Lines Matching +full:spi +full:- +full:cs +full:- +full:setup +full:- +full:delay +full:- +full:ns
1 // SPDX-License-Identifier: GPL-2.0
3 * AD7606 SPI ADC driver
9 #include <linux/delay.h>
115 .name = "ad7605-4",
124 .name = "ad7606-8",
135 .name = "ad7606-6",
147 .name = "ad7606-4",
249 if (st->gpio_reset) { in ad7606_reset()
250 gpiod_set_value(st->gpio_reset, 1); in ad7606_reset()
251 ndelay(100); /* t_reset >= 100ns */ in ad7606_reset()
252 gpiod_set_value(st->gpio_reset, 0); in ad7606_reset()
256 return -ENODEV; in ad7606_reset()
264 struct ad7606_chan_scale *cs = &st->chan_scales[chan->scan_index]; in ad7606_16bit_chan_scale_setup() local
266 if (!st->sw_mode_en) { in ad7606_16bit_chan_scale_setup()
267 /* tied to logic low, analog input range is +/- 5V */ in ad7606_16bit_chan_scale_setup()
268 cs->range = 0; in ad7606_16bit_chan_scale_setup()
269 cs->scale_avail = ad7606_16bit_hw_scale_avail; in ad7606_16bit_chan_scale_setup()
270 cs->num_scales = ARRAY_SIZE(ad7606_16bit_hw_scale_avail); in ad7606_16bit_chan_scale_setup()
276 cs->range = 2; in ad7606_16bit_chan_scale_setup()
277 cs->scale_avail = ad7606_16bit_sw_scale_avail; in ad7606_16bit_chan_scale_setup()
278 cs->num_scales = ARRAY_SIZE(ad7606_16bit_sw_scale_avail); in ad7606_16bit_chan_scale_setup()
287 unsigned int num_channels = st->chip_info->num_adc_channels; in ad7606_get_chan_config()
288 struct device *dev = st->dev; in ad7606_get_chan_config()
314 ret = fwnode_property_read_u32_array(child, "diff-channels", in ad7606_get_chan_config()
320 return -EINVAL; in ad7606_get_chan_config()
329 return -EINVAL; in ad7606_get_chan_config()
342 struct ad7606_chan_scale *cs = &st->chan_scales[chan->scan_index]; in ad7606c_18bit_chan_scale_setup() local
346 if (!st->sw_mode_en) { in ad7606c_18bit_chan_scale_setup()
347 cs->range = 0; in ad7606c_18bit_chan_scale_setup()
348 cs->scale_avail = ad7606_18bit_hw_scale_avail; in ad7606c_18bit_chan_scale_setup()
349 cs->num_scales = ARRAY_SIZE(ad7606_18bit_hw_scale_avail); in ad7606c_18bit_chan_scale_setup()
353 ret = ad7606_get_chan_config(indio_dev, chan->scan_index, &bipolar, in ad7606c_18bit_chan_scale_setup()
359 cs->scale_avail = ad7606c_18bit_differential_bipolar_scale_avail; in ad7606c_18bit_chan_scale_setup()
360 cs->num_scales = in ad7606c_18bit_chan_scale_setup()
363 cs->reg_offset = 8; in ad7606c_18bit_chan_scale_setup()
364 cs->range = 1; in ad7606c_18bit_chan_scale_setup()
365 chan->differential = 1; in ad7606c_18bit_chan_scale_setup()
366 chan->channel2 = chan->channel; in ad7606c_18bit_chan_scale_setup()
371 chan->differential = 0; in ad7606c_18bit_chan_scale_setup()
374 cs->scale_avail = ad7606c_18bit_single_ended_bipolar_scale_avail; in ad7606c_18bit_chan_scale_setup()
375 cs->num_scales = in ad7606c_18bit_chan_scale_setup()
377 /* Bipolar single-ended ranges start at 0 (b0000) */ in ad7606c_18bit_chan_scale_setup()
378 cs->reg_offset = 0; in ad7606c_18bit_chan_scale_setup()
379 cs->range = 3; in ad7606c_18bit_chan_scale_setup()
380 chan->scan_type.sign = 's'; in ad7606c_18bit_chan_scale_setup()
385 cs->scale_avail = ad7606c_18bit_single_ended_unipolar_scale_avail; in ad7606c_18bit_chan_scale_setup()
386 cs->num_scales = in ad7606c_18bit_chan_scale_setup()
388 /* Unipolar single-ended ranges start at 5 (b0101) */ in ad7606c_18bit_chan_scale_setup()
389 cs->reg_offset = 5; in ad7606c_18bit_chan_scale_setup()
390 cs->range = 1; in ad7606c_18bit_chan_scale_setup()
391 chan->scan_type.sign = 'u'; in ad7606c_18bit_chan_scale_setup()
400 struct ad7606_chan_scale *cs = &st->chan_scales[chan->scan_index]; in ad7606c_16bit_chan_scale_setup() local
404 if (!st->sw_mode_en) { in ad7606c_16bit_chan_scale_setup()
405 cs->range = 0; in ad7606c_16bit_chan_scale_setup()
406 cs->scale_avail = ad7606_16bit_hw_scale_avail; in ad7606c_16bit_chan_scale_setup()
407 cs->num_scales = ARRAY_SIZE(ad7606_16bit_hw_scale_avail); in ad7606c_16bit_chan_scale_setup()
411 ret = ad7606_get_chan_config(indio_dev, chan->scan_index, &bipolar, in ad7606c_16bit_chan_scale_setup()
417 cs->scale_avail = ad7606c_16bit_differential_bipolar_scale_avail; in ad7606c_16bit_chan_scale_setup()
418 cs->num_scales = in ad7606c_16bit_chan_scale_setup()
421 cs->reg_offset = 8; in ad7606c_16bit_chan_scale_setup()
422 cs->range = 1; in ad7606c_16bit_chan_scale_setup()
423 chan->differential = 1; in ad7606c_16bit_chan_scale_setup()
424 chan->channel2 = chan->channel; in ad7606c_16bit_chan_scale_setup()
425 chan->scan_type.sign = 's'; in ad7606c_16bit_chan_scale_setup()
430 chan->differential = 0; in ad7606c_16bit_chan_scale_setup()
433 cs->scale_avail = ad7606c_16bit_single_ended_bipolar_scale_avail; in ad7606c_16bit_chan_scale_setup()
434 cs->num_scales = in ad7606c_16bit_chan_scale_setup()
436 /* Bipolar single-ended ranges start at 0 (b0000) */ in ad7606c_16bit_chan_scale_setup()
437 cs->reg_offset = 0; in ad7606c_16bit_chan_scale_setup()
438 cs->range = 3; in ad7606c_16bit_chan_scale_setup()
439 chan->scan_type.sign = 's'; in ad7606c_16bit_chan_scale_setup()
444 cs->scale_avail = ad7606c_16bit_single_ended_unipolar_scale_avail; in ad7606c_16bit_chan_scale_setup()
445 cs->num_scales = in ad7606c_16bit_chan_scale_setup()
447 /* Unipolar single-ended ranges start at 5 (b0101) */ in ad7606c_16bit_chan_scale_setup()
448 cs->reg_offset = 5; in ad7606c_16bit_chan_scale_setup()
449 cs->range = 1; in ad7606c_16bit_chan_scale_setup()
450 chan->scan_type.sign = 'u'; in ad7606c_16bit_chan_scale_setup()
459 struct ad7606_chan_scale *cs = &st->chan_scales[chan->scan_index]; in ad7607_chan_scale_setup() local
461 cs->range = 0; in ad7607_chan_scale_setup()
462 cs->scale_avail = ad7607_hw_scale_avail; in ad7607_chan_scale_setup()
463 cs->num_scales = ARRAY_SIZE(ad7607_hw_scale_avail); in ad7607_chan_scale_setup()
471 struct ad7606_chan_scale *cs = &st->chan_scales[chan->scan_index]; in ad7608_chan_scale_setup() local
473 cs->range = 0; in ad7608_chan_scale_setup()
474 cs->scale_avail = ad7606_18bit_hw_scale_avail; in ad7608_chan_scale_setup()
475 cs->num_scales = ARRAY_SIZE(ad7606_18bit_hw_scale_avail); in ad7608_chan_scale_setup()
483 struct ad7606_chan_scale *cs = &st->chan_scales[chan->scan_index]; in ad7609_chan_scale_setup() local
485 cs->range = 0; in ad7609_chan_scale_setup()
486 cs->scale_avail = ad7609_hw_scale_avail; in ad7609_chan_scale_setup()
487 cs->num_scales = ARRAY_SIZE(ad7609_hw_scale_avail); in ad7609_chan_scale_setup()
499 guard(mutex)(&st->lock); in ad7606_reg_access()
502 ret = st->bops->reg_read(st, reg); in ad7606_reg_access()
508 return st->bops->reg_write(st, reg, writeval); in ad7606_reg_access()
517 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_high()
521 ret = pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_high()
531 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_low()
535 ret = pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_low()
545 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_swing()
549 return pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_swing()
557 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_is_swinging()
570 return -EINVAL; in ad7606_set_sampling_freq()
573 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_set_sampling_freq()
585 return pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_set_sampling_freq()
590 unsigned int num = st->chip_info->num_adc_channels; in ad7606_read_samples()
592 return st->bops->read_block(st->dev, num, &st->data); in ad7606_read_samples()
598 struct iio_dev *indio_dev = pf->indio_dev; in ad7606_trigger_handler()
602 guard(mutex)(&st->lock); in ad7606_trigger_handler()
608 iio_push_to_buffers_with_ts(indio_dev, &st->data, sizeof(st->data), in ad7606_trigger_handler()
611 iio_trigger_notify_done(indio_dev->trig); in ad7606_trigger_handler()
613 gpiod_set_value(st->gpio_convst, 1); in ad7606_trigger_handler()
626 if (st->gpio_convst) { in ad7606_scan_direct()
627 gpiod_set_value(st->gpio_convst, 1); in ad7606_scan_direct()
636 * a delay to leave time for the data to be available. For now, the latter in ad7606_scan_direct()
640 if (st->trig) { in ad7606_scan_direct()
641 ret = wait_for_completion_timeout(&st->completion, in ad7606_scan_direct()
644 ret = -ETIMEDOUT; in ad7606_scan_direct()
660 chan = &indio_dev->channels[ch]; in ad7606_scan_direct()
661 realbits = chan->scan_type.realbits; in ad7606_scan_direct()
664 *val = st->data.buf32[ch]; in ad7606_scan_direct()
666 *val = st->data.buf16[ch]; in ad7606_scan_direct()
668 *val &= GENMASK(realbits - 1, 0); in ad7606_scan_direct()
670 if (chan->scan_type.sign == 's') in ad7606_scan_direct()
671 *val = sign_extend32(*val, realbits - 1); in ad7606_scan_direct()
674 if (!st->gpio_convst) { in ad7606_scan_direct()
679 gpiod_set_value(st->gpio_convst, 0); in ad7606_scan_direct()
692 struct ad7606_chan_scale *cs; in ad7606_read_raw() local
698 return -EBUSY; in ad7606_read_raw()
699 ret = ad7606_scan_direct(indio_dev, chan->scan_index, val); in ad7606_read_raw()
705 if (st->sw_mode_en) in ad7606_read_raw()
706 ch = chan->scan_index; in ad7606_read_raw()
707 cs = &st->chan_scales[ch]; in ad7606_read_raw()
708 *val = cs->scale_avail[cs->range][0]; in ad7606_read_raw()
709 *val2 = cs->scale_avail[cs->range][1]; in ad7606_read_raw()
712 *val = st->oversampling; in ad7606_read_raw()
715 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_read_raw()
719 return -EINVAL; in ad7606_read_raw()
728 struct ad7606_chan_scale *cs = &st->chan_scales[0]; in in_voltage_scale_available_show() local
729 const unsigned int (*vals)[2] = cs->scale_avail; in in_voltage_scale_available_show()
733 for (i = 0; i < cs->num_scales; i++) in in_voltage_scale_available_show()
734 len += scnprintf(buf + len, PAGE_SIZE - len, "%u.%06u ", in in_voltage_scale_available_show()
736 buf[len - 1] = '\n'; in in_voltage_scale_available_show()
747 gpiod_set_value(st->gpio_range, val); in ad7606_write_scale_hw()
759 gpiod_multi_set_value_cansleep(st->gpio_os, values); in ad7606_write_os_hw()
762 if (st->chip_info->os_req_reset) in ad7606_write_os_hw()
776 struct ad7606_chan_scale *cs; in ad7606_write_raw() local
779 guard(mutex)(&st->lock); in ad7606_write_raw()
783 if (st->sw_mode_en) in ad7606_write_raw()
784 ch = chan->scan_index; in ad7606_write_raw()
785 cs = &st->chan_scales[ch]; in ad7606_write_raw()
786 for (i = 0; i < cs->num_scales; i++) { in ad7606_write_raw()
787 scale_avail_uv[i] = cs->scale_avail[i][0] * MICRO + in ad7606_write_raw()
788 cs->scale_avail[i][1]; in ad7606_write_raw()
791 i = find_closest(val, scale_avail_uv, cs->num_scales); in ad7606_write_raw()
794 return -EBUSY; in ad7606_write_raw()
795 ret = st->write_scale(indio_dev, ch, i + cs->reg_offset); in ad7606_write_raw()
799 cs->range = i; in ad7606_write_raw()
804 return -EINVAL; in ad7606_write_raw()
805 i = find_closest(val, st->oversampling_avail, in ad7606_write_raw()
806 st->num_os_ratios); in ad7606_write_raw()
809 return -EBUSY; in ad7606_write_raw()
810 ret = st->write_os(indio_dev, i); in ad7606_write_raw()
814 st->oversampling = st->oversampling_avail[i]; in ad7606_write_raw()
819 return -EINVAL; in ad7606_write_raw()
822 return -EINVAL; in ad7606_write_raw()
832 const unsigned int *vals = st->oversampling_avail; in ad7606_oversampling_ratio_avail()
836 for (i = 0; i < st->num_os_ratios; i++) in ad7606_oversampling_ratio_avail()
837 len += scnprintf(buf + len, PAGE_SIZE - len, "%u ", vals[i]); in ad7606_oversampling_ratio_avail()
838 buf[len - 1] = '\n'; in ad7606_oversampling_ratio_avail()
876 struct device *dev = st->dev; in ad7606_request_gpios()
878 st->gpio_convst = devm_gpiod_get_optional(dev, "adi,conversion-start", in ad7606_request_gpios()
881 if (IS_ERR(st->gpio_convst)) in ad7606_request_gpios()
882 return PTR_ERR(st->gpio_convst); in ad7606_request_gpios()
884 st->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ad7606_request_gpios()
885 if (IS_ERR(st->gpio_reset)) in ad7606_request_gpios()
886 return PTR_ERR(st->gpio_reset); in ad7606_request_gpios()
888 st->gpio_range = devm_gpiod_get_optional(dev, "adi,range", in ad7606_request_gpios()
890 if (IS_ERR(st->gpio_range)) in ad7606_request_gpios()
891 return PTR_ERR(st->gpio_range); in ad7606_request_gpios()
893 st->gpio_standby = devm_gpiod_get_optional(dev, "standby", in ad7606_request_gpios()
895 if (IS_ERR(st->gpio_standby)) in ad7606_request_gpios()
896 return PTR_ERR(st->gpio_standby); in ad7606_request_gpios()
898 st->gpio_frstdata = devm_gpiod_get_optional(dev, "adi,first-data", in ad7606_request_gpios()
900 if (IS_ERR(st->gpio_frstdata)) in ad7606_request_gpios()
901 return PTR_ERR(st->gpio_frstdata); in ad7606_request_gpios()
903 if (!st->chip_info->oversampling_num) in ad7606_request_gpios()
906 st->gpio_os = devm_gpiod_get_array_optional(dev, in ad7606_request_gpios()
907 "adi,oversampling-ratio", in ad7606_request_gpios()
909 return PTR_ERR_OR_ZERO(st->gpio_os); in ad7606_request_gpios()
925 if (st->gpio_convst) { in ad7606_interrupt()
926 gpiod_set_value(st->gpio_convst, 0); in ad7606_interrupt()
930 dev_err(st->dev, "PWM set low failed"); in ad7606_interrupt()
934 iio_trigger_poll_nested(st->trig); in ad7606_interrupt()
936 complete(&st->completion); in ad7606_interrupt()
948 if (st->trig != trig) in ad7606_validate_trigger()
949 return -EINVAL; in ad7606_validate_trigger()
958 gpiod_set_value(st->gpio_convst, 1); in ad7606_buffer_postenable()
967 gpiod_set_value(st->gpio_convst, 0); in ad7606_buffer_predisable()
978 struct ad7606_chan_scale *cs; in ad7606_read_avail() local
983 *vals = st->oversampling_avail; in ad7606_read_avail()
984 *length = st->num_os_ratios; in ad7606_read_avail()
990 if (st->sw_mode_en) in ad7606_read_avail()
991 ch = chan->scan_index; in ad7606_read_avail()
993 cs = &st->chan_scales[ch]; in ad7606_read_avail()
994 *vals = (int *)cs->scale_avail; in ad7606_read_avail()
995 *length = cs->num_scales * 2; in ad7606_read_avail()
1000 return -EINVAL; in ad7606_read_avail()
1027 if (!st->bops->update_scan_mode) in ad7606_update_scan_mode()
1030 return st->bops->update_scan_mode(indio_dev, scan_mask); in ad7606_update_scan_mode()
1091 readval = st->bops->reg_read(st, addr); in ad7606_write_mask()
1098 return st->bops->reg_write(st, addr, readval); in ad7606_write_mask()
1150 return st->bops->reg_write(st, AD7606_OS_MODE, val); in ad7606_write_os_sw()
1163 st->write_scale = ad7616_write_scale_sw; in ad7616_sw_mode_setup()
1164 st->write_os = &ad7616_write_os_sw; in ad7616_sw_mode_setup()
1166 if (st->bops->sw_mode_config) { in ad7616_sw_mode_setup()
1167 ret = st->bops->sw_mode_config(indio_dev); in ad7616_sw_mode_setup()
1190 if (st->gpio_os) in ad7606b_sw_mode_setup()
1191 gpiod_multi_set_value_cansleep(st->gpio_os, os); in ad7606b_sw_mode_setup()
1194 st->oversampling_avail = ad7606b_oversampling_avail; in ad7606b_sw_mode_setup()
1195 st->num_os_ratios = ARRAY_SIZE(ad7606b_oversampling_avail); in ad7606b_sw_mode_setup()
1197 st->write_scale = ad7606_write_scale_sw; in ad7606b_sw_mode_setup()
1198 st->write_os = &ad7606_write_os_sw; in ad7606b_sw_mode_setup()
1200 if (!st->bops->sw_mode_config) in ad7606b_sw_mode_setup()
1203 return st->bops->sw_mode_config(indio_dev); in ad7606b_sw_mode_setup()
1209 struct device *dev = indio_dev->dev.parent; in ad7606_probe_channels()
1214 slow_bus = !(st->bops->iio_backend_config || st->offload_en); in ad7606_probe_channels()
1215 indio_dev->num_channels = st->chip_info->num_adc_channels; in ad7606_probe_channels()
1219 indio_dev->num_channels++; in ad7606_probe_channels()
1221 channels = devm_kcalloc(dev, indio_dev->num_channels, sizeof(*channels), in ad7606_probe_channels()
1224 return -ENOMEM; in ad7606_probe_channels()
1226 for (i = 0; i < st->chip_info->num_adc_channels; i++) { in ad7606_probe_channels()
1229 chan->type = IIO_VOLTAGE; in ad7606_probe_channels()
1230 chan->indexed = 1; in ad7606_probe_channels()
1231 chan->channel = i; in ad7606_probe_channels()
1232 chan->scan_index = i; in ad7606_probe_channels()
1233 chan->scan_type.sign = 's'; in ad7606_probe_channels()
1234 chan->scan_type.realbits = st->chip_info->bits; in ad7606_probe_channels()
1236 * If in SPI offload mode, storagebits are set based in ad7606_probe_channels()
1237 * on the spi-engine hw implementation. in ad7606_probe_channels()
1239 chan->scan_type.storagebits = st->offload_en ? in ad7606_probe_channels()
1240 st->chip_info->offload_storagebits : in ad7606_probe_channels()
1241 (st->chip_info->bits > 16 ? 32 : 16); in ad7606_probe_channels()
1243 chan->scan_type.endianness = IIO_CPU; in ad7606_probe_channels()
1245 if (indio_dev->modes & INDIO_DIRECT_MODE) in ad7606_probe_channels()
1246 chan->info_mask_separate |= BIT(IIO_CHAN_INFO_RAW); in ad7606_probe_channels()
1248 if (st->sw_mode_en) { in ad7606_probe_channels()
1249 chan->info_mask_separate |= BIT(IIO_CHAN_INFO_SCALE); in ad7606_probe_channels()
1250 chan->info_mask_separate_available |= in ad7606_probe_channels()
1260 chan->info_mask_shared_by_type |= in ad7606_probe_channels()
1263 chan->info_mask_shared_by_all |= in ad7606_probe_channels()
1266 chan->info_mask_shared_by_all_available |= in ad7606_probe_channels()
1269 chan->info_mask_shared_by_type |= in ad7606_probe_channels()
1272 if (st->chip_info->oversampling_avail) in ad7606_probe_channels()
1273 chan->info_mask_shared_by_all |= in ad7606_probe_channels()
1278 chan->info_mask_shared_by_all |= in ad7606_probe_channels()
1281 ret = st->chip_info->scale_setup_cb(indio_dev, chan); in ad7606_probe_channels()
1289 indio_dev->channels = channels; in ad7606_probe_channels()
1309 return -ENOMEM; in ad7606_probe()
1314 ret = devm_mutex_init(dev, &st->lock); in ad7606_probe()
1318 st->dev = dev; in ad7606_probe()
1319 st->bops = bops; in ad7606_probe()
1320 st->base_address = base_address; in ad7606_probe()
1321 st->oversampling = 1; in ad7606_probe()
1322 st->sw_mode_en = device_property_read_bool(dev, "adi,sw-mode"); in ad7606_probe()
1324 if (st->sw_mode_en && !chip_info->sw_setup_cb) in ad7606_probe()
1325 return dev_err_probe(dev, -EINVAL, in ad7606_probe()
1333 st->chip_info = chip_info; in ad7606_probe()
1335 if (st->chip_info->oversampling_num) { in ad7606_probe()
1336 st->oversampling_avail = st->chip_info->oversampling_avail; in ad7606_probe()
1337 st->num_os_ratios = st->chip_info->oversampling_num; in ad7606_probe()
1344 if (st->gpio_os) { in ad7606_probe()
1345 if (st->gpio_range) in ad7606_probe()
1346 indio_dev->info = &ad7606_info_os_and_range; in ad7606_probe()
1348 indio_dev->info = &ad7606_info_os; in ad7606_probe()
1350 if (st->gpio_range) in ad7606_probe()
1351 indio_dev->info = &ad7606_info_range; in ad7606_probe()
1353 indio_dev->info = &ad7606_info_no_os_or_range; in ad7606_probe()
1357 indio_dev->modes = st->bops->iio_backend_config ? 0 : INDIO_DIRECT_MODE; in ad7606_probe()
1358 indio_dev->name = chip_info->name; in ad7606_probe()
1360 /* Using spi-engine with offload support ? */ in ad7606_probe()
1361 if (st->bops->offload_config) { in ad7606_probe()
1362 ret = st->bops->offload_config(dev, indio_dev); in ad7606_probe()
1373 dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n"); in ad7606_probe()
1376 if (st->chip_info->init_delay_ms) { in ad7606_probe()
1377 if (msleep_interruptible(st->chip_info->init_delay_ms)) in ad7606_probe()
1378 return -ERESTARTSYS; in ad7606_probe()
1381 /* If convst pin is not defined, setup PWM. */ in ad7606_probe()
1382 if (!st->gpio_convst || st->offload_en) { in ad7606_probe()
1383 st->cnvst_pwm = devm_pwm_get(dev, NULL); in ad7606_probe()
1384 if (IS_ERR(st->cnvst_pwm)) in ad7606_probe()
1385 return PTR_ERR(st->cnvst_pwm); in ad7606_probe()
1402 st->cnvst_pwm); in ad7606_probe()
1407 if (st->bops->iio_backend_config) { in ad7606_probe()
1412 ret = ad7606_set_sampling_freq(st, chip_info->max_samplerate); in ad7606_probe()
1416 ret = st->bops->iio_backend_config(dev, indio_dev); in ad7606_probe()
1420 indio_dev->setup_ops = &ad7606_backend_buffer_ops; in ad7606_probe()
1421 } else if (!st->offload_en) { in ad7606_probe()
1423 if (!st->gpio_convst) in ad7606_probe()
1424 return dev_err_probe(dev, -EINVAL, in ad7606_probe()
1427 init_completion(&st->completion); in ad7606_probe()
1428 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", in ad7606_probe()
1429 indio_dev->name, in ad7606_probe()
1431 if (!st->trig) in ad7606_probe()
1432 return -ENOMEM; in ad7606_probe()
1434 st->trig->ops = &ad7606_trigger_ops; in ad7606_probe()
1435 iio_trigger_set_drvdata(st->trig, indio_dev); in ad7606_probe()
1436 ret = devm_iio_trigger_register(dev, st->trig); in ad7606_probe()
1440 indio_dev->trig = iio_trigger_get(st->trig); in ad7606_probe()
1444 chip_info->name, indio_dev); in ad7606_probe()
1456 st->write_scale = ad7606_write_scale_hw; in ad7606_probe()
1457 st->write_os = ad7606_write_os_hw; in ad7606_probe()
1460 if (st->sw_mode_en || st->offload_en) { in ad7606_probe()
1461 indio_dev->info = &ad7606_info_sw_mode; in ad7606_probe()
1462 st->chip_info->sw_setup_cb(indio_dev); in ad7606_probe()
1476 if (st->gpio_standby) { in ad7606_suspend()
1477 gpiod_set_value(st->gpio_range, 1); in ad7606_suspend()
1478 gpiod_set_value(st->gpio_standby, 1); in ad7606_suspend()
1489 if (st->gpio_standby) { in ad7606_resume()
1490 gpiod_set_value(st->gpio_range, st->chan_scales[0].range); in ad7606_resume()
1491 gpiod_set_value(st->gpio_standby, 1); in ad7606_resume()