Lines Matching +full:3 +full:- +full:channel
1 // SPDX-License-Identifier: GPL-2.0+
54 #define AD7124_SILICON_REV_MSK GENMASK(3, 0)
73 #define AD7124_CONFIG_REF_SEL_MSK GENMASK(4, 3)
112 1, 2, 3, 3, 2, 1, 3, 3, 1, 2, 2, 2, 2,
114 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
115 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
116 3, 3, 3, 3, 3
119 static const int ad7124_master_clk_freq_hz[3] = {
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()
240 static int ad7124_set_channel(struct ad_sigma_delta *sd, unsigned int channel) in ad7124_set_channel() argument
245 val = st->channel_config[channel].ain | AD7124_CHANNEL_EN(1) | in ad7124_set_channel()
246 AD7124_CHANNEL_SETUP(channel); in ad7124_set_channel()
248 return ad_sd_write_reg(&st->sd, AD7124_CHANNEL(channel), 2, val); in ad7124_set_channel()
262 unsigned int channel, in ad7124_set_channel_odr() argument
268 fclk = clk_get_rate(st->mclk); in ad7124_set_channel_odr()
282 ret = ad7124_spi_write_mask(st, AD7124_FILTER(channel), in ad7124_set_channel_odr()
284 AD7124_FILTER_FS(odr_sel_bits), 3); in ad7124_set_channel_odr()
288 st->channel_config[channel].odr = in ad7124_set_channel_odr()
295 unsigned int channel, in ad7124_set_channel_gain() argument
303 ret = ad7124_spi_write_mask(st, AD7124_CONFIG(channel), in ad7124_set_channel_gain()
309 st->channel_config[channel].pga_bits = res; in ad7124_set_channel_gain()
315 unsigned int channel) in ad7124_get_3db_filter_freq() argument
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()
332 unsigned int channel, in ad7124_set_3db_filter_freq() argument
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()
355 ret = ad7124_spi_write_mask(st, AD7124_FILTER(channel), in ad7124_set_3db_filter_freq()
358 3); in ad7124_set_3db_filter_freq()
363 return ad7124_set_channel_odr(st, channel, new_odr); in ad7124_set_3db_filter_freq()
379 /* After the conversion is performed, disable the channel */ in ad7124_read_raw()
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()
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()
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()
590 unsigned int ain[2], channel = 0, tmp; in ad7124_of_parse_channel_config() local
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()
614 ret = of_property_read_u32(child, "reg", &channel); 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()
620 "Channel index >= number of channels\n"); 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()
646 chan[channel] = ad7124_channel_template; in ad7124_of_parse_channel_config()
647 chan[channel].address = channel; in ad7124_of_parse_channel_config()
648 chan[channel].scan_index = channel; in ad7124_of_parse_channel_config()
649 chan[channel].channel = ain[0]; in ad7124_of_parse_channel_config()
650 chan[channel].channel2 = ain[1]; 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",