Input: ad7877 - implement specified chip select behavior
authorMichael Hennerich <michael.hennerich@analog.com>
Fri, 15 Oct 2010 16:48:10 +0000 (09:48 -0700)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Mon, 18 Oct 2010 04:12:11 +0000 (21:12 -0700)
According to the AD7877 datasheet:

Each transfer operation is 16-bit. If multiple read/write operations are
to be performed, CS must be taken high after the end of each read/write
operation before another read/write operation can be performed by
taking CS low again.

Make sure CS toggles after each transfer in the message.

Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
drivers/input/touchscreen/ad7877.c

index 5f0221cffef9bf12821ed9fd38d63bac0df720dc..53f4d79ee5307583ba76ab7b4ea0718d01012951 100644 (file)
@@ -230,6 +230,7 @@ static int ad7877_read(struct spi_device *spi, u16 reg)
                        AD7877_READADD(reg));
        req->xfer[0].tx_buf = &req->command;
        req->xfer[0].len = 2;
+       req->xfer[0].cs_change = 1;
 
        req->xfer[1].rx_buf = &req->sample;
        req->xfer[1].len = 2;
@@ -295,20 +296,25 @@ static int ad7877_read_adc(struct spi_device *spi, unsigned command)
 
        req->xfer[0].tx_buf = &req->reset;
        req->xfer[0].len = 2;
+       req->xfer[0].cs_change = 1;
 
        req->xfer[1].tx_buf = &req->ref_on;
        req->xfer[1].len = 2;
        req->xfer[1].delay_usecs = ts->vref_delay_usecs;
+       req->xfer[1].cs_change = 1;
 
        req->xfer[2].tx_buf = &req->command;
        req->xfer[2].len = 2;
        req->xfer[2].delay_usecs = ts->vref_delay_usecs;
+       req->xfer[2].cs_change = 1;
 
        req->xfer[3].rx_buf = &req->sample;
        req->xfer[3].len = 2;
+       req->xfer[3].cs_change = 1;
 
        req->xfer[4].tx_buf = &ts->cmd_crtl2;   /*REF OFF*/
        req->xfer[4].len = 2;
+       req->xfer[4].cs_change = 1;
 
        req->xfer[5].tx_buf = &ts->cmd_crtl1;   /*DEFAULT*/
        req->xfer[5].len = 2;
@@ -640,17 +646,21 @@ static void ad7877_setup_ts_def_msg(struct spi_device *spi, struct ad7877 *ts)
 
        ts->xfer[0].tx_buf = &ts->cmd_crtl1;
        ts->xfer[0].len = 2;
+       ts->xfer[0].cs_change = 1;
 
        spi_message_add_tail(&ts->xfer[0], m);
 
        ts->xfer[1].tx_buf = &ts->cmd_dummy; /* Send ZERO */
        ts->xfer[1].len = 2;
+       ts->xfer[1].cs_change = 1;
 
        spi_message_add_tail(&ts->xfer[1], m);
 
-       for (i = 0; i < 11; i++) {
+       for (i = 0; i < AD7877_NR_SENSE; i++) {
                ts->xfer[i + 2].rx_buf = &ts->conversion_data[AD7877_SEQ_YPOS + i];
                ts->xfer[i + 2].len = 2;
+               if (i < (AD7877_NR_SENSE - 1))
+                       ts->xfer[i + 2].cs_change = 1;
                spi_message_add_tail(&ts->xfer[i + 2], m);
        }
 }