ad_sigma_delta.c (17624B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Support code for Analog Devices Sigma-Delta ADCs 4 * 5 * Copyright 2012 Analog Devices Inc. 6 * Author: Lars-Peter Clausen <lars@metafoo.de> 7 */ 8 9#include <linux/align.h> 10#include <linux/interrupt.h> 11#include <linux/device.h> 12#include <linux/kernel.h> 13#include <linux/slab.h> 14#include <linux/spi/spi.h> 15#include <linux/err.h> 16#include <linux/module.h> 17 18#include <linux/iio/iio.h> 19#include <linux/iio/sysfs.h> 20#include <linux/iio/buffer.h> 21#include <linux/iio/trigger.h> 22#include <linux/iio/trigger_consumer.h> 23#include <linux/iio/triggered_buffer.h> 24#include <linux/iio/adc/ad_sigma_delta.h> 25 26#include <asm/unaligned.h> 27 28 29#define AD_SD_COMM_CHAN_MASK 0x3 30 31#define AD_SD_REG_COMM 0x00 32#define AD_SD_REG_DATA 0x03 33 34/** 35 * ad_sd_set_comm() - Set communications register 36 * 37 * @sigma_delta: The sigma delta device 38 * @comm: New value for the communications register 39 */ 40void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm) 41{ 42 /* Some variants use the lower two bits of the communications register 43 * to select the channel */ 44 sigma_delta->comm = comm & AD_SD_COMM_CHAN_MASK; 45} 46EXPORT_SYMBOL_NS_GPL(ad_sd_set_comm, IIO_AD_SIGMA_DELTA); 47 48/** 49 * ad_sd_write_reg() - Write a register 50 * 51 * @sigma_delta: The sigma delta device 52 * @reg: Address of the register 53 * @size: Size of the register (0-3) 54 * @val: Value to write to the register 55 * 56 * Returns 0 on success, an error code otherwise. 57 **/ 58int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, 59 unsigned int size, unsigned int val) 60{ 61 uint8_t *data = sigma_delta->tx_buf; 62 struct spi_transfer t = { 63 .tx_buf = data, 64 .len = size + 1, 65 .cs_change = sigma_delta->keep_cs_asserted, 66 }; 67 struct spi_message m; 68 int ret; 69 70 data[0] = (reg << sigma_delta->info->addr_shift) | sigma_delta->comm; 71 72 switch (size) { 73 case 3: 74 put_unaligned_be24(val, &data[1]); 75 break; 76 case 2: 77 put_unaligned_be16(val, &data[1]); 78 break; 79 case 1: 80 data[1] = val; 81 break; 82 case 0: 83 break; 84 default: 85 return -EINVAL; 86 } 87 88 spi_message_init(&m); 89 spi_message_add_tail(&t, &m); 90 91 if (sigma_delta->bus_locked) 92 ret = spi_sync_locked(sigma_delta->spi, &m); 93 else 94 ret = spi_sync(sigma_delta->spi, &m); 95 96 return ret; 97} 98EXPORT_SYMBOL_NS_GPL(ad_sd_write_reg, IIO_AD_SIGMA_DELTA); 99 100static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta, 101 unsigned int reg, unsigned int size, uint8_t *val) 102{ 103 uint8_t *data = sigma_delta->tx_buf; 104 int ret; 105 struct spi_transfer t[] = { 106 { 107 .tx_buf = data, 108 .len = 1, 109 }, { 110 .rx_buf = val, 111 .len = size, 112 .cs_change = sigma_delta->bus_locked, 113 }, 114 }; 115 struct spi_message m; 116 117 spi_message_init(&m); 118 119 if (sigma_delta->info->has_registers) { 120 data[0] = reg << sigma_delta->info->addr_shift; 121 data[0] |= sigma_delta->info->read_mask; 122 data[0] |= sigma_delta->comm; 123 spi_message_add_tail(&t[0], &m); 124 } 125 spi_message_add_tail(&t[1], &m); 126 127 if (sigma_delta->bus_locked) 128 ret = spi_sync_locked(sigma_delta->spi, &m); 129 else 130 ret = spi_sync(sigma_delta->spi, &m); 131 132 return ret; 133} 134 135/** 136 * ad_sd_read_reg() - Read a register 137 * 138 * @sigma_delta: The sigma delta device 139 * @reg: Address of the register 140 * @size: Size of the register (1-4) 141 * @val: Read value 142 * 143 * Returns 0 on success, an error code otherwise. 144 **/ 145int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, 146 unsigned int reg, unsigned int size, unsigned int *val) 147{ 148 int ret; 149 150 ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->rx_buf); 151 if (ret < 0) 152 goto out; 153 154 switch (size) { 155 case 4: 156 *val = get_unaligned_be32(sigma_delta->rx_buf); 157 break; 158 case 3: 159 *val = get_unaligned_be24(sigma_delta->rx_buf); 160 break; 161 case 2: 162 *val = get_unaligned_be16(sigma_delta->rx_buf); 163 break; 164 case 1: 165 *val = sigma_delta->rx_buf[0]; 166 break; 167 default: 168 ret = -EINVAL; 169 break; 170 } 171 172out: 173 return ret; 174} 175EXPORT_SYMBOL_NS_GPL(ad_sd_read_reg, IIO_AD_SIGMA_DELTA); 176 177/** 178 * ad_sd_reset() - Reset the serial interface 179 * 180 * @sigma_delta: The sigma delta device 181 * @reset_length: Number of SCLKs with DIN = 1 182 * 183 * Returns 0 on success, an error code otherwise. 184 **/ 185int ad_sd_reset(struct ad_sigma_delta *sigma_delta, 186 unsigned int reset_length) 187{ 188 uint8_t *buf; 189 unsigned int size; 190 int ret; 191 192 size = DIV_ROUND_UP(reset_length, 8); 193 buf = kcalloc(size, sizeof(*buf), GFP_KERNEL); 194 if (!buf) 195 return -ENOMEM; 196 197 memset(buf, 0xff, size); 198 ret = spi_write(sigma_delta->spi, buf, size); 199 kfree(buf); 200 201 return ret; 202} 203EXPORT_SYMBOL_NS_GPL(ad_sd_reset, IIO_AD_SIGMA_DELTA); 204 205int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta, 206 unsigned int mode, unsigned int channel) 207{ 208 int ret; 209 unsigned long timeout; 210 211 ret = ad_sigma_delta_set_channel(sigma_delta, channel); 212 if (ret) 213 return ret; 214 215 spi_bus_lock(sigma_delta->spi->master); 216 sigma_delta->bus_locked = true; 217 sigma_delta->keep_cs_asserted = true; 218 reinit_completion(&sigma_delta->completion); 219 220 ret = ad_sigma_delta_set_mode(sigma_delta, mode); 221 if (ret < 0) 222 goto out; 223 224 sigma_delta->irq_dis = false; 225 enable_irq(sigma_delta->spi->irq); 226 timeout = wait_for_completion_timeout(&sigma_delta->completion, 2 * HZ); 227 if (timeout == 0) { 228 sigma_delta->irq_dis = true; 229 disable_irq_nosync(sigma_delta->spi->irq); 230 ret = -EIO; 231 } else { 232 ret = 0; 233 } 234out: 235 sigma_delta->keep_cs_asserted = false; 236 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); 237 sigma_delta->bus_locked = false; 238 spi_bus_unlock(sigma_delta->spi->master); 239 240 return ret; 241} 242EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate, IIO_AD_SIGMA_DELTA); 243 244/** 245 * ad_sd_calibrate_all() - Performs channel calibration 246 * @sigma_delta: The sigma delta device 247 * @cb: Array of channels and calibration type to perform 248 * @n: Number of items in cb 249 * 250 * Returns 0 on success, an error code otherwise. 251 **/ 252int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta, 253 const struct ad_sd_calib_data *cb, unsigned int n) 254{ 255 unsigned int i; 256 int ret; 257 258 for (i = 0; i < n; i++) { 259 ret = ad_sd_calibrate(sigma_delta, cb[i].mode, cb[i].channel); 260 if (ret) 261 return ret; 262 } 263 264 return 0; 265} 266EXPORT_SYMBOL_NS_GPL(ad_sd_calibrate_all, IIO_AD_SIGMA_DELTA); 267 268/** 269 * ad_sigma_delta_single_conversion() - Performs a single data conversion 270 * @indio_dev: The IIO device 271 * @chan: The conversion is done for this channel 272 * @val: Pointer to the location where to store the read value 273 * 274 * Returns: 0 on success, an error value otherwise. 275 */ 276int ad_sigma_delta_single_conversion(struct iio_dev *indio_dev, 277 const struct iio_chan_spec *chan, int *val) 278{ 279 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 280 unsigned int sample, raw_sample; 281 unsigned int data_reg; 282 int ret = 0; 283 284 if (iio_buffer_enabled(indio_dev)) 285 return -EBUSY; 286 287 mutex_lock(&indio_dev->mlock); 288 ad_sigma_delta_set_channel(sigma_delta, chan->address); 289 290 spi_bus_lock(sigma_delta->spi->master); 291 sigma_delta->bus_locked = true; 292 sigma_delta->keep_cs_asserted = true; 293 reinit_completion(&sigma_delta->completion); 294 295 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE); 296 297 sigma_delta->irq_dis = false; 298 enable_irq(sigma_delta->spi->irq); 299 ret = wait_for_completion_interruptible_timeout( 300 &sigma_delta->completion, HZ); 301 302 if (ret == 0) 303 ret = -EIO; 304 if (ret < 0) 305 goto out; 306 307 if (sigma_delta->info->data_reg != 0) 308 data_reg = sigma_delta->info->data_reg; 309 else 310 data_reg = AD_SD_REG_DATA; 311 312 ret = ad_sd_read_reg(sigma_delta, data_reg, 313 DIV_ROUND_UP(chan->scan_type.realbits + chan->scan_type.shift, 8), 314 &raw_sample); 315 316out: 317 if (!sigma_delta->irq_dis) { 318 disable_irq_nosync(sigma_delta->spi->irq); 319 sigma_delta->irq_dis = true; 320 } 321 322 sigma_delta->keep_cs_asserted = false; 323 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); 324 sigma_delta->bus_locked = false; 325 spi_bus_unlock(sigma_delta->spi->master); 326 mutex_unlock(&indio_dev->mlock); 327 328 if (ret) 329 return ret; 330 331 sample = raw_sample >> chan->scan_type.shift; 332 sample &= (1 << chan->scan_type.realbits) - 1; 333 *val = sample; 334 335 ret = ad_sigma_delta_postprocess_sample(sigma_delta, raw_sample); 336 if (ret) 337 return ret; 338 339 return IIO_VAL_INT; 340} 341EXPORT_SYMBOL_NS_GPL(ad_sigma_delta_single_conversion, IIO_AD_SIGMA_DELTA); 342 343static int ad_sd_buffer_postenable(struct iio_dev *indio_dev) 344{ 345 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 346 unsigned int i, slot, samples_buf_size; 347 unsigned int channel; 348 uint8_t *samples_buf; 349 int ret; 350 351 if (sigma_delta->num_slots == 1) { 352 channel = find_first_bit(indio_dev->active_scan_mask, 353 indio_dev->masklength); 354 ret = ad_sigma_delta_set_channel(sigma_delta, 355 indio_dev->channels[channel].address); 356 if (ret) 357 return ret; 358 slot = 1; 359 } else { 360 /* 361 * At this point update_scan_mode already enabled the required channels. 362 * For sigma-delta sequencer drivers with multiple slots, an update_scan_mode 363 * implementation is mandatory. 364 */ 365 slot = 0; 366 for_each_set_bit(i, indio_dev->active_scan_mask, indio_dev->masklength) { 367 sigma_delta->slots[slot] = indio_dev->channels[i].address; 368 slot++; 369 } 370 } 371 372 sigma_delta->active_slots = slot; 373 sigma_delta->current_slot = 0; 374 375 if (sigma_delta->active_slots > 1) { 376 ret = ad_sigma_delta_append_status(sigma_delta, true); 377 if (ret) 378 return ret; 379 } 380 381 samples_buf_size = ALIGN(slot * indio_dev->channels[0].scan_type.storagebits, 8); 382 samples_buf_size += sizeof(int64_t); 383 samples_buf = devm_krealloc(&sigma_delta->spi->dev, sigma_delta->samples_buf, 384 samples_buf_size, GFP_KERNEL); 385 if (!samples_buf) 386 return -ENOMEM; 387 388 sigma_delta->samples_buf = samples_buf; 389 390 spi_bus_lock(sigma_delta->spi->master); 391 sigma_delta->bus_locked = true; 392 sigma_delta->keep_cs_asserted = true; 393 394 ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS); 395 if (ret) 396 goto err_unlock; 397 398 sigma_delta->irq_dis = false; 399 enable_irq(sigma_delta->spi->irq); 400 401 return 0; 402 403err_unlock: 404 spi_bus_unlock(sigma_delta->spi->master); 405 406 return ret; 407} 408 409static int ad_sd_buffer_postdisable(struct iio_dev *indio_dev) 410{ 411 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 412 413 reinit_completion(&sigma_delta->completion); 414 wait_for_completion_timeout(&sigma_delta->completion, HZ); 415 416 if (!sigma_delta->irq_dis) { 417 disable_irq_nosync(sigma_delta->spi->irq); 418 sigma_delta->irq_dis = true; 419 } 420 421 sigma_delta->keep_cs_asserted = false; 422 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); 423 424 if (sigma_delta->status_appended) 425 ad_sigma_delta_append_status(sigma_delta, false); 426 427 ad_sigma_delta_disable_all(sigma_delta); 428 sigma_delta->bus_locked = false; 429 return spi_bus_unlock(sigma_delta->spi->master); 430} 431 432static irqreturn_t ad_sd_trigger_handler(int irq, void *p) 433{ 434 struct iio_poll_func *pf = p; 435 struct iio_dev *indio_dev = pf->indio_dev; 436 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 437 uint8_t *data = sigma_delta->rx_buf; 438 unsigned int transfer_size; 439 unsigned int sample_size; 440 unsigned int sample_pos; 441 unsigned int status_pos; 442 unsigned int reg_size; 443 unsigned int data_reg; 444 445 reg_size = indio_dev->channels[0].scan_type.realbits + 446 indio_dev->channels[0].scan_type.shift; 447 reg_size = DIV_ROUND_UP(reg_size, 8); 448 449 if (sigma_delta->info->data_reg != 0) 450 data_reg = sigma_delta->info->data_reg; 451 else 452 data_reg = AD_SD_REG_DATA; 453 454 /* Status word will be appended to the sample during transfer */ 455 if (sigma_delta->status_appended) 456 transfer_size = reg_size + 1; 457 else 458 transfer_size = reg_size; 459 460 switch (reg_size) { 461 case 4: 462 case 2: 463 case 1: 464 status_pos = reg_size; 465 ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[0]); 466 break; 467 case 3: 468 /* 469 * Data array after transfer will look like (if status is appended): 470 * data[] = { [0][sample][sample][sample][status] } 471 * Keeping the first byte 0 shifts the status postion by 1 byte to the right. 472 */ 473 status_pos = reg_size + 1; 474 475 /* We store 24 bit samples in a 32 bit word. Keep the upper 476 * byte set to zero. */ 477 ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[1]); 478 break; 479 } 480 481 /* 482 * For devices sampling only one channel at 483 * once, there is no need for sample number tracking. 484 */ 485 if (sigma_delta->active_slots == 1) { 486 iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp); 487 goto irq_handled; 488 } 489 490 if (sigma_delta->status_appended) { 491 u8 converted_channel; 492 493 converted_channel = data[status_pos] & sigma_delta->info->status_ch_mask; 494 if (converted_channel != sigma_delta->slots[sigma_delta->current_slot]) { 495 /* 496 * Desync occurred during continuous sampling of multiple channels. 497 * Drop this incomplete sample and start from first channel again. 498 */ 499 500 sigma_delta->current_slot = 0; 501 goto irq_handled; 502 } 503 } 504 505 sample_size = indio_dev->channels[0].scan_type.storagebits / 8; 506 sample_pos = sample_size * sigma_delta->current_slot; 507 memcpy(&sigma_delta->samples_buf[sample_pos], data, sample_size); 508 sigma_delta->current_slot++; 509 510 if (sigma_delta->current_slot == sigma_delta->active_slots) { 511 sigma_delta->current_slot = 0; 512 iio_push_to_buffers_with_timestamp(indio_dev, sigma_delta->samples_buf, 513 pf->timestamp); 514 } 515 516irq_handled: 517 iio_trigger_notify_done(indio_dev->trig); 518 sigma_delta->irq_dis = false; 519 enable_irq(sigma_delta->spi->irq); 520 521 return IRQ_HANDLED; 522} 523 524static bool ad_sd_validate_scan_mask(struct iio_dev *indio_dev, const unsigned long *mask) 525{ 526 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 527 528 return bitmap_weight(mask, indio_dev->masklength) <= sigma_delta->num_slots; 529} 530 531static const struct iio_buffer_setup_ops ad_sd_buffer_setup_ops = { 532 .postenable = &ad_sd_buffer_postenable, 533 .postdisable = &ad_sd_buffer_postdisable, 534 .validate_scan_mask = &ad_sd_validate_scan_mask, 535}; 536 537static irqreturn_t ad_sd_data_rdy_trig_poll(int irq, void *private) 538{ 539 struct ad_sigma_delta *sigma_delta = private; 540 541 complete(&sigma_delta->completion); 542 disable_irq_nosync(irq); 543 sigma_delta->irq_dis = true; 544 iio_trigger_poll(sigma_delta->trig); 545 546 return IRQ_HANDLED; 547} 548 549/** 550 * ad_sd_validate_trigger() - validate_trigger callback for ad_sigma_delta devices 551 * @indio_dev: The IIO device 552 * @trig: The new trigger 553 * 554 * Returns: 0 if the 'trig' matches the trigger registered by the ad_sigma_delta 555 * device, -EINVAL otherwise. 556 */ 557int ad_sd_validate_trigger(struct iio_dev *indio_dev, struct iio_trigger *trig) 558{ 559 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 560 561 if (sigma_delta->trig != trig) 562 return -EINVAL; 563 564 return 0; 565} 566EXPORT_SYMBOL_NS_GPL(ad_sd_validate_trigger, IIO_AD_SIGMA_DELTA); 567 568static int devm_ad_sd_probe_trigger(struct device *dev, struct iio_dev *indio_dev) 569{ 570 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 571 int ret; 572 573 if (dev != &sigma_delta->spi->dev) { 574 dev_err(dev, "Trigger parent should be '%s', got '%s'\n", 575 dev_name(dev), dev_name(&sigma_delta->spi->dev)); 576 return -EFAULT; 577 } 578 579 sigma_delta->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, 580 iio_device_id(indio_dev)); 581 if (sigma_delta->trig == NULL) 582 return -ENOMEM; 583 584 init_completion(&sigma_delta->completion); 585 586 sigma_delta->irq_dis = true; 587 ret = devm_request_irq(dev, sigma_delta->spi->irq, 588 ad_sd_data_rdy_trig_poll, 589 sigma_delta->info->irq_flags | IRQF_NO_AUTOEN, 590 indio_dev->name, 591 sigma_delta); 592 if (ret) 593 return ret; 594 595 iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta); 596 597 ret = devm_iio_trigger_register(dev, sigma_delta->trig); 598 if (ret) 599 return ret; 600 601 /* select default trigger */ 602 indio_dev->trig = iio_trigger_get(sigma_delta->trig); 603 604 return 0; 605} 606 607/** 608 * devm_ad_sd_setup_buffer_and_trigger() - Device-managed buffer & trigger setup 609 * @dev: Device object to which to bind the life-time of the resources attached 610 * @indio_dev: The IIO device 611 */ 612int devm_ad_sd_setup_buffer_and_trigger(struct device *dev, struct iio_dev *indio_dev) 613{ 614 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); 615 int ret; 616 617 sigma_delta->slots = devm_kcalloc(dev, sigma_delta->num_slots, 618 sizeof(*sigma_delta->slots), GFP_KERNEL); 619 if (!sigma_delta->slots) 620 return -ENOMEM; 621 622 ret = devm_iio_triggered_buffer_setup(dev, indio_dev, 623 &iio_pollfunc_store_time, 624 &ad_sd_trigger_handler, 625 &ad_sd_buffer_setup_ops); 626 if (ret) 627 return ret; 628 629 return devm_ad_sd_probe_trigger(dev, indio_dev); 630} 631EXPORT_SYMBOL_NS_GPL(devm_ad_sd_setup_buffer_and_trigger, IIO_AD_SIGMA_DELTA); 632 633/** 634 * ad_sd_init() - Initializes a ad_sigma_delta struct 635 * @sigma_delta: The ad_sigma_delta device 636 * @indio_dev: The IIO device which the Sigma Delta device is used for 637 * @spi: The SPI device for the ad_sigma_delta device 638 * @info: Device specific callbacks and options 639 * 640 * This function needs to be called before any other operations are performed on 641 * the ad_sigma_delta struct. 642 */ 643int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev, 644 struct spi_device *spi, const struct ad_sigma_delta_info *info) 645{ 646 sigma_delta->spi = spi; 647 sigma_delta->info = info; 648 649 /* If the field is unset in ad_sigma_delta_info, asume there can only be 1 slot. */ 650 if (!info->num_slots) 651 sigma_delta->num_slots = 1; 652 else 653 sigma_delta->num_slots = info->num_slots; 654 655 if (sigma_delta->num_slots > 1) { 656 if (!indio_dev->info->update_scan_mode) { 657 dev_err(&spi->dev, "iio_dev lacks update_scan_mode().\n"); 658 return -EINVAL; 659 } 660 661 if (!info->disable_all) { 662 dev_err(&spi->dev, "ad_sigma_delta_info lacks disable_all().\n"); 663 return -EINVAL; 664 } 665 } 666 667 iio_device_set_drvdata(indio_dev, sigma_delta); 668 669 return 0; 670} 671EXPORT_SYMBOL_NS_GPL(ad_sd_init, IIO_AD_SIGMA_DELTA); 672 673MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 674MODULE_DESCRIPTION("Analog Devices Sigma-Delta ADCs"); 675MODULE_LICENSE("GPL v2");