Re: [RFC][PATCH] SPI subsystem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



--- David Brownell <[email protected]> wrote:

> > > > I notice that there is no bus lock. Are you expecting the adapter
> > > > driver to handle the fact that its transfer routine could be called
> > > > before a previous call returns?
> > > 
> > > Yes.  The transfer routine is purely async, and its responsibility
> > > is to append that spi_message to the current queue.  (Assuming
> > > the driver isn't a simple pure-PIO driver without a queue...)
> > > 
> > > That's a simple matter of a spin_lock_irqsave/list_add_tail/unlock.
> > > 
> >
> > OK. Thought so. I think that in the documentation (when it gets written ;)
> > we need to warn people that they can only do quick work (adding message
> > to a queue or waking up a kthread) in the transfer routine
> 
> The documented constraint -- right by the declaration of that
> particular method!! -- is that it may not sleep.  That suffices.
> 

Sorry, must have had my glasses on back to front ;)

> 
> >	as it would
> > not be fair for a PIO driver to transfer several KB in what might be
> > interrupt context.
> 
> That's a "quality of implementation" issue.  There are a lot of
> different SPI drivers floating around today that are pure PIO;
> they're used for sensor access, and work in exactly that way.
> (And without any buslock.)
> 
> When the driver is only reading/writing a handful of bytes, PIO
> can easily be "quick" ... and may well be quicker than going
> through a queue manager.  Example:  if SPI is clocked at 8 MHz,
> that's a microsecond per byte.  Add a smidgeon of overhead,
> and call it 5 usecs to read a sensor that way.
> 
> One point of standardizing an API is to support a broad range
> of different controller driver optimization points.  They should
> all work correctly of course.  A DMA driver may be the ticket for
> running from SPI flash ... but setting up DMA for just a couple
> bytes is likely not a win.
> 

True. In our SPI adapter driver we check to see if the transfer is below is certain size in which
case it is quicker to do PIO, otherwise we do DMA.

> 
> > So your asking the adapter to keep a 'personality' for each device on
> > that bus (clock speed, cs & clock mode etc) and then just before the
> > transfer to/from a device is started the adapter takes the 'personality'
> > of that device (i.e. sets clock speed registers if needed etc)?
> 
> As you noted later, yes.  Most of the SPI controllers I've looked
> at will do that in hardware, for that matter.  PCI drivers don't
> need to arbitrate bus access themselves; neither should SPI drivers.
> 

OK. Our hardware doesn't :(, so I'll have to emulate it. It's an interesting idea and as you say
it is more optimal for devices that have this support :).
To make it quicker for devices that don't have this support in hardware how would you feel about
having a 'void *personality' pointer in the spi_device structure which the adapter could use for
storing and accessing the register settings for clock etc for that SPI device?

> 
> > > > > +EXPORT_SYMBOL_GPL(spi_new_device);
> > > >
> > > > I think we should have a bus lock (in the adapter structure) for
> > > > safety, and in the remove routine as well.
> > > 
> > > Why?  I don't see any need for one, at least in the "all drivers
> > > must use this one" category.  Persuade me; what problems would such
> > > a lock solve? 
> > > 
> >
> > Problems with parallel calls to register spi device/unregister
> > spi device/transfer?
> 
> Only an issue if the driver core had bugs ... bugs that would break
> many more things than just SPI.  :)
> 
> 
> > > The parallel port adapter wouldn't use that interface.  It would
> > > instead be using spi_new_device() with board_info matching the
> > > device (Ethernet, EEPROM, USB controller, etc) ...
> >
> > OK. So if I had an array of devices then I have to go though that array
> > and call  spi_new_device() for each one?  Where do I get spi_master
> > from? I need a function to which I can pass the name/bus number to and
> > get a spi_master pointer in return.
> 
> You're the one who's defining the "parallel port adapter with device"
> thing ... so you've got the spi_master that you created.  In fact you
> probably used dev_set_drvdata(dev, master) to keep it handy.
> 

Ahh, but the spi_master structure is in /usr/src/linux/drivers/spi/busses/spi-parport.c and my
array of devices is in ~/spi-work/parprt_adapter_1.c

> 
> 
> > Sorry I didn't make myself clear. I mean check the complete element in
> > the spi_message structure when spi_transfer is called. So:
> >
> > int spi_transfer(struct spi_device *spi, struct spi_message *message)
> > {
> >         if (message->complete)
> >                 /* We have callback so transfer is async */
> >         else
> >                 /* We have no callback so transfer is sync */
> > }
> >
> > Although thinking about it this is probably a bad idea as it could b
> > prone to errors
> 
> That's a large part of why I would never support that model.  :)
> 
> 
> > > > Hmm, using local variables for messages, so DMA adapter drivers have
> > > > to check if this is non-kmalloc'ed space (how?)
> > > 
> > > They can't check that.  It turns out that most current Linuxes
> > > have no issues DMAing a few bytes from the stack.
> >
> > Will the DMA remapping calls work with data from the stack?
> 
> On "most current Linuxes" yes.  All I know about, in fact.
> But it's not guaranteed.

OK. Thanks

Mark

> 
> - Dave
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 



	
	
		
___________________________________________________________ 
Yahoo! Messenger - NEW crystal clear PC to PC calling worldwide with voicemail http://uk.messenger.yahoo.com
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux