[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