Lines Matching refs:st
313 int ad7606_reset(struct ad7606_state *st) in ad7606_reset() argument
315 if (st->gpio_reset) { in ad7606_reset()
316 gpiod_set_value(st->gpio_reset, 1); in ad7606_reset()
318 gpiod_set_value(st->gpio_reset, 0); in ad7606_reset()
329 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_16bit_chan_scale_setup() local
330 struct ad7606_chan_scale *cs = &st->chan_scales[ch]; in ad7606_16bit_chan_scale_setup()
332 if (!st->sw_mode_en) { in ad7606_16bit_chan_scale_setup()
352 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_get_chan_config() local
353 unsigned int num_channels = st->chip_info->num_adc_channels; in ad7606_get_chan_config()
354 unsigned int offset = indio_dev->num_channels - st->chip_info->num_adc_channels; in ad7606_get_chan_config()
355 struct device *dev = st->dev; in ad7606_get_chan_config()
408 struct ad7606_state *st = iio_priv(indio_dev); in ad7606c_18bit_chan_scale_setup() local
409 struct ad7606_chan_scale *cs = &st->chan_scales[ch]; in ad7606c_18bit_chan_scale_setup()
413 if (!st->sw_mode_en) { in ad7606c_18bit_chan_scale_setup()
465 struct ad7606_state *st = iio_priv(indio_dev); in ad7606c_16bit_chan_scale_setup() local
466 struct ad7606_chan_scale *cs = &st->chan_scales[ch]; in ad7606c_16bit_chan_scale_setup()
470 if (!st->sw_mode_en) { in ad7606c_16bit_chan_scale_setup()
523 struct ad7606_state *st = iio_priv(indio_dev); in ad7607_chan_scale_setup() local
524 struct ad7606_chan_scale *cs = &st->chan_scales[ch]; in ad7607_chan_scale_setup()
535 struct ad7606_state *st = iio_priv(indio_dev); in ad7608_chan_scale_setup() local
536 struct ad7606_chan_scale *cs = &st->chan_scales[ch]; in ad7608_chan_scale_setup()
547 struct ad7606_state *st = iio_priv(indio_dev); in ad7609_chan_scale_setup() local
548 struct ad7606_chan_scale *cs = &st->chan_scales[ch]; in ad7609_chan_scale_setup()
561 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_reg_access() local
564 guard(mutex)(&st->lock); in ad7606_reg_access()
567 ret = st->bops->reg_read(st, reg); in ad7606_reg_access()
573 return st->bops->reg_write(st, reg, writeval); in ad7606_reg_access()
577 static int ad7606_pwm_set_high(struct ad7606_state *st) in ad7606_pwm_set_high() argument
582 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_high()
586 ret = pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_high()
591 static int ad7606_pwm_set_low(struct ad7606_state *st) in ad7606_pwm_set_low() argument
596 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_low()
600 ret = pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_low()
605 static int ad7606_pwm_set_swing(struct ad7606_state *st) in ad7606_pwm_set_swing() argument
609 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_swing()
613 return pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_set_swing()
616 static bool ad7606_pwm_is_swinging(struct ad7606_state *st) in ad7606_pwm_is_swinging() argument
620 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_pwm_is_swinging()
626 static int ad7606_set_sampling_freq(struct ad7606_state *st, unsigned long freq) in ad7606_set_sampling_freq() argument
629 bool is_swinging = ad7606_pwm_is_swinging(st); in ad7606_set_sampling_freq()
636 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_set_sampling_freq()
648 return pwm_apply_might_sleep(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_set_sampling_freq()
651 static int ad7606_read_samples(struct ad7606_state *st) in ad7606_read_samples() argument
653 unsigned int num = st->chip_info->num_adc_channels; in ad7606_read_samples()
655 return st->bops->read_block(st->dev, num, &st->data); in ad7606_read_samples()
662 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_trigger_handler() local
665 guard(mutex)(&st->lock); in ad7606_trigger_handler()
667 ret = ad7606_read_samples(st); in ad7606_trigger_handler()
671 iio_push_to_buffers_with_timestamp(indio_dev, &st->data, in ad7606_trigger_handler()
676 gpiod_set_value(st->gpio_convst, 1); in ad7606_trigger_handler()
684 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_scan_direct() local
685 unsigned int realbits = st->chip_info->channels[1].scan_type.realbits; in ad7606_scan_direct()
689 if (st->gpio_convst) { in ad7606_scan_direct()
690 gpiod_set_value(st->gpio_convst, 1); in ad7606_scan_direct()
692 ret = ad7606_pwm_set_high(st); in ad7606_scan_direct()
703 if (!st->back) { in ad7606_scan_direct()
704 ret = wait_for_completion_timeout(&st->completion, in ad7606_scan_direct()
714 ret = ad7606_read_samples(st); in ad7606_scan_direct()
721 *val = st->data.buf32[ch]; in ad7606_scan_direct()
723 *val = st->data.buf16[ch]; in ad7606_scan_direct()
726 *val = sign_extend32(st->data.buf32[ch], realbits - 1); in ad7606_scan_direct()
728 *val = sign_extend32(st->data.buf16[ch], realbits - 1); in ad7606_scan_direct()
732 if (!st->gpio_convst) { in ad7606_scan_direct()
733 ret = ad7606_pwm_set_low(st); in ad7606_scan_direct()
737 gpiod_set_value(st->gpio_convst, 0); in ad7606_scan_direct()
749 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_read_raw() local
763 if (st->sw_mode_en) in ad7606_read_raw()
765 cs = &st->chan_scales[ch]; in ad7606_read_raw()
770 *val = st->oversampling; in ad7606_read_raw()
777 pwm_get_state(st->cnvst_pwm, &cnvst_pwm_state); in ad7606_read_raw()
789 struct ad7606_state *st = iio_priv(indio_dev); in in_voltage_scale_available_show() local
790 struct ad7606_chan_scale *cs = &st->chan_scales[0]; in in_voltage_scale_available_show()
807 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_write_scale_hw() local
809 gpiod_set_value(st->gpio_range, val); in ad7606_write_scale_hw()
816 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_write_os_hw() local
821 gpiod_set_array_value(st->gpio_os->ndescs, st->gpio_os->desc, in ad7606_write_os_hw()
822 st->gpio_os->info, values); in ad7606_write_os_hw()
825 if (st->chip_info->os_req_reset) in ad7606_write_os_hw()
826 ad7606_reset(st); in ad7606_write_os_hw()
837 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_write_raw() local
842 guard(mutex)(&st->lock); in ad7606_write_raw()
846 if (st->sw_mode_en) in ad7606_write_raw()
848 cs = &st->chan_scales[ch]; in ad7606_write_raw()
855 ret = st->write_scale(indio_dev, ch, i + cs->reg_offset); in ad7606_write_raw()
864 i = find_closest(val, st->oversampling_avail, in ad7606_write_raw()
865 st->num_os_ratios); in ad7606_write_raw()
866 ret = st->write_os(indio_dev, i); in ad7606_write_raw()
869 st->oversampling = st->oversampling_avail[i]; in ad7606_write_raw()
875 return ad7606_set_sampling_freq(st, val); in ad7606_write_raw()
886 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_oversampling_ratio_avail() local
887 const unsigned int *vals = st->oversampling_avail; in ad7606_oversampling_ratio_avail()
891 for (i = 0; i < st->num_os_ratios; i++) in ad7606_oversampling_ratio_avail()
929 static int ad7606_request_gpios(struct ad7606_state *st) in ad7606_request_gpios() argument
931 struct device *dev = st->dev; in ad7606_request_gpios()
933 st->gpio_convst = devm_gpiod_get_optional(dev, "adi,conversion-start", in ad7606_request_gpios()
936 if (IS_ERR(st->gpio_convst)) in ad7606_request_gpios()
937 return PTR_ERR(st->gpio_convst); in ad7606_request_gpios()
939 st->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in ad7606_request_gpios()
940 if (IS_ERR(st->gpio_reset)) in ad7606_request_gpios()
941 return PTR_ERR(st->gpio_reset); in ad7606_request_gpios()
943 st->gpio_range = devm_gpiod_get_optional(dev, "adi,range", in ad7606_request_gpios()
945 if (IS_ERR(st->gpio_range)) in ad7606_request_gpios()
946 return PTR_ERR(st->gpio_range); in ad7606_request_gpios()
948 st->gpio_standby = devm_gpiod_get_optional(dev, "standby", in ad7606_request_gpios()
950 if (IS_ERR(st->gpio_standby)) in ad7606_request_gpios()
951 return PTR_ERR(st->gpio_standby); in ad7606_request_gpios()
953 st->gpio_frstdata = devm_gpiod_get_optional(dev, "adi,first-data", in ad7606_request_gpios()
955 if (IS_ERR(st->gpio_frstdata)) in ad7606_request_gpios()
956 return PTR_ERR(st->gpio_frstdata); in ad7606_request_gpios()
958 if (!st->chip_info->oversampling_num) in ad7606_request_gpios()
961 st->gpio_os = devm_gpiod_get_array_optional(dev, in ad7606_request_gpios()
964 return PTR_ERR_OR_ZERO(st->gpio_os); in ad7606_request_gpios()
976 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_interrupt() local
980 if (st->gpio_convst) { in ad7606_interrupt()
981 gpiod_set_value(st->gpio_convst, 0); in ad7606_interrupt()
983 ret = ad7606_pwm_set_low(st); in ad7606_interrupt()
985 dev_err(st->dev, "PWM set low failed"); in ad7606_interrupt()
989 iio_trigger_poll_nested(st->trig); in ad7606_interrupt()
991 complete(&st->completion); in ad7606_interrupt()
1001 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_validate_trigger() local
1003 if (st->trig != trig) in ad7606_validate_trigger()
1011 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_buffer_postenable() local
1013 gpiod_set_value(st->gpio_convst, 1); in ad7606_buffer_postenable()
1020 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_buffer_predisable() local
1022 gpiod_set_value(st->gpio_convst, 0); in ad7606_buffer_predisable()
1032 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_read_avail() local
1038 *vals = st->oversampling_avail; in ad7606_read_avail()
1039 *length = st->num_os_ratios; in ad7606_read_avail()
1045 if (st->sw_mode_en) in ad7606_read_avail()
1048 cs = &st->chan_scales[ch]; in ad7606_read_avail()
1060 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_backend_buffer_postenable() local
1062 return ad7606_pwm_set_swing(st); in ad7606_backend_buffer_postenable()
1067 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_backend_buffer_predisable() local
1069 return ad7606_pwm_set_low(st); in ad7606_backend_buffer_predisable()
1075 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_update_scan_mode() local
1082 if (!st->bops->update_scan_mode) in ad7606_update_scan_mode()
1085 return st->bops->update_scan_mode(indio_dev, scan_mask); in ad7606_update_scan_mode()
1143 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_sw_mode_setup() local
1145 st->sw_mode_en = st->bops->sw_mode_config && in ad7606_sw_mode_setup()
1146 device_property_present(st->dev, "adi,sw-mode"); in ad7606_sw_mode_setup()
1147 if (!st->sw_mode_en) in ad7606_sw_mode_setup()
1152 return st->bops->sw_mode_config(indio_dev); in ad7606_sw_mode_setup()
1157 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_chan_scales_setup() local
1158 unsigned int offset = indio_dev->num_channels - st->chip_info->num_adc_channels; in ad7606_chan_scales_setup()
1165 chans = devm_kzalloc(st->dev, size, GFP_KERNEL); in ad7606_chan_scales_setup()
1172 for (ch = 0; ch < st->chip_info->num_adc_channels; ch++) { in ad7606_chan_scales_setup()
1173 ret = st->chip_info->scale_setup_cb(indio_dev, &chans[ch + offset], ch); in ad7606_chan_scales_setup()
1190 struct ad7606_state *st; in ad7606_probe() local
1194 indio_dev = devm_iio_device_alloc(dev, sizeof(*st)); in ad7606_probe()
1198 st = iio_priv(indio_dev); in ad7606_probe()
1201 st->dev = dev; in ad7606_probe()
1202 mutex_init(&st->lock); in ad7606_probe()
1203 st->bops = bops; in ad7606_probe()
1204 st->base_address = base_address; in ad7606_probe()
1205 st->oversampling = 1; in ad7606_probe()
1212 st->chip_info = chip_info; in ad7606_probe()
1214 if (st->chip_info->oversampling_num) { in ad7606_probe()
1215 st->oversampling_avail = st->chip_info->oversampling_avail; in ad7606_probe()
1216 st->num_os_ratios = st->chip_info->oversampling_num; in ad7606_probe()
1219 ret = ad7606_request_gpios(st); in ad7606_probe()
1223 if (st->gpio_os) { in ad7606_probe()
1224 if (st->gpio_range) in ad7606_probe()
1229 if (st->gpio_range) in ad7606_probe()
1236 indio_dev->channels = st->chip_info->channels; in ad7606_probe()
1237 indio_dev->num_channels = st->chip_info->num_channels; in ad7606_probe()
1239 ret = ad7606_reset(st); in ad7606_probe()
1241 dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n"); in ad7606_probe()
1244 if (st->chip_info->init_delay_ms) { in ad7606_probe()
1245 if (msleep_interruptible(st->chip_info->init_delay_ms)) in ad7606_probe()
1249 st->write_scale = ad7606_write_scale_hw; in ad7606_probe()
1250 st->write_os = ad7606_write_os_hw; in ad7606_probe()
1261 if (!st->gpio_convst) { in ad7606_probe()
1262 st->cnvst_pwm = devm_pwm_get(dev, NULL); in ad7606_probe()
1263 if (IS_ERR(st->cnvst_pwm)) in ad7606_probe()
1264 return PTR_ERR(st->cnvst_pwm); in ad7606_probe()
1267 ret = ad7606_set_sampling_freq(st, 1 * MEGA); in ad7606_probe()
1271 ret = ad7606_pwm_set_low(st); in ad7606_probe()
1281 st->cnvst_pwm); in ad7606_probe()
1286 if (st->bops->iio_backend_config) { in ad7606_probe()
1291 ret = ad7606_set_sampling_freq(st, in ad7606_probe()
1296 ret = st->bops->iio_backend_config(dev, indio_dev); in ad7606_probe()
1304 if (!st->gpio_convst) in ad7606_probe()
1308 init_completion(&st->completion); in ad7606_probe()
1309 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", in ad7606_probe()
1312 if (!st->trig) in ad7606_probe()
1315 st->trig->ops = &ad7606_trigger_ops; in ad7606_probe()
1316 iio_trigger_set_drvdata(st->trig, indio_dev); in ad7606_probe()
1317 ret = devm_iio_trigger_register(dev, st->trig); in ad7606_probe()
1321 indio_dev->trig = iio_trigger_get(st->trig); in ad7606_probe()
1346 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_suspend() local
1348 if (st->gpio_standby) { in ad7606_suspend()
1349 gpiod_set_value(st->gpio_range, 1); in ad7606_suspend()
1350 gpiod_set_value(st->gpio_standby, 1); in ad7606_suspend()
1359 struct ad7606_state *st = iio_priv(indio_dev); in ad7606_resume() local
1361 if (st->gpio_standby) { in ad7606_resume()
1362 gpiod_set_value(st->gpio_range, st->chan_scales[0].range); in ad7606_resume()
1363 gpiod_set_value(st->gpio_standby, 1); in ad7606_resume()
1364 ad7606_reset(st); in ad7606_resume()