.. | .. |
---|
1 | | -// SPDX-License-Identifier: GPL-2.0+ |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
---|
2 | 2 | /* |
---|
3 | 3 | * AD5686R, AD5685R, AD5684R Digital to analog converters driver |
---|
4 | 4 | * |
---|
.. | .. |
---|
71 | 71 | int ret; |
---|
72 | 72 | struct ad5686_state *st = iio_priv(indio_dev); |
---|
73 | 73 | unsigned int val, ref_bit_msk; |
---|
74 | | - u8 shift; |
---|
| 74 | + u8 shift, address = 0; |
---|
75 | 75 | |
---|
76 | 76 | ret = strtobool(buf, &readin); |
---|
77 | 77 | if (ret) |
---|
.. | .. |
---|
83 | 83 | st->pwr_down_mask &= ~(0x3 << (chan->channel * 2)); |
---|
84 | 84 | |
---|
85 | 85 | switch (st->chip_info->regmap_type) { |
---|
| 86 | + case AD5310_REGMAP: |
---|
| 87 | + shift = 9; |
---|
| 88 | + ref_bit_msk = AD5310_REF_BIT_MSK; |
---|
| 89 | + break; |
---|
86 | 90 | case AD5683_REGMAP: |
---|
87 | 91 | shift = 13; |
---|
88 | 92 | ref_bit_msk = AD5683_REF_BIT_MSK; |
---|
.. | .. |
---|
90 | 94 | case AD5686_REGMAP: |
---|
91 | 95 | shift = 0; |
---|
92 | 96 | ref_bit_msk = 0; |
---|
| 97 | + /* AD5674R/AD5679R have 16 channels and 2 powerdown registers */ |
---|
| 98 | + if (chan->channel > 0x7) |
---|
| 99 | + address = 0x8; |
---|
93 | 100 | break; |
---|
94 | 101 | case AD5693_REGMAP: |
---|
95 | 102 | shift = 13; |
---|
.. | .. |
---|
103 | 110 | if (!st->use_internal_vref) |
---|
104 | 111 | val |= ref_bit_msk; |
---|
105 | 112 | |
---|
106 | | - ret = st->write(st, AD5686_CMD_POWERDOWN_DAC, 0, val); |
---|
| 113 | + ret = st->write(st, AD5686_CMD_POWERDOWN_DAC, |
---|
| 114 | + address, val >> (address * 2)); |
---|
107 | 115 | |
---|
108 | 116 | return ret ? ret : len; |
---|
109 | 117 | } |
---|
.. | .. |
---|
119 | 127 | |
---|
120 | 128 | switch (m) { |
---|
121 | 129 | case IIO_CHAN_INFO_RAW: |
---|
122 | | - mutex_lock(&indio_dev->mlock); |
---|
| 130 | + mutex_lock(&st->lock); |
---|
123 | 131 | ret = st->read(st, chan->address); |
---|
124 | | - mutex_unlock(&indio_dev->mlock); |
---|
| 132 | + mutex_unlock(&st->lock); |
---|
125 | 133 | if (ret < 0) |
---|
126 | 134 | return ret; |
---|
127 | 135 | *val = (ret >> chan->scan_type.shift) & |
---|
.. | .. |
---|
149 | 157 | if (val > (1 << chan->scan_type.realbits) || val < 0) |
---|
150 | 158 | return -EINVAL; |
---|
151 | 159 | |
---|
152 | | - mutex_lock(&indio_dev->mlock); |
---|
| 160 | + mutex_lock(&st->lock); |
---|
153 | 161 | ret = st->write(st, |
---|
154 | 162 | AD5686_CMD_WRITE_INPUT_N_UPDATE_N, |
---|
155 | 163 | chan->address, |
---|
156 | 164 | val << chan->scan_type.shift); |
---|
157 | | - mutex_unlock(&indio_dev->mlock); |
---|
| 165 | + mutex_unlock(&st->lock); |
---|
158 | 166 | break; |
---|
159 | 167 | default: |
---|
160 | 168 | ret = -EINVAL; |
---|
.. | .. |
---|
198 | 206 | } |
---|
199 | 207 | |
---|
200 | 208 | #define DECLARE_AD5693_CHANNELS(name, bits, _shift) \ |
---|
201 | | -static struct iio_chan_spec name[] = { \ |
---|
| 209 | +static const struct iio_chan_spec name[] = { \ |
---|
202 | 210 | AD5868_CHANNEL(0, 0, bits, _shift), \ |
---|
203 | 211 | } |
---|
204 | 212 | |
---|
205 | 213 | #define DECLARE_AD5686_CHANNELS(name, bits, _shift) \ |
---|
206 | | -static struct iio_chan_spec name[] = { \ |
---|
| 214 | +static const struct iio_chan_spec name[] = { \ |
---|
207 | 215 | AD5868_CHANNEL(0, 1, bits, _shift), \ |
---|
208 | 216 | AD5868_CHANNEL(1, 2, bits, _shift), \ |
---|
209 | 217 | AD5868_CHANNEL(2, 4, bits, _shift), \ |
---|
.. | .. |
---|
211 | 219 | } |
---|
212 | 220 | |
---|
213 | 221 | #define DECLARE_AD5676_CHANNELS(name, bits, _shift) \ |
---|
214 | | -static struct iio_chan_spec name[] = { \ |
---|
| 222 | +static const struct iio_chan_spec name[] = { \ |
---|
215 | 223 | AD5868_CHANNEL(0, 0, bits, _shift), \ |
---|
216 | 224 | AD5868_CHANNEL(1, 1, bits, _shift), \ |
---|
217 | 225 | AD5868_CHANNEL(2, 2, bits, _shift), \ |
---|
.. | .. |
---|
222 | 230 | AD5868_CHANNEL(7, 7, bits, _shift), \ |
---|
223 | 231 | } |
---|
224 | 232 | |
---|
| 233 | +#define DECLARE_AD5679_CHANNELS(name, bits, _shift) \ |
---|
| 234 | +static const struct iio_chan_spec name[] = { \ |
---|
| 235 | + AD5868_CHANNEL(0, 0, bits, _shift), \ |
---|
| 236 | + AD5868_CHANNEL(1, 1, bits, _shift), \ |
---|
| 237 | + AD5868_CHANNEL(2, 2, bits, _shift), \ |
---|
| 238 | + AD5868_CHANNEL(3, 3, bits, _shift), \ |
---|
| 239 | + AD5868_CHANNEL(4, 4, bits, _shift), \ |
---|
| 240 | + AD5868_CHANNEL(5, 5, bits, _shift), \ |
---|
| 241 | + AD5868_CHANNEL(6, 6, bits, _shift), \ |
---|
| 242 | + AD5868_CHANNEL(7, 7, bits, _shift), \ |
---|
| 243 | + AD5868_CHANNEL(8, 8, bits, _shift), \ |
---|
| 244 | + AD5868_CHANNEL(9, 9, bits, _shift), \ |
---|
| 245 | + AD5868_CHANNEL(10, 10, bits, _shift), \ |
---|
| 246 | + AD5868_CHANNEL(11, 11, bits, _shift), \ |
---|
| 247 | + AD5868_CHANNEL(12, 12, bits, _shift), \ |
---|
| 248 | + AD5868_CHANNEL(13, 13, bits, _shift), \ |
---|
| 249 | + AD5868_CHANNEL(14, 14, bits, _shift), \ |
---|
| 250 | + AD5868_CHANNEL(15, 15, bits, _shift), \ |
---|
| 251 | +} |
---|
| 252 | + |
---|
| 253 | +DECLARE_AD5693_CHANNELS(ad5310r_channels, 10, 2); |
---|
225 | 254 | DECLARE_AD5693_CHANNELS(ad5311r_channels, 10, 6); |
---|
226 | 255 | DECLARE_AD5676_CHANNELS(ad5672_channels, 12, 4); |
---|
| 256 | +DECLARE_AD5679_CHANNELS(ad5674r_channels, 12, 4); |
---|
227 | 257 | DECLARE_AD5676_CHANNELS(ad5676_channels, 16, 0); |
---|
| 258 | +DECLARE_AD5679_CHANNELS(ad5679r_channels, 16, 0); |
---|
228 | 259 | DECLARE_AD5686_CHANNELS(ad5684_channels, 12, 4); |
---|
229 | 260 | DECLARE_AD5686_CHANNELS(ad5685r_channels, 14, 2); |
---|
230 | 261 | DECLARE_AD5686_CHANNELS(ad5686_channels, 16, 0); |
---|
.. | .. |
---|
233 | 264 | DECLARE_AD5693_CHANNELS(ad5691r_channels, 12, 4); |
---|
234 | 265 | |
---|
235 | 266 | static const struct ad5686_chip_info ad5686_chip_info_tbl[] = { |
---|
| 267 | + [ID_AD5310R] = { |
---|
| 268 | + .channels = ad5310r_channels, |
---|
| 269 | + .int_vref_mv = 2500, |
---|
| 270 | + .num_channels = 1, |
---|
| 271 | + .regmap_type = AD5310_REGMAP, |
---|
| 272 | + }, |
---|
236 | 273 | [ID_AD5311R] = { |
---|
237 | 274 | .channels = ad5311r_channels, |
---|
238 | 275 | .int_vref_mv = 2500, |
---|
.. | .. |
---|
251 | 288 | .num_channels = 8, |
---|
252 | 289 | .regmap_type = AD5686_REGMAP, |
---|
253 | 290 | }, |
---|
| 291 | + [ID_AD5674R] = { |
---|
| 292 | + .channels = ad5674r_channels, |
---|
| 293 | + .int_vref_mv = 2500, |
---|
| 294 | + .num_channels = 16, |
---|
| 295 | + .regmap_type = AD5686_REGMAP, |
---|
| 296 | + }, |
---|
254 | 297 | [ID_AD5675R] = { |
---|
255 | 298 | .channels = ad5676_channels, |
---|
256 | 299 | .int_vref_mv = 2500, |
---|
.. | .. |
---|
266 | 309 | .channels = ad5676_channels, |
---|
267 | 310 | .int_vref_mv = 2500, |
---|
268 | 311 | .num_channels = 8, |
---|
| 312 | + .regmap_type = AD5686_REGMAP, |
---|
| 313 | + }, |
---|
| 314 | + [ID_AD5679R] = { |
---|
| 315 | + .channels = ad5679r_channels, |
---|
| 316 | + .int_vref_mv = 2500, |
---|
| 317 | + .num_channels = 16, |
---|
269 | 318 | .regmap_type = AD5686_REGMAP, |
---|
270 | 319 | }, |
---|
271 | 320 | [ID_AD5681R] = { |
---|
.. | .. |
---|
412 | 461 | for (i = 0; i < st->chip_info->num_channels; i++) |
---|
413 | 462 | st->pwr_down_mode |= (0x01 << (i * 2)); |
---|
414 | 463 | |
---|
415 | | - indio_dev->dev.parent = dev; |
---|
416 | 464 | indio_dev->name = name; |
---|
417 | 465 | indio_dev->info = &ad5686_info; |
---|
418 | 466 | indio_dev->modes = INDIO_DIRECT_MODE; |
---|
419 | 467 | indio_dev->channels = st->chip_info->channels; |
---|
420 | 468 | indio_dev->num_channels = st->chip_info->num_channels; |
---|
421 | 469 | |
---|
| 470 | + mutex_init(&st->lock); |
---|
| 471 | + |
---|
422 | 472 | switch (st->chip_info->regmap_type) { |
---|
| 473 | + case AD5310_REGMAP: |
---|
| 474 | + cmd = AD5686_CMD_CONTROL_REG; |
---|
| 475 | + ref_bit_msk = AD5310_REF_BIT_MSK; |
---|
| 476 | + st->use_internal_vref = !voltage_uv; |
---|
| 477 | + break; |
---|
423 | 478 | case AD5683_REGMAP: |
---|
424 | 479 | cmd = AD5686_CMD_CONTROL_REG; |
---|
425 | 480 | ref_bit_msk = AD5683_REF_BIT_MSK; |
---|
.. | .. |
---|
471 | 526 | } |
---|
472 | 527 | EXPORT_SYMBOL_GPL(ad5686_remove); |
---|
473 | 528 | |
---|
474 | | -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); |
---|
| 529 | +MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); |
---|
475 | 530 | MODULE_DESCRIPTION("Analog Devices AD5686/85/84 DAC"); |
---|
476 | 531 | MODULE_LICENSE("GPL v2"); |
---|