0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/interrupt.h>
0010 #include <linux/device.h>
0011 #include <linux/kernel.h>
0012 #include <linux/slab.h>
0013 #include <linux/sysfs.h>
0014 #include <linux/spi/spi.h>
0015 #include <linux/regulator/consumer.h>
0016 #include <linux/err.h>
0017 #include <linux/sched.h>
0018 #include <linux/delay.h>
0019 #include <linux/module.h>
0020
0021 #include <linux/iio/iio.h>
0022 #include <linux/iio/sysfs.h>
0023 #include <linux/iio/buffer.h>
0024 #include <linux/iio/trigger.h>
0025 #include <linux/iio/trigger_consumer.h>
0026 #include <linux/iio/triggered_buffer.h>
0027 #include <linux/iio/adc/ad_sigma_delta.h>
0028
0029 #include <linux/platform_data/ad7791.h>
0030
0031 #define AD7791_REG_COMM 0x0
0032 #define AD7791_REG_STATUS 0x0
0033 #define AD7791_REG_MODE 0x1
0034 #define AD7791_REG_FILTER 0x2
0035 #define AD7791_REG_DATA 0x3
0036
0037 #define AD7791_MODE_CONTINUOUS 0x00
0038 #define AD7791_MODE_SINGLE 0x02
0039 #define AD7791_MODE_POWERDOWN 0x03
0040
0041 #define AD7791_CH_AIN1P_AIN1N 0x00
0042 #define AD7791_CH_AIN2 0x01
0043 #define AD7791_CH_AIN1N_AIN1N 0x02
0044 #define AD7791_CH_AVDD_MONITOR 0x03
0045
0046 #define AD7791_FILTER_CLK_DIV_1 (0x0 << 4)
0047 #define AD7791_FILTER_CLK_DIV_2 (0x1 << 4)
0048 #define AD7791_FILTER_CLK_DIV_4 (0x2 << 4)
0049 #define AD7791_FILTER_CLK_DIV_8 (0x3 << 4)
0050 #define AD7791_FILTER_CLK_MASK (0x3 << 4)
0051 #define AD7791_FILTER_RATE_120 0x0
0052 #define AD7791_FILTER_RATE_100 0x1
0053 #define AD7791_FILTER_RATE_33_3 0x2
0054 #define AD7791_FILTER_RATE_20 0x3
0055 #define AD7791_FILTER_RATE_16_6 0x4
0056 #define AD7791_FILTER_RATE_16_7 0x5
0057 #define AD7791_FILTER_RATE_13_3 0x6
0058 #define AD7791_FILTER_RATE_9_5 0x7
0059 #define AD7791_FILTER_RATE_MASK 0x7
0060
0061 #define AD7791_MODE_BUFFER BIT(1)
0062 #define AD7791_MODE_UNIPOLAR BIT(2)
0063 #define AD7791_MODE_BURNOUT BIT(3)
0064 #define AD7791_MODE_SEL_MASK (0x3 << 6)
0065 #define AD7791_MODE_SEL(x) ((x) << 6)
0066
0067 #define __AD7991_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
0068 _storagebits, _shift, _extend_name, _type, _mask_all) \
0069 { \
0070 .type = (_type), \
0071 .differential = (_channel2 == -1 ? 0 : 1), \
0072 .indexed = 1, \
0073 .channel = (_channel1), \
0074 .channel2 = (_channel2), \
0075 .address = (_address), \
0076 .extend_name = (_extend_name), \
0077 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
0078 BIT(IIO_CHAN_INFO_OFFSET), \
0079 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
0080 .info_mask_shared_by_all = _mask_all, \
0081 .scan_index = (_si), \
0082 .scan_type = { \
0083 .sign = 'u', \
0084 .realbits = (_bits), \
0085 .storagebits = (_storagebits), \
0086 .shift = (_shift), \
0087 .endianness = IIO_BE, \
0088 }, \
0089 }
0090
0091 #define AD7991_SHORTED_CHANNEL(_si, _channel, _address, _bits, \
0092 _storagebits, _shift) \
0093 __AD7991_CHANNEL(_si, _channel, _channel, _address, _bits, \
0094 _storagebits, _shift, "shorted", IIO_VOLTAGE, \
0095 BIT(IIO_CHAN_INFO_SAMP_FREQ))
0096
0097 #define AD7991_CHANNEL(_si, _channel, _address, _bits, \
0098 _storagebits, _shift) \
0099 __AD7991_CHANNEL(_si, _channel, -1, _address, _bits, \
0100 _storagebits, _shift, NULL, IIO_VOLTAGE, \
0101 BIT(IIO_CHAN_INFO_SAMP_FREQ))
0102
0103 #define AD7991_DIFF_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
0104 _storagebits, _shift) \
0105 __AD7991_CHANNEL(_si, _channel1, _channel2, _address, _bits, \
0106 _storagebits, _shift, NULL, IIO_VOLTAGE, \
0107 BIT(IIO_CHAN_INFO_SAMP_FREQ))
0108
0109 #define AD7991_SUPPLY_CHANNEL(_si, _channel, _address, _bits, _storagebits, \
0110 _shift) \
0111 __AD7991_CHANNEL(_si, _channel, -1, _address, _bits, \
0112 _storagebits, _shift, "supply", IIO_VOLTAGE, \
0113 BIT(IIO_CHAN_INFO_SAMP_FREQ))
0114
0115 #define DECLARE_AD7787_CHANNELS(name, bits, storagebits) \
0116 const struct iio_chan_spec name[] = { \
0117 AD7991_DIFF_CHANNEL(0, 0, 0, AD7791_CH_AIN1P_AIN1N, \
0118 (bits), (storagebits), 0), \
0119 AD7991_CHANNEL(1, 1, AD7791_CH_AIN2, (bits), (storagebits), 0), \
0120 AD7991_SHORTED_CHANNEL(2, 0, AD7791_CH_AIN1N_AIN1N, \
0121 (bits), (storagebits), 0), \
0122 AD7991_SUPPLY_CHANNEL(3, 2, AD7791_CH_AVDD_MONITOR, \
0123 (bits), (storagebits), 0), \
0124 IIO_CHAN_SOFT_TIMESTAMP(4), \
0125 }
0126
0127 #define DECLARE_AD7791_CHANNELS(name, bits, storagebits) \
0128 const struct iio_chan_spec name[] = { \
0129 AD7991_DIFF_CHANNEL(0, 0, 0, AD7791_CH_AIN1P_AIN1N, \
0130 (bits), (storagebits), 0), \
0131 AD7991_SHORTED_CHANNEL(1, 0, AD7791_CH_AIN1N_AIN1N, \
0132 (bits), (storagebits), 0), \
0133 AD7991_SUPPLY_CHANNEL(2, 1, AD7791_CH_AVDD_MONITOR, \
0134 (bits), (storagebits), 0), \
0135 IIO_CHAN_SOFT_TIMESTAMP(3), \
0136 }
0137
0138 static DECLARE_AD7787_CHANNELS(ad7787_channels, 24, 32);
0139 static DECLARE_AD7791_CHANNELS(ad7790_channels, 16, 16);
0140 static DECLARE_AD7791_CHANNELS(ad7791_channels, 24, 32);
0141
0142 enum {
0143 AD7787,
0144 AD7788,
0145 AD7789,
0146 AD7790,
0147 AD7791,
0148 };
0149
0150 enum ad7791_chip_info_flags {
0151 AD7791_FLAG_HAS_FILTER = (1 << 0),
0152 AD7791_FLAG_HAS_BUFFER = (1 << 1),
0153 AD7791_FLAG_HAS_UNIPOLAR = (1 << 2),
0154 AD7791_FLAG_HAS_BURNOUT = (1 << 3),
0155 };
0156
0157 struct ad7791_chip_info {
0158 const struct iio_chan_spec *channels;
0159 unsigned int num_channels;
0160 enum ad7791_chip_info_flags flags;
0161 };
0162
0163 static const struct ad7791_chip_info ad7791_chip_infos[] = {
0164 [AD7787] = {
0165 .channels = ad7787_channels,
0166 .num_channels = ARRAY_SIZE(ad7787_channels),
0167 .flags = AD7791_FLAG_HAS_FILTER | AD7791_FLAG_HAS_BUFFER |
0168 AD7791_FLAG_HAS_UNIPOLAR | AD7791_FLAG_HAS_BURNOUT,
0169 },
0170 [AD7788] = {
0171 .channels = ad7790_channels,
0172 .num_channels = ARRAY_SIZE(ad7790_channels),
0173 .flags = AD7791_FLAG_HAS_UNIPOLAR,
0174 },
0175 [AD7789] = {
0176 .channels = ad7791_channels,
0177 .num_channels = ARRAY_SIZE(ad7791_channels),
0178 .flags = AD7791_FLAG_HAS_UNIPOLAR,
0179 },
0180 [AD7790] = {
0181 .channels = ad7790_channels,
0182 .num_channels = ARRAY_SIZE(ad7790_channels),
0183 .flags = AD7791_FLAG_HAS_FILTER | AD7791_FLAG_HAS_BUFFER |
0184 AD7791_FLAG_HAS_BURNOUT,
0185 },
0186 [AD7791] = {
0187 .channels = ad7791_channels,
0188 .num_channels = ARRAY_SIZE(ad7791_channels),
0189 .flags = AD7791_FLAG_HAS_FILTER | AD7791_FLAG_HAS_BUFFER |
0190 AD7791_FLAG_HAS_UNIPOLAR | AD7791_FLAG_HAS_BURNOUT,
0191 },
0192 };
0193
0194 struct ad7791_state {
0195 struct ad_sigma_delta sd;
0196 uint8_t mode;
0197 uint8_t filter;
0198
0199 struct regulator *reg;
0200 const struct ad7791_chip_info *info;
0201 };
0202
0203 static const int ad7791_sample_freq_avail[8][2] = {
0204 [AD7791_FILTER_RATE_120] = { 120, 0 },
0205 [AD7791_FILTER_RATE_100] = { 100, 0 },
0206 [AD7791_FILTER_RATE_33_3] = { 33, 300000 },
0207 [AD7791_FILTER_RATE_20] = { 20, 0 },
0208 [AD7791_FILTER_RATE_16_6] = { 16, 600000 },
0209 [AD7791_FILTER_RATE_16_7] = { 16, 700000 },
0210 [AD7791_FILTER_RATE_13_3] = { 13, 300000 },
0211 [AD7791_FILTER_RATE_9_5] = { 9, 500000 },
0212 };
0213
0214 static struct ad7791_state *ad_sigma_delta_to_ad7791(struct ad_sigma_delta *sd)
0215 {
0216 return container_of(sd, struct ad7791_state, sd);
0217 }
0218
0219 static int ad7791_set_channel(struct ad_sigma_delta *sd, unsigned int channel)
0220 {
0221 ad_sd_set_comm(sd, channel);
0222
0223 return 0;
0224 }
0225
0226 static int ad7791_set_mode(struct ad_sigma_delta *sd,
0227 enum ad_sigma_delta_mode mode)
0228 {
0229 struct ad7791_state *st = ad_sigma_delta_to_ad7791(sd);
0230
0231 switch (mode) {
0232 case AD_SD_MODE_CONTINUOUS:
0233 mode = AD7791_MODE_CONTINUOUS;
0234 break;
0235 case AD_SD_MODE_SINGLE:
0236 mode = AD7791_MODE_SINGLE;
0237 break;
0238 case AD_SD_MODE_IDLE:
0239 case AD_SD_MODE_POWERDOWN:
0240 mode = AD7791_MODE_POWERDOWN;
0241 break;
0242 }
0243
0244 st->mode &= ~AD7791_MODE_SEL_MASK;
0245 st->mode |= AD7791_MODE_SEL(mode);
0246
0247 return ad_sd_write_reg(sd, AD7791_REG_MODE, sizeof(st->mode), st->mode);
0248 }
0249
0250 static const struct ad_sigma_delta_info ad7791_sigma_delta_info = {
0251 .set_channel = ad7791_set_channel,
0252 .set_mode = ad7791_set_mode,
0253 .has_registers = true,
0254 .addr_shift = 4,
0255 .read_mask = BIT(3),
0256 .irq_flags = IRQF_TRIGGER_LOW,
0257 };
0258
0259 static int ad7791_read_raw(struct iio_dev *indio_dev,
0260 const struct iio_chan_spec *chan, int *val, int *val2, long info)
0261 {
0262 struct ad7791_state *st = iio_priv(indio_dev);
0263 bool unipolar = !!(st->mode & AD7791_MODE_UNIPOLAR);
0264 unsigned int rate;
0265
0266 switch (info) {
0267 case IIO_CHAN_INFO_RAW:
0268 return ad_sigma_delta_single_conversion(indio_dev, chan, val);
0269 case IIO_CHAN_INFO_OFFSET:
0270
0271
0272
0273
0274 if (unipolar)
0275 *val = 0;
0276 else
0277 *val = -(1 << (chan->scan_type.realbits - 1));
0278 return IIO_VAL_INT;
0279 case IIO_CHAN_INFO_SCALE:
0280
0281 if (chan->address == AD7791_CH_AVDD_MONITOR) {
0282
0283
0284
0285
0286 *val = 1170 * 5;
0287 } else {
0288 int voltage_uv;
0289
0290 voltage_uv = regulator_get_voltage(st->reg);
0291 if (voltage_uv < 0)
0292 return voltage_uv;
0293
0294 *val = voltage_uv / 1000;
0295 }
0296 if (unipolar)
0297 *val2 = chan->scan_type.realbits;
0298 else
0299 *val2 = chan->scan_type.realbits - 1;
0300
0301 return IIO_VAL_FRACTIONAL_LOG2;
0302 case IIO_CHAN_INFO_SAMP_FREQ:
0303 rate = st->filter & AD7791_FILTER_RATE_MASK;
0304 *val = ad7791_sample_freq_avail[rate][0];
0305 *val2 = ad7791_sample_freq_avail[rate][1];
0306 return IIO_VAL_INT_PLUS_MICRO;
0307 }
0308
0309 return -EINVAL;
0310 }
0311
0312 static int ad7791_write_raw(struct iio_dev *indio_dev,
0313 struct iio_chan_spec const *chan, int val, int val2, long mask)
0314 {
0315 struct ad7791_state *st = iio_priv(indio_dev);
0316 int ret, i;
0317
0318 ret = iio_device_claim_direct_mode(indio_dev);
0319 if (ret)
0320 return ret;
0321
0322 switch (mask) {
0323 case IIO_CHAN_INFO_SAMP_FREQ:
0324 for (i = 0; i < ARRAY_SIZE(ad7791_sample_freq_avail); i++) {
0325 if (ad7791_sample_freq_avail[i][0] == val &&
0326 ad7791_sample_freq_avail[i][1] == val2)
0327 break;
0328 }
0329
0330 if (i == ARRAY_SIZE(ad7791_sample_freq_avail)) {
0331 ret = -EINVAL;
0332 break;
0333 }
0334
0335 st->filter &= ~AD7791_FILTER_RATE_MASK;
0336 st->filter |= i;
0337 ad_sd_write_reg(&st->sd, AD7791_REG_FILTER,
0338 sizeof(st->filter),
0339 st->filter);
0340 break;
0341 default:
0342 ret = -EINVAL;
0343 }
0344
0345 iio_device_release_direct_mode(indio_dev);
0346 return ret;
0347 }
0348
0349 static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("120 100 33.3 20 16.7 16.6 13.3 9.5");
0350
0351 static struct attribute *ad7791_attributes[] = {
0352 &iio_const_attr_sampling_frequency_available.dev_attr.attr,
0353 NULL
0354 };
0355
0356 static const struct attribute_group ad7791_attribute_group = {
0357 .attrs = ad7791_attributes,
0358 };
0359
0360 static const struct iio_info ad7791_info = {
0361 .read_raw = &ad7791_read_raw,
0362 .write_raw = &ad7791_write_raw,
0363 .attrs = &ad7791_attribute_group,
0364 .validate_trigger = ad_sd_validate_trigger,
0365 };
0366
0367 static const struct iio_info ad7791_no_filter_info = {
0368 .read_raw = &ad7791_read_raw,
0369 .write_raw = &ad7791_write_raw,
0370 .validate_trigger = ad_sd_validate_trigger,
0371 };
0372
0373 static int ad7791_setup(struct ad7791_state *st,
0374 struct ad7791_platform_data *pdata)
0375 {
0376
0377 st->mode = AD7791_MODE_BUFFER;
0378 st->filter = AD7791_FILTER_RATE_16_6;
0379
0380 if (!pdata)
0381 return 0;
0382
0383 if ((st->info->flags & AD7791_FLAG_HAS_BUFFER) && !pdata->buffered)
0384 st->mode &= ~AD7791_MODE_BUFFER;
0385
0386 if ((st->info->flags & AD7791_FLAG_HAS_BURNOUT) &&
0387 pdata->burnout_current)
0388 st->mode |= AD7791_MODE_BURNOUT;
0389
0390 if ((st->info->flags & AD7791_FLAG_HAS_UNIPOLAR) && pdata->unipolar)
0391 st->mode |= AD7791_MODE_UNIPOLAR;
0392
0393 return ad_sd_write_reg(&st->sd, AD7791_REG_MODE, sizeof(st->mode),
0394 st->mode);
0395 }
0396
0397 static void ad7791_reg_disable(void *reg)
0398 {
0399 regulator_disable(reg);
0400 }
0401
0402 static int ad7791_probe(struct spi_device *spi)
0403 {
0404 struct ad7791_platform_data *pdata = spi->dev.platform_data;
0405 struct iio_dev *indio_dev;
0406 struct ad7791_state *st;
0407 int ret;
0408
0409 if (!spi->irq) {
0410 dev_err(&spi->dev, "Missing IRQ.\n");
0411 return -ENXIO;
0412 }
0413
0414 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
0415 if (!indio_dev)
0416 return -ENOMEM;
0417
0418 st = iio_priv(indio_dev);
0419
0420 st->reg = devm_regulator_get(&spi->dev, "refin");
0421 if (IS_ERR(st->reg))
0422 return PTR_ERR(st->reg);
0423
0424 ret = regulator_enable(st->reg);
0425 if (ret)
0426 return ret;
0427
0428 ret = devm_add_action_or_reset(&spi->dev, ad7791_reg_disable, st->reg);
0429 if (ret)
0430 return ret;
0431
0432 st->info = &ad7791_chip_infos[spi_get_device_id(spi)->driver_data];
0433 ad_sd_init(&st->sd, indio_dev, spi, &ad7791_sigma_delta_info);
0434
0435 indio_dev->name = spi_get_device_id(spi)->name;
0436 indio_dev->modes = INDIO_DIRECT_MODE;
0437 indio_dev->channels = st->info->channels;
0438 indio_dev->num_channels = st->info->num_channels;
0439 if (st->info->flags & AD7791_FLAG_HAS_FILTER)
0440 indio_dev->info = &ad7791_info;
0441 else
0442 indio_dev->info = &ad7791_no_filter_info;
0443
0444 ret = devm_ad_sd_setup_buffer_and_trigger(&spi->dev, indio_dev);
0445 if (ret)
0446 return ret;
0447
0448 ret = ad7791_setup(st, pdata);
0449 if (ret)
0450 return ret;
0451
0452 return devm_iio_device_register(&spi->dev, indio_dev);
0453 }
0454
0455 static const struct spi_device_id ad7791_spi_ids[] = {
0456 { "ad7787", AD7787 },
0457 { "ad7788", AD7788 },
0458 { "ad7789", AD7789 },
0459 { "ad7790", AD7790 },
0460 { "ad7791", AD7791 },
0461 {}
0462 };
0463 MODULE_DEVICE_TABLE(spi, ad7791_spi_ids);
0464
0465 static struct spi_driver ad7791_driver = {
0466 .driver = {
0467 .name = "ad7791",
0468 },
0469 .probe = ad7791_probe,
0470 .id_table = ad7791_spi_ids,
0471 };
0472 module_spi_driver(ad7791_driver);
0473
0474 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
0475 MODULE_DESCRIPTION("Analog Devices AD7787/AD7788/AD7789/AD7790/AD7791 ADC driver");
0476 MODULE_LICENSE("GPL v2");
0477 MODULE_IMPORT_NS(IIO_AD_SIGMA_DELTA);