| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | | - * AD7904/AD7914/AD7923/AD7924 SPI ADC driver |
|---|
| 3 | + * AD7904/AD7914/AD7923/AD7924/AD7908/AD7918/AD7928 SPI ADC driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright 2011 Analog Devices Inc (from AD7923 Driver) |
|---|
| 5 | 6 | * Copyright 2012 CS Systemes d'Information |
|---|
| 6 | | - * |
|---|
| 7 | | - * Licensed under the GPL-2. |
|---|
| 8 | 7 | */ |
|---|
| 9 | 8 | |
|---|
| 10 | 9 | #include <linux/device.h> |
|---|
| .. | .. |
|---|
| 24 | 23 | #include <linux/iio/trigger_consumer.h> |
|---|
| 25 | 24 | #include <linux/iio/triggered_buffer.h> |
|---|
| 26 | 25 | |
|---|
| 27 | | -#define AD7923_WRITE_CR (1 << 11) /* write control register */ |
|---|
| 28 | | -#define AD7923_RANGE (1 << 1) /* range to REFin */ |
|---|
| 29 | | -#define AD7923_CODING (1 << 0) /* coding is straight binary */ |
|---|
| 26 | +#define AD7923_WRITE_CR BIT(11) /* write control register */ |
|---|
| 27 | +#define AD7923_RANGE BIT(1) /* range to REFin */ |
|---|
| 28 | +#define AD7923_CODING BIT(0) /* coding is straight binary */ |
|---|
| 30 | 29 | #define AD7923_PM_MODE_AS (1) /* auto shutdown */ |
|---|
| 31 | 30 | #define AD7923_PM_MODE_FS (2) /* full shutdown */ |
|---|
| 32 | 31 | #define AD7923_PM_MODE_OPS (3) /* normal operation */ |
|---|
| 33 | | -#define AD7923_CHANNEL_0 (0) /* analog input 0 */ |
|---|
| 34 | | -#define AD7923_CHANNEL_1 (1) /* analog input 1 */ |
|---|
| 35 | | -#define AD7923_CHANNEL_2 (2) /* analog input 2 */ |
|---|
| 36 | | -#define AD7923_CHANNEL_3 (3) /* analog input 3 */ |
|---|
| 37 | 32 | #define AD7923_SEQUENCE_OFF (0) /* no sequence fonction */ |
|---|
| 38 | 33 | #define AD7923_SEQUENCE_PROTECT (2) /* no interrupt write cycle */ |
|---|
| 39 | 34 | #define AD7923_SEQUENCE_ON (3) /* continuous sequence */ |
|---|
| 40 | 35 | |
|---|
| 41 | | -#define AD7923_MAX_CHAN 4 |
|---|
| 42 | 36 | |
|---|
| 43 | | -#define AD7923_PM_MODE_WRITE(mode) (mode << 4) /* write mode */ |
|---|
| 44 | | -#define AD7923_CHANNEL_WRITE(channel) (channel << 6) /* write channel */ |
|---|
| 45 | | -#define AD7923_SEQUENCE_WRITE(sequence) (((sequence & 1) << 3) \ |
|---|
| 46 | | - + ((sequence & 2) << 9)) |
|---|
| 37 | +#define AD7923_PM_MODE_WRITE(mode) ((mode) << 4) /* write mode */ |
|---|
| 38 | +#define AD7923_CHANNEL_WRITE(channel) ((channel) << 6) /* write channel */ |
|---|
| 39 | +#define AD7923_SEQUENCE_WRITE(sequence) ((((sequence) & 1) << 3) \ |
|---|
| 40 | + + (((sequence) & 2) << 9)) |
|---|
| 47 | 41 | /* write sequence fonction */ |
|---|
| 48 | 42 | /* left shift for CR : bit 11 transmit in first */ |
|---|
| 49 | 43 | #define AD7923_SHIFT_REGISTER 4 |
|---|
| 50 | 44 | |
|---|
| 51 | 45 | /* val = value, dec = left shift, bits = number of bits of the mask */ |
|---|
| 52 | | -#define EXTRACT(val, dec, bits) ((val >> dec) & ((1 << bits) - 1)) |
|---|
| 46 | +#define EXTRACT(val, dec, bits) (((val) >> (dec)) & ((1 << (bits)) - 1)) |
|---|
| 53 | 47 | |
|---|
| 54 | 48 | struct ad7923_state { |
|---|
| 55 | 49 | struct spi_device *spi; |
|---|
| .. | .. |
|---|
| 65 | 59 | /* |
|---|
| 66 | 60 | * DMA (thus cache coherency maintenance) requires the |
|---|
| 67 | 61 | * transfer buffers to live in their own cache lines. |
|---|
| 62 | + * Ensure rx_buf can be directly used in iio_push_to_buffers_with_timetamp |
|---|
| 63 | + * Length = 8 channels + 4 extra for 8 byte timestamp |
|---|
| 68 | 64 | */ |
|---|
| 69 | | - __be16 rx_buf[4] ____cacheline_aligned; |
|---|
| 65 | + __be16 rx_buf[12] ____cacheline_aligned; |
|---|
| 70 | 66 | __be16 tx_buf[4]; |
|---|
| 71 | 67 | }; |
|---|
| 72 | 68 | |
|---|
| .. | .. |
|---|
| 79 | 75 | AD7904, |
|---|
| 80 | 76 | AD7914, |
|---|
| 81 | 77 | AD7924, |
|---|
| 78 | + AD7908, |
|---|
| 79 | + AD7918, |
|---|
| 80 | + AD7928 |
|---|
| 82 | 81 | }; |
|---|
| 83 | 82 | |
|---|
| 84 | 83 | #define AD7923_V_CHAN(index, bits) \ |
|---|
| .. | .. |
|---|
| 94 | 93 | .sign = 'u', \ |
|---|
| 95 | 94 | .realbits = (bits), \ |
|---|
| 96 | 95 | .storagebits = 16, \ |
|---|
| 96 | + .shift = 12 - (bits), \ |
|---|
| 97 | 97 | .endianness = IIO_BE, \ |
|---|
| 98 | 98 | }, \ |
|---|
| 99 | 99 | } |
|---|
| .. | .. |
|---|
| 107 | 107 | IIO_CHAN_SOFT_TIMESTAMP(4), \ |
|---|
| 108 | 108 | } |
|---|
| 109 | 109 | |
|---|
| 110 | +#define DECLARE_AD7908_CHANNELS(name, bits) \ |
|---|
| 111 | +const struct iio_chan_spec name ## _channels[] = { \ |
|---|
| 112 | + AD7923_V_CHAN(0, bits), \ |
|---|
| 113 | + AD7923_V_CHAN(1, bits), \ |
|---|
| 114 | + AD7923_V_CHAN(2, bits), \ |
|---|
| 115 | + AD7923_V_CHAN(3, bits), \ |
|---|
| 116 | + AD7923_V_CHAN(4, bits), \ |
|---|
| 117 | + AD7923_V_CHAN(5, bits), \ |
|---|
| 118 | + AD7923_V_CHAN(6, bits), \ |
|---|
| 119 | + AD7923_V_CHAN(7, bits), \ |
|---|
| 120 | + IIO_CHAN_SOFT_TIMESTAMP(8), \ |
|---|
| 121 | +} |
|---|
| 122 | + |
|---|
| 110 | 123 | static DECLARE_AD7923_CHANNELS(ad7904, 8); |
|---|
| 111 | 124 | static DECLARE_AD7923_CHANNELS(ad7914, 10); |
|---|
| 112 | 125 | static DECLARE_AD7923_CHANNELS(ad7924, 12); |
|---|
| 126 | +static DECLARE_AD7908_CHANNELS(ad7908, 8); |
|---|
| 127 | +static DECLARE_AD7908_CHANNELS(ad7918, 10); |
|---|
| 128 | +static DECLARE_AD7908_CHANNELS(ad7928, 12); |
|---|
| 113 | 129 | |
|---|
| 114 | 130 | static const struct ad7923_chip_info ad7923_chip_info[] = { |
|---|
| 115 | 131 | [AD7904] = { |
|---|
| .. | .. |
|---|
| 124 | 140 | .channels = ad7924_channels, |
|---|
| 125 | 141 | .num_channels = ARRAY_SIZE(ad7924_channels), |
|---|
| 126 | 142 | }, |
|---|
| 143 | + [AD7908] = { |
|---|
| 144 | + .channels = ad7908_channels, |
|---|
| 145 | + .num_channels = ARRAY_SIZE(ad7908_channels), |
|---|
| 146 | + }, |
|---|
| 147 | + [AD7918] = { |
|---|
| 148 | + .channels = ad7918_channels, |
|---|
| 149 | + .num_channels = ARRAY_SIZE(ad7918_channels), |
|---|
| 150 | + }, |
|---|
| 151 | + [AD7928] = { |
|---|
| 152 | + .channels = ad7928_channels, |
|---|
| 153 | + .num_channels = ARRAY_SIZE(ad7928_channels), |
|---|
| 154 | + }, |
|---|
| 127 | 155 | }; |
|---|
| 128 | 156 | |
|---|
| 129 | | -/** |
|---|
| 157 | +/* |
|---|
| 130 | 158 | * ad7923_update_scan_mode() setup the spi transfer buffer for the new scan mask |
|---|
| 131 | | - **/ |
|---|
| 159 | + */ |
|---|
| 132 | 160 | static int ad7923_update_scan_mode(struct iio_dev *indio_dev, |
|---|
| 133 | | - const unsigned long *active_scan_mask) |
|---|
| 161 | + const unsigned long *active_scan_mask) |
|---|
| 134 | 162 | { |
|---|
| 135 | 163 | struct ad7923_state *st = iio_priv(indio_dev); |
|---|
| 136 | 164 | int i, cmd, len; |
|---|
| 137 | 165 | |
|---|
| 138 | 166 | len = 0; |
|---|
| 139 | | - for_each_set_bit(i, active_scan_mask, AD7923_MAX_CHAN) { |
|---|
| 167 | + /* |
|---|
| 168 | + * For this driver the last channel is always the software timestamp so |
|---|
| 169 | + * skip that one. |
|---|
| 170 | + */ |
|---|
| 171 | + for_each_set_bit(i, active_scan_mask, indio_dev->num_channels - 1) { |
|---|
| 140 | 172 | cmd = AD7923_WRITE_CR | AD7923_CHANNEL_WRITE(i) | |
|---|
| 141 | 173 | AD7923_SEQUENCE_WRITE(AD7923_SEQUENCE_OFF) | |
|---|
| 142 | 174 | st->settings; |
|---|
| .. | .. |
|---|
| 163 | 195 | return 0; |
|---|
| 164 | 196 | } |
|---|
| 165 | 197 | |
|---|
| 166 | | -/** |
|---|
| 198 | +/* |
|---|
| 167 | 199 | * ad7923_trigger_handler() bh of trigger launched polling to ring buffer |
|---|
| 168 | 200 | * |
|---|
| 169 | 201 | * Currently there is no option in this driver to disable the saving of |
|---|
| 170 | 202 | * timestamps within the ring. |
|---|
| 171 | | - **/ |
|---|
| 203 | + */ |
|---|
| 172 | 204 | static irqreturn_t ad7923_trigger_handler(int irq, void *p) |
|---|
| 173 | 205 | { |
|---|
| 174 | 206 | struct iio_poll_func *pf = p; |
|---|
| .. | .. |
|---|
| 181 | 213 | goto done; |
|---|
| 182 | 214 | |
|---|
| 183 | 215 | iio_push_to_buffers_with_timestamp(indio_dev, st->rx_buf, |
|---|
| 184 | | - iio_get_time_ns(indio_dev)); |
|---|
| 216 | + iio_get_time_ns(indio_dev)); |
|---|
| 185 | 217 | |
|---|
| 186 | 218 | done: |
|---|
| 187 | 219 | iio_trigger_notify_done(indio_dev->trig); |
|---|
| .. | .. |
|---|
| 189 | 221 | return IRQ_HANDLED; |
|---|
| 190 | 222 | } |
|---|
| 191 | 223 | |
|---|
| 192 | | -static int ad7923_scan_direct(struct ad7923_state *st, unsigned ch) |
|---|
| 224 | +static int ad7923_scan_direct(struct ad7923_state *st, unsigned int ch) |
|---|
| 193 | 225 | { |
|---|
| 194 | 226 | int ret, cmd; |
|---|
| 195 | 227 | |
|---|
| .. | .. |
|---|
| 243 | 275 | return ret; |
|---|
| 244 | 276 | |
|---|
| 245 | 277 | if (chan->address == EXTRACT(ret, 12, 4)) |
|---|
| 246 | | - *val = EXTRACT(ret, 0, 12); |
|---|
| 278 | + *val = EXTRACT(ret, chan->scan_type.shift, |
|---|
| 279 | + chan->scan_type.realbits); |
|---|
| 247 | 280 | else |
|---|
| 248 | 281 | return -EIO; |
|---|
| 249 | 282 | |
|---|
| .. | .. |
|---|
| 272 | 305 | int ret; |
|---|
| 273 | 306 | |
|---|
| 274 | 307 | indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); |
|---|
| 275 | | - if (indio_dev == NULL) |
|---|
| 308 | + if (!indio_dev) |
|---|
| 276 | 309 | return -ENOMEM; |
|---|
| 277 | 310 | |
|---|
| 278 | 311 | st = iio_priv(indio_dev); |
|---|
| .. | .. |
|---|
| 286 | 319 | info = &ad7923_chip_info[spi_get_device_id(spi)->driver_data]; |
|---|
| 287 | 320 | |
|---|
| 288 | 321 | indio_dev->name = spi_get_device_id(spi)->name; |
|---|
| 289 | | - indio_dev->dev.parent = &spi->dev; |
|---|
| 290 | | - indio_dev->dev.of_node = spi->dev.of_node; |
|---|
| 291 | 322 | indio_dev->modes = INDIO_DIRECT_MODE; |
|---|
| 292 | 323 | indio_dev->channels = info->channels; |
|---|
| 293 | 324 | indio_dev->num_channels = info->num_channels; |
|---|
| .. | .. |
|---|
| 314 | 345 | return ret; |
|---|
| 315 | 346 | |
|---|
| 316 | 347 | ret = iio_triggered_buffer_setup(indio_dev, NULL, |
|---|
| 317 | | - &ad7923_trigger_handler, NULL); |
|---|
| 348 | + &ad7923_trigger_handler, NULL); |
|---|
| 318 | 349 | if (ret) |
|---|
| 319 | 350 | goto error_disable_reg; |
|---|
| 320 | 351 | |
|---|
| .. | .. |
|---|
| 349 | 380 | {"ad7914", AD7914}, |
|---|
| 350 | 381 | {"ad7923", AD7924}, |
|---|
| 351 | 382 | {"ad7924", AD7924}, |
|---|
| 383 | + {"ad7908", AD7908}, |
|---|
| 384 | + {"ad7918", AD7918}, |
|---|
| 385 | + {"ad7928", AD7928}, |
|---|
| 352 | 386 | {} |
|---|
| 353 | 387 | }; |
|---|
| 354 | 388 | MODULE_DEVICE_TABLE(spi, ad7923_id); |
|---|
| 355 | 389 | |
|---|
| 390 | +static const struct of_device_id ad7923_of_match[] = { |
|---|
| 391 | + { .compatible = "adi,ad7904", }, |
|---|
| 392 | + { .compatible = "adi,ad7914", }, |
|---|
| 393 | + { .compatible = "adi,ad7923", }, |
|---|
| 394 | + { .compatible = "adi,ad7924", }, |
|---|
| 395 | + { .compatible = "adi,ad7908", }, |
|---|
| 396 | + { .compatible = "adi,ad7918", }, |
|---|
| 397 | + { .compatible = "adi,ad7928", }, |
|---|
| 398 | + { }, |
|---|
| 399 | +}; |
|---|
| 400 | +MODULE_DEVICE_TABLE(of, ad7923_of_match); |
|---|
| 401 | + |
|---|
| 356 | 402 | static struct spi_driver ad7923_driver = { |
|---|
| 357 | 403 | .driver = { |
|---|
| 358 | 404 | .name = "ad7923", |
|---|
| 405 | + .of_match_table = ad7923_of_match, |
|---|
| 359 | 406 | }, |
|---|
| 360 | 407 | .probe = ad7923_probe, |
|---|
| 361 | 408 | .remove = ad7923_remove, |
|---|
| .. | .. |
|---|
| 363 | 410 | }; |
|---|
| 364 | 411 | module_spi_driver(ad7923_driver); |
|---|
| 365 | 412 | |
|---|
| 366 | | -MODULE_AUTHOR("Michael Hennerich <hennerich@blackfin.uclinux.org>"); |
|---|
| 413 | +MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); |
|---|
| 367 | 414 | MODULE_AUTHOR("Patrick Vasseur <patrick.vasseur@c-s.fr>"); |
|---|
| 368 | | -MODULE_DESCRIPTION("Analog Devices AD7904/AD7914/AD7923/AD7924 ADC"); |
|---|
| 415 | +MODULE_DESCRIPTION("Analog Devices AD7923 and similar ADC"); |
|---|
| 369 | 416 | MODULE_LICENSE("GPL v2"); |
|---|