Commit a2630262 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Jonathan Cameron

iio:ad5064: Fix address of the second channel for ad5065/ad5045/ad5025

The ad5065, ad5045, ad5025 use address '3' for the second channel, so they need
their own channel spec.

Note that ad5064_sync_powerdown_mode() also needs to be slightly updated since
it was relying on the fact that chan->address always equaled chan->channel.
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 76426daf
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#define AD5064_ADDR(x) ((x) << 20) #define AD5064_ADDR(x) ((x) << 20)
#define AD5064_CMD(x) ((x) << 24) #define AD5064_CMD(x) ((x) << 24)
#define AD5064_ADDR_DAC(chan) (chan)
#define AD5064_ADDR_ALL_DAC 0xF #define AD5064_ADDR_ALL_DAC 0xF
#define AD5064_CMD_WRITE_INPUT_N 0x0 #define AD5064_CMD_WRITE_INPUT_N 0x0
...@@ -131,15 +130,15 @@ static int ad5064_write(struct ad5064_state *st, unsigned int cmd, ...@@ -131,15 +130,15 @@ static int ad5064_write(struct ad5064_state *st, unsigned int cmd,
} }
static int ad5064_sync_powerdown_mode(struct ad5064_state *st, static int ad5064_sync_powerdown_mode(struct ad5064_state *st,
unsigned int channel) const struct iio_chan_spec *chan)
{ {
unsigned int val; unsigned int val;
int ret; int ret;
val = (0x1 << channel); val = (0x1 << chan->address);
if (st->pwr_down[channel]) if (st->pwr_down[chan->channel])
val |= st->pwr_down_mode[channel] << 8; val |= st->pwr_down_mode[chan->channel] << 8;
ret = ad5064_write(st, AD5064_CMD_POWERDOWN_DAC, 0, val, 0); ret = ad5064_write(st, AD5064_CMD_POWERDOWN_DAC, 0, val, 0);
...@@ -169,7 +168,7 @@ static int ad5064_set_powerdown_mode(struct iio_dev *indio_dev, ...@@ -169,7 +168,7 @@ static int ad5064_set_powerdown_mode(struct iio_dev *indio_dev,
mutex_lock(&indio_dev->mlock); mutex_lock(&indio_dev->mlock);
st->pwr_down_mode[chan->channel] = mode + 1; st->pwr_down_mode[chan->channel] = mode + 1;
ret = ad5064_sync_powerdown_mode(st, chan->channel); ret = ad5064_sync_powerdown_mode(st, chan);
mutex_unlock(&indio_dev->mlock); mutex_unlock(&indio_dev->mlock);
return ret; return ret;
...@@ -205,7 +204,7 @@ static ssize_t ad5064_write_dac_powerdown(struct iio_dev *indio_dev, ...@@ -205,7 +204,7 @@ static ssize_t ad5064_write_dac_powerdown(struct iio_dev *indio_dev,
mutex_lock(&indio_dev->mlock); mutex_lock(&indio_dev->mlock);
st->pwr_down[chan->channel] = pwr_down; st->pwr_down[chan->channel] = pwr_down;
ret = ad5064_sync_powerdown_mode(st, chan->channel); ret = ad5064_sync_powerdown_mode(st, chan);
mutex_unlock(&indio_dev->mlock); mutex_unlock(&indio_dev->mlock);
return ret ? ret : len; return ret ? ret : len;
} }
...@@ -292,34 +291,44 @@ static const struct iio_chan_spec_ext_info ad5064_ext_info[] = { ...@@ -292,34 +291,44 @@ static const struct iio_chan_spec_ext_info ad5064_ext_info[] = {
{ }, { },
}; };
#define AD5064_CHANNEL(chan, bits) { \ #define AD5064_CHANNEL(chan, addr, bits) { \
.type = IIO_VOLTAGE, \ .type = IIO_VOLTAGE, \
.indexed = 1, \ .indexed = 1, \
.output = 1, \ .output = 1, \
.channel = (chan), \ .channel = (chan), \
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \
IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \ IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \
.address = AD5064_ADDR_DAC(chan), \ .address = addr, \
.scan_type = IIO_ST('u', (bits), 16, 20 - (bits)), \ .scan_type = IIO_ST('u', (bits), 16, 20 - (bits)), \
.ext_info = ad5064_ext_info, \ .ext_info = ad5064_ext_info, \
} }
#define DECLARE_AD5064_CHANNELS(name, bits) \ #define DECLARE_AD5064_CHANNELS(name, bits) \
const struct iio_chan_spec name[] = { \ const struct iio_chan_spec name[] = { \
AD5064_CHANNEL(0, bits), \ AD5064_CHANNEL(0, 0, bits), \
AD5064_CHANNEL(1, bits), \ AD5064_CHANNEL(1, 1, bits), \
AD5064_CHANNEL(2, bits), \ AD5064_CHANNEL(2, 2, bits), \
AD5064_CHANNEL(3, bits), \ AD5064_CHANNEL(3, 3, bits), \
AD5064_CHANNEL(4, bits), \ AD5064_CHANNEL(4, 4, bits), \
AD5064_CHANNEL(5, bits), \ AD5064_CHANNEL(5, 5, bits), \
AD5064_CHANNEL(6, bits), \ AD5064_CHANNEL(6, 6, bits), \
AD5064_CHANNEL(7, bits), \ AD5064_CHANNEL(7, 7, bits), \
}
#define DECLARE_AD5065_CHANNELS(name, bits) \
const struct iio_chan_spec name[] = { \
AD5064_CHANNEL(0, 0, bits), \
AD5064_CHANNEL(1, 3, bits), \
} }
static DECLARE_AD5064_CHANNELS(ad5024_channels, 12); static DECLARE_AD5064_CHANNELS(ad5024_channels, 12);
static DECLARE_AD5064_CHANNELS(ad5044_channels, 14); static DECLARE_AD5064_CHANNELS(ad5044_channels, 14);
static DECLARE_AD5064_CHANNELS(ad5064_channels, 16); static DECLARE_AD5064_CHANNELS(ad5064_channels, 16);
static DECLARE_AD5065_CHANNELS(ad5025_channels, 12);
static DECLARE_AD5065_CHANNELS(ad5045_channels, 14);
static DECLARE_AD5065_CHANNELS(ad5065_channels, 16);
static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
[ID_AD5024] = { [ID_AD5024] = {
.shared_vref = false, .shared_vref = false,
...@@ -328,7 +337,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { ...@@ -328,7 +337,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
}, },
[ID_AD5025] = { [ID_AD5025] = {
.shared_vref = false, .shared_vref = false,
.channels = ad5024_channels, .channels = ad5025_channels,
.num_channels = 2, .num_channels = 2,
}, },
[ID_AD5044] = { [ID_AD5044] = {
...@@ -338,7 +347,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { ...@@ -338,7 +347,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
}, },
[ID_AD5045] = { [ID_AD5045] = {
.shared_vref = false, .shared_vref = false,
.channels = ad5044_channels, .channels = ad5045_channels,
.num_channels = 2, .num_channels = 2,
}, },
[ID_AD5064] = { [ID_AD5064] = {
...@@ -353,7 +362,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { ...@@ -353,7 +362,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = {
}, },
[ID_AD5065] = { [ID_AD5065] = {
.shared_vref = false, .shared_vref = false,
.channels = ad5064_channels, .channels = ad5065_channels,
.num_channels = 2, .num_channels = 2,
}, },
[ID_AD5628_1] = { [ID_AD5628_1] = {
......
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