diff options
Diffstat (limited to 'drivers/iio/adc')
-rw-r--r-- | drivers/iio/adc/ad7266.c | 7 | ||||
-rw-r--r-- | drivers/iio/adc/ad7476.c | 11 | ||||
-rw-r--r-- | drivers/iio/adc/ad7791.c | 36 | ||||
-rw-r--r-- | drivers/iio/adc/ad7793.c | 32 | ||||
-rw-r--r-- | drivers/iio/adc/ad7887.c | 11 | ||||
-rw-r--r-- | drivers/iio/adc/ad7923.c | 11 | ||||
-rw-r--r-- | drivers/iio/adc/ad799x.c | 24 | ||||
-rw-r--r-- | drivers/iio/adc/mxs-lradc.c | 34 | ||||
-rw-r--r-- | drivers/iio/adc/nau7802.c | 19 | ||||
-rw-r--r-- | drivers/iio/adc/ti-ads1015.c | 128 | ||||
-rw-r--r-- | drivers/iio/adc/ti_am335x_adc.c | 22 |
11 files changed, 198 insertions, 137 deletions
diff --git a/drivers/iio/adc/ad7266.c b/drivers/iio/adc/ad7266.c index 21e19b60e2b9..01240aeeeab0 100644 --- a/drivers/iio/adc/ad7266.c +++ b/drivers/iio/adc/ad7266.c | |||
@@ -154,12 +154,11 @@ static int ad7266_read_raw(struct iio_dev *indio_dev, | |||
154 | 154 | ||
155 | switch (m) { | 155 | switch (m) { |
156 | case IIO_CHAN_INFO_RAW: | 156 | case IIO_CHAN_INFO_RAW: |
157 | if (iio_buffer_enabled(indio_dev)) | 157 | ret = iio_device_claim_direct_mode(indio_dev); |
158 | return -EBUSY; | ||
159 | |||
160 | ret = ad7266_read_single(st, val, chan->address); | ||
161 | if (ret) | 158 | if (ret) |
162 | return ret; | 159 | return ret; |
160 | ret = ad7266_read_single(st, val, chan->address); | ||
161 | iio_device_release_direct_mode(indio_dev); | ||
163 | 162 | ||
164 | *val = (*val >> 2) & 0xfff; | 163 | *val = (*val >> 2) & 0xfff; |
165 | if (chan->scan_type.sign == 's') | 164 | if (chan->scan_type.sign == 's') |
diff --git a/drivers/iio/adc/ad7476.c b/drivers/iio/adc/ad7476.c index be85c2a0ad97..810c9a9fa62f 100644 --- a/drivers/iio/adc/ad7476.c +++ b/drivers/iio/adc/ad7476.c | |||
@@ -106,12 +106,11 @@ static int ad7476_read_raw(struct iio_dev *indio_dev, | |||
106 | 106 | ||
107 | switch (m) { | 107 | switch (m) { |
108 | case IIO_CHAN_INFO_RAW: | 108 | case IIO_CHAN_INFO_RAW: |
109 | mutex_lock(&indio_dev->mlock); | 109 | ret = iio_device_claim_direct_mode(indio_dev); |
110 | if (iio_buffer_enabled(indio_dev)) | 110 | if (ret) |
111 | ret = -EBUSY; | 111 | return ret; |
112 | else | 112 | ret = ad7476_scan_direct(st); |
113 | ret = ad7476_scan_direct(st); | 113 | iio_device_release_direct_mode(indio_dev); |
114 | mutex_unlock(&indio_dev->mlock); | ||
115 | 114 | ||
116 | if (ret < 0) | 115 | if (ret < 0) |
117 | return ret; | 116 | return ret; |
diff --git a/drivers/iio/adc/ad7791.c b/drivers/iio/adc/ad7791.c index cf172d58cd44..1dfe6410c64c 100644 --- a/drivers/iio/adc/ad7791.c +++ b/drivers/iio/adc/ad7791.c | |||
@@ -272,30 +272,22 @@ static ssize_t ad7791_write_frequency(struct device *dev, | |||
272 | struct ad7791_state *st = iio_priv(indio_dev); | 272 | struct ad7791_state *st = iio_priv(indio_dev); |
273 | int i, ret; | 273 | int i, ret; |
274 | 274 | ||
275 | mutex_lock(&indio_dev->mlock); | 275 | for (i = 0; i < ARRAY_SIZE(ad7791_sample_freq_avail); i++) |
276 | if (iio_buffer_enabled(indio_dev)) { | 276 | if (sysfs_streq(ad7791_sample_freq_avail[i], buf)) |
277 | mutex_unlock(&indio_dev->mlock); | ||
278 | return -EBUSY; | ||
279 | } | ||
280 | mutex_unlock(&indio_dev->mlock); | ||
281 | |||
282 | ret = -EINVAL; | ||
283 | |||
284 | for (i = 0; i < ARRAY_SIZE(ad7791_sample_freq_avail); i++) { | ||
285 | if (sysfs_streq(ad7791_sample_freq_avail[i], buf)) { | ||
286 | |||
287 | mutex_lock(&indio_dev->mlock); | ||
288 | st->filter &= ~AD7791_FILTER_RATE_MASK; | ||
289 | st->filter |= i; | ||
290 | ad_sd_write_reg(&st->sd, AD7791_REG_FILTER, | ||
291 | sizeof(st->filter), st->filter); | ||
292 | mutex_unlock(&indio_dev->mlock); | ||
293 | ret = 0; | ||
294 | break; | 277 | break; |
295 | } | 278 | if (i == ARRAY_SIZE(ad7791_sample_freq_avail)) |
296 | } | 279 | return -EINVAL; |
280 | |||
281 | ret = iio_device_claim_direct_mode(indio_dev); | ||
282 | if (ret) | ||
283 | return ret; | ||
284 | st->filter &= ~AD7791_FILTER_RATE_MASK; | ||
285 | st->filter |= i; | ||
286 | ad_sd_write_reg(&st->sd, AD7791_REG_FILTER, sizeof(st->filter), | ||
287 | st->filter); | ||
288 | iio_device_release_direct_mode(indio_dev); | ||
297 | 289 | ||
298 | return ret ? ret : len; | 290 | return len; |
299 | } | 291 | } |
300 | 292 | ||
301 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | 293 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, |
diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c index 7b07bb651671..a43722fbf03a 100644 --- a/drivers/iio/adc/ad7793.c +++ b/drivers/iio/adc/ad7793.c | |||
@@ -369,13 +369,6 @@ static ssize_t ad7793_write_frequency(struct device *dev, | |||
369 | long lval; | 369 | long lval; |
370 | int i, ret; | 370 | int i, ret; |
371 | 371 | ||
372 | mutex_lock(&indio_dev->mlock); | ||
373 | if (iio_buffer_enabled(indio_dev)) { | ||
374 | mutex_unlock(&indio_dev->mlock); | ||
375 | return -EBUSY; | ||
376 | } | ||
377 | mutex_unlock(&indio_dev->mlock); | ||
378 | |||
379 | ret = kstrtol(buf, 10, &lval); | 372 | ret = kstrtol(buf, 10, &lval); |
380 | if (ret) | 373 | if (ret) |
381 | return ret; | 374 | return ret; |
@@ -383,20 +376,21 @@ static ssize_t ad7793_write_frequency(struct device *dev, | |||
383 | if (lval == 0) | 376 | if (lval == 0) |
384 | return -EINVAL; | 377 | return -EINVAL; |
385 | 378 | ||
386 | ret = -EINVAL; | ||
387 | |||
388 | for (i = 0; i < 16; i++) | 379 | for (i = 0; i < 16; i++) |
389 | if (lval == st->chip_info->sample_freq_avail[i]) { | 380 | if (lval == st->chip_info->sample_freq_avail[i]) |
390 | mutex_lock(&indio_dev->mlock); | 381 | break; |
391 | st->mode &= ~AD7793_MODE_RATE(-1); | 382 | if (i == 16) |
392 | st->mode |= AD7793_MODE_RATE(i); | 383 | return -EINVAL; |
393 | ad_sd_write_reg(&st->sd, AD7793_REG_MODE, | ||
394 | sizeof(st->mode), st->mode); | ||
395 | mutex_unlock(&indio_dev->mlock); | ||
396 | ret = 0; | ||
397 | } | ||
398 | 384 | ||
399 | return ret ? ret : len; | 385 | ret = iio_device_claim_direct_mode(indio_dev); |
386 | if (ret) | ||
387 | return ret; | ||
388 | st->mode &= ~AD7793_MODE_RATE(-1); | ||
389 | st->mode |= AD7793_MODE_RATE(i); | ||
390 | ad_sd_write_reg(&st->sd, AD7793_REG_MODE, sizeof(st->mode), st->mode); | ||
391 | iio_device_release_direct_mode(indio_dev); | ||
392 | |||
393 | return len; | ||
400 | } | 394 | } |
401 | 395 | ||
402 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | 396 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, |
diff --git a/drivers/iio/adc/ad7887.c b/drivers/iio/adc/ad7887.c index 2d3c397e66ad..ee2ccc19fab6 100644 --- a/drivers/iio/adc/ad7887.c +++ b/drivers/iio/adc/ad7887.c | |||
@@ -156,12 +156,11 @@ static int ad7887_read_raw(struct iio_dev *indio_dev, | |||
156 | 156 | ||
157 | switch (m) { | 157 | switch (m) { |
158 | case IIO_CHAN_INFO_RAW: | 158 | case IIO_CHAN_INFO_RAW: |
159 | mutex_lock(&indio_dev->mlock); | 159 | ret = iio_device_claim_direct_mode(indio_dev); |
160 | if (iio_buffer_enabled(indio_dev)) | 160 | if (ret) |
161 | ret = -EBUSY; | 161 | return ret; |
162 | else | 162 | ret = ad7887_scan_direct(st, chan->address); |
163 | ret = ad7887_scan_direct(st, chan->address); | 163 | iio_device_release_direct_mode(indio_dev); |
164 | mutex_unlock(&indio_dev->mlock); | ||
165 | 164 | ||
166 | if (ret < 0) | 165 | if (ret < 0) |
167 | return ret; | 166 | return ret; |
diff --git a/drivers/iio/adc/ad7923.c b/drivers/iio/adc/ad7923.c index 45e29ccd824f..ff444c19d749 100644 --- a/drivers/iio/adc/ad7923.c +++ b/drivers/iio/adc/ad7923.c | |||
@@ -233,12 +233,11 @@ static int ad7923_read_raw(struct iio_dev *indio_dev, | |||
233 | 233 | ||
234 | switch (m) { | 234 | switch (m) { |
235 | case IIO_CHAN_INFO_RAW: | 235 | case IIO_CHAN_INFO_RAW: |
236 | mutex_lock(&indio_dev->mlock); | 236 | ret = iio_device_claim_direct_mode(indio_dev); |
237 | if (iio_buffer_enabled(indio_dev)) | 237 | if (ret) |
238 | ret = -EBUSY; | 238 | return ret; |
239 | else | 239 | ret = ad7923_scan_direct(st, chan->address); |
240 | ret = ad7923_scan_direct(st, chan->address); | 240 | iio_device_release_direct_mode(indio_dev); |
241 | mutex_unlock(&indio_dev->mlock); | ||
242 | 241 | ||
243 | if (ret < 0) | 242 | if (ret < 0) |
244 | return ret; | 243 | return ret; |
diff --git a/drivers/iio/adc/ad799x.c b/drivers/iio/adc/ad799x.c index a3f5254f4e51..ec0200dd52cb 100644 --- a/drivers/iio/adc/ad799x.c +++ b/drivers/iio/adc/ad799x.c | |||
@@ -282,12 +282,11 @@ static int ad799x_read_raw(struct iio_dev *indio_dev, | |||
282 | 282 | ||
283 | switch (m) { | 283 | switch (m) { |
284 | case IIO_CHAN_INFO_RAW: | 284 | case IIO_CHAN_INFO_RAW: |
285 | mutex_lock(&indio_dev->mlock); | 285 | ret = iio_device_claim_direct_mode(indio_dev); |
286 | if (iio_buffer_enabled(indio_dev)) | 286 | if (ret) |
287 | ret = -EBUSY; | 287 | return ret; |
288 | else | 288 | ret = ad799x_scan_direct(st, chan->scan_index); |
289 | ret = ad799x_scan_direct(st, chan->scan_index); | 289 | iio_device_release_direct_mode(indio_dev); |
290 | mutex_unlock(&indio_dev->mlock); | ||
291 | 290 | ||
292 | if (ret < 0) | 291 | if (ret < 0) |
293 | return ret; | 292 | return ret; |
@@ -395,11 +394,9 @@ static int ad799x_write_event_config(struct iio_dev *indio_dev, | |||
395 | struct ad799x_state *st = iio_priv(indio_dev); | 394 | struct ad799x_state *st = iio_priv(indio_dev); |
396 | int ret; | 395 | int ret; |
397 | 396 | ||
398 | mutex_lock(&indio_dev->mlock); | 397 | ret = iio_device_claim_direct_mode(indio_dev); |
399 | if (iio_buffer_enabled(indio_dev)) { | 398 | if (ret) |
400 | ret = -EBUSY; | 399 | return ret; |
401 | goto done; | ||
402 | } | ||
403 | 400 | ||
404 | if (state) | 401 | if (state) |
405 | st->config |= BIT(chan->scan_index) << AD799X_CHANNEL_SHIFT; | 402 | st->config |= BIT(chan->scan_index) << AD799X_CHANNEL_SHIFT; |
@@ -412,10 +409,7 @@ static int ad799x_write_event_config(struct iio_dev *indio_dev, | |||
412 | st->config &= ~AD7998_ALERT_EN; | 409 | st->config &= ~AD7998_ALERT_EN; |
413 | 410 | ||
414 | ret = ad799x_write_config(st, st->config); | 411 | ret = ad799x_write_config(st, st->config); |
415 | 412 | iio_device_release_direct_mode(indio_dev); | |
416 | done: | ||
417 | mutex_unlock(&indio_dev->mlock); | ||
418 | |||
419 | return ret; | 413 | return ret; |
420 | } | 414 | } |
421 | 415 | ||
diff --git a/drivers/iio/adc/mxs-lradc.c b/drivers/iio/adc/mxs-lradc.c index ad26da1edbee..b84d37c80a94 100644 --- a/drivers/iio/adc/mxs-lradc.c +++ b/drivers/iio/adc/mxs-lradc.c | |||
@@ -373,13 +373,6 @@ static u32 mxs_lradc_plate_mask(struct mxs_lradc *lradc) | |||
373 | return LRADC_CTRL0_MX28_PLATE_MASK; | 373 | return LRADC_CTRL0_MX28_PLATE_MASK; |
374 | } | 374 | } |
375 | 375 | ||
376 | static u32 mxs_lradc_irq_en_mask(struct mxs_lradc *lradc) | ||
377 | { | ||
378 | if (lradc->soc == IMX23_LRADC) | ||
379 | return LRADC_CTRL1_MX23_LRADC_IRQ_EN_MASK; | ||
380 | return LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK; | ||
381 | } | ||
382 | |||
383 | static u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc) | 376 | static u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc) |
384 | { | 377 | { |
385 | if (lradc->soc == IMX23_LRADC) | 378 | if (lradc->soc == IMX23_LRADC) |
@@ -1120,18 +1113,16 @@ static int mxs_lradc_ts_register(struct mxs_lradc *lradc) | |||
1120 | { | 1113 | { |
1121 | struct input_dev *input; | 1114 | struct input_dev *input; |
1122 | struct device *dev = lradc->dev; | 1115 | struct device *dev = lradc->dev; |
1123 | int ret; | ||
1124 | 1116 | ||
1125 | if (!lradc->use_touchscreen) | 1117 | if (!lradc->use_touchscreen) |
1126 | return 0; | 1118 | return 0; |
1127 | 1119 | ||
1128 | input = input_allocate_device(); | 1120 | input = devm_input_allocate_device(dev); |
1129 | if (!input) | 1121 | if (!input) |
1130 | return -ENOMEM; | 1122 | return -ENOMEM; |
1131 | 1123 | ||
1132 | input->name = DRIVER_NAME; | 1124 | input->name = DRIVER_NAME; |
1133 | input->id.bustype = BUS_HOST; | 1125 | input->id.bustype = BUS_HOST; |
1134 | input->dev.parent = dev; | ||
1135 | input->open = mxs_lradc_ts_open; | 1126 | input->open = mxs_lradc_ts_open; |
1136 | input->close = mxs_lradc_ts_close; | 1127 | input->close = mxs_lradc_ts_close; |
1137 | 1128 | ||
@@ -1146,20 +1137,8 @@ static int mxs_lradc_ts_register(struct mxs_lradc *lradc) | |||
1146 | 1137 | ||
1147 | lradc->ts_input = input; | 1138 | lradc->ts_input = input; |
1148 | input_set_drvdata(input, lradc); | 1139 | input_set_drvdata(input, lradc); |
1149 | ret = input_register_device(input); | ||
1150 | if (ret) | ||
1151 | input_free_device(lradc->ts_input); | ||
1152 | |||
1153 | return ret; | ||
1154 | } | ||
1155 | |||
1156 | static void mxs_lradc_ts_unregister(struct mxs_lradc *lradc) | ||
1157 | { | ||
1158 | if (!lradc->use_touchscreen) | ||
1159 | return; | ||
1160 | 1140 | ||
1161 | mxs_lradc_disable_ts(lradc); | 1141 | return input_register_device(input); |
1162 | input_unregister_device(lradc->ts_input); | ||
1163 | } | 1142 | } |
1164 | 1143 | ||
1165 | /* | 1144 | /* |
@@ -1510,7 +1489,9 @@ static void mxs_lradc_hw_stop(struct mxs_lradc *lradc) | |||
1510 | { | 1489 | { |
1511 | int i; | 1490 | int i; |
1512 | 1491 | ||
1513 | mxs_lradc_reg_clear(lradc, mxs_lradc_irq_en_mask(lradc), LRADC_CTRL1); | 1492 | mxs_lradc_reg_clear(lradc, |
1493 | lradc->buffer_vchans << LRADC_CTRL1_LRADC_IRQ_EN_OFFSET, | ||
1494 | LRADC_CTRL1); | ||
1514 | 1495 | ||
1515 | for (i = 0; i < LRADC_MAX_DELAY_CHANS; i++) | 1496 | for (i = 0; i < LRADC_MAX_DELAY_CHANS; i++) |
1516 | mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(i)); | 1497 | mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(i)); |
@@ -1721,13 +1702,11 @@ static int mxs_lradc_probe(struct platform_device *pdev) | |||
1721 | ret = iio_device_register(iio); | 1702 | ret = iio_device_register(iio); |
1722 | if (ret) { | 1703 | if (ret) { |
1723 | dev_err(dev, "Failed to register IIO device\n"); | 1704 | dev_err(dev, "Failed to register IIO device\n"); |
1724 | goto err_ts; | 1705 | return ret; |
1725 | } | 1706 | } |
1726 | 1707 | ||
1727 | return 0; | 1708 | return 0; |
1728 | 1709 | ||
1729 | err_ts: | ||
1730 | mxs_lradc_ts_unregister(lradc); | ||
1731 | err_ts_register: | 1710 | err_ts_register: |
1732 | mxs_lradc_hw_stop(lradc); | 1711 | mxs_lradc_hw_stop(lradc); |
1733 | err_dev: | 1712 | err_dev: |
@@ -1745,7 +1724,6 @@ static int mxs_lradc_remove(struct platform_device *pdev) | |||
1745 | struct mxs_lradc *lradc = iio_priv(iio); | 1724 | struct mxs_lradc *lradc = iio_priv(iio); |
1746 | 1725 | ||
1747 | iio_device_unregister(iio); | 1726 | iio_device_unregister(iio); |
1748 | mxs_lradc_ts_unregister(lradc); | ||
1749 | mxs_lradc_hw_stop(lradc); | 1727 | mxs_lradc_hw_stop(lradc); |
1750 | mxs_lradc_trigger_remove(iio); | 1728 | mxs_lradc_trigger_remove(iio); |
1751 | iio_triggered_buffer_cleanup(iio); | 1729 | iio_triggered_buffer_cleanup(iio); |
diff --git a/drivers/iio/adc/nau7802.c b/drivers/iio/adc/nau7802.c index e525aa6475c4..57365c504093 100644 --- a/drivers/iio/adc/nau7802.c +++ b/drivers/iio/adc/nau7802.c | |||
@@ -79,10 +79,29 @@ static const struct iio_chan_spec nau7802_chan_array[] = { | |||
79 | static const u16 nau7802_sample_freq_avail[] = {10, 20, 40, 80, | 79 | static const u16 nau7802_sample_freq_avail[] = {10, 20, 40, 80, |
80 | 10, 10, 10, 320}; | 80 | 10, 10, 10, 320}; |
81 | 81 | ||
82 | static ssize_t nau7802_show_scales(struct device *dev, | ||
83 | struct device_attribute *attr, char *buf) | ||
84 | { | ||
85 | struct nau7802_state *st = iio_priv(dev_to_iio_dev(dev)); | ||
86 | int i, len = 0; | ||
87 | |||
88 | for (i = 0; i < ARRAY_SIZE(st->scale_avail); i++) | ||
89 | len += scnprintf(buf + len, PAGE_SIZE - len, "0.%09d ", | ||
90 | st->scale_avail[i]); | ||
91 | |||
92 | buf[len-1] = '\n'; | ||
93 | |||
94 | return len; | ||
95 | } | ||
96 | |||
82 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("10 40 80 320"); | 97 | static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("10 40 80 320"); |
83 | 98 | ||
99 | static IIO_DEVICE_ATTR(in_voltage_scale_available, S_IRUGO, nau7802_show_scales, | ||
100 | NULL, 0); | ||
101 | |||
84 | static struct attribute *nau7802_attributes[] = { | 102 | static struct attribute *nau7802_attributes[] = { |
85 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, | 103 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, |
104 | &iio_dev_attr_in_voltage_scale_available.dev_attr.attr, | ||
86 | NULL | 105 | NULL |
87 | }; | 106 | }; |
88 | 107 | ||
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c index 73cbf0b54e54..8be192a84893 100644 --- a/drivers/iio/adc/ti-ads1015.c +++ b/drivers/iio/adc/ti-ads1015.c | |||
@@ -55,6 +55,11 @@ | |||
55 | #define ADS1015_DEFAULT_DATA_RATE 4 | 55 | #define ADS1015_DEFAULT_DATA_RATE 4 |
56 | #define ADS1015_DEFAULT_CHAN 0 | 56 | #define ADS1015_DEFAULT_CHAN 0 |
57 | 57 | ||
58 | enum { | ||
59 | ADS1015, | ||
60 | ADS1115, | ||
61 | }; | ||
62 | |||
58 | enum ads1015_channels { | 63 | enum ads1015_channels { |
59 | ADS1015_AIN0_AIN1 = 0, | 64 | ADS1015_AIN0_AIN1 = 0, |
60 | ADS1015_AIN0_AIN3, | 65 | ADS1015_AIN0_AIN3, |
@@ -71,6 +76,10 @@ static const unsigned int ads1015_data_rate[] = { | |||
71 | 128, 250, 490, 920, 1600, 2400, 3300, 3300 | 76 | 128, 250, 490, 920, 1600, 2400, 3300, 3300 |
72 | }; | 77 | }; |
73 | 78 | ||
79 | static const unsigned int ads1115_data_rate[] = { | ||
80 | 8, 16, 32, 64, 128, 250, 475, 860 | ||
81 | }; | ||
82 | |||
74 | static const struct { | 83 | static const struct { |
75 | int scale; | 84 | int scale; |
76 | int uscale; | 85 | int uscale; |
@@ -101,6 +110,7 @@ static const struct { | |||
101 | .shift = 4, \ | 110 | .shift = 4, \ |
102 | .endianness = IIO_CPU, \ | 111 | .endianness = IIO_CPU, \ |
103 | }, \ | 112 | }, \ |
113 | .datasheet_name = "AIN"#_chan, \ | ||
104 | } | 114 | } |
105 | 115 | ||
106 | #define ADS1015_V_DIFF_CHAN(_chan, _chan2, _addr) { \ | 116 | #define ADS1015_V_DIFF_CHAN(_chan, _chan2, _addr) { \ |
@@ -121,6 +131,45 @@ static const struct { | |||
121 | .shift = 4, \ | 131 | .shift = 4, \ |
122 | .endianness = IIO_CPU, \ | 132 | .endianness = IIO_CPU, \ |
123 | }, \ | 133 | }, \ |
134 | .datasheet_name = "AIN"#_chan"-AIN"#_chan2, \ | ||
135 | } | ||
136 | |||
137 | #define ADS1115_V_CHAN(_chan, _addr) { \ | ||
138 | .type = IIO_VOLTAGE, \ | ||
139 | .indexed = 1, \ | ||
140 | .address = _addr, \ | ||
141 | .channel = _chan, \ | ||
142 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | ||
143 | BIT(IIO_CHAN_INFO_SCALE) | \ | ||
144 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
145 | .scan_index = _addr, \ | ||
146 | .scan_type = { \ | ||
147 | .sign = 's', \ | ||
148 | .realbits = 16, \ | ||
149 | .storagebits = 16, \ | ||
150 | .endianness = IIO_CPU, \ | ||
151 | }, \ | ||
152 | .datasheet_name = "AIN"#_chan, \ | ||
153 | } | ||
154 | |||
155 | #define ADS1115_V_DIFF_CHAN(_chan, _chan2, _addr) { \ | ||
156 | .type = IIO_VOLTAGE, \ | ||
157 | .differential = 1, \ | ||
158 | .indexed = 1, \ | ||
159 | .address = _addr, \ | ||
160 | .channel = _chan, \ | ||
161 | .channel2 = _chan2, \ | ||
162 | .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ | ||
163 | BIT(IIO_CHAN_INFO_SCALE) | \ | ||
164 | BIT(IIO_CHAN_INFO_SAMP_FREQ), \ | ||
165 | .scan_index = _addr, \ | ||
166 | .scan_type = { \ | ||
167 | .sign = 's', \ | ||
168 | .realbits = 16, \ | ||
169 | .storagebits = 16, \ | ||
170 | .endianness = IIO_CPU, \ | ||
171 | }, \ | ||
172 | .datasheet_name = "AIN"#_chan"-AIN"#_chan2, \ | ||
124 | } | 173 | } |
125 | 174 | ||
126 | struct ads1015_data { | 175 | struct ads1015_data { |
@@ -131,6 +180,8 @@ struct ads1015_data { | |||
131 | */ | 180 | */ |
132 | struct mutex lock; | 181 | struct mutex lock; |
133 | struct ads1015_channel_data channel_data[ADS1015_CHANNELS]; | 182 | struct ads1015_channel_data channel_data[ADS1015_CHANNELS]; |
183 | |||
184 | unsigned int *data_rate; | ||
134 | }; | 185 | }; |
135 | 186 | ||
136 | static bool ads1015_is_writeable_reg(struct device *dev, unsigned int reg) | 187 | static bool ads1015_is_writeable_reg(struct device *dev, unsigned int reg) |
@@ -157,6 +208,18 @@ static const struct iio_chan_spec ads1015_channels[] = { | |||
157 | IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP), | 208 | IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP), |
158 | }; | 209 | }; |
159 | 210 | ||
211 | static const struct iio_chan_spec ads1115_channels[] = { | ||
212 | ADS1115_V_DIFF_CHAN(0, 1, ADS1015_AIN0_AIN1), | ||
213 | ADS1115_V_DIFF_CHAN(0, 3, ADS1015_AIN0_AIN3), | ||
214 | ADS1115_V_DIFF_CHAN(1, 3, ADS1015_AIN1_AIN3), | ||
215 | ADS1115_V_DIFF_CHAN(2, 3, ADS1015_AIN2_AIN3), | ||
216 | ADS1115_V_CHAN(0, ADS1015_AIN0), | ||
217 | ADS1115_V_CHAN(1, ADS1015_AIN1), | ||
218 | ADS1115_V_CHAN(2, ADS1015_AIN2), | ||
219 | ADS1115_V_CHAN(3, ADS1015_AIN3), | ||
220 | IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP), | ||
221 | }; | ||
222 | |||
160 | static int ads1015_set_power_state(struct ads1015_data *data, bool on) | 223 | static int ads1015_set_power_state(struct ads1015_data *data, bool on) |
161 | { | 224 | { |
162 | int ret; | 225 | int ret; |
@@ -196,7 +259,7 @@ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val) | |||
196 | return ret; | 259 | return ret; |
197 | 260 | ||
198 | if (change) { | 261 | if (change) { |
199 | conv_time = DIV_ROUND_UP(USEC_PER_SEC, ads1015_data_rate[dr]); | 262 | conv_time = DIV_ROUND_UP(USEC_PER_SEC, data->data_rate[dr]); |
200 | usleep_range(conv_time, conv_time + 1); | 263 | usleep_range(conv_time, conv_time + 1); |
201 | } | 264 | } |
202 | 265 | ||
@@ -263,7 +326,7 @@ static int ads1015_set_data_rate(struct ads1015_data *data, int chan, int rate) | |||
263 | int i, ret, rindex = -1; | 326 | int i, ret, rindex = -1; |
264 | 327 | ||
265 | for (i = 0; i < ARRAY_SIZE(ads1015_data_rate); i++) | 328 | for (i = 0; i < ARRAY_SIZE(ads1015_data_rate); i++) |
266 | if (ads1015_data_rate[i] == rate) { | 329 | if (data->data_rate[i] == rate) { |
267 | rindex = i; | 330 | rindex = i; |
268 | break; | 331 | break; |
269 | } | 332 | } |
@@ -291,7 +354,9 @@ static int ads1015_read_raw(struct iio_dev *indio_dev, | |||
291 | mutex_lock(&indio_dev->mlock); | 354 | mutex_lock(&indio_dev->mlock); |
292 | mutex_lock(&data->lock); | 355 | mutex_lock(&data->lock); |
293 | switch (mask) { | 356 | switch (mask) { |
294 | case IIO_CHAN_INFO_RAW: | 357 | case IIO_CHAN_INFO_RAW: { |
358 | int shift = chan->scan_type.shift; | ||
359 | |||
295 | if (iio_buffer_enabled(indio_dev)) { | 360 | if (iio_buffer_enabled(indio_dev)) { |
296 | ret = -EBUSY; | 361 | ret = -EBUSY; |
297 | break; | 362 | break; |
@@ -307,8 +372,7 @@ static int ads1015_read_raw(struct iio_dev *indio_dev, | |||
307 | break; | 372 | break; |
308 | } | 373 | } |
309 | 374 | ||
310 | /* 12 bit res, D0 is bit 4 in conversion register */ | 375 | *val = sign_extend32(*val >> shift, 15 - shift); |
311 | *val = sign_extend32(*val >> 4, 11); | ||
312 | 376 | ||
313 | ret = ads1015_set_power_state(data, false); | 377 | ret = ads1015_set_power_state(data, false); |
314 | if (ret < 0) | 378 | if (ret < 0) |
@@ -316,6 +380,7 @@ static int ads1015_read_raw(struct iio_dev *indio_dev, | |||
316 | 380 | ||
317 | ret = IIO_VAL_INT; | 381 | ret = IIO_VAL_INT; |
318 | break; | 382 | break; |
383 | } | ||
319 | case IIO_CHAN_INFO_SCALE: | 384 | case IIO_CHAN_INFO_SCALE: |
320 | idx = data->channel_data[chan->address].pga; | 385 | idx = data->channel_data[chan->address].pga; |
321 | *val = ads1015_scale[idx].scale; | 386 | *val = ads1015_scale[idx].scale; |
@@ -324,7 +389,7 @@ static int ads1015_read_raw(struct iio_dev *indio_dev, | |||
324 | break; | 389 | break; |
325 | case IIO_CHAN_INFO_SAMP_FREQ: | 390 | case IIO_CHAN_INFO_SAMP_FREQ: |
326 | idx = data->channel_data[chan->address].data_rate; | 391 | idx = data->channel_data[chan->address].data_rate; |
327 | *val = ads1015_data_rate[idx]; | 392 | *val = data->data_rate[idx]; |
328 | ret = IIO_VAL_INT; | 393 | ret = IIO_VAL_INT; |
329 | break; | 394 | break; |
330 | default: | 395 | default: |
@@ -380,12 +445,15 @@ static const struct iio_buffer_setup_ops ads1015_buffer_setup_ops = { | |||
380 | }; | 445 | }; |
381 | 446 | ||
382 | static IIO_CONST_ATTR(scale_available, "3 2 1 0.5 0.25 0.125"); | 447 | static IIO_CONST_ATTR(scale_available, "3 2 1 0.5 0.25 0.125"); |
383 | static IIO_CONST_ATTR(sampling_frequency_available, | 448 | |
384 | "128 250 490 920 1600 2400 3300"); | 449 | static IIO_CONST_ATTR_NAMED(ads1015_sampling_frequency_available, |
450 | sampling_frequency_available, "128 250 490 920 1600 2400 3300"); | ||
451 | static IIO_CONST_ATTR_NAMED(ads1115_sampling_frequency_available, | ||
452 | sampling_frequency_available, "8 16 32 64 128 250 475 860"); | ||
385 | 453 | ||
386 | static struct attribute *ads1015_attributes[] = { | 454 | static struct attribute *ads1015_attributes[] = { |
387 | &iio_const_attr_scale_available.dev_attr.attr, | 455 | &iio_const_attr_scale_available.dev_attr.attr, |
388 | &iio_const_attr_sampling_frequency_available.dev_attr.attr, | 456 | &iio_const_attr_ads1015_sampling_frequency_available.dev_attr.attr, |
389 | NULL, | 457 | NULL, |
390 | }; | 458 | }; |
391 | 459 | ||
@@ -393,11 +461,28 @@ static const struct attribute_group ads1015_attribute_group = { | |||
393 | .attrs = ads1015_attributes, | 461 | .attrs = ads1015_attributes, |
394 | }; | 462 | }; |
395 | 463 | ||
396 | static const struct iio_info ads1015_info = { | 464 | static struct attribute *ads1115_attributes[] = { |
465 | &iio_const_attr_scale_available.dev_attr.attr, | ||
466 | &iio_const_attr_ads1115_sampling_frequency_available.dev_attr.attr, | ||
467 | NULL, | ||
468 | }; | ||
469 | |||
470 | static const struct attribute_group ads1115_attribute_group = { | ||
471 | .attrs = ads1115_attributes, | ||
472 | }; | ||
473 | |||
474 | static struct iio_info ads1015_info = { | ||
475 | .driver_module = THIS_MODULE, | ||
476 | .read_raw = ads1015_read_raw, | ||
477 | .write_raw = ads1015_write_raw, | ||
478 | .attrs = &ads1015_attribute_group, | ||
479 | }; | ||
480 | |||
481 | static struct iio_info ads1115_info = { | ||
397 | .driver_module = THIS_MODULE, | 482 | .driver_module = THIS_MODULE, |
398 | .read_raw = ads1015_read_raw, | 483 | .read_raw = ads1015_read_raw, |
399 | .write_raw = ads1015_write_raw, | 484 | .write_raw = ads1015_write_raw, |
400 | .attrs = &ads1015_attribute_group, | 485 | .attrs = &ads1115_attribute_group, |
401 | }; | 486 | }; |
402 | 487 | ||
403 | #ifdef CONFIG_OF | 488 | #ifdef CONFIG_OF |
@@ -500,12 +585,24 @@ static int ads1015_probe(struct i2c_client *client, | |||
500 | mutex_init(&data->lock); | 585 | mutex_init(&data->lock); |
501 | 586 | ||
502 | indio_dev->dev.parent = &client->dev; | 587 | indio_dev->dev.parent = &client->dev; |
503 | indio_dev->info = &ads1015_info; | ||
504 | indio_dev->name = ADS1015_DRV_NAME; | 588 | indio_dev->name = ADS1015_DRV_NAME; |
505 | indio_dev->channels = ads1015_channels; | ||
506 | indio_dev->num_channels = ARRAY_SIZE(ads1015_channels); | ||
507 | indio_dev->modes = INDIO_DIRECT_MODE; | 589 | indio_dev->modes = INDIO_DIRECT_MODE; |
508 | 590 | ||
591 | switch (id->driver_data) { | ||
592 | case ADS1015: | ||
593 | indio_dev->channels = ads1015_channels; | ||
594 | indio_dev->num_channels = ARRAY_SIZE(ads1015_channels); | ||
595 | indio_dev->info = &ads1015_info; | ||
596 | data->data_rate = (unsigned int *) &ads1015_data_rate; | ||
597 | break; | ||
598 | case ADS1115: | ||
599 | indio_dev->channels = ads1115_channels; | ||
600 | indio_dev->num_channels = ARRAY_SIZE(ads1115_channels); | ||
601 | indio_dev->info = &ads1115_info; | ||
602 | data->data_rate = (unsigned int *) &ads1115_data_rate; | ||
603 | break; | ||
604 | } | ||
605 | |||
509 | /* we need to keep this ABI the same as used by hwmon ADS1015 driver */ | 606 | /* we need to keep this ABI the same as used by hwmon ADS1015 driver */ |
510 | ads1015_get_channels_config(client); | 607 | ads1015_get_channels_config(client); |
511 | 608 | ||
@@ -590,7 +687,8 @@ static const struct dev_pm_ops ads1015_pm_ops = { | |||
590 | }; | 687 | }; |
591 | 688 | ||
592 | static const struct i2c_device_id ads1015_id[] = { | 689 | static const struct i2c_device_id ads1015_id[] = { |
593 | {"ads1015", 0}, | 690 | {"ads1015", ADS1015}, |
691 | {"ads1115", ADS1115}, | ||
594 | {} | 692 | {} |
595 | }; | 693 | }; |
596 | MODULE_DEVICE_TABLE(i2c, ads1015_id); | 694 | MODULE_DEVICE_TABLE(i2c, ads1015_id); |
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c index c1e05532d437..8a368756881b 100644 --- a/drivers/iio/adc/ti_am335x_adc.c +++ b/drivers/iio/adc/ti_am335x_adc.c | |||
@@ -326,8 +326,7 @@ static int tiadc_channel_init(struct iio_dev *indio_dev, int channels) | |||
326 | int i; | 326 | int i; |
327 | 327 | ||
328 | indio_dev->num_channels = channels; | 328 | indio_dev->num_channels = channels; |
329 | chan_array = kcalloc(channels, | 329 | chan_array = kcalloc(channels, sizeof(*chan_array), GFP_KERNEL); |
330 | sizeof(struct iio_chan_spec), GFP_KERNEL); | ||
331 | if (chan_array == NULL) | 330 | if (chan_array == NULL) |
332 | return -ENOMEM; | 331 | return -ENOMEM; |
333 | 332 | ||
@@ -467,8 +466,7 @@ static int tiadc_probe(struct platform_device *pdev) | |||
467 | return -EINVAL; | 466 | return -EINVAL; |
468 | } | 467 | } |
469 | 468 | ||
470 | indio_dev = devm_iio_device_alloc(&pdev->dev, | 469 | indio_dev = devm_iio_device_alloc(&pdev->dev, sizeof(*indio_dev)); |
471 | sizeof(struct tiadc_device)); | ||
472 | if (indio_dev == NULL) { | 470 | if (indio_dev == NULL) { |
473 | dev_err(&pdev->dev, "failed to allocate iio device\n"); | 471 | dev_err(&pdev->dev, "failed to allocate iio device\n"); |
474 | return -ENOMEM; | 472 | return -ENOMEM; |
@@ -531,8 +529,7 @@ static int tiadc_remove(struct platform_device *pdev) | |||
531 | return 0; | 529 | return 0; |
532 | } | 530 | } |
533 | 531 | ||
534 | #ifdef CONFIG_PM | 532 | static int __maybe_unused tiadc_suspend(struct device *dev) |
535 | static int tiadc_suspend(struct device *dev) | ||
536 | { | 533 | { |
537 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | 534 | struct iio_dev *indio_dev = dev_get_drvdata(dev); |
538 | struct tiadc_device *adc_dev = iio_priv(indio_dev); | 535 | struct tiadc_device *adc_dev = iio_priv(indio_dev); |
@@ -550,7 +547,7 @@ static int tiadc_suspend(struct device *dev) | |||
550 | return 0; | 547 | return 0; |
551 | } | 548 | } |
552 | 549 | ||
553 | static int tiadc_resume(struct device *dev) | 550 | static int __maybe_unused tiadc_resume(struct device *dev) |
554 | { | 551 | { |
555 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | 552 | struct iio_dev *indio_dev = dev_get_drvdata(dev); |
556 | struct tiadc_device *adc_dev = iio_priv(indio_dev); | 553 | struct tiadc_device *adc_dev = iio_priv(indio_dev); |
@@ -567,14 +564,7 @@ static int tiadc_resume(struct device *dev) | |||
567 | return 0; | 564 | return 0; |
568 | } | 565 | } |
569 | 566 | ||
570 | static const struct dev_pm_ops tiadc_pm_ops = { | 567 | static SIMPLE_DEV_PM_OPS(tiadc_pm_ops, tiadc_suspend, tiadc_resume); |
571 | .suspend = tiadc_suspend, | ||
572 | .resume = tiadc_resume, | ||
573 | }; | ||
574 | #define TIADC_PM_OPS (&tiadc_pm_ops) | ||
575 | #else | ||
576 | #define TIADC_PM_OPS NULL | ||
577 | #endif | ||
578 | 568 | ||
579 | static const struct of_device_id ti_adc_dt_ids[] = { | 569 | static const struct of_device_id ti_adc_dt_ids[] = { |
580 | { .compatible = "ti,am3359-adc", }, | 570 | { .compatible = "ti,am3359-adc", }, |
@@ -585,7 +575,7 @@ MODULE_DEVICE_TABLE(of, ti_adc_dt_ids); | |||
585 | static struct platform_driver tiadc_driver = { | 575 | static struct platform_driver tiadc_driver = { |
586 | .driver = { | 576 | .driver = { |
587 | .name = "TI-am335x-adc", | 577 | .name = "TI-am335x-adc", |
588 | .pm = TIADC_PM_OPS, | 578 | .pm = &tiadc_pm_ops, |
589 | .of_match_table = ti_adc_dt_ids, | 579 | .of_match_table = ti_adc_dt_ids, |
590 | }, | 580 | }, |
591 | .probe = tiadc_probe, | 581 | .probe = tiadc_probe, |