[U-Boot-Users] [RFC/PATCH] SPI API improvements
Guennadi Liakhovetski
lg at denx.de
Tue May 13 17:06:35 CEST 2008
On Tue, 13 May 2008, Haavard Skinnemoen wrote:
> On Tue, 13 May 2008 13:20:22 +0200 (CEST)
> Guennadi Liakhovetski <lg at denx.de> wrote:
>
> > > + /* FIXME: Make these parameters configurable */
> > > + slave = spi_setup_slave(0, device, 1000000, SPI_MODE_0);
> >
> > Until it is configurable (I think, you mean at runtime), please use the
> > CONFIG_MXC_SPI_IFACE macro, otherwise it will be useless on mx31ads.
>
> Do you really think platform-specific macros are appropriate here?
>
> But yeah, I did mean at runtime. If we're going to support multiple
> busses, we need to expose that at the user interface level too.
Appropriate or not from the esthetic PoV, I don't see another chance to
make it useful - either make it run-time configurable either via command
parameters, or environment varables, ot at least compile-time, so
platforms could specify something meaningful there. BTW, same holds for
the flags. So, I'd do
#ifndef CONFIG_MXC_SPI_IFACE
#define CONFIG_MXC_SPI_IFACE 0
#endif
#ifndef CONFIG_MXC_SPI_MODE
#define CONFIG_MXC_SPI_MODE SPI_MODE_0
#endif
slave = spi_setup_slave(CONFIG_MXC_SPI_IFACE, device, 1000000, CONFIG_MXC_SPI_MODE);
Without these sspi is useless on mx31ads.
> > > diff --git a/drivers/rtc/mc13783-rtc.c b/drivers/rtc/mc13783-rtc.c
> > > index 35b1b8b..5a1ef4f 100644
> > > --- a/drivers/rtc/mc13783-rtc.c
> > > +++ b/drivers/rtc/mc13783-rtc.c
> > > @@ -24,13 +24,24 @@
> > > #include <rtc.h>
> > > #include <spi.h>
> > >
> > > +static struct spi_slave *slave;
> > > +
> >
> > In do_spi() you use a local variable, allocate a slave, claim the bus,
> > xfer data, release the bus and free the slave on each call, which is also
> > nice. Whereas, for example, in this driver you use a static variable,
> > allocate a slave for it once, and, naturally, never free it. This is at
> > least inconsistent, IMHO.
>
> I don't think it's inconsistent...they're very different users. While
> this RTC driver will normally only ever see one slave, do_spi() needs
> to be able to communicate with whatever device the user tells it to,
> which may be different from one call to the next.
Ok, sorry, you're right.
> > > -/*
> > > - * The function call pointer type used to drive the chip select.
> > > - */
> > > -typedef void (*spi_chipsel_type)(int cs);
> > > +/* SPI transfer flags */
> > > +#define SPI_XFER_BEGIN 0x01 /* Assert CS before transfer */
> > > +#define SPI_XFER_END 0x02 /* Deassert CS after transfer */
> > >
> > > +/* Driver-specific SPI slave data */
> > > +struct spi_slave;
> >
> > Well, I am a bit upset you decided to make struct spi_slave
> > hardware-specific. I hoped it would be standard, and contain a void * to
> > hardware-specific part. Or, better yet, be embeddable in hardware-specific
> > object, so drivers then would use container_of to get to their data and
> > wouldn't need to malloc 2 structs. But, as you say, it is not an operating
> > system, so, let's see what others say.
>
> Instead of being upset, could you tell me what kind of information such
> a hardware-independent spi_slave struct should have, and why it might be
> useful outside the controller driver?
Well, I just don't like different things being called with the same
name:-)
> > After all above are fixed, and I can at least compile it again:-), I'll
> > test it on hardware.
>
> With the below patch, it compiles on imx31_litekit at least.
and it works too - rtc works, sspi works with above modifications and
setting
#define CONFIG_MXC_SPI_MODE (SPI_MODE_2 | SPI_CS_HIGH) /* Default SPI mode */
in mx31ads.h
Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office at denx.de
More information about the U-Boot
mailing list