Lines Matching refs:sigma_delta

40 void ad_sd_set_comm(struct ad_sigma_delta *sigma_delta, uint8_t comm)  in ad_sd_set_comm()  argument
44 sigma_delta->comm = comm & AD_SD_COMM_CHAN_MASK; in ad_sd_set_comm()
58 int ad_sd_write_reg(struct ad_sigma_delta *sigma_delta, unsigned int reg, in ad_sd_write_reg() argument
61 uint8_t *data = sigma_delta->tx_buf; in ad_sd_write_reg()
65 .cs_change = sigma_delta->keep_cs_asserted, in ad_sd_write_reg()
70 data[0] = (reg << sigma_delta->info->addr_shift) | sigma_delta->comm; in ad_sd_write_reg()
91 if (sigma_delta->bus_locked) in ad_sd_write_reg()
92 ret = spi_sync_locked(sigma_delta->spi, &m); in ad_sd_write_reg()
94 ret = spi_sync(sigma_delta->spi, &m); in ad_sd_write_reg()
100 static int ad_sd_read_reg_raw(struct ad_sigma_delta *sigma_delta, in ad_sd_read_reg_raw() argument
103 uint8_t *data = sigma_delta->tx_buf; in ad_sd_read_reg_raw()
112 .cs_change = sigma_delta->bus_locked, in ad_sd_read_reg_raw()
119 if (sigma_delta->info->has_registers) { in ad_sd_read_reg_raw()
120 data[0] = reg << sigma_delta->info->addr_shift; in ad_sd_read_reg_raw()
121 data[0] |= sigma_delta->info->read_mask; in ad_sd_read_reg_raw()
122 data[0] |= sigma_delta->comm; in ad_sd_read_reg_raw()
127 if (sigma_delta->bus_locked) in ad_sd_read_reg_raw()
128 ret = spi_sync_locked(sigma_delta->spi, &m); in ad_sd_read_reg_raw()
130 ret = spi_sync(sigma_delta->spi, &m); in ad_sd_read_reg_raw()
145 int ad_sd_read_reg(struct ad_sigma_delta *sigma_delta, in ad_sd_read_reg() argument
150 ret = ad_sd_read_reg_raw(sigma_delta, reg, size, sigma_delta->rx_buf); in ad_sd_read_reg()
156 *val = get_unaligned_be32(sigma_delta->rx_buf); in ad_sd_read_reg()
159 *val = get_unaligned_be24(sigma_delta->rx_buf); in ad_sd_read_reg()
162 *val = get_unaligned_be16(sigma_delta->rx_buf); in ad_sd_read_reg()
165 *val = sigma_delta->rx_buf[0]; in ad_sd_read_reg()
185 int ad_sd_reset(struct ad_sigma_delta *sigma_delta, in ad_sd_reset() argument
198 ret = spi_write(sigma_delta->spi, buf, size); in ad_sd_reset()
205 int ad_sd_calibrate(struct ad_sigma_delta *sigma_delta, in ad_sd_calibrate() argument
211 ret = ad_sigma_delta_set_channel(sigma_delta, channel); in ad_sd_calibrate()
215 spi_bus_lock(sigma_delta->spi->master); in ad_sd_calibrate()
216 sigma_delta->bus_locked = true; in ad_sd_calibrate()
217 sigma_delta->keep_cs_asserted = true; in ad_sd_calibrate()
218 reinit_completion(&sigma_delta->completion); in ad_sd_calibrate()
220 ret = ad_sigma_delta_set_mode(sigma_delta, mode); in ad_sd_calibrate()
224 sigma_delta->irq_dis = false; in ad_sd_calibrate()
225 enable_irq(sigma_delta->spi->irq); in ad_sd_calibrate()
226 timeout = wait_for_completion_timeout(&sigma_delta->completion, 2 * HZ); in ad_sd_calibrate()
228 sigma_delta->irq_dis = true; in ad_sd_calibrate()
229 disable_irq_nosync(sigma_delta->spi->irq); in ad_sd_calibrate()
235 sigma_delta->keep_cs_asserted = false; in ad_sd_calibrate()
236 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); in ad_sd_calibrate()
237 sigma_delta->bus_locked = false; in ad_sd_calibrate()
238 spi_bus_unlock(sigma_delta->spi->master); in ad_sd_calibrate()
252 int ad_sd_calibrate_all(struct ad_sigma_delta *sigma_delta, in ad_sd_calibrate_all() argument
259 ret = ad_sd_calibrate(sigma_delta, cb[i].mode, cb[i].channel); in ad_sd_calibrate_all()
279 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in ad_sigma_delta_single_conversion() local
288 ad_sigma_delta_set_channel(sigma_delta, chan->address); in ad_sigma_delta_single_conversion()
290 spi_bus_lock(sigma_delta->spi->master); in ad_sigma_delta_single_conversion()
291 sigma_delta->bus_locked = true; in ad_sigma_delta_single_conversion()
292 sigma_delta->keep_cs_asserted = true; in ad_sigma_delta_single_conversion()
293 reinit_completion(&sigma_delta->completion); in ad_sigma_delta_single_conversion()
295 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_SINGLE); in ad_sigma_delta_single_conversion()
297 sigma_delta->irq_dis = false; in ad_sigma_delta_single_conversion()
298 enable_irq(sigma_delta->spi->irq); in ad_sigma_delta_single_conversion()
300 &sigma_delta->completion, HZ); in ad_sigma_delta_single_conversion()
307 if (sigma_delta->info->data_reg != 0) in ad_sigma_delta_single_conversion()
308 data_reg = sigma_delta->info->data_reg; in ad_sigma_delta_single_conversion()
312 ret = ad_sd_read_reg(sigma_delta, data_reg, in ad_sigma_delta_single_conversion()
317 if (!sigma_delta->irq_dis) { in ad_sigma_delta_single_conversion()
318 disable_irq_nosync(sigma_delta->spi->irq); in ad_sigma_delta_single_conversion()
319 sigma_delta->irq_dis = true; in ad_sigma_delta_single_conversion()
322 sigma_delta->keep_cs_asserted = false; in ad_sigma_delta_single_conversion()
323 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); in ad_sigma_delta_single_conversion()
324 sigma_delta->bus_locked = false; in ad_sigma_delta_single_conversion()
325 spi_bus_unlock(sigma_delta->spi->master); in ad_sigma_delta_single_conversion()
335 ret = ad_sigma_delta_postprocess_sample(sigma_delta, raw_sample); in ad_sigma_delta_single_conversion()
345 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in ad_sd_buffer_postenable() local
351 if (sigma_delta->num_slots == 1) { in ad_sd_buffer_postenable()
354 ret = ad_sigma_delta_set_channel(sigma_delta, in ad_sd_buffer_postenable()
367 sigma_delta->slots[slot] = indio_dev->channels[i].address; in ad_sd_buffer_postenable()
372 sigma_delta->active_slots = slot; in ad_sd_buffer_postenable()
373 sigma_delta->current_slot = 0; in ad_sd_buffer_postenable()
375 if (sigma_delta->active_slots > 1) { in ad_sd_buffer_postenable()
376 ret = ad_sigma_delta_append_status(sigma_delta, true); in ad_sd_buffer_postenable()
383 samples_buf = devm_krealloc(&sigma_delta->spi->dev, sigma_delta->samples_buf, in ad_sd_buffer_postenable()
388 sigma_delta->samples_buf = samples_buf; in ad_sd_buffer_postenable()
390 spi_bus_lock(sigma_delta->spi->master); in ad_sd_buffer_postenable()
391 sigma_delta->bus_locked = true; in ad_sd_buffer_postenable()
392 sigma_delta->keep_cs_asserted = true; in ad_sd_buffer_postenable()
394 ret = ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_CONTINUOUS); in ad_sd_buffer_postenable()
398 sigma_delta->irq_dis = false; in ad_sd_buffer_postenable()
399 enable_irq(sigma_delta->spi->irq); in ad_sd_buffer_postenable()
404 spi_bus_unlock(sigma_delta->spi->master); in ad_sd_buffer_postenable()
411 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in ad_sd_buffer_postdisable() local
413 reinit_completion(&sigma_delta->completion); in ad_sd_buffer_postdisable()
414 wait_for_completion_timeout(&sigma_delta->completion, HZ); in ad_sd_buffer_postdisable()
416 if (!sigma_delta->irq_dis) { in ad_sd_buffer_postdisable()
417 disable_irq_nosync(sigma_delta->spi->irq); in ad_sd_buffer_postdisable()
418 sigma_delta->irq_dis = true; in ad_sd_buffer_postdisable()
421 sigma_delta->keep_cs_asserted = false; in ad_sd_buffer_postdisable()
422 ad_sigma_delta_set_mode(sigma_delta, AD_SD_MODE_IDLE); in ad_sd_buffer_postdisable()
424 if (sigma_delta->status_appended) in ad_sd_buffer_postdisable()
425 ad_sigma_delta_append_status(sigma_delta, false); in ad_sd_buffer_postdisable()
427 ad_sigma_delta_disable_all(sigma_delta); in ad_sd_buffer_postdisable()
428 sigma_delta->bus_locked = false; in ad_sd_buffer_postdisable()
429 return spi_bus_unlock(sigma_delta->spi->master); in ad_sd_buffer_postdisable()
436 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in ad_sd_trigger_handler() local
437 uint8_t *data = sigma_delta->rx_buf; in ad_sd_trigger_handler()
449 if (sigma_delta->info->data_reg != 0) in ad_sd_trigger_handler()
450 data_reg = sigma_delta->info->data_reg; in ad_sd_trigger_handler()
455 if (sigma_delta->status_appended) in ad_sd_trigger_handler()
465 ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[0]); in ad_sd_trigger_handler()
477 ad_sd_read_reg_raw(sigma_delta, data_reg, transfer_size, &data[1]); in ad_sd_trigger_handler()
485 if (sigma_delta->active_slots == 1) { in ad_sd_trigger_handler()
490 if (sigma_delta->status_appended) { in ad_sd_trigger_handler()
493 converted_channel = data[status_pos] & sigma_delta->info->status_ch_mask; in ad_sd_trigger_handler()
494 if (converted_channel != sigma_delta->slots[sigma_delta->current_slot]) { in ad_sd_trigger_handler()
500 sigma_delta->current_slot = 0; in ad_sd_trigger_handler()
506 sample_pos = sample_size * sigma_delta->current_slot; in ad_sd_trigger_handler()
507 memcpy(&sigma_delta->samples_buf[sample_pos], data, sample_size); in ad_sd_trigger_handler()
508 sigma_delta->current_slot++; in ad_sd_trigger_handler()
510 if (sigma_delta->current_slot == sigma_delta->active_slots) { in ad_sd_trigger_handler()
511 sigma_delta->current_slot = 0; in ad_sd_trigger_handler()
512 iio_push_to_buffers_with_timestamp(indio_dev, sigma_delta->samples_buf, in ad_sd_trigger_handler()
518 sigma_delta->irq_dis = false; in ad_sd_trigger_handler()
519 enable_irq(sigma_delta->spi->irq); in ad_sd_trigger_handler()
526 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in ad_sd_validate_scan_mask() local
528 return bitmap_weight(mask, indio_dev->masklength) <= sigma_delta->num_slots; in ad_sd_validate_scan_mask()
539 struct ad_sigma_delta *sigma_delta = private; in ad_sd_data_rdy_trig_poll() local
541 complete(&sigma_delta->completion); in ad_sd_data_rdy_trig_poll()
543 sigma_delta->irq_dis = true; in ad_sd_data_rdy_trig_poll()
544 iio_trigger_poll(sigma_delta->trig); in ad_sd_data_rdy_trig_poll()
559 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in ad_sd_validate_trigger() local
561 if (sigma_delta->trig != trig) in ad_sd_validate_trigger()
570 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in devm_ad_sd_probe_trigger() local
573 if (dev != &sigma_delta->spi->dev) { in devm_ad_sd_probe_trigger()
575 dev_name(dev), dev_name(&sigma_delta->spi->dev)); in devm_ad_sd_probe_trigger()
579 sigma_delta->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name, in devm_ad_sd_probe_trigger()
581 if (sigma_delta->trig == NULL) in devm_ad_sd_probe_trigger()
584 init_completion(&sigma_delta->completion); in devm_ad_sd_probe_trigger()
586 sigma_delta->irq_dis = true; in devm_ad_sd_probe_trigger()
589 irq_set_status_flags(sigma_delta->spi->irq, IRQ_DISABLE_UNLAZY); in devm_ad_sd_probe_trigger()
591 ret = devm_request_irq(dev, sigma_delta->spi->irq, in devm_ad_sd_probe_trigger()
593 sigma_delta->info->irq_flags | IRQF_NO_AUTOEN, in devm_ad_sd_probe_trigger()
595 sigma_delta); in devm_ad_sd_probe_trigger()
599 iio_trigger_set_drvdata(sigma_delta->trig, sigma_delta); in devm_ad_sd_probe_trigger()
601 ret = devm_iio_trigger_register(dev, sigma_delta->trig); in devm_ad_sd_probe_trigger()
606 indio_dev->trig = iio_trigger_get(sigma_delta->trig); in devm_ad_sd_probe_trigger()
618 struct ad_sigma_delta *sigma_delta = iio_device_get_drvdata(indio_dev); in devm_ad_sd_setup_buffer_and_trigger() local
621 sigma_delta->slots = devm_kcalloc(dev, sigma_delta->num_slots, in devm_ad_sd_setup_buffer_and_trigger()
622 sizeof(*sigma_delta->slots), GFP_KERNEL); in devm_ad_sd_setup_buffer_and_trigger()
623 if (!sigma_delta->slots) in devm_ad_sd_setup_buffer_and_trigger()
647 int ad_sd_init(struct ad_sigma_delta *sigma_delta, struct iio_dev *indio_dev, in ad_sd_init() argument
650 sigma_delta->spi = spi; in ad_sd_init()
651 sigma_delta->info = info; in ad_sd_init()
655 sigma_delta->num_slots = 1; in ad_sd_init()
657 sigma_delta->num_slots = info->num_slots; in ad_sd_init()
659 if (sigma_delta->num_slots > 1) { in ad_sd_init()
671 iio_device_set_drvdata(indio_dev, sigma_delta); in ad_sd_init()