Commit e6182b2d authored by Rodrigo Siqueira's avatar Rodrigo Siqueira Committed by Jonathan Cameron

staging:iio:ade7854: Rework SPI read function

Rework read SPI function to reduce the code duplication and centralizes
all the task in a single function.
Signed-off-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 5d55dcbc
...@@ -67,9 +67,10 @@ static int ade7854_spi_write_reg(struct device *dev, ...@@ -67,9 +67,10 @@ static int ade7854_spi_write_reg(struct device *dev,
return ret; return ret;
} }
static int ade7854_spi_read_reg_8(struct device *dev, static int ade7854_spi_read_reg(struct device *dev,
u16 reg_address, u16 reg_address,
u8 *val) u32 *val,
int bits)
{ {
struct iio_dev *indio_dev = dev_to_iio_dev(dev); struct iio_dev *indio_dev = dev_to_iio_dev(dev);
struct ade7854_state *st = iio_priv(indio_dev); struct ade7854_state *st = iio_priv(indio_dev);
...@@ -82,7 +83,7 @@ static int ade7854_spi_read_reg_8(struct device *dev, ...@@ -82,7 +83,7 @@ static int ade7854_spi_read_reg_8(struct device *dev,
}, { }, {
.rx_buf = st->rx, .rx_buf = st->rx,
.bits_per_word = 8, .bits_per_word = 8,
.len = 1, .len = bits,
} }
}; };
...@@ -94,128 +95,57 @@ static int ade7854_spi_read_reg_8(struct device *dev, ...@@ -94,128 +95,57 @@ static int ade7854_spi_read_reg_8(struct device *dev,
ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers)); ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
if (ret) { if (ret) {
dev_err(&st->spi->dev, "problem when reading 8 bit register 0x%02X", dev_err(&st->spi->dev, "problem when reading register 0x%02X",
reg_address); reg_address);
goto error_ret; goto unlock;
} }
switch (bits) {
case 8:
*val = st->rx[0]; *val = st->rx[0];
break;
case 16:
*val = be16_to_cpup((const __be16 *)st->rx);
break;
case 24:
*val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2];
break;
case 32:
*val = be32_to_cpup((const __be32 *)st->rx);
break;
}
error_ret: unlock:
mutex_unlock(&st->buf_lock); mutex_unlock(&st->buf_lock);
return ret; return ret;
} }
static int ade7854_spi_read_reg_8(struct device *dev,
u16 reg_address,
u8 *val)
{
return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 8);
}
static int ade7854_spi_read_reg_16(struct device *dev, static int ade7854_spi_read_reg_16(struct device *dev,
u16 reg_address, u16 reg_address,
u16 *val) u16 *val)
{ {
struct iio_dev *indio_dev = dev_to_iio_dev(dev); return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 16);
struct ade7854_state *st = iio_priv(indio_dev);
int ret;
struct spi_transfer xfers[] = {
{
.tx_buf = st->tx,
.bits_per_word = 8,
.len = 3,
}, {
.rx_buf = st->rx,
.bits_per_word = 8,
.len = 2,
}
};
mutex_lock(&st->buf_lock);
st->tx[0] = ADE7854_READ_REG;
st->tx[1] = (reg_address >> 8) & 0xFF;
st->tx[2] = reg_address & 0xFF;
ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
if (ret) {
dev_err(&st->spi->dev, "problem when reading 16 bit register 0x%02X",
reg_address);
goto error_ret;
}
*val = be16_to_cpup((const __be16 *)st->rx);
error_ret:
mutex_unlock(&st->buf_lock);
return ret;
} }
static int ade7854_spi_read_reg_24(struct device *dev, static int ade7854_spi_read_reg_24(struct device *dev,
u16 reg_address, u16 reg_address,
u32 *val) u32 *val)
{ {
struct iio_dev *indio_dev = dev_to_iio_dev(dev); return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 24);
struct ade7854_state *st = iio_priv(indio_dev);
int ret;
struct spi_transfer xfers[] = {
{
.tx_buf = st->tx,
.bits_per_word = 8,
.len = 3,
}, {
.rx_buf = st->rx,
.bits_per_word = 8,
.len = 3,
}
};
mutex_lock(&st->buf_lock);
st->tx[0] = ADE7854_READ_REG;
st->tx[1] = (reg_address >> 8) & 0xFF;
st->tx[2] = reg_address & 0xFF;
ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
if (ret) {
dev_err(&st->spi->dev, "problem when reading 24 bit register 0x%02X",
reg_address);
goto error_ret;
}
*val = (st->rx[0] << 16) | (st->rx[1] << 8) | st->rx[2];
error_ret:
mutex_unlock(&st->buf_lock);
return ret;
} }
static int ade7854_spi_read_reg_32(struct device *dev, static int ade7854_spi_read_reg_32(struct device *dev,
u16 reg_address, u16 reg_address,
u32 *val) u32 *val)
{ {
struct iio_dev *indio_dev = dev_to_iio_dev(dev); return ade7854_spi_read_reg(dev, reg_address, (u32 *)val, 32);
struct ade7854_state *st = iio_priv(indio_dev);
int ret;
struct spi_transfer xfers[] = {
{
.tx_buf = st->tx,
.bits_per_word = 8,
.len = 3,
}, {
.rx_buf = st->rx,
.bits_per_word = 8,
.len = 4,
}
};
mutex_lock(&st->buf_lock);
st->tx[0] = ADE7854_READ_REG;
st->tx[1] = (reg_address >> 8) & 0xFF;
st->tx[2] = reg_address & 0xFF;
ret = spi_sync_transfer(st->spi, xfers, ARRAY_SIZE(xfers));
if (ret) {
dev_err(&st->spi->dev, "problem when reading 32 bit register 0x%02X",
reg_address);
goto error_ret;
}
*val = be32_to_cpup((const __be32 *)st->rx);
error_ret:
mutex_unlock(&st->buf_lock);
return ret;
} }
static int ade7854_spi_probe(struct spi_device *spi) static int ade7854_spi_probe(struct spi_device *spi)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment