Lines Matching refs:st

51 static int ad7606_reset(struct ad7606_state *st)
53 if (st->gpio_reset) {
54 gpiod_set_value(st->gpio_reset, 1);
56 gpiod_set_value(st->gpio_reset, 0);
68 struct ad7606_state *st = iio_priv(indio_dev);
71 mutex_lock(&st->lock);
73 ret = st->bops->reg_read(st, reg);
79 ret = st->bops->reg_write(st, reg, writeval);
82 mutex_unlock(&st->lock);
86 static int ad7606_read_samples(struct ad7606_state *st)
88 unsigned int num = st->chip_info->num_channels - 1;
89 u16 *data = st->data;
102 if (st->gpio_frstdata) {
103 ret = st->bops->read_block(st->dev, 1, data);
107 if (!gpiod_get_value(st->gpio_frstdata)) {
108 ad7606_reset(st);
116 return st->bops->read_block(st->dev, num, data);
123 struct ad7606_state *st = iio_priv(indio_dev);
126 mutex_lock(&st->lock);
128 ret = ad7606_read_samples(st);
130 iio_push_to_buffers_with_timestamp(indio_dev, st->data,
135 gpiod_set_value(st->gpio_convst, 1);
137 mutex_unlock(&st->lock);
144 struct ad7606_state *st = iio_priv(indio_dev);
147 gpiod_set_value(st->gpio_convst, 1);
148 ret = wait_for_completion_timeout(&st->completion,
155 ret = ad7606_read_samples(st);
157 ret = st->data[ch];
160 gpiod_set_value(st->gpio_convst, 0);
172 struct ad7606_state *st = iio_priv(indio_dev);
188 if (st->sw_mode_en)
191 *val2 = st->scale_avail[st->range[ch]];
194 *val = st->oversampling;
220 struct ad7606_state *st = iio_priv(indio_dev);
222 return ad7606_show_avail(buf, st->scale_avail, st->num_scales, true);
229 struct ad7606_state *st = iio_priv(indio_dev);
231 gpiod_set_value(st->gpio_range, val);
238 struct ad7606_state *st = iio_priv(indio_dev);
243 gpiod_set_array_value(ARRAY_SIZE(values), st->gpio_os->desc,
244 st->gpio_os->info, values);
247 if (st->chip_info->os_req_reset)
248 ad7606_reset(st);
259 struct ad7606_state *st = iio_priv(indio_dev);
264 mutex_lock(&st->lock);
265 i = find_closest(val2, st->scale_avail, st->num_scales);
266 if (st->sw_mode_en)
268 ret = st->write_scale(indio_dev, ch, i);
270 mutex_unlock(&st->lock);
273 st->range[ch] = i;
274 mutex_unlock(&st->lock);
280 i = find_closest(val, st->oversampling_avail,
281 st->num_os_ratios);
282 mutex_lock(&st->lock);
283 ret = st->write_os(indio_dev, i);
285 mutex_unlock(&st->lock);
288 st->oversampling = st->oversampling_avail[i];
289 mutex_unlock(&st->lock);
302 struct ad7606_state *st = iio_priv(indio_dev);
304 return ad7606_show_avail(buf, st->oversampling_avail,
305 st->num_os_ratios, false);
429 static int ad7606_request_gpios(struct ad7606_state *st)
431 struct device *dev = st->dev;
433 st->gpio_convst = devm_gpiod_get(dev, "adi,conversion-start",
435 if (IS_ERR(st->gpio_convst))
436 return PTR_ERR(st->gpio_convst);
438 st->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW);
439 if (IS_ERR(st->gpio_reset))
440 return PTR_ERR(st->gpio_reset);
442 st->gpio_range = devm_gpiod_get_optional(dev, "adi,range",
444 if (IS_ERR(st->gpio_range))
445 return PTR_ERR(st->gpio_range);
447 st->gpio_standby = devm_gpiod_get_optional(dev, "standby",
449 if (IS_ERR(st->gpio_standby))
450 return PTR_ERR(st->gpio_standby);
452 st->gpio_frstdata = devm_gpiod_get_optional(dev, "adi,first-data",
454 if (IS_ERR(st->gpio_frstdata))
455 return PTR_ERR(st->gpio_frstdata);
457 if (!st->chip_info->oversampling_num)
460 st->gpio_os = devm_gpiod_get_array_optional(dev,
463 return PTR_ERR_OR_ZERO(st->gpio_os);
475 struct ad7606_state *st = iio_priv(indio_dev);
478 gpiod_set_value(st->gpio_convst, 0);
479 iio_trigger_poll_chained(st->trig);
481 complete(&st->completion);
490 struct ad7606_state *st = iio_priv(indio_dev);
492 if (st->trig != trig)
500 struct ad7606_state *st = iio_priv(indio_dev);
502 gpiod_set_value(st->gpio_convst, 1);
509 struct ad7606_state *st = iio_priv(indio_dev);
511 gpiod_set_value(st->gpio_convst, 0);
561 struct ad7606_state *st = data;
563 regulator_disable(st->reg);
570 struct ad7606_state *st;
574 indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
578 st = iio_priv(indio_dev);
581 st->dev = dev;
582 mutex_init(&st->lock);
583 st->bops = bops;
584 st->base_address = base_address;
586 st->range[0] = 0;
587 st->oversampling = 1;
588 st->scale_avail = ad7606_scale_avail;
589 st->num_scales = ARRAY_SIZE(ad7606_scale_avail);
591 st->reg = devm_regulator_get(dev, "avcc");
592 if (IS_ERR(st->reg))
593 return PTR_ERR(st->reg);
595 ret = regulator_enable(st->reg);
601 ret = devm_add_action_or_reset(dev, ad7606_regulator_disable, st);
605 st->chip_info = &ad7606_chip_info_tbl[id];
607 if (st->chip_info->oversampling_num) {
608 st->oversampling_avail = st->chip_info->oversampling_avail;
609 st->num_os_ratios = st->chip_info->oversampling_num;
612 ret = ad7606_request_gpios(st);
616 if (st->gpio_os) {
617 if (st->gpio_range)
622 if (st->gpio_range)
629 indio_dev->channels = st->chip_info->channels;
630 indio_dev->num_channels = st->chip_info->num_channels;
632 init_completion(&st->completion);
634 ret = ad7606_reset(st);
636 dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n");
639 if (st->chip_info->init_delay_ms) {
640 if (msleep_interruptible(st->chip_info->init_delay_ms))
644 st->write_scale = ad7606_write_scale_hw;
645 st->write_os = ad7606_write_os_hw;
647 if (st->bops->sw_mode_config)
648 st->sw_mode_en = device_property_present(st->dev,
651 if (st->sw_mode_en) {
653 st->scale_avail = ad7616_sw_scale_avail;
654 st->num_scales = ARRAY_SIZE(ad7616_sw_scale_avail);
657 memset32(st->range, 2, ARRAY_SIZE(st->range));
660 ret = st->bops->sw_mode_config(indio_dev);
665 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d",
667 if (!st->trig)
670 st->trig->ops = &ad7606_trigger_ops;
671 st->trig->dev.parent = dev;
672 iio_trigger_set_drvdata(st->trig, indio_dev);
673 ret = devm_iio_trigger_register(dev, st->trig);
677 indio_dev->trig = iio_trigger_get(st->trig);
703 struct ad7606_state *st = iio_priv(indio_dev);
705 if (st->gpio_standby) {
706 gpiod_set_value(st->gpio_range, 1);
707 gpiod_set_value(st->gpio_standby, 0);
716 struct ad7606_state *st = iio_priv(indio_dev);
718 if (st->gpio_standby) {
719 gpiod_set_value(st->gpio_range, st->range[0]);
720 gpiod_set_value(st->gpio_standby, 1);
721 ad7606_reset(st);