0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/align.h>
0010 #include <linux/interrupt.h>
0011 #include <linux/device.h>
0012 #include <linux/kernel.h>
0013 #include <linux/slab.h>
0014 #include <linux/spi/spi.h>
0015 #include <linux/err.h>
0016 #include <linux/module.h>
0017
0018 #include <linux/iio/iio.h>
0019 #include <linux/iio/sysfs.h>
0020 #include <linux/iio/buffer.h>
0021 #include <linux/iio/trigger.h>
0022 #include <linux/iio/trigger_consumer.h>
0023 #include <linux/iio/triggered_buffer.h>
0024 #include <linux/iio/adc/ad_sigma_delta.h>
0025
0026 #include <asm/unaligned.h>
0027
0028
0029 #define AD_SD_COMM_CHAN_MASK 0x3
0030
0031 #define AD_SD_REG_COMM 0x00
0032 #define AD_SD_REG_DATA 0x03
0033
0034
0035
0036
0037
0038
0039
0040 void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm)
0041 {
0042
0043
0044 sigma_delta->comm = comm & AD_SD_COMM_CHAN_MASK;
0045 }
0046 EXPORT_SYMBOL_NS_GPL(ad_sd_set_comm, IIO_AD_SIGMA_DELTA);
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg,
0059 unsigned int size, unsigned int val)
0060 {
0061 uint8_t *data = sigma_delta->tx_buf;
0062 struct spi_transfer t = {
0063 .tx_buf = data,
0064 .len = size + 1,
0065 .cs_change = sigma_delta->keep_cs_asserted,
0066 };
0067 struct spi_message m;
0068 int ret;
0069
0070 data[0] = (reg << sigma_delta->info->addr_shift) | sigma_delta->comm;
0071
0072 switch (size) {
0073 case 3:
0074 put_unaligned_be24(val, &data[1]);
0075 break;
0076 case 2:
0077 put_unaligned_be16(val, &data[1]);
0078 break;
0079 case 1:
0080 data[1] = val;
0081 break;
0082 case 0:
0083 break;
0084 default:
0085 return -EINVAL;
0086 }
0087
0088 spi_message_init(&m);
0089 spi_message_add_tail(&t, &m);
0090
0091 if (sigma_delta->bus_locked)
0092 ret = spi_sync_locked(sigma_delta->spi, &m);
0093 else
0094 ret = spi_sync(sigma_delta->spi, &m);
0095
0096 return ret;
0097 }
0098 EXPORT_SYMBOL_NS_GPL(ad_sd_write_reg, IIO_AD_SIGMA_DELTA);
0099
0100 static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta,
0101 unsigned int reg, unsigned int size, uint8_t *val)
0102 {
0103 uint8_t *data = sigma_delta->tx_buf;
0104 int ret;
0105 struct spi_transfer t[] = {
0106 {
0107 .tx_buf = data,
0108 .len = 1,
0109 }, {
0110 .rx_buf = val,
0111 .len = size,
0112 .cs_change = sigma_delta->bus_locked,
0113 },
0114 };
0115 struct spi_message m;
0116
0117 spi_message_init(&m);
0118
0119 if (sigma_delta->info->has_registers) {
0120 data[0] = reg << sigma_delta->info->addr_shift;
0121 data[0] |= sigma_delta->info->read_mask;
0122 data[0] |= sigma_delta->comm;
0123 spi_message_add_tail(&t[0], &m);
0124 }
0125 spi_message_add_tail(&t[1], &m);
0126
0127 if (sigma_delta->bus_locked)
0128 ret = spi_sync_locked(sigma_delta->spi, &m);
0129 else
0130 ret = spi_sync(sigma_delta->spi, &m);
0131
0132 return ret;
0133 }
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145 int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta,
0146 unsigned int reg, unsigned int size, unsigned int *val)
0147 {
0148 int ret;
0149
0150 ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->rx_buf);
0151 if (ret < 0)
0152 goto out;
0153
0154 switch (size) {
0155 case 4:
0156 *val = get_unaligned_be32(sigma_delta->rx_buf);
0157 break;
0158 case 3:
0159 *val = get_unaligned_be24(sigma_delta->rx_buf);
0160 break;
0161 case 2:
0162 *val = get_unaligned_be16(sigma_delta->rx_buf);
0163 break;
0164 case 1:
0165 *val = sigma_delta->rx_buf[0];
0166 break;
0167 default:
0168 ret = -EINVAL;
0169 break;
0170 }
0171
0172 out:
0173 return ret;
0174 }
0175 EXPORT_SYMBOL_NS_GPL(ad_sd_read_reg, IIO_AD_SIGMA_DELTA);
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 int ad_sd_reset(struct ad_sigma_delta *sigma_delta,
0186 unsigned int reset_length)
0187 {
0188 uint8_t *buf;
0189 unsigned int size;
0190 int ret;
0191
0192 size = DIV_ROUND_UP(reset_length, 8);
0193 buf = kcalloc(size, sizeof(*buf), GFP_KERNEL);
0194 if (!buf)
0195 return -ENOMEM;
0196
0197 memset(buf, 0xff, size);
0198 ret = spi_write(sigma_delta->spi, buf, size);
0199 kfree(buf);
0200
0201 return ret;
0202 }
0203 EXPORT_SYMBOL_NS_GPL(ad_sd_reset, IIO_AD_SIGMA_DELTA);
0204
0205 int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta,
0206 unsigned int mode, unsigned int channel)
0207 {
0208 int ret;
0209 unsigned long timeout;
0210
0211 ret = ad_sigma_delta_set_channel(sigma_delta, channel);
0212 if (ret)
0213 return ret;
0214
0215 spi_bus_lock(sigma_delta->spi->master);
0216 sigma_delta->bus_locked = true;
0217 sigma_delta->keep_cs_asserted = true;
0218 reinit_completion(&sigma_delta->completion);
0219
0220 ret = ad_sigma_delta_set_mode(sigma_delta, mode);
0221 if (ret < 0)
0222 goto out;
0223
0224 sigma_delta->irq_dis = false;
0225 enable_irq(sigma_delta->spi->irq);
0226 timeout = wait_for_completion_timeout(&sigma_delta->completion, 2 * HZ);
0227 if (timeout == 0) {
0228 sigma_delta->irq_dis = true;
0229 disable_irq_nosync(sigma_delta->spi->irq);
0230 ret = -EIO;
0231 } else {
0232 ret = 0;
0233 }
0234 out:
0235 sigma_delta->keep_cs_asserted = false;
0236 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
0237 sigma_delta->bus_locked = false;
0238 spi_bus_unlock(sigma_delta->spi->master);
0239
0240 return ret;
0241 }
0242 EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate, IIO_AD_SIGMA_DELTA);
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252 int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta,
0253 const struct ad_sd_calib_data *cb, unsigned int n)
0254 {
0255 unsigned int i;
0256 int ret;
0257
0258 for (i = 0; i < n; i++) {
0259 ret = ad_sd_calibrate(sigma_delta, cb[i].mode, cb[i].channel);
0260 if (ret)
0261 return ret;
0262 }
0263
0264 return 0;
0265 }
0266 EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate_all, IIO_AD_SIGMA_DELTA);
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276 int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev,
0277 const struct iio_chan_spec *chan, int *val)
0278 {
0279 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0280 unsigned int sample, raw_sample;
0281 unsigned int data_reg;
0282 int ret = 0;
0283
0284 if (iio_buffer_enabled(indio_dev))
0285 return -EBUSY;
0286
0287 mutex_lock(&indio_dev->mlock);
0288 ad_sigma_delta_set_channel(sigma_delta, chan->address);
0289
0290 spi_bus_lock(sigma_delta->spi->master);
0291 sigma_delta->bus_locked = true;
0292 sigma_delta->keep_cs_asserted = true;
0293 reinit_completion(&sigma_delta->completion);
0294
0295 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE);
0296
0297 sigma_delta->irq_dis = false;
0298 enable_irq(sigma_delta->spi->irq);
0299 ret = wait_for_completion_interruptible_timeout(
0300 &sigma_delta->completion, HZ);
0301
0302 if (ret == 0)
0303 ret = -EIO;
0304 if (ret < 0)
0305 goto out;
0306
0307 if (sigma_delta->info->data_reg != 0)
0308 data_reg = sigma_delta->info->data_reg;
0309 else
0310 data_reg = AD_SD_REG_DATA;
0311
0312 ret = ad_sd_read_reg(sigma_delta, data_reg,
0313 DIV_ROUND_UP(chan->scan_type.realbits + chan->scan_type.shift, 8),
0314 &raw_sample);
0315
0316 out:
0317 if (!sigma_delta->irq_dis) {
0318 disable_irq_nosync(sigma_delta->spi->irq);
0319 sigma_delta->irq_dis = true;
0320 }
0321
0322 sigma_delta->keep_cs_asserted = false;
0323 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
0324 sigma_delta->bus_locked = false;
0325 spi_bus_unlock(sigma_delta->spi->master);
0326 mutex_unlock(&indio_dev->mlock);
0327
0328 if (ret)
0329 return ret;
0330
0331 sample = raw_sample >> chan->scan_type.shift;
0332 sample &= (1 << chan->scan_type.realbits) - 1;
0333 *val = sample;
0334
0335 ret = ad_sigma_delta_postprocess_sample(sigma_delta, raw_sample);
0336 if (ret)
0337 return ret;
0338
0339 return IIO_VAL_INT;
0340 }
0341 EXPORT_SYMBOL_NS_GPL(ad_sigma_delta_single_conversion, IIO_AD_SIGMA_DELTA);
0342
0343 static int ad_sd_buffer_postenable(struct iio_dev *indio_dev)
0344 {
0345 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0346 unsigned int i, slot, samples_buf_size;
0347 unsigned int channel;
0348 uint8_t *samples_buf;
0349 int ret;
0350
0351 if (sigma_delta->num_slots == 1) {
0352 channel = find_first_bit(indio_dev->active_scan_mask,
0353 indio_dev->masklength);
0354 ret = ad_sigma_delta_set_channel(sigma_delta,
0355 indio_dev->channels[channel].address);
0356 if (ret)
0357 return ret;
0358 slot = 1;
0359 } else {
0360
0361
0362
0363
0364
0365 slot = 0;
0366 for_each_set_bit(i, indio_dev->active_scan_mask, indio_dev->masklength) {
0367 sigma_delta->slots[slot] = indio_dev->channels[i].address;
0368 slot++;
0369 }
0370 }
0371
0372 sigma_delta->active_slots = slot;
0373 sigma_delta->current_slot = 0;
0374
0375 if (sigma_delta->active_slots > 1) {
0376 ret = ad_sigma_delta_append_status(sigma_delta, true);
0377 if (ret)
0378 return ret;
0379 }
0380
0381 samples_buf_size = ALIGN(slot * indio_dev->channels[0].scan_type.storagebits, 8);
0382 samples_buf_size += sizeof(int64_t);
0383 samples_buf = devm_krealloc(&sigma_delta->spi->dev, sigma_delta->samples_buf,
0384 samples_buf_size, GFP_KERNEL);
0385 if (!samples_buf)
0386 return -ENOMEM;
0387
0388 sigma_delta->samples_buf = samples_buf;
0389
0390 spi_bus_lock(sigma_delta->spi->master);
0391 sigma_delta->bus_locked = true;
0392 sigma_delta->keep_cs_asserted = true;
0393
0394 ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS);
0395 if (ret)
0396 goto err_unlock;
0397
0398 sigma_delta->irq_dis = false;
0399 enable_irq(sigma_delta->spi->irq);
0400
0401 return 0;
0402
0403 err_unlock:
0404 spi_bus_unlock(sigma_delta->spi->master);
0405
0406 return ret;
0407 }
0408
0409 static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev)
0410 {
0411 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0412
0413 reinit_completion(&sigma_delta->completion);
0414 wait_for_completion_timeout(&sigma_delta->completion, HZ);
0415
0416 if (!sigma_delta->irq_dis) {
0417 disable_irq_nosync(sigma_delta->spi->irq);
0418 sigma_delta->irq_dis = true;
0419 }
0420
0421 sigma_delta->keep_cs_asserted = false;
0422 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE);
0423
0424 if (sigma_delta->status_appended)
0425 ad_sigma_delta_append_status(sigma_delta, false);
0426
0427 ad_sigma_delta_disable_all(sigma_delta);
0428 sigma_delta->bus_locked = false;
0429 return spi_bus_unlock(sigma_delta->spi->master);
0430 }
0431
0432 static irqreturn_t ad_sd_trigger_handler(int irq, void *p)
0433 {
0434 struct iio_poll_func *pf = p;
0435 struct iio_dev *indio_dev = pf->indio_dev;
0436 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0437 uint8_t *data = sigma_delta->rx_buf;
0438 unsigned int transfer_size;
0439 unsigned int sample_size;
0440 unsigned int sample_pos;
0441 unsigned int status_pos;
0442 unsigned int reg_size;
0443 unsigned int data_reg;
0444
0445 reg_size = indio_dev->channels[0].scan_type.realbits +
0446 indio_dev->channels[0].scan_type.shift;
0447 reg_size = DIV_ROUND_UP(reg_size, 8);
0448
0449 if (sigma_delta->info->data_reg != 0)
0450 data_reg = sigma_delta->info->data_reg;
0451 else
0452 data_reg = AD_SD_REG_DATA;
0453
0454
0455 if (sigma_delta->status_appended)
0456 transfer_size = reg_size + 1;
0457 else
0458 transfer_size = reg_size;
0459
0460 switch (reg_size) {
0461 case 4:
0462 case 2:
0463 case 1:
0464 status_pos = reg_size;
0465 ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[0]);
0466 break;
0467 case 3:
0468
0469
0470
0471
0472
0473 status_pos = reg_size + 1;
0474
0475
0476
0477 ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[1]);
0478 break;
0479 }
0480
0481
0482
0483
0484
0485 if (sigma_delta->active_slots == 1) {
0486 iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp);
0487 goto irq_handled;
0488 }
0489
0490 if (sigma_delta->status_appended) {
0491 u8 converted_channel;
0492
0493 converted_channel = data[status_pos] & sigma_delta->info->status_ch_mask;
0494 if (converted_channel != sigma_delta->slots[sigma_delta->current_slot]) {
0495
0496
0497
0498
0499
0500 sigma_delta->current_slot = 0;
0501 goto irq_handled;
0502 }
0503 }
0504
0505 sample_size = indio_dev->channels[0].scan_type.storagebits / 8;
0506 sample_pos = sample_size * sigma_delta->current_slot;
0507 memcpy(&sigma_delta->samples_buf[sample_pos], data, sample_size);
0508 sigma_delta->current_slot++;
0509
0510 if (sigma_delta->current_slot == sigma_delta->active_slots) {
0511 sigma_delta->current_slot = 0;
0512 iio_push_to_buffers_with_timestamp(indio_dev, sigma_delta->samples_buf,
0513 pf->timestamp);
0514 }
0515
0516 irq_handled:
0517 iio_trigger_notify_done(indio_dev->trig);
0518 sigma_delta->irq_dis = false;
0519 enable_irq(sigma_delta->spi->irq);
0520
0521 return IRQ_HANDLED;
0522 }
0523
0524 static bool ad_sd_validate_scan_mask(struct iio_dev *indio_dev, const unsigned long *mask)
0525 {
0526 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0527
0528 return bitmap_weight(mask, indio_dev->masklength) <= sigma_delta->num_slots;
0529 }
0530
0531 static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = {
0532 .postenable = &ad_sd_buffer_postenable,
0533 .postdisable = &ad_sd_buffer_postdisable,
0534 .validate_scan_mask = &ad_sd_validate_scan_mask,
0535 };
0536
0537 static irqreturn_t ad_sd_data_rdy_trig_poll(int irq, void *private)
0538 {
0539 struct ad_sigma_delta *sigma_delta = private;
0540
0541 complete(&sigma_delta->completion);
0542 disable_irq_nosync(irq);
0543 sigma_delta->irq_dis = true;
0544 iio_trigger_poll(sigma_delta->trig);
0545
0546 return IRQ_HANDLED;
0547 }
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557 int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig)
0558 {
0559 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0560
0561 if (sigma_delta->trig != trig)
0562 return -EINVAL;
0563
0564 return 0;
0565 }
0566 EXPORT_SYMBOL_NS_GPL(ad_sd_validate_trigger, IIO_AD_SIGMA_DELTA);
0567
0568 static int devm_ad_sd_probe_trigger(struct device *dev, struct iio_dev *indio_dev)
0569 {
0570 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0571 int ret;
0572
0573 if (dev != &sigma_delta->spi->dev) {
0574 dev_err(dev, "Trigger parent should be '%s', got '%s'\n",
0575 dev_name(dev), dev_name(&sigma_delta->spi->dev));
0576 return -EFAULT;
0577 }
0578
0579 sigma_delta->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name,
0580 iio_device_id(indio_dev));
0581 if (sigma_delta->trig == NULL)
0582 return -ENOMEM;
0583
0584 init_completion(&sigma_delta->completion);
0585
0586 sigma_delta->irq_dis = true;
0587 ret = devm_request_irq(dev, sigma_delta->spi->irq,
0588 ad_sd_data_rdy_trig_poll,
0589 sigma_delta->info->irq_flags | IRQF_NO_AUTOEN,
0590 indio_dev->name,
0591 sigma_delta);
0592 if (ret)
0593 return ret;
0594
0595 iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta);
0596
0597 ret = devm_iio_trigger_register(dev, sigma_delta->trig);
0598 if (ret)
0599 return ret;
0600
0601
0602 indio_dev->trig = iio_trigger_get(sigma_delta->trig);
0603
0604 return 0;
0605 }
0606
0607
0608
0609
0610
0611
0612 int devm_ad_sd_setup_buffer_and_trigger(struct device *dev, struct iio_dev *indio_dev)
0613 {
0614 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev);
0615 int ret;
0616
0617 sigma_delta->slots = devm_kcalloc(dev, sigma_delta->num_slots,
0618 sizeof(*sigma_delta->slots), GFP_KERNEL);
0619 if (!sigma_delta->slots)
0620 return -ENOMEM;
0621
0622 ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
0623 &iio_pollfunc_store_time,
0624 &ad_sd_trigger_handler,
0625 &ad_sd_buffer_setup_ops);
0626 if (ret)
0627 return ret;
0628
0629 return devm_ad_sd_probe_trigger(dev, indio_dev);
0630 }
0631 EXPORT_SYMBOL_NS_GPL(devm_ad_sd_setup_buffer_and_trigger, IIO_AD_SIGMA_DELTA);
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643 int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev,
0644 struct spi_device *spi, const struct ad_sigma_delta_info *info)
0645 {
0646 sigma_delta->spi = spi;
0647 sigma_delta->info = info;
0648
0649
0650 if (!info->num_slots)
0651 sigma_delta->num_slots = 1;
0652 else
0653 sigma_delta->num_slots = info->num_slots;
0654
0655 if (sigma_delta->num_slots > 1) {
0656 if (!indio_dev->info->update_scan_mode) {
0657 dev_err(&spi->dev, "iio_dev lacks update_scan_mode().\n");
0658 return -EINVAL;
0659 }
0660
0661 if (!info->disable_all) {
0662 dev_err(&spi->dev, "ad_sigma_delta_info lacks disable_all().\n");
0663 return -EINVAL;
0664 }
0665 }
0666
0667 iio_device_set_drvdata(indio_dev, sigma_delta);
0668
0669 return 0;
0670 }
0671 EXPORT_SYMBOL_NS_GPL(ad_sd_init, IIO_AD_SIGMA_DELTA);
0672
0673 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
0674 MODULE_DESCRIPTION("Analog Devices Sigma-Delta ADCs");
0675 MODULE_LICENSE("GPL v2");