diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2013-03-01 08:07:00 -0500 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2013-03-02 11:22:13 -0500 |
commit | a26302628ad164980493ab7768a05a7f3a8d8842 (patch) | |
tree | 7c621c678c86361cfd03e03d68990c31817e84ee /drivers/iio/dac | |
parent | 76426daf50d5df38893cc189e9ccd026093debc8 (diff) |
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: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio/dac')
-rw-r--r-- | drivers/iio/dac/ad5064.c | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/drivers/iio/dac/ad5064.c b/drivers/iio/dac/ad5064.c index 2fe1d4edcb2f..7b777083cb48 100644 --- a/drivers/iio/dac/ad5064.c +++ b/drivers/iio/dac/ad5064.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #define AD5064_ADDR(x) ((x) << 20) | 27 | #define AD5064_ADDR(x) ((x) << 20) |
28 | #define AD5064_CMD(x) ((x) << 24) | 28 | #define AD5064_CMD(x) ((x) << 24) |
29 | 29 | ||
30 | #define AD5064_ADDR_DAC(chan) (chan) | ||
31 | #define AD5064_ADDR_ALL_DAC 0xF | 30 | #define AD5064_ADDR_ALL_DAC 0xF |
32 | 31 | ||
33 | #define AD5064_CMD_WRITE_INPUT_N 0x0 | 32 | #define AD5064_CMD_WRITE_INPUT_N 0x0 |
@@ -131,15 +130,15 @@ static int ad5064_write(struct ad5064_state *st, unsigned int cmd, | |||
131 | } | 130 | } |
132 | 131 | ||
133 | static int ad5064_sync_powerdown_mode(struct ad5064_state *st, | 132 | static int ad5064_sync_powerdown_mode(struct ad5064_state *st, |
134 | unsigned int channel) | 133 | const struct iio_chan_spec *chan) |
135 | { | 134 | { |
136 | unsigned int val; | 135 | unsigned int val; |
137 | int ret; | 136 | int ret; |
138 | 137 | ||
139 | val = (0x1 << channel); | 138 | val = (0x1 << chan->address); |
140 | 139 | ||
141 | if (st->pwr_down[channel]) | 140 | if (st->pwr_down[chan->channel]) |
142 | val |= st->pwr_down_mode[channel] << 8; | 141 | val |= st->pwr_down_mode[chan->channel] << 8; |
143 | 142 | ||
144 | ret = ad5064_write(st, AD5064_CMD_POWERDOWN_DAC, 0, val, 0); | 143 | ret = ad5064_write(st, AD5064_CMD_POWERDOWN_DAC, 0, val, 0); |
145 | 144 | ||
@@ -169,7 +168,7 @@ static int ad5064_set_powerdown_mode(struct iio_dev *indio_dev, | |||
169 | mutex_lock(&indio_dev->mlock); | 168 | mutex_lock(&indio_dev->mlock); |
170 | st->pwr_down_mode[chan->channel] = mode + 1; | 169 | st->pwr_down_mode[chan->channel] = mode + 1; |
171 | 170 | ||
172 | ret = ad5064_sync_powerdown_mode(st, chan->channel); | 171 | ret = ad5064_sync_powerdown_mode(st, chan); |
173 | mutex_unlock(&indio_dev->mlock); | 172 | mutex_unlock(&indio_dev->mlock); |
174 | 173 | ||
175 | return ret; | 174 | return ret; |
@@ -205,7 +204,7 @@ static ssize_t ad5064_write_dac_powerdown(struct iio_dev *indio_dev, | |||
205 | mutex_lock(&indio_dev->mlock); | 204 | mutex_lock(&indio_dev->mlock); |
206 | st->pwr_down[chan->channel] = pwr_down; | 205 | st->pwr_down[chan->channel] = pwr_down; |
207 | 206 | ||
208 | ret = ad5064_sync_powerdown_mode(st, chan->channel); | 207 | ret = ad5064_sync_powerdown_mode(st, chan); |
209 | mutex_unlock(&indio_dev->mlock); | 208 | mutex_unlock(&indio_dev->mlock); |
210 | return ret ? ret : len; | 209 | return ret ? ret : len; |
211 | } | 210 | } |
@@ -292,34 +291,44 @@ static const struct iio_chan_spec_ext_info ad5064_ext_info[] = { | |||
292 | { }, | 291 | { }, |
293 | }; | 292 | }; |
294 | 293 | ||
295 | #define AD5064_CHANNEL(chan, bits) { \ | 294 | #define AD5064_CHANNEL(chan, addr, bits) { \ |
296 | .type = IIO_VOLTAGE, \ | 295 | .type = IIO_VOLTAGE, \ |
297 | .indexed = 1, \ | 296 | .indexed = 1, \ |
298 | .output = 1, \ | 297 | .output = 1, \ |
299 | .channel = (chan), \ | 298 | .channel = (chan), \ |
300 | .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ | 299 | .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT | \ |
301 | IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \ | 300 | IIO_CHAN_INFO_SCALE_SEPARATE_BIT, \ |
302 | .address = AD5064_ADDR_DAC(chan), \ | 301 | .address = addr, \ |
303 | .scan_type = IIO_ST('u', (bits), 16, 20 - (bits)), \ | 302 | .scan_type = IIO_ST('u', (bits), 16, 20 - (bits)), \ |
304 | .ext_info = ad5064_ext_info, \ | 303 | .ext_info = ad5064_ext_info, \ |
305 | } | 304 | } |
306 | 305 | ||
307 | #define DECLARE_AD5064_CHANNELS(name, bits) \ | 306 | #define DECLARE_AD5064_CHANNELS(name, bits) \ |
308 | const struct iio_chan_spec name[] = { \ | 307 | const struct iio_chan_spec name[] = { \ |
309 | AD5064_CHANNEL(0, bits), \ | 308 | AD5064_CHANNEL(0, 0, bits), \ |
310 | AD5064_CHANNEL(1, bits), \ | 309 | AD5064_CHANNEL(1, 1, bits), \ |
311 | AD5064_CHANNEL(2, bits), \ | 310 | AD5064_CHANNEL(2, 2, bits), \ |
312 | AD5064_CHANNEL(3, bits), \ | 311 | AD5064_CHANNEL(3, 3, bits), \ |
313 | AD5064_CHANNEL(4, bits), \ | 312 | AD5064_CHANNEL(4, 4, bits), \ |
314 | AD5064_CHANNEL(5, bits), \ | 313 | AD5064_CHANNEL(5, 5, bits), \ |
315 | AD5064_CHANNEL(6, bits), \ | 314 | AD5064_CHANNEL(6, 6, bits), \ |
316 | AD5064_CHANNEL(7, bits), \ | 315 | AD5064_CHANNEL(7, 7, bits), \ |
316 | } | ||
317 | |||
318 | #define DECLARE_AD5065_CHANNELS(name, bits) \ | ||
319 | const struct iio_chan_spec name[] = { \ | ||
320 | AD5064_CHANNEL(0, 0, bits), \ | ||
321 | AD5064_CHANNEL(1, 3, bits), \ | ||
317 | } | 322 | } |
318 | 323 | ||
319 | static DECLARE_AD5064_CHANNELS(ad5024_channels, 12); | 324 | static DECLARE_AD5064_CHANNELS(ad5024_channels, 12); |
320 | static DECLARE_AD5064_CHANNELS(ad5044_channels, 14); | 325 | static DECLARE_AD5064_CHANNELS(ad5044_channels, 14); |
321 | static DECLARE_AD5064_CHANNELS(ad5064_channels, 16); | 326 | static DECLARE_AD5064_CHANNELS(ad5064_channels, 16); |
322 | 327 | ||
328 | static DECLARE_AD5065_CHANNELS(ad5025_channels, 12); | ||
329 | static DECLARE_AD5065_CHANNELS(ad5045_channels, 14); | ||
330 | static DECLARE_AD5065_CHANNELS(ad5065_channels, 16); | ||
331 | |||
323 | static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { | 332 | static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { |
324 | [ID_AD5024] = { | 333 | [ID_AD5024] = { |
325 | .shared_vref = false, | 334 | .shared_vref = false, |
@@ -328,7 +337,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { | |||
328 | }, | 337 | }, |
329 | [ID_AD5025] = { | 338 | [ID_AD5025] = { |
330 | .shared_vref = false, | 339 | .shared_vref = false, |
331 | .channels = ad5024_channels, | 340 | .channels = ad5025_channels, |
332 | .num_channels = 2, | 341 | .num_channels = 2, |
333 | }, | 342 | }, |
334 | [ID_AD5044] = { | 343 | [ID_AD5044] = { |
@@ -338,7 +347,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { | |||
338 | }, | 347 | }, |
339 | [ID_AD5045] = { | 348 | [ID_AD5045] = { |
340 | .shared_vref = false, | 349 | .shared_vref = false, |
341 | .channels = ad5044_channels, | 350 | .channels = ad5045_channels, |
342 | .num_channels = 2, | 351 | .num_channels = 2, |
343 | }, | 352 | }, |
344 | [ID_AD5064] = { | 353 | [ID_AD5064] = { |
@@ -353,7 +362,7 @@ static const struct ad5064_chip_info ad5064_chip_info_tbl[] = { | |||
353 | }, | 362 | }, |
354 | [ID_AD5065] = { | 363 | [ID_AD5065] = { |
355 | .shared_vref = false, | 364 | .shared_vref = false, |
356 | .channels = ad5064_channels, | 365 | .channels = ad5065_channels, |
357 | .num_channels = 2, | 366 | .num_channels = 2, |
358 | }, | 367 | }, |
359 | [ID_AD5628_1] = { | 368 | [ID_AD5628_1] = { |