Hi Haavard,

On Fri, 9 May 2008, Haavard Skinnemoen wrote:

> diff --git a/common/cmd_spi.c b/common/cmd_spi.c
> index 7604422..b0e7db1 100644
> --- a/common/cmd_spi.c
> +++ b/common/cmd_spi.c
> @@ -38,19 +38,13 @@
>  #endif
>  
>  /*
> - * External table of chip select functions (see the appropriate board
> - * support for the actual definition of the table).
> - */
> -extern spi_chipsel_type spi_chipsel[];
> -extern int spi_chipsel_cnt;
> -
> -/*
>   * Values from last command.
>   */
>  static int   device;
>  static int   bitlen;
>  static uchar dout[MAX_SPI_BYTES];
>  static uchar din[MAX_SPI_BYTES];
> +static struct spi_slave *slave;

Don't think this is needed...

>  
>  /*
>   * SPI read/write
> @@ -65,6 +59,7 @@ static uchar din[MAX_SPI_BYTES];
>  
>  int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
>  {
> +     struct spi_slave *slave;

...because it is only ever used in this function and is shadowed by this 
local variable.

> @@ -101,19 +96,22 @@ int do_spi (cmd_tbl_t *cmdtp, int flag, int argc, char 
> *argv[])
>               }
>       }
>  
> -     if ((device < 0) || (device >=  spi_chipsel_cnt)) {
> -             printf("Invalid device %d, giving up.\n", device);
> -             return 1;
> -     }
>       if ((bitlen < 0) || (bitlen >  (MAX_SPI_BYTES * 8))) {
>               printf("Invalid bitlen %d, giving up.\n", bitlen);
>               return 1;
>       }
>  
> -     debug ("spi_chipsel[%d] = %08X\n",
> -             device, (uint)spi_chipsel[device]);
> +     /* 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.

> 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.

> @@ -65,16 +78,29 @@ void rtc_set(struct rtc_time *rtc)
>  {
>       u32 time, day, reg;
>  
> +     if (!slave) {
> +             /* FIXME: Verify the max SCK rate */
> +             slave = spi_setup_slave(1, 0, 1000000,
> +                             SPI_MODE_2 | SPI_CS_HIGH);
> +             if (!slave)
> +                     return;
> +     }
> +
>       time = mktime(rtc->tm_year, rtc->tm_mon, rtc->tm_mday,
>                     rtc->tm_hour, rtc->tm_min, rtc->tm_sec);
>       day = time / 86400;
>       time %= 86400;
>  
> +     if (spi_claim_bus(slave))
> +             return;
> +
>       reg = 0x2c000000 | day | 0x80000000;
>       spi_xfer(0, 32, (uchar *)&reg, (uchar *)&day);

You changed spi_xfer()'s prototype, but didn't change all calls.

> diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
> index b2e3ab9..8279e3e 100644
> --- a/drivers/spi/mxc_spi.c
> +++ b/drivers/spi/mxc_spi.c

[skip]

> @@ -132,15 +125,15 @@ void spi_init(void)
>  {
>  }
>  
> -int spi_select(unsigned int bus, unsigned int dev, unsigned long mode)
> +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
> +                     unsigned int max_hz, unsigned int mode)

You changed the parameter name from dev to cs

>  {
>       unsigned int ctrl_reg;
> +     struct spi_slave *slave;
>  
>       if (bus >= sizeof(spi_bases) / sizeof(spi_bases[0]) ||
>           dev > 3)

but you didn't change it here

> -             return 1;
> -
> -     spi_base = spi_bases[bus];
> +             return NULL;
>  
>       ctrl_reg = MXC_CSPICTRL_CHIPSELECT(dev) |
>               MXC_CSPICTRL_BITCOUNT(31) |

and here.

> diff --git a/include/spi.h b/include/spi.h
> index 3a55a68..b434402 100644
> --- a/include/spi.h
> +++ b/include/spi.h
> @@ -31,22 +31,77 @@
>  #define      SPI_MODE_1      (0|SPI_CPHA)
>  #define      SPI_MODE_2      (SPI_CPOL|0)
>  #define      SPI_MODE_3      (SPI_CPOL|SPI_CPHA)
> -#define      SPI_CS_HIGH     0x04                    /* chipselect active 
> high? */
> +#define      SPI_CS_HIGH     0x04                    /* CS active high */
>  #define      SPI_LSB_FIRST   0x08                    /* per-word 
> bits-on-wire */
>  #define      SPI_3WIRE       0x10                    /* SI/SO signals shared 
> */
>  #define      SPI_LOOP        0x20                    /* loopback mode */
>  
> -/*
> - * 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.

After all above are fixed, and I can at least compile it again:-), I'll 
test it on hardware.

I only reviewed the parts I'd written or changed myself.

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: [EMAIL PROTECTED]

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to