Lines Matching +full:vref +full:- +full:buffered
1 // SPDX-License-Identifier: GPL-2.0+
154 struct regulator *vref[4]; member
179 .name = "ad7124-4",
184 .name = "ad7124-8",
200 diff_new = abs(val - array[i]); in ad7124_find_closest_match()
219 ret = ad_sd_read_reg(&st->sd, addr, bytes, &readval); in ad7124_spi_write_mask()
226 return ad_sd_write_reg(&st->sd, addr, bytes, readval); in ad7124_spi_write_mask()
234 st->adc_control &= ~AD7124_ADC_CTRL_MODE_MSK; in ad7124_set_mode()
235 st->adc_control |= AD7124_ADC_CTRL_MODE(mode); in ad7124_set_mode()
237 return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control); in ad7124_set_mode()
245 val = st->channel_config[channel].ain | AD7124_CHANNEL_EN(1) | in ad7124_set_channel()
248 return ad_sd_write_reg(&st->sd, AD7124_CHANNEL(channel), 2, val); in ad7124_set_channel()
268 fclk = clk_get_rate(st->mclk); in ad7124_set_channel_odr()
288 st->channel_config[channel].odr = in ad7124_set_channel_odr()
309 st->channel_config[channel].pga_bits = res; in ad7124_set_channel_gain()
319 fadc = st->channel_config[channel].odr; in ad7124_get_3db_filter_freq()
321 switch (st->channel_config[channel].filter_type) { in ad7124_get_3db_filter_freq()
327 return -EINVAL; in ad7124_get_3db_filter_freq()
351 if (st->channel_config[channel].filter_type != new_filter) { in ad7124_set_3db_filter_freq()
354 st->channel_config[channel].filter_type = new_filter; in ad7124_set_3db_filter_freq()
380 ret = ad_sd_write_reg(&st->sd, in ad7124_read_raw()
381 AD7124_CHANNEL(chan->address), 2, in ad7124_read_raw()
382 st->channel_config[chan->address].ain | in ad7124_read_raw()
389 idx = st->channel_config[chan->address].pga_bits; in ad7124_read_raw()
390 *val = st->channel_config[chan->address].vref_mv; in ad7124_read_raw()
391 if (st->channel_config[chan->address].bipolar) in ad7124_read_raw()
392 *val2 = chan->scan_type.realbits - 1 + idx; in ad7124_read_raw()
394 *val2 = chan->scan_type.realbits + idx; in ad7124_read_raw()
398 if (st->channel_config[chan->address].bipolar) in ad7124_read_raw()
399 *val = -(1 << (chan->scan_type.realbits - 1)); in ad7124_read_raw()
405 *val = st->channel_config[chan->address].odr; in ad7124_read_raw()
409 *val = ad7124_get_3db_filter_freq(st, chan->scan_index); in ad7124_read_raw()
412 return -EINVAL; in ad7124_read_raw()
421 unsigned int res, gain, full_scale, vref; in ad7124_write_raw() local
426 return -EINVAL; in ad7124_write_raw()
428 return ad7124_set_channel_odr(st, chan->address, val); in ad7124_write_raw()
431 return -EINVAL; in ad7124_write_raw()
433 if (st->channel_config[chan->address].bipolar) in ad7124_write_raw()
434 full_scale = 1 << (chan->scan_type.realbits - 1); in ad7124_write_raw()
436 full_scale = 1 << chan->scan_type.realbits; in ad7124_write_raw()
438 vref = st->channel_config[chan->address].vref_mv * 1000000LL; in ad7124_write_raw()
439 res = DIV_ROUND_CLOSEST(vref, full_scale); in ad7124_write_raw()
442 return ad7124_set_channel_gain(st, chan->address, gain); in ad7124_write_raw()
445 return -EINVAL; in ad7124_write_raw()
447 return ad7124_set_3db_filter_freq(st, chan->address, val); in ad7124_write_raw()
449 return -EINVAL; in ad7124_write_raw()
462 return -EINVAL; in ad7124_reg_access()
465 ret = ad_sd_read_reg(&st->sd, reg, ad7124_reg_size[reg], in ad7124_reg_access()
468 ret = ad_sd_write_reg(&st->sd, reg, ad7124_reg_size[reg], in ad7124_reg_access()
499 ret = ad_sd_reset(&st->sd, 64); in ad7124_soft_reset()
505 ret = ad_sd_read_reg(&st->sd, AD7124_STATUS, 1, &readval); in ad7124_soft_reset()
514 } while (--timeout); in ad7124_soft_reset()
516 dev_err(&st->sd.spi->dev, "Soft reset failed\n"); in ad7124_soft_reset()
518 return -EIO; in ad7124_soft_reset()
526 ret = ad_sd_read_reg(&st->sd, AD7124_ID, 1, &readval); in ad7124_check_chip_id()
533 if (chip_id != st->chip_info->chip_id) { in ad7124_check_chip_id()
534 dev_err(&st->sd.spi->dev, in ad7124_check_chip_id()
536 st->chip_info->chip_id, chip_id); in ad7124_check_chip_id()
537 return -ENODEV; in ad7124_check_chip_id()
541 dev_err(&st->sd.spi->dev, in ad7124_check_chip_id()
543 return -ENODEV; in ad7124_check_chip_id()
552 unsigned int refsel = st->channel_config[channel_number].refsel; in ad7124_init_channel_vref()
558 if (IS_ERR(st->vref[refsel])) { in ad7124_init_channel_vref()
559 dev_err(&st->sd.spi->dev, in ad7124_init_channel_vref()
562 return PTR_ERR(st->vref[refsel]); in ad7124_init_channel_vref()
564 st->channel_config[channel_number].vref_mv = in ad7124_init_channel_vref()
565 regulator_get_voltage(st->vref[refsel]); in ad7124_init_channel_vref()
567 st->channel_config[channel_number].vref_mv /= 1000; in ad7124_init_channel_vref()
570 st->channel_config[channel_number].vref_mv = 2500; in ad7124_init_channel_vref()
571 st->adc_control &= ~AD7124_ADC_CTRL_REF_EN_MSK; in ad7124_init_channel_vref()
572 st->adc_control |= AD7124_ADC_CTRL_REF_EN(1); in ad7124_init_channel_vref()
573 return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, in ad7124_init_channel_vref()
574 2, st->adc_control); in ad7124_init_channel_vref()
576 dev_err(&st->sd.spi->dev, "Invalid reference %d\n", refsel); in ad7124_init_channel_vref()
577 return -EINVAL; in ad7124_init_channel_vref()
593 st->num_channels = of_get_available_child_count(np); in ad7124_of_parse_channel_config()
594 if (!st->num_channels) { in ad7124_of_parse_channel_config()
595 dev_err(indio_dev->dev.parent, "no channel children\n"); in ad7124_of_parse_channel_config()
596 return -ENODEV; in ad7124_of_parse_channel_config()
599 chan = devm_kcalloc(indio_dev->dev.parent, st->num_channels, in ad7124_of_parse_channel_config()
602 return -ENOMEM; in ad7124_of_parse_channel_config()
604 chan_config = devm_kcalloc(indio_dev->dev.parent, st->num_channels, in ad7124_of_parse_channel_config()
607 return -ENOMEM; in ad7124_of_parse_channel_config()
609 indio_dev->channels = chan; in ad7124_of_parse_channel_config()
610 indio_dev->num_channels = st->num_channels; in ad7124_of_parse_channel_config()
611 st->channel_config = chan_config; in ad7124_of_parse_channel_config()
618 if (channel >= indio_dev->num_channels) { in ad7124_of_parse_channel_config()
619 dev_err(indio_dev->dev.parent, in ad7124_of_parse_channel_config()
621 ret = -EINVAL; in ad7124_of_parse_channel_config()
625 ret = of_property_read_u32_array(child, "diff-channels", in ad7124_of_parse_channel_config()
630 st->channel_config[channel].ain = AD7124_CHANNEL_AINP(ain[0]) | in ad7124_of_parse_channel_config()
632 st->channel_config[channel].bipolar = in ad7124_of_parse_channel_config()
635 ret = of_property_read_u32(child, "adi,reference-select", &tmp); in ad7124_of_parse_channel_config()
637 st->channel_config[channel].refsel = AD7124_INT_REF; in ad7124_of_parse_channel_config()
639 st->channel_config[channel].refsel = tmp; in ad7124_of_parse_channel_config()
641 st->channel_config[channel].buf_positive = in ad7124_of_parse_channel_config()
642 of_property_read_bool(child, "adi,buffered-positive"); in ad7124_of_parse_channel_config()
643 st->channel_config[channel].buf_negative = in ad7124_of_parse_channel_config()
644 of_property_read_bool(child, "adi,buffered-negative"); in ad7124_of_parse_channel_config()
665 fclk = clk_get_rate(st->mclk); in ad7124_setup()
667 return -EINVAL; in ad7124_setup()
674 ret = clk_set_rate(st->mclk, fclk); in ad7124_setup()
680 st->adc_control &= ~AD7124_ADC_CTRL_PWR_MSK; in ad7124_setup()
681 st->adc_control |= AD7124_ADC_CTRL_PWR(power_mode); in ad7124_setup()
682 ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control); in ad7124_setup()
686 for (i = 0; i < st->num_channels; i++) { in ad7124_setup()
687 val = st->channel_config[i].ain | AD7124_CHANNEL_SETUP(i); in ad7124_setup()
688 ret = ad_sd_write_reg(&st->sd, AD7124_CHANNEL(i), 2, val); in ad7124_setup()
696 tmp = (st->channel_config[i].buf_positive << 1) + in ad7124_setup()
697 st->channel_config[i].buf_negative; in ad7124_setup()
699 val = AD7124_CONFIG_BIPOLAR(st->channel_config[i].bipolar) | in ad7124_setup()
700 AD7124_CONFIG_REF_SEL(st->channel_config[i].refsel) | in ad7124_setup()
702 ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(i), 2, val); in ad7124_setup()
728 info = of_device_get_match_data(&spi->dev); in ad7124_probe()
730 return -ENODEV; in ad7124_probe()
732 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad7124_probe()
734 return -ENOMEM; in ad7124_probe()
738 st->chip_info = info; in ad7124_probe()
740 ad_sd_init(&st->sd, indio_dev, spi, &ad7124_sigma_delta_info); in ad7124_probe()
744 indio_dev->name = st->chip_info->name; in ad7124_probe()
745 indio_dev->modes = INDIO_DIRECT_MODE; in ad7124_probe()
746 indio_dev->info = &ad7124_info; in ad7124_probe()
748 ret = ad7124_of_parse_channel_config(indio_dev, spi->dev.of_node); in ad7124_probe()
752 for (i = 0; i < ARRAY_SIZE(st->vref); i++) { in ad7124_probe()
756 st->vref[i] = devm_regulator_get_optional(&spi->dev, in ad7124_probe()
758 if (PTR_ERR(st->vref[i]) == -ENODEV) in ad7124_probe()
760 else if (IS_ERR(st->vref[i])) in ad7124_probe()
761 return PTR_ERR(st->vref[i]); in ad7124_probe()
763 ret = regulator_enable(st->vref[i]); in ad7124_probe()
767 ret = devm_add_action_or_reset(&spi->dev, ad7124_reg_disable, in ad7124_probe()
768 st->vref[i]); in ad7124_probe()
773 st->mclk = devm_clk_get(&spi->dev, "mclk"); in ad7124_probe()
774 if (IS_ERR(st->mclk)) in ad7124_probe()
775 return PTR_ERR(st->mclk); in ad7124_probe()
777 ret = clk_prepare_enable(st->mclk); in ad7124_probe()
799 dev_err(&spi->dev, "Failed to register iio device\n"); in ad7124_probe()
808 clk_disable_unprepare(st->mclk); in ad7124_probe()
820 clk_disable_unprepare(st->mclk); in ad7124_remove()
826 { .compatible = "adi,ad7124-4",
828 { .compatible = "adi,ad7124-8",