staging:iio:meter:ade7758: Fix timing on SPI read accessor functions.
authorMichael Hennerich <michael.hennerich@analog.com>
Wed, 18 May 2011 13:42:04 +0000 (14:42 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 19 May 2011 23:14:58 +0000 (16:14 -0700)
According to the ADE7758 datasheet the minimum time between read command
(that is, a write to communication register) and data read must not be
less than 4us.

Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/meter/ade7758_core.c

index c9956c4a1b9aae76a5ac31a21ffea3c2efd0e3b7..8cfb617082cede509d3575e0a7d1ba4470352dd7 100644 (file)
@@ -100,7 +100,7 @@ static int ade7758_spi_write_reg_24(struct device *dev,
        return ret;
 }
 
-static int ade7758_spi_read_reg_8(struct device *dev,
+int ade7758_spi_read_reg_8(struct device *dev,
                u8 reg_address,
                u8 *val)
 {
@@ -111,9 +111,15 @@ static int ade7758_spi_read_reg_8(struct device *dev,
        struct spi_transfer xfers[] = {
                {
                        .tx_buf = st->tx,
+                       .bits_per_word = 8,
+                       .len = 1,
+                       .delay_usecs = 4,
+               },
+               {
+                       .tx_buf = &st->tx[1],
                        .rx_buf = st->rx,
                        .bits_per_word = 8,
-                       .len = 2,
+                       .len = 1,
                },
        };
 
@@ -122,14 +128,15 @@ static int ade7758_spi_read_reg_8(struct device *dev,
        st->tx[1] = 0;
 
        spi_message_init(&msg);
-       spi_message_add_tail(xfers, &msg);
+       spi_message_add_tail(&xfers[0], &msg);
+       spi_message_add_tail(&xfers[1], &msg);
        ret = spi_sync(st->us, &msg);
        if (ret) {
                dev_err(&st->us->dev, "problem when reading 8 bit register 0x%02X",
                                reg_address);
                goto error_ret;
        }
-       *val = st->rx[1];
+       *val = st->rx[0];
 
 error_ret:
        mutex_unlock(&st->buf_lock);
@@ -147,26 +154,35 @@ static int ade7758_spi_read_reg_16(struct device *dev,
        struct spi_transfer xfers[] = {
                {
                        .tx_buf = st->tx,
+                       .bits_per_word = 8,
+                       .len = 1,
+                       .delay_usecs = 4,
+               },
+               {
+                       .tx_buf = &st->tx[1],
                        .rx_buf = st->rx,
                        .bits_per_word = 8,
-                       .len = 3,
+                       .len = 2,
                },
        };
 
+
        mutex_lock(&st->buf_lock);
        st->tx[0] = ADE7758_READ_REG(reg_address);
        st->tx[1] = 0;
        st->tx[2] = 0;
 
        spi_message_init(&msg);
-       spi_message_add_tail(xfers, &msg);
+       spi_message_add_tail(&xfers[0], &msg);
+       spi_message_add_tail(&xfers[1], &msg);
        ret = spi_sync(st->us, &msg);
        if (ret) {
                dev_err(&st->us->dev, "problem when reading 16 bit register 0x%02X",
                                reg_address);
                goto error_ret;
        }
-       *val = (st->rx[1] << 8) | st->rx[2];
+
+       *val = (st->rx[0] << 8) | st->rx[1];
 
 error_ret:
        mutex_unlock(&st->buf_lock);
@@ -184,9 +200,15 @@ static int ade7758_spi_read_reg_24(struct device *dev,
        struct spi_transfer xfers[] = {
                {
                        .tx_buf = st->tx,
+                       .bits_per_word = 8,
+                       .len = 1,
+                       .delay_usecs = 4,
+               },
+               {
+                       .tx_buf = &st->tx[1],
                        .rx_buf = st->rx,
                        .bits_per_word = 8,
-                       .len = 4,
+                       .len = 3,
                },
        };
 
@@ -197,14 +219,15 @@ static int ade7758_spi_read_reg_24(struct device *dev,
        st->tx[3] = 0;
 
        spi_message_init(&msg);
-       spi_message_add_tail(xfers, &msg);
+       spi_message_add_tail(&xfers[0], &msg);
+       spi_message_add_tail(&xfers[1], &msg);
        ret = spi_sync(st->us, &msg);
        if (ret) {
                dev_err(&st->us->dev, "problem when reading 24 bit register 0x%02X",
                                reg_address);
                goto error_ret;
        }
-       *val = (st->rx[1] << 16) | (st->rx[2] << 8) | st->rx[3];
+       *val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2];
 
 error_ret:
        mutex_unlock(&st->buf_lock);