[alsa-devel] [PATCH 7/8] ASoC: Add SPI support for WM8731

Alan Horstmann gineera at aspect135.co.uk
Thu Sep 4 12:48:29 CEST 2008


On Thursday 04 September 2008 02:46, you wrote:
> On Thu, Sep 4, 2008 at 12:01 AM, Alan Horstmann <gineera at aspect135.co.uk> 
wrote:
> > On Monday 01 September 2008 18:47, Mark Brown wrote:
> >> [Modified to allow runtime selection between I2C and SPI and to select
> >> SPI_MASTER for all codecs build so this is included. -- broonie]
> > What architecture has this SPI code been tested on?  Specifically, what
> > endianess?
>
> We tested on Blackfin machine and it's little-endian.
>
> -Bryan

Thanks, Mark, Bryan.  We are trying this on AT91.  What we see is the 2 bytes 
of the SPI message swapped on the bus (data then address) and I am suspicious 
of this _spi_write function.  As I am in unfamiliar territory, please be 
patient if I am mistaken.  Analysis below...

> >> +static int wm8731_spi_write(struct spi_device *spi, const char *data,
> >> int len) +{
> >> +     struct spi_transfer t;
> >> +     struct spi_message m;
> >> +     u16 msg[2];
> >> +
> >> +     if (len <= 0)
> >> +             return 0;
> >> +
> >> +     msg[0] = (data[0] << 8) + data[1];
> >> +
> >> +     spi_message_init(&m);
> >> +     memset(&t, 0, (sizeof t));
> >> +
> >> +     t.tx_buf = &msg[0];
> >> +     t.len = len;
> >> +
> >> +     spi_message_add_tail(&t, &m);
> >> +     spi_sync(spi, &m);
> >> +
> >> +     return len;
> >> +}

I assume that spi_transfer sends bytes in order, from the tx_buf position, and 
it seems clear that data[0] is the high byte that should go first.  As msg[2] 
is u16 (why?), I would have thought that the byte at &msg[0] would be the low 
byte on LE, high byte on BE so it would only be correct on BE.

Changing the code to use 
	u8 msg[2];
and simply, but explicitly
	msg[0] = data[0];
	msg[1] = data[1];

fixes the problem here.

Comments?

Alan



More information about the Alsa-devel mailing list