Lines Matching +full:delta +full:- +full:sigma
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Support code for Analog Devices Sigma-Delta ADCs
6 * Author: Lars-Peter Clausen <[email protected]>
38 * ad_sd_set_comm() - Set communications register
40 * @sigma_delta: The sigma delta device
47 sigma_delta->comm = comm & AD_SD_COMM_CHAN_MASK; in ad_sd_set_comm()
52 * ad_sd_write_reg() - Write a register
54 * @sigma_delta: The sigma delta device
56 * @size: Size of the register (0-3)
64 uint8_t *data = sigma_delta->tx_buf; in ad_sd_write_reg()
68 .cs_change = sigma_delta->keep_cs_asserted, in ad_sd_write_reg()
73 data[0] = (reg << sigma_delta->info->addr_shift) | sigma_delta->comm; in ad_sd_write_reg()
88 return -EINVAL; in ad_sd_write_reg()
94 if (sigma_delta->bus_locked) in ad_sd_write_reg()
95 ret = spi_sync_locked(sigma_delta->spi, &m); in ad_sd_write_reg()
97 ret = spi_sync(sigma_delta->spi, &m); in ad_sd_write_reg()
106 uint8_t *data = sigma_delta->tx_buf; in ad_sd_read_reg_raw()
115 .cs_change = sigma_delta->keep_cs_asserted, in ad_sd_read_reg_raw()
122 if (sigma_delta->info->has_registers) { in ad_sd_read_reg_raw()
123 data[0] = reg << sigma_delta->info->addr_shift; in ad_sd_read_reg_raw()
124 data[0] |= sigma_delta->info->read_mask; in ad_sd_read_reg_raw()
125 data[0] |= sigma_delta->comm; in ad_sd_read_reg_raw()
130 if (sigma_delta->bus_locked) in ad_sd_read_reg_raw()
131 ret = spi_sync_locked(sigma_delta->spi, &m); in ad_sd_read_reg_raw()
133 ret = spi_sync(sigma_delta->spi, &m); in ad_sd_read_reg_raw()
139 * ad_sd_read_reg() - Read a register
141 * @sigma_delta: The sigma delta device
143 * @size: Size of the register (1-4)
153 ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->rx_buf); in ad_sd_read_reg()
159 *val = get_unaligned_be32(sigma_delta->rx_buf); in ad_sd_read_reg()
162 *val = get_unaligned_be24(sigma_delta->rx_buf); in ad_sd_read_reg()
165 *val = get_unaligned_be16(sigma_delta->rx_buf); in ad_sd_read_reg()
168 *val = sigma_delta->rx_buf[0]; in ad_sd_read_reg()
171 ret = -EINVAL; in ad_sd_read_reg()
181 * ad_sd_reset() - Reset the serial interface
183 * @sigma_delta: The sigma delta device
189 unsigned int reset_length = sigma_delta->info->num_resetclks; in ad_sd_reset()
197 return -ENOMEM; in ad_sd_reset()
200 ret = spi_write(sigma_delta->spi, buf, size); in ad_sd_reset()
209 guard(spinlock_irqsave)(&sigma_delta->irq_lock); in ad_sd_disable_irq()
212 if (sigma_delta->irq_dis) in ad_sd_disable_irq()
215 sigma_delta->irq_dis = true; in ad_sd_disable_irq()
216 disable_irq_nosync(sigma_delta->irq_line); in ad_sd_disable_irq()
222 guard(spinlock_irqsave)(&sigma_delta->irq_lock); in ad_sd_enable_irq()
224 sigma_delta->irq_dis = false; in ad_sd_enable_irq()
225 enable_irq(sigma_delta->irq_line); in ad_sd_enable_irq()
230 /* Called with `sigma_delta->bus_locked == true` only. */
234 unsigned int data_read_len = BITS_TO_BYTES(sigma_delta->info->num_resetclks); in ad_sigma_delta_clear_pending_event()
250 if (sigma_delta->rdy_gpiod) { in ad_sigma_delta_clear_pending_event()
251 pending_event = gpiod_get_value(sigma_delta->rdy_gpiod); in ad_sigma_delta_clear_pending_event()
278 return -ENOMEM; in ad_sigma_delta_clear_pending_event()
281 if (sigma_delta->info->has_registers) { in ad_sigma_delta_clear_pending_event()
282 unsigned int data_reg = sigma_delta->info->data_reg ?: AD_SD_REG_DATA; in ad_sigma_delta_clear_pending_event()
284 data[0] = data_reg << sigma_delta->info->addr_shift; in ad_sigma_delta_clear_pending_event()
285 data[0] |= sigma_delta->info->read_mask; in ad_sigma_delta_clear_pending_event()
286 data[0] |= sigma_delta->comm; in ad_sigma_delta_clear_pending_event()
294 * `data_read_len - 1` bytes are less than $num_resetclks ones. in ad_sigma_delta_clear_pending_event()
298 memset(data + 2, 0xff, data_read_len - 1); in ad_sigma_delta_clear_pending_event()
301 ret = spi_sync_locked(sigma_delta->spi, &m); in ad_sigma_delta_clear_pending_event()
318 spi_bus_lock(sigma_delta->spi->controller); in ad_sd_calibrate()
319 sigma_delta->bus_locked = true; in ad_sd_calibrate()
320 sigma_delta->keep_cs_asserted = true; in ad_sd_calibrate()
321 reinit_completion(&sigma_delta->completion); in ad_sd_calibrate()
332 time_left = wait_for_completion_timeout(&sigma_delta->completion, 2 * HZ); in ad_sd_calibrate()
335 ret = -EIO; in ad_sd_calibrate()
340 sigma_delta->keep_cs_asserted = false; in ad_sd_calibrate()
343 sigma_delta->bus_locked = false; in ad_sd_calibrate()
344 spi_bus_unlock(sigma_delta->spi->controller); in ad_sd_calibrate()
351 * ad_sd_calibrate_all() - Performs channel calibration
352 * @sigma_delta: The sigma delta device
375 * ad_sigma_delta_single_conversion() - Performs a single data conversion
394 ad_sigma_delta_set_channel(sigma_delta, chan->address); in ad_sigma_delta_single_conversion()
396 spi_bus_lock(sigma_delta->spi->controller); in ad_sigma_delta_single_conversion()
397 sigma_delta->bus_locked = true; in ad_sigma_delta_single_conversion()
398 sigma_delta->keep_cs_asserted = true; in ad_sigma_delta_single_conversion()
399 reinit_completion(&sigma_delta->completion); in ad_sigma_delta_single_conversion()
409 &sigma_delta->completion, HZ); in ad_sigma_delta_single_conversion()
412 ret = -EIO; in ad_sigma_delta_single_conversion()
416 if (sigma_delta->info->data_reg != 0) in ad_sigma_delta_single_conversion()
417 data_reg = sigma_delta->info->data_reg; in ad_sigma_delta_single_conversion()
422 DIV_ROUND_UP(chan->scan_type.realbits + chan->scan_type.shift, 8), in ad_sigma_delta_single_conversion()
429 ad_sigma_delta_disable_one(sigma_delta, chan->address); in ad_sigma_delta_single_conversion()
432 sigma_delta->keep_cs_asserted = false; in ad_sigma_delta_single_conversion()
433 sigma_delta->bus_locked = false; in ad_sigma_delta_single_conversion()
434 spi_bus_unlock(sigma_delta->spi->controller); in ad_sigma_delta_single_conversion()
440 sample = raw_sample >> chan->scan_type.shift; in ad_sigma_delta_single_conversion()
441 sample &= (1 << chan->scan_type.realbits) - 1; in ad_sigma_delta_single_conversion()
460 if (sigma_delta->num_slots == 1) { in ad_sd_buffer_postenable()
461 channel = find_first_bit(indio_dev->active_scan_mask, in ad_sd_buffer_postenable()
464 indio_dev->channels[channel].address); in ad_sd_buffer_postenable()
471 * For sigma-delta sequencer drivers with multiple slots, an update_scan_mode in ad_sd_buffer_postenable()
476 sigma_delta->slots[slot] = indio_dev->channels[i].address; in ad_sd_buffer_postenable()
481 sigma_delta->active_slots = slot; in ad_sd_buffer_postenable()
482 sigma_delta->current_slot = 0; in ad_sd_buffer_postenable()
484 if (sigma_delta->active_slots > 1) { in ad_sd_buffer_postenable()
490 samples_buf_size = ALIGN(slot * indio_dev->channels[0].scan_type.storagebits, 8); in ad_sd_buffer_postenable()
492 samples_buf = devm_krealloc(&sigma_delta->spi->dev, sigma_delta->samples_buf, in ad_sd_buffer_postenable()
495 return -ENOMEM; in ad_sd_buffer_postenable()
497 sigma_delta->samples_buf = samples_buf; in ad_sd_buffer_postenable()
499 spi_bus_lock(sigma_delta->spi->controller); in ad_sd_buffer_postenable()
500 sigma_delta->bus_locked = true; in ad_sd_buffer_postenable()
501 sigma_delta->keep_cs_asserted = true; in ad_sd_buffer_postenable()
516 spi_bus_unlock(sigma_delta->spi->controller); in ad_sd_buffer_postenable()
525 reinit_completion(&sigma_delta->completion); in ad_sd_buffer_postdisable()
526 wait_for_completion_timeout(&sigma_delta->completion, HZ); in ad_sd_buffer_postdisable()
530 sigma_delta->keep_cs_asserted = false; in ad_sd_buffer_postdisable()
533 if (sigma_delta->status_appended) in ad_sd_buffer_postdisable()
537 sigma_delta->bus_locked = false; in ad_sd_buffer_postdisable()
538 return spi_bus_unlock(sigma_delta->spi->controller); in ad_sd_buffer_postdisable()
544 struct iio_dev *indio_dev = pf->indio_dev; in ad_sd_trigger_handler()
546 uint8_t *data = sigma_delta->rx_buf; in ad_sd_trigger_handler()
554 reg_size = indio_dev->channels[0].scan_type.realbits + in ad_sd_trigger_handler()
555 indio_dev->channels[0].scan_type.shift; in ad_sd_trigger_handler()
558 if (sigma_delta->info->data_reg != 0) in ad_sd_trigger_handler()
559 data_reg = sigma_delta->info->data_reg; in ad_sd_trigger_handler()
564 if (sigma_delta->status_appended) in ad_sd_trigger_handler()
594 if (sigma_delta->active_slots == 1) { in ad_sd_trigger_handler()
595 iio_push_to_buffers_with_timestamp(indio_dev, data, pf->timestamp); in ad_sd_trigger_handler()
599 if (sigma_delta->status_appended) { in ad_sd_trigger_handler()
602 converted_channel = data[status_pos] & sigma_delta->info->status_ch_mask; in ad_sd_trigger_handler()
603 if (converted_channel != sigma_delta->slots[sigma_delta->current_slot]) { in ad_sd_trigger_handler()
609 sigma_delta->current_slot = 0; in ad_sd_trigger_handler()
614 sample_size = indio_dev->channels[0].scan_type.storagebits / 8; in ad_sd_trigger_handler()
615 sample_pos = sample_size * sigma_delta->current_slot; in ad_sd_trigger_handler()
616 memcpy(&sigma_delta->samples_buf[sample_pos], data, sample_size); in ad_sd_trigger_handler()
617 sigma_delta->current_slot++; in ad_sd_trigger_handler()
619 if (sigma_delta->current_slot == sigma_delta->active_slots) { in ad_sd_trigger_handler()
620 sigma_delta->current_slot = 0; in ad_sd_trigger_handler()
621 iio_push_to_buffers_with_timestamp(indio_dev, sigma_delta->samples_buf, in ad_sd_trigger_handler()
622 pf->timestamp); in ad_sd_trigger_handler()
626 iio_trigger_notify_done(indio_dev->trig); in ad_sd_trigger_handler()
636 return bitmap_weight(mask, iio_get_masklength(indio_dev)) <= sigma_delta->num_slots; in ad_sd_validate_scan_mask()
656 * off-limits as reading that would trigger another irq event. in ad_sd_data_rdy_trig_poll()
665 if ((!sigma_delta->rdy_gpiod || gpiod_get_value(sigma_delta->rdy_gpiod)) && in ad_sd_data_rdy_trig_poll()
667 complete(&sigma_delta->completion); in ad_sd_data_rdy_trig_poll()
668 iio_trigger_poll(sigma_delta->trig); in ad_sd_data_rdy_trig_poll()
677 * ad_sd_validate_trigger() - validate_trigger callback for ad_sigma_delta devices
682 * device, -EINVAL otherwise.
688 if (sigma_delta->trig != trig) in ad_sd_validate_trigger()
689 return -EINVAL; in ad_sd_validate_trigger()
698 unsigned long irq_flags = irq_get_trigger_type(sigma_delta->irq_line); in devm_ad_sd_probe_trigger()
701 if (dev != &sigma_delta->spi->dev) { in devm_ad_sd_probe_trigger()
703 dev_name(dev), dev_name(&sigma_delta->spi->dev)); in devm_ad_sd_probe_trigger()
704 return -EFAULT; in devm_ad_sd_probe_trigger()
707 sigma_delta->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, in devm_ad_sd_probe_trigger()
709 if (sigma_delta->trig == NULL) in devm_ad_sd_probe_trigger()
710 return -ENOMEM; in devm_ad_sd_probe_trigger()
712 init_completion(&sigma_delta->completion); in devm_ad_sd_probe_trigger()
714 sigma_delta->irq_dis = true; in devm_ad_sd_probe_trigger()
717 irq_set_status_flags(sigma_delta->irq_line, IRQ_DISABLE_UNLAZY); in devm_ad_sd_probe_trigger()
721 irq_flags = sigma_delta->info->irq_flags; in devm_ad_sd_probe_trigger()
723 ret = devm_request_irq(dev, sigma_delta->irq_line, in devm_ad_sd_probe_trigger()
726 indio_dev->name, in devm_ad_sd_probe_trigger()
731 iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta); in devm_ad_sd_probe_trigger()
733 ret = devm_iio_trigger_register(dev, sigma_delta->trig); in devm_ad_sd_probe_trigger()
738 indio_dev->trig = iio_trigger_get(sigma_delta->trig); in devm_ad_sd_probe_trigger()
744 * devm_ad_sd_setup_buffer_and_trigger() - Device-managed buffer & trigger setup
745 * @dev: Device object to which to bind the life-time of the resources attached
753 sigma_delta->slots = devm_kcalloc(dev, sigma_delta->num_slots, in devm_ad_sd_setup_buffer_and_trigger()
754 sizeof(*sigma_delta->slots), GFP_KERNEL); in devm_ad_sd_setup_buffer_and_trigger()
755 if (!sigma_delta->slots) in devm_ad_sd_setup_buffer_and_trigger()
756 return -ENOMEM; in devm_ad_sd_setup_buffer_and_trigger()
770 * ad_sd_init() - Initializes a ad_sigma_delta struct
772 * @indio_dev: The IIO device which the Sigma Delta device is used for
782 sigma_delta->spi = spi; in ad_sd_init()
783 sigma_delta->info = info; in ad_sd_init()
786 if (!info->num_slots) in ad_sd_init()
787 sigma_delta->num_slots = 1; in ad_sd_init()
789 sigma_delta->num_slots = info->num_slots; in ad_sd_init()
791 if (sigma_delta->num_slots > 1) { in ad_sd_init()
792 if (!indio_dev->info->update_scan_mode) { in ad_sd_init()
793 dev_err(&spi->dev, "iio_dev lacks update_scan_mode().\n"); in ad_sd_init()
794 return -EINVAL; in ad_sd_init()
797 if (!info->disable_all) { in ad_sd_init()
798 dev_err(&spi->dev, "ad_sigma_delta_info lacks disable_all().\n"); in ad_sd_init()
799 return -EINVAL; in ad_sd_init()
803 spin_lock_init(&sigma_delta->irq_lock); in ad_sd_init()
805 if (info->irq_line) in ad_sd_init()
806 sigma_delta->irq_line = info->irq_line; in ad_sd_init()
808 sigma_delta->irq_line = spi->irq; in ad_sd_init()
810 sigma_delta->rdy_gpiod = devm_gpiod_get_optional(&spi->dev, "rdy", GPIOD_IN); in ad_sd_init()
811 if (IS_ERR(sigma_delta->rdy_gpiod)) in ad_sd_init()
812 return dev_err_probe(&spi->dev, PTR_ERR(sigma_delta->rdy_gpiod), in ad_sd_init()
815 if (sigma_delta->rdy_gpiod && !sigma_delta->irq_line) { in ad_sd_init()
816 sigma_delta->irq_line = gpiod_to_irq(sigma_delta->rdy_gpiod); in ad_sd_init()
817 if (sigma_delta->irq_line < 0) in ad_sd_init()
818 return sigma_delta->irq_line; in ad_sd_init()
827 MODULE_AUTHOR("Lars-Peter Clausen <[email protected]>");
828 MODULE_DESCRIPTION("Analog Devices Sigma-Delta ADCs");