[U-Boot] [PATCH] andes_spi: add andes_spi interface

Mike Frysinger vapier at gentoo.org
Fri Apr 22 23:04:58 CEST 2011


On Fri, Apr 22, 2011 at 3:20 AM, Macpaul Lin wrote:
> +#ifdef DEBUG
> +#define debug(fmt, args...)    printf(fmt, ##args)
> +#else
> +#define debug(fmt, args...)
> +#endif

common.h already provides this for you

> +void andes_spi_spit_en(struct andes_spi_slave *ds)
> +{
> +       debug("%s: dcr: %x, write value: %x\n",
> +                       __func__, readl(&ds->regs->dcr),
> +                       readl(&ds->regs->dcr) | ANDES_SPI_DCR_SPIT);
> +       writel((readl(&ds->regs->dcr) | ANDES_SPI_DCR_SPIT), &ds->regs->dcr);
> +}

putting io accessors into debug() is generally a bad idea.  i'd
suggest you store this in a local variable and then pass that to
everything else.  it'd also make the code cleaner.
unsigned long dcr = readl(&ds->regs->dcr);

> +struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
> +                       unsigned int max_hz, unsigned int mode)
> +{
> +       struct andes_spi_slave  *ds;
> +
> +       if (!spi_cs_is_valid(bus, cs))
> +               return NULL;
> +
> +       ds = malloc(sizeof(*ds));
> +       if (!ds)
> +               return NULL;
> +
> +       ds->slave.bus = bus;
> +       ds->slave.cs = cs;
> +       ds->regs = (struct andes_spi_regs *)CONFIG_SYS_SPI_BASE;
> +       ds->freq = max_hz;

your spi controller has no frequency limit ?  your spi_claim_bus
indicates that there is ...

> +static int andes_spi_read(struct spi_slave *slave, unsigned int len,
> +                           u8 *rxp, unsigned long flags)
> +{
> ....
> +       while (len > 0) {
> +               debug(" ");
> +               if (len / 4 > 0)
> +                       left = 4;
> +               else
> +                       left = len;

seems like you want:
left = max(len, 4);

> +               data = readl(&ds->regs->data);
> +               for (i = 0; i < left; i++) {
> +                       debug("%02x ", data & 0xff);
> +                       *rxp++ = data;
> +                       data >>= 8;
> +                       len--;
> +               }
> +       }

looks to me like you write too much data ... if someone does a spi
read of 1 byte, you still write out 4 ?

> +int spi_xfer(struct spi_slave *slave, unsigned int bitlen,
> +            const void *dout, void *din, unsigned long flags)
> +{
> ...
> +       /*
> +        * It's not clear how non-8-bit-aligned transfers are supposed to be
> +        * represented as a stream of bytes...this is a limitation of
> +        * the current SPI interface - here we terminate on receiving such a
> +        * transfer request.
> +        */
> +
> +       if (bitlen % 8) {
> +               /* Errors always terminate an ongoing transfer */
> +               flags |= SPI_XFER_END;
> +               goto out;
> +       }

this is correct behavior

> --- /dev/null
> +++ b/drivers/spi/andes_spi.h

i cant think of any reason other code would want to include this ...
so please put this header in drivers/spi/
-mike


More information about the U-Boot mailing list