diff options
author | Michael Hennerich <michael.hennerich@analog.com> | 2011-05-18 14:42:04 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-05-19 16:14:58 -0700 |
commit | f535e08eb60edbfb9f8ff660c9512b498ba0e1de (patch) | |
tree | 51ba5e1e893f53c6e0dd0a05e22d1fc20d7cefba /drivers/staging/iio | |
parent | 69c272cc8edf3e5432859a9c1bcb51a64b2accb5 (diff) |
staging:iio:meter:ade7758: Fix timing on SPI read accessor functions.
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>
Diffstat (limited to 'drivers/staging/iio')
-rw-r--r-- | drivers/staging/iio/meter/ade7758_core.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/drivers/staging/iio/meter/ade7758_core.c b/drivers/staging/iio/meter/ade7758_core.c index c9956c4a1b9..8cfb617082c 100644 --- a/drivers/staging/iio/meter/ade7758_core.c +++ b/drivers/staging/iio/meter/ade7758_core.c @@ -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); |