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>
This commit is contained in:
Michael Hennerich 2011-05-18 14:42:04 +01:00 committed by Greg Kroah-Hartman
parent 69c272cc8e
commit f535e08eb6
1 changed files with 33 additions and 10 deletions

View File

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