Lines Matching +full:iio +full:- +full:backend

1 // SPDX-License-Identifier: GPL-2.0-only
26 #include <linux/iio/backend.h>
27 #include <linux/iio/iio.h>
205 return regmap_read(st->regmap, reg, readval); in ad4851_reg_access()
207 return regmap_write(st->regmap, reg, writeval); in ad4851_reg_access()
218 freq = clamp(freq, 1, st->info->max_sample_rate_hz); in ad4851_set_sampling_freq()
222 ret = pwm_apply_might_sleep(st->cnv, &cnv_state); in ad4851_set_sampling_freq()
226 st->cnv_trigger_rate_hz = freq; in ad4851_set_sampling_freq()
243 return i - 1; in ad4851_osr_to_regval()
245 return -EINVAL; in ad4851_osr_to_regval()
254 scan_type = iio_get_current_scan_type(indio_dev, &indio_dev->channels[0]); in __ad4851_get_scale()
258 tmp = ((u64)scale_tbl * MICRO) >> scan_type->realbits; in __ad4851_get_scale()
278 st->scales_unipolar[i][0] = val1; in ad4851_scale_fill()
279 st->scales_unipolar[i][1] = val2; in ad4851_scale_fill()
289 st->scales_bipolar[i][0] = val1; in ad4851_scale_fill()
290 st->scales_bipolar[i][1] = val2; in ad4851_scale_fill()
302 guard(mutex)(&st->lock); in ad4851_set_oversampling_ratio()
305 ret = regmap_clear_bits(st->regmap, AD4851_REG_OVERSAMPLE, in ad4851_set_oversampling_ratio()
312 return -EINVAL; in ad4851_set_oversampling_ratio()
314 ret = regmap_update_bits(st->regmap, AD4851_REG_OVERSAMPLE, in ad4851_set_oversampling_ratio()
323 /* Channel is ignored by the backend being used here */ in ad4851_set_oversampling_ratio()
324 ret = iio_backend_oversampling_ratio_set(st->back, 0, osr); in ad4851_set_oversampling_ratio()
328 switch (st->info->resolution) { in ad4851_set_oversampling_ratio()
332 return -EINVAL; in ad4851_set_oversampling_ratio()
345 return -EINVAL; in ad4851_set_oversampling_ratio()
348 ret = iio_backend_data_size_set(st->back, val); in ad4851_set_oversampling_ratio()
352 if (osr == 1 || st->info->resolution == 16) { in ad4851_set_oversampling_ratio()
353 ret = regmap_clear_bits(st->regmap, AD4851_REG_PACKET, in ad4851_set_oversampling_ratio()
358 st->resolution_boost_enabled = false; in ad4851_set_oversampling_ratio()
360 ret = regmap_update_bits(st->regmap, AD4851_REG_PACKET, in ad4851_set_oversampling_ratio()
366 st->resolution_boost_enabled = true; in ad4851_set_oversampling_ratio()
369 if (st->osr != osr) { in ad4851_set_oversampling_ratio()
374 st->osr = osr; in ad4851_set_oversampling_ratio()
385 guard(mutex)(&st->lock); in ad4851_get_oversampling_ratio()
387 ret = regmap_read(st->regmap, AD4851_REG_OVERSAMPLE, &osr); in ad4851_get_oversampling_ratio()
396 st->osr = *val; in ad4851_get_oversampling_ratio()
411 if (st->pd_gpio) { in ad4851_setup()
413 gpiod_set_value(st->pd_gpio, 1); in ad4851_setup()
415 gpiod_set_value(st->pd_gpio, 0); in ad4851_setup()
417 gpiod_set_value(st->pd_gpio, 1); in ad4851_setup()
419 gpiod_set_value(st->pd_gpio, 0); in ad4851_setup()
422 ret = regmap_set_bits(st->regmap, AD4851_REG_INTERFACE_CONFIG_A, in ad4851_setup()
428 if (st->vrefbuf_en) { in ad4851_setup()
429 ret = regmap_set_bits(st->regmap, AD4851_REG_DEVICE_CTRL, in ad4851_setup()
435 if (st->vrefio_en) { in ad4851_setup()
436 ret = regmap_set_bits(st->regmap, AD4851_REG_DEVICE_CTRL, in ad4851_setup()
442 ret = regmap_write(st->regmap, AD4851_REG_INTERFACE_CONFIG_B, in ad4851_setup()
447 if (!(st->spi->mode & SPI_3WIRE)) { in ad4851_setup()
448 ret = regmap_write(st->regmap, AD4851_REG_INTERFACE_CONFIG_A, in ad4851_setup()
454 ret = regmap_read(st->regmap, AD4851_REG_PRODUCT_ID_L, &product_id); in ad4851_setup()
458 if (product_id != st->info->product_id) in ad4851_setup()
459 dev_info(&st->spi->dev, "Unknown product ID: 0x%02X\n", in ad4851_setup()
462 ret = regmap_set_bits(st->regmap, AD4851_REG_DEVICE_CTRL, in ad4851_setup()
467 return regmap_write(st->regmap, AD4851_REG_PACKET, 0); in ad4851_setup()
480 if (end - bit > cnt) { in ad4851_find_opt()
481 cnt = end - bit; in ad4851_find_opt()
482 start_cnt = bit - start; in ad4851_find_opt()
487 return -ENOENT; in ad4851_find_opt()
503 ret = iio_backend_interface_type_get(st->back, &interface_type); in ad4851_calibrate()
509 num_lanes = indio_dev->num_channels; in ad4851_calibrate()
515 return -EINVAL; in ad4851_calibrate()
518 if (st->info->resolution == 16) { in ad4851_calibrate()
519 ret = iio_backend_data_size_set(st->back, 24); in ad4851_calibrate()
523 ret = regmap_write(st->regmap, AD4851_REG_PACKET, in ad4851_calibrate()
528 ret = iio_backend_data_size_set(st->back, 32); in ad4851_calibrate()
532 ret = regmap_write(st->regmap, AD4851_REG_PACKET, in ad4851_calibrate()
538 for (i = 0; i < indio_dev->num_channels; i++) { in ad4851_calibrate()
539 ret = regmap_write(st->regmap, AD4851_REG_TESTPAT_0(i), in ad4851_calibrate()
544 ret = regmap_write(st->regmap, AD4851_REG_TESTPAT_1(i), in ad4851_calibrate()
549 ret = regmap_write(st->regmap, AD4851_REG_TESTPAT_2(i), in ad4851_calibrate()
554 ret = regmap_write(st->regmap, AD4851_REG_TESTPAT_3(i), in ad4851_calibrate()
559 ret = iio_backend_chan_enable(st->back, in ad4851_calibrate()
560 indio_dev->channels[i].channel); in ad4851_calibrate()
567 ret = iio_backend_iodelay_set(st->back, i, delay); in ad4851_calibrate()
571 ret = iio_backend_chan_status(st->back, i, &status); in ad4851_calibrate()
587 ret = iio_backend_iodelay_set(st->back, i, opt_delay); in ad4851_calibrate()
592 for (i = 0; i < indio_dev->num_channels; i++) { in ad4851_calibrate()
593 ret = iio_backend_chan_disable(st->back, i); in ad4851_calibrate()
598 ret = iio_backend_data_size_set(st->back, 20); in ad4851_calibrate()
602 return regmap_write(st->regmap, AD4851_REG_PACKET, 0); in ad4851_calibrate()
611 guard(mutex)(&st->lock); in ad4851_get_calibscale()
613 ret = regmap_read(st->regmap, AD4851_REG_CHX_GAIN_MSB(ch), &reg_val); in ad4851_get_calibscale()
619 ret = regmap_read(st->regmap, AD4851_REG_CHX_GAIN_LSB(ch), &reg_val); in ad4851_get_calibscale()
639 return -EINVAL; in ad4851_set_calibscale()
646 guard(mutex)(&st->lock); in ad4851_set_calibscale()
648 ret = regmap_write(st->regmap, AD4851_REG_CHX_GAIN_MSB(ch), buf[0]); in ad4851_set_calibscale()
652 return regmap_write(st->regmap, AD4851_REG_CHX_GAIN_LSB(ch), buf[1]); in ad4851_set_calibscale()
660 guard(mutex)(&st->lock); in ad4851_get_calibbias()
665 ret = regmap_read(st->regmap, AD4851_REG_CHX_OFFSET_MSB(ch), &msb); in ad4851_get_calibbias()
669 ret = regmap_read(st->regmap, AD4851_REG_CHX_OFFSET_MID(ch), &mid); in ad4851_get_calibbias()
673 ret = regmap_read(st->regmap, AD4851_REG_CHX_OFFSET_LSB(ch), &lsb); in ad4851_get_calibbias()
677 if (st->info->resolution == 16) { in ad4851_get_calibbias()
697 return -EINVAL; in ad4851_set_calibbias()
699 if (st->info->resolution == 16) in ad4851_set_calibbias()
704 guard(mutex)(&st->lock); in ad4851_set_calibbias()
709 ret = regmap_write(st->regmap, AD4851_REG_CHX_OFFSET_LSB(ch), buf[2]); in ad4851_set_calibbias()
713 ret = regmap_write(st->regmap, AD4851_REG_CHX_OFFSET_MID(ch), buf[1]); in ad4851_set_calibbias()
717 return regmap_write(st->regmap, AD4851_REG_CHX_OFFSET_MSB(ch), buf[0]); in ad4851_set_calibbias()
730 if (st->bipolar_ch[chan->channel]) { in ad4851_set_scale()
747 return regmap_write(st->regmap, in ad4851_set_scale()
748 AD4851_REG_CHX_SOFTSPAN(chan->channel), in ad4851_set_scale()
752 return -EINVAL; in ad4851_set_scale()
765 if (st->bipolar_ch[chan->channel]) { in ad4851_get_scale()
773 ret = regmap_read(st->regmap, AD4851_REG_CHX_SOFTSPAN(chan->channel), in ad4851_get_scale()
784 return -EIO; in ad4851_get_scale()
802 *val = st->cnv_trigger_rate_hz; in ad4851_read_raw()
803 *val2 = st->osr; in ad4851_read_raw()
806 return ad4851_get_calibscale(st, chan->channel, val, val2); in ad4851_read_raw()
810 return ad4851_get_calibbias(st, chan->channel, val); in ad4851_read_raw()
814 return -EINVAL; in ad4851_read_raw()
827 return -EINVAL; in ad4851_write_raw()
828 return ad4851_set_sampling_freq(st, val * st->osr + val2 * st->osr / MICRO); in ad4851_write_raw()
832 return ad4851_set_calibscale(st, chan->channel, val, val2); in ad4851_write_raw()
834 return ad4851_set_calibbias(st, chan->channel, val); in ad4851_write_raw()
838 return -EINVAL; in ad4851_write_raw()
849 for (c = 0; c < indio_dev->num_channels; c++) { in ad4851_update_scan_mode()
851 ret = iio_backend_chan_enable(st->back, c); in ad4851_update_scan_mode()
853 ret = iio_backend_chan_disable(st->back, c); in ad4851_update_scan_mode()
870 if (st->bipolar_ch[chan->channel]) { in ad4851_read_avail()
871 *vals = (const int *)st->scales_bipolar; in ad4851_read_avail()
876 *vals = (const int *)st->scales_unipolar; in ad4851_read_avail()
888 return -EINVAL; in ad4851_read_avail()
923 return st->resolution_boost_enabled ? AD4851_SCAN_TYPE_RESOLUTION_BOOST in ad4851_get_current_scan_type()
963 struct device *dev = &st->spi->dev; in ad4851_parse_channels_common()
971 return dev_err_probe(dev, -EINVAL, "Too many channels: %u\n", in ad4851_parse_channels_common()
976 return -ENOMEM; in ad4851_parse_channels_common()
986 return dev_err_probe(dev, -EINVAL, in ad4851_parse_channels_common()
989 channels->scan_index = index++; in ad4851_parse_channels_common()
990 channels->channel = reg; in ad4851_parse_channels_common()
992 if (fwnode_property_present(child, "diff-channels")) { in ad4851_parse_channels_common()
993 channels->channel2 = reg + st->info->max_channels; in ad4851_parse_channels_common()
994 channels->differential = 1; in ad4851_parse_channels_common()
997 st->bipolar_ch[reg] = fwnode_property_read_bool(child, "bipolar"); in ad4851_parse_channels_common()
999 if (st->bipolar_ch[reg]) { in ad4851_parse_channels_common()
1000 channels->scan_type.sign = 's'; in ad4851_parse_channels_common()
1002 ret = regmap_write(st->regmap, AD4851_REG_CHX_SOFTSPAN(reg), in ad4851_parse_channels_common()
1027 indio_dev->channels = ad4851_channels; in ad4857_parse_channels()
1028 indio_dev->num_channels = ret; in ad4857_parse_channels()
1036 struct device *dev = &st->spi->dev; in ad4858_parse_channels()
1058 indio_dev->channels = ad4851_channels; in ad4858_parse_channels()
1059 indio_dev->num_channels = ret; in ad4858_parse_channels()
1171 struct device *dev = &spi->dev; in ad4851_probe()
1177 return -ENOMEM; in ad4851_probe()
1180 st->spi = spi; in ad4851_probe()
1182 ret = devm_mutex_init(dev, &st->lock); in ad4851_probe()
1194 if (ret < 0 && ret != -ENODEV) in ad4851_probe()
1198 if (ret < 0 && ret != -ENODEV) in ad4851_probe()
1202 if (ret < 0 && ret != -ENODEV) in ad4851_probe()
1205 st->vrefbuf_en = ret != -ENODEV; in ad4851_probe()
1208 if (ret < 0 && ret != -ENODEV) in ad4851_probe()
1211 st->vrefio_en = ret != -ENODEV; in ad4851_probe()
1213 st->pd_gpio = devm_gpiod_get_optional(dev, "pd", GPIOD_OUT_LOW); in ad4851_probe()
1214 if (IS_ERR(st->pd_gpio)) in ad4851_probe()
1215 return dev_err_probe(dev, PTR_ERR(st->pd_gpio), in ad4851_probe()
1218 st->cnv = devm_pwm_get(dev, NULL); in ad4851_probe()
1219 if (IS_ERR(st->cnv)) in ad4851_probe()
1220 return dev_err_probe(dev, PTR_ERR(st->cnv), in ad4851_probe()
1223 st->info = spi_get_device_match_data(spi); in ad4851_probe()
1224 if (!st->info) in ad4851_probe()
1225 return -ENODEV; in ad4851_probe()
1227 st->regmap = devm_regmap_init_spi(spi, &regmap_config); in ad4851_probe()
1228 if (IS_ERR(st->regmap)) in ad4851_probe()
1229 return PTR_ERR(st->regmap); in ad4851_probe()
1235 ret = devm_add_action_or_reset(&st->spi->dev, ad4851_pwm_disable, in ad4851_probe()
1236 st->cnv); in ad4851_probe()
1244 indio_dev->name = st->info->name; in ad4851_probe()
1245 indio_dev->info = &ad4851_iio_info; in ad4851_probe()
1246 indio_dev->modes = INDIO_DIRECT_MODE; in ad4851_probe()
1248 ret = st->info->parse_channels(indio_dev); in ad4851_probe()
1256 st->back = devm_iio_backend_get(dev, NULL); in ad4851_probe()
1257 if (IS_ERR(st->back)) in ad4851_probe()
1258 return PTR_ERR(st->back); in ad4851_probe()
1260 ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev); in ad4851_probe()
1264 ret = devm_iio_backend_enable(dev, st->back); in ad4851_probe()