2 * AD7787/AD7788/AD7789/AD7790/AD7791 SPI ADC driver
4 * Copyright 2012 Analog Devices Inc.
5 * Author: Lars-Peter Clausen <lars@metafoo.de>
7 * Licensed under the GPL-2.
10 #include <linux/interrupt.h>
11 #include <linux/device.h>
12 #include <linux/kernel.h>
13 #include <linux/slab.h>
14 #include <linux/sysfs.h>
15 #include <linux/spi/spi.h>
16 #include <linux/regulator/consumer.h>
17 #include <linux/err.h>
18 #include <linux/sched.h>
19 #include <linux/delay.h>
20 #include <linux/module.h>
22 #include <linux/iio/iio.h>
23 #include <linux/iio/sysfs.h>
24 #include <linux/iio/buffer.h>
25 #include <linux/iio/trigger.h>
26 #include <linux/iio/trigger_consumer.h>
27 #include <linux/iio/triggered_buffer.h>
28 #include <linux/iio/adc/ad_sigma_delta.h>
30 #include <linux/platform_data/ad7791.h>
32 #define AD7791_REG_COMM 0x0 /* For writes */
33 #define AD7791_REG_STATUS 0x0 /* For reads */
34 #define AD7791_REG_MODE 0x1
35 #define AD7791_REG_FILTER 0x2
36 #define AD7791_REG_DATA 0x3
38 #define AD7791_MODE_CONTINUOUS 0x00
39 #define AD7791_MODE_SINGLE 0x02
40 #define AD7791_MODE_POWERDOWN 0x03
42 #define AD7791_CH_AIN1P_AIN1N 0x00
43 #define AD7791_CH_AIN2 0x01
44 #define AD7791_CH_AIN1N_AIN1N 0x02
45 #define AD7791_CH_AVDD_MONITOR 0x03
47 #define AD7791_FILTER_CLK_DIV_1 (0x0 << 4)
48 #define AD7791_FILTER_CLK_DIV_2 (0x1 << 4)
49 #define AD7791_FILTER_CLK_DIV_4 (0x2 << 4)
50 #define AD7791_FILTER_CLK_DIV_8 (0x3 << 4)
51 #define AD7791_FILTER_CLK_MASK (0x3 << 4)
52 #define AD7791_FILTER_RATE_120 0x0
53 #define AD7791_FILTER_RATE_100 0x1
54 #define AD7791_FILTER_RATE_33_3 0x2
55 #define AD7791_FILTER_RATE_20 0x3
56 #define AD7791_FILTER_RATE_16_6 0x4
57 #define AD7791_FILTER_RATE_16_7 0x5
58 #define AD7791_FILTER_RATE_13_3 0x6
59 #define AD7791_FILTER_RATE_9_5 0x7
60 #define AD7791_FILTER_RATE_MASK 0x7
62 #define AD7791_MODE_BUFFER BIT(1)
63 #define AD7791_MODE_UNIPOLAR BIT(2)
64 #define AD7791_MODE_BURNOUT BIT(3)
65 #define AD7791_MODE_SEL_MASK (0x3 << 6)
66 #define AD7791_MODE_SEL(x) ((x) << 6)
68 #define DECLARE_AD7787_CHANNELS(name, bits, storagebits) \
69 const struct iio_chan_spec name[] = { \
70 AD_SD_DIFF_CHANNEL(0, 0, 0, AD7791_CH_AIN1P_AIN1N, \
71 (bits), (storagebits), 0), \
72 AD_SD_CHANNEL(1, 1, AD7791_CH_AIN2, (bits), (storagebits), 0), \
73 AD_SD_SHORTED_CHANNEL(2, 0, AD7791_CH_AIN1N_AIN1N, \
74 (bits), (storagebits), 0), \
75 AD_SD_SUPPLY_CHANNEL(3, 2, AD7791_CH_AVDD_MONITOR, \
76 (bits), (storagebits), 0), \
77 IIO_CHAN_SOFT_TIMESTAMP(4), \
80 #define DECLARE_AD7791_CHANNELS(name, bits, storagebits) \
81 const struct iio_chan_spec name[] = { \
82 AD_SD_DIFF_CHANNEL(0, 0, 0, AD7791_CH_AIN1P_AIN1N, \
83 (bits), (storagebits), 0), \
84 AD_SD_SHORTED_CHANNEL(1, 0, AD7791_CH_AIN1N_AIN1N, \
85 (bits), (storagebits), 0), \
86 AD_SD_SUPPLY_CHANNEL(2, 1, AD7791_CH_AVDD_MONITOR, \
87 (bits), (storagebits), 0), \
88 IIO_CHAN_SOFT_TIMESTAMP(3), \
91 static DECLARE_AD7787_CHANNELS(ad7787_channels
, 24, 32);
92 static DECLARE_AD7791_CHANNELS(ad7790_channels
, 16, 16);
93 static DECLARE_AD7791_CHANNELS(ad7791_channels
, 24, 32);
103 enum ad7791_chip_info_flags
{
104 AD7791_FLAG_HAS_FILTER
= (1 << 0),
105 AD7791_FLAG_HAS_BUFFER
= (1 << 1),
106 AD7791_FLAG_HAS_UNIPOLAR
= (1 << 2),
107 AD7791_FLAG_HAS_BURNOUT
= (1 << 3),
110 struct ad7791_chip_info
{
111 const struct iio_chan_spec
*channels
;
112 unsigned int num_channels
;
113 enum ad7791_chip_info_flags flags
;
116 static const struct ad7791_chip_info ad7791_chip_infos
[] = {
118 .channels
= ad7787_channels
,
119 .num_channels
= ARRAY_SIZE(ad7787_channels
),
120 .flags
= AD7791_FLAG_HAS_FILTER
| AD7791_FLAG_HAS_BUFFER
|
121 AD7791_FLAG_HAS_UNIPOLAR
| AD7791_FLAG_HAS_BURNOUT
,
124 .channels
= ad7790_channels
,
125 .num_channels
= ARRAY_SIZE(ad7790_channels
),
126 .flags
= AD7791_FLAG_HAS_UNIPOLAR
,
129 .channels
= ad7791_channels
,
130 .num_channels
= ARRAY_SIZE(ad7791_channels
),
131 .flags
= AD7791_FLAG_HAS_UNIPOLAR
,
134 .channels
= ad7790_channels
,
135 .num_channels
= ARRAY_SIZE(ad7790_channels
),
136 .flags
= AD7791_FLAG_HAS_FILTER
| AD7791_FLAG_HAS_BUFFER
|
137 AD7791_FLAG_HAS_BURNOUT
,
140 .channels
= ad7791_channels
,
141 .num_channels
= ARRAY_SIZE(ad7791_channels
),
142 .flags
= AD7791_FLAG_HAS_FILTER
| AD7791_FLAG_HAS_BUFFER
|
143 AD7791_FLAG_HAS_UNIPOLAR
| AD7791_FLAG_HAS_BURNOUT
,
147 struct ad7791_state
{
148 struct ad_sigma_delta sd
;
152 struct regulator
*reg
;
153 const struct ad7791_chip_info
*info
;
156 static struct ad7791_state
*ad_sigma_delta_to_ad7791(struct ad_sigma_delta
*sd
)
158 return container_of(sd
, struct ad7791_state
, sd
);
161 static int ad7791_set_channel(struct ad_sigma_delta
*sd
, unsigned int channel
)
163 ad_sd_set_comm(sd
, channel
);
168 static int ad7791_set_mode(struct ad_sigma_delta
*sd
,
169 enum ad_sigma_delta_mode mode
)
171 struct ad7791_state
*st
= ad_sigma_delta_to_ad7791(sd
);
174 case AD_SD_MODE_CONTINUOUS
:
175 mode
= AD7791_MODE_CONTINUOUS
;
177 case AD_SD_MODE_SINGLE
:
178 mode
= AD7791_MODE_SINGLE
;
180 case AD_SD_MODE_IDLE
:
181 case AD_SD_MODE_POWERDOWN
:
182 mode
= AD7791_MODE_POWERDOWN
;
186 st
->mode
&= ~AD7791_MODE_SEL_MASK
;
187 st
->mode
|= AD7791_MODE_SEL(mode
);
189 return ad_sd_write_reg(sd
, AD7791_REG_MODE
, sizeof(st
->mode
), st
->mode
);
192 static const struct ad_sigma_delta_info ad7791_sigma_delta_info
= {
193 .set_channel
= ad7791_set_channel
,
194 .set_mode
= ad7791_set_mode
,
195 .has_registers
= true,
200 static int ad7791_read_raw(struct iio_dev
*indio_dev
,
201 const struct iio_chan_spec
*chan
, int *val
, int *val2
, long info
)
203 struct ad7791_state
*st
= iio_priv(indio_dev
);
204 bool unipolar
= !!(st
->mode
& AD7791_MODE_UNIPOLAR
);
207 case IIO_CHAN_INFO_RAW
:
208 return ad_sigma_delta_single_conversion(indio_dev
, chan
, val
);
209 case IIO_CHAN_INFO_OFFSET
:
211 * Unipolar: 0 to VREF
212 * Bipolar -VREF to VREF
217 *val
= -(1 << (chan
->scan_type
.realbits
- 1));
219 case IIO_CHAN_INFO_SCALE
:
220 /* The monitor channel uses an internal reference. */
221 if (chan
->address
== AD7791_CH_AVDD_MONITOR
) {
223 * The signal is attenuated by a factor of 5 and
224 * compared against a 1.17V internal reference.
230 voltage_uv
= regulator_get_voltage(st
->reg
);
234 *val
= voltage_uv
/ 1000;
237 *val2
= chan
->scan_type
.realbits
;
239 *val2
= chan
->scan_type
.realbits
- 1;
241 return IIO_VAL_FRACTIONAL_LOG2
;
247 static const char * const ad7791_sample_freq_avail
[] = {
248 [AD7791_FILTER_RATE_120
] = "120",
249 [AD7791_FILTER_RATE_100
] = "100",
250 [AD7791_FILTER_RATE_33_3
] = "33.3",
251 [AD7791_FILTER_RATE_20
] = "20",
252 [AD7791_FILTER_RATE_16_6
] = "16.6",
253 [AD7791_FILTER_RATE_16_7
] = "16.7",
254 [AD7791_FILTER_RATE_13_3
] = "13.3",
255 [AD7791_FILTER_RATE_9_5
] = "9.5",
258 static ssize_t
ad7791_read_frequency(struct device
*dev
,
259 struct device_attribute
*attr
, char *buf
)
261 struct iio_dev
*indio_dev
= dev_to_iio_dev(dev
);
262 struct ad7791_state
*st
= iio_priv(indio_dev
);
263 unsigned int rate
= st
->filter
& AD7791_FILTER_RATE_MASK
;
265 return sprintf(buf
, "%s\n", ad7791_sample_freq_avail
[rate
]);
268 static ssize_t
ad7791_write_frequency(struct device
*dev
,
269 struct device_attribute
*attr
, const char *buf
, size_t len
)
271 struct iio_dev
*indio_dev
= dev_to_iio_dev(dev
);
272 struct ad7791_state
*st
= iio_priv(indio_dev
);
275 mutex_lock(&indio_dev
->mlock
);
276 if (iio_buffer_enabled(indio_dev
)) {
277 mutex_unlock(&indio_dev
->mlock
);
280 mutex_unlock(&indio_dev
->mlock
);
284 for (i
= 0; i
< ARRAY_SIZE(ad7791_sample_freq_avail
); i
++) {
285 if (sysfs_streq(ad7791_sample_freq_avail
[i
], buf
)) {
287 mutex_lock(&indio_dev
->mlock
);
288 st
->filter
&= ~AD7791_FILTER_RATE_MASK
;
290 ad_sd_write_reg(&st
->sd
, AD7791_REG_FILTER
,
291 sizeof(st
->filter
), st
->filter
);
292 mutex_unlock(&indio_dev
->mlock
);
298 return ret
? ret
: len
;
301 static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR
| S_IRUGO
,
302 ad7791_read_frequency
,
303 ad7791_write_frequency
);
305 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("120 100 33.3 20 16.7 16.6 13.3 9.5");
307 static struct attribute
*ad7791_attributes
[] = {
308 &iio_dev_attr_sampling_frequency
.dev_attr
.attr
,
309 &iio_const_attr_sampling_frequency_available
.dev_attr
.attr
,
313 static const struct attribute_group ad7791_attribute_group
= {
314 .attrs
= ad7791_attributes
,
317 static const struct iio_info ad7791_info
= {
318 .read_raw
= &ad7791_read_raw
,
319 .attrs
= &ad7791_attribute_group
,
320 .validate_trigger
= ad_sd_validate_trigger
,
321 .driver_module
= THIS_MODULE
,
324 static const struct iio_info ad7791_no_filter_info
= {
325 .read_raw
= &ad7791_read_raw
,
326 .validate_trigger
= ad_sd_validate_trigger
,
327 .driver_module
= THIS_MODULE
,
330 static int ad7791_setup(struct ad7791_state
*st
,
331 struct ad7791_platform_data
*pdata
)
333 /* Set to poweron-reset default values */
334 st
->mode
= AD7791_MODE_BUFFER
;
335 st
->filter
= AD7791_FILTER_RATE_16_6
;
340 if ((st
->info
->flags
& AD7791_FLAG_HAS_BUFFER
) && !pdata
->buffered
)
341 st
->mode
&= ~AD7791_MODE_BUFFER
;
343 if ((st
->info
->flags
& AD7791_FLAG_HAS_BURNOUT
) &&
344 pdata
->burnout_current
)
345 st
->mode
|= AD7791_MODE_BURNOUT
;
347 if ((st
->info
->flags
& AD7791_FLAG_HAS_UNIPOLAR
) && pdata
->unipolar
)
348 st
->mode
|= AD7791_MODE_UNIPOLAR
;
350 return ad_sd_write_reg(&st
->sd
, AD7791_REG_MODE
, sizeof(st
->mode
),
354 static int ad7791_probe(struct spi_device
*spi
)
356 struct ad7791_platform_data
*pdata
= spi
->dev
.platform_data
;
357 struct iio_dev
*indio_dev
;
358 struct ad7791_state
*st
;
362 dev_err(&spi
->dev
, "Missing IRQ.\n");
366 indio_dev
= devm_iio_device_alloc(&spi
->dev
, sizeof(*st
));
370 st
= iio_priv(indio_dev
);
372 st
->reg
= devm_regulator_get(&spi
->dev
, "refin");
374 return PTR_ERR(st
->reg
);
376 ret
= regulator_enable(st
->reg
);
380 st
->info
= &ad7791_chip_infos
[spi_get_device_id(spi
)->driver_data
];
381 ad_sd_init(&st
->sd
, indio_dev
, spi
, &ad7791_sigma_delta_info
);
383 spi_set_drvdata(spi
, indio_dev
);
385 indio_dev
->dev
.parent
= &spi
->dev
;
386 indio_dev
->name
= spi_get_device_id(spi
)->name
;
387 indio_dev
->modes
= INDIO_DIRECT_MODE
;
388 indio_dev
->channels
= st
->info
->channels
;
389 indio_dev
->num_channels
= st
->info
->num_channels
;
390 if (st
->info
->flags
& AD7791_FLAG_HAS_FILTER
)
391 indio_dev
->info
= &ad7791_info
;
393 indio_dev
->info
= &ad7791_no_filter_info
;
395 ret
= ad_sd_setup_buffer_and_trigger(indio_dev
);
397 goto error_disable_reg
;
399 ret
= ad7791_setup(st
, pdata
);
401 goto error_remove_trigger
;
403 ret
= iio_device_register(indio_dev
);
405 goto error_remove_trigger
;
409 error_remove_trigger
:
410 ad_sd_cleanup_buffer_and_trigger(indio_dev
);
412 regulator_disable(st
->reg
);
417 static int ad7791_remove(struct spi_device
*spi
)
419 struct iio_dev
*indio_dev
= spi_get_drvdata(spi
);
420 struct ad7791_state
*st
= iio_priv(indio_dev
);
422 iio_device_unregister(indio_dev
);
423 ad_sd_cleanup_buffer_and_trigger(indio_dev
);
425 regulator_disable(st
->reg
);
430 static const struct spi_device_id ad7791_spi_ids
[] = {
431 { "ad7787", AD7787
},
432 { "ad7788", AD7788
},
433 { "ad7789", AD7789
},
434 { "ad7790", AD7790
},
435 { "ad7791", AD7791
},
438 MODULE_DEVICE_TABLE(spi
, ad7791_spi_ids
);
440 static struct spi_driver ad7791_driver
= {
443 .owner
= THIS_MODULE
,
445 .probe
= ad7791_probe
,
446 .remove
= ad7791_remove
,
447 .id_table
= ad7791_spi_ids
,
449 module_spi_driver(ad7791_driver
);
451 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
452 MODULE_DESCRIPTION("Analog Device AD7787/AD7788/AD7789/AD7790/AD7791 ADC driver");
453 MODULE_LICENSE("GPL v2");