Lines Matching +full:buffered +full:- +full:positive

1 // SPDX-License-Identifier: GPL-2.0+
198 .name = "ad7124-4",
203 .name = "ad7124-8",
219 diff_new = abs(val - array[i]); in ad7124_find_closest_match()
238 ret = ad_sd_read_reg(&st->sd, addr, bytes, &readval); in ad7124_spi_write_mask()
245 return ad_sd_write_reg(&st->sd, addr, bytes, readval); in ad7124_spi_write_mask()
253 st->adc_control &= ~AD7124_ADC_CTRL_MODE_MSK; in ad7124_set_mode()
254 st->adc_control |= AD7124_ADC_CTRL_MODE(mode); in ad7124_set_mode()
256 return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control); in ad7124_set_mode()
263 fclk = clk_get_rate(st->mclk); in ad7124_set_channel_odr()
277 if (odr_sel_bits != st->channels[channel].cfg.odr_sel_bits) in ad7124_set_channel_odr()
278 st->channels[channel].cfg.live = false; in ad7124_set_channel_odr()
281 st->channels[channel].cfg.odr = DIV_ROUND_CLOSEST(fclk, odr_sel_bits * 32); in ad7124_set_channel_odr()
282 st->channels[channel].cfg.odr_sel_bits = odr_sel_bits; in ad7124_set_channel_odr()
290 fadc = st->channels[channel].cfg.odr; in ad7124_get_3db_filter_freq()
292 switch (st->channels[channel].cfg.filter_type) { in ad7124_get_3db_filter_freq()
298 return -EINVAL; in ad7124_get_3db_filter_freq()
321 if (new_odr != st->channels[channel].cfg.odr) in ad7124_set_3db_filter_freq()
322 st->channels[channel].cfg.live = false; in ad7124_set_3db_filter_freq()
324 st->channels[channel].cfg.filter_type = new_filter; in ad7124_set_3db_filter_freq()
325 st->channels[channel].cfg.odr = new_odr; in ad7124_set_3db_filter_freq()
335 cmp_size = (u8 *)&cfg->live - (u8 *)cfg; in ad7124_find_similar_live_cfg()
336 for (i = 0; i < st->num_channels; i++) { in ad7124_find_similar_live_cfg()
337 cfg_aux = &st->channels[i].cfg; in ad7124_find_similar_live_cfg()
339 if (cfg_aux->live && !memcmp(cfg, cfg_aux, cmp_size)) in ad7124_find_similar_live_cfg()
350 free_cfg_slot = find_next_zero_bit(&st->cfg_slots_status, AD7124_MAX_CONFIGS, 0); in ad7124_find_free_config_slot()
352 return -1; in ad7124_find_free_config_slot()
359 unsigned int refsel = cfg->refsel; in ad7124_init_config_vref()
365 if (IS_ERR(st->vref[refsel])) { in ad7124_init_config_vref()
366 dev_err(&st->sd.spi->dev, in ad7124_init_config_vref()
369 return PTR_ERR(st->vref[refsel]); in ad7124_init_config_vref()
371 cfg->vref_mv = regulator_get_voltage(st->vref[refsel]); in ad7124_init_config_vref()
373 cfg->vref_mv /= 1000; in ad7124_init_config_vref()
376 cfg->vref_mv = 2500; in ad7124_init_config_vref()
377 st->adc_control &= ~AD7124_ADC_CTRL_REF_EN_MSK; in ad7124_init_config_vref()
378 st->adc_control |= AD7124_ADC_CTRL_REF_EN(1); in ad7124_init_config_vref()
379 return ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, in ad7124_init_config_vref()
380 2, st->adc_control); in ad7124_init_config_vref()
382 dev_err(&st->sd.spi->dev, "Invalid reference %d\n", refsel); in ad7124_init_config_vref()
383 return -EINVAL; in ad7124_init_config_vref()
394 cfg->cfg_slot = cfg_slot; in ad7124_write_config()
396 tmp = (cfg->buf_positive << 1) + cfg->buf_negative; in ad7124_write_config()
397 val = AD7124_CONFIG_BIPOLAR(cfg->bipolar) | AD7124_CONFIG_REF_SEL(cfg->refsel) | in ad7124_write_config()
399 ret = ad_sd_write_reg(&st->sd, AD7124_CONFIG(cfg->cfg_slot), 2, val); in ad7124_write_config()
403 tmp = AD7124_FILTER_TYPE_SEL(cfg->filter_type); in ad7124_write_config()
404 ret = ad7124_spi_write_mask(st, AD7124_FILTER(cfg->cfg_slot), AD7124_FILTER_TYPE_MSK, in ad7124_write_config()
409 ret = ad7124_spi_write_mask(st, AD7124_FILTER(cfg->cfg_slot), AD7124_FILTER_FS_MSK, in ad7124_write_config()
410 AD7124_FILTER_FS(cfg->odr_sel_bits), 3); in ad7124_write_config()
414 return ad7124_spi_write_mask(st, AD7124_CONFIG(cfg->cfg_slot), AD7124_CONFIG_PGA_MSK, in ad7124_write_config()
415 AD7124_CONFIG_PGA(cfg->pga_bits), 2); in ad7124_write_config()
429 ret = kfifo_get(&st->live_cfgs_fifo, &lru_cfg); in ad7124_pop_config()
433 lru_cfg->live = false; in ad7124_pop_config()
436 assign_bit(lru_cfg->cfg_slot, &st->cfg_slots_status, 0); in ad7124_pop_config()
439 for (i = 0; i < st->num_channels; i++) { in ad7124_pop_config()
440 cfg = &st->channels[i].cfg; in ad7124_pop_config()
442 if (cfg->cfg_slot == lru_cfg->cfg_slot) in ad7124_pop_config()
443 cfg->live = false; in ad7124_pop_config()
457 kfifo_put(&st->live_cfgs_fifo, cfg); in ad7124_push_config()
462 return -EINVAL; in ad7124_push_config()
465 free_cfg_slot = lru_cfg->cfg_slot; in ad7124_push_config()
466 kfifo_put(&st->live_cfgs_fifo, cfg); in ad7124_push_config()
470 assign_bit(free_cfg_slot, &st->cfg_slots_status, 1); in ad7124_push_config()
477 ch->cfg.live = true; in ad7124_enable_channel()
478 return ad_sd_write_reg(&st->sd, AD7124_CHANNEL(ch->nr), 2, ch->ain | in ad7124_enable_channel()
479 AD7124_CHANNEL_SETUP(ch->cfg.cfg_slot) | AD7124_CHANNEL_EN(1)); in ad7124_enable_channel()
484 struct ad7124_channel_config *cfg = &st->channels[address].cfg; in ad7124_prepare_read()
491 if (!cfg->live) { in ad7124_prepare_read()
497 cfg->cfg_slot = live_cfg->cfg_slot; in ad7124_prepare_read()
501 return ad7124_enable_channel(st, &st->channels[address]); in ad7124_prepare_read()
509 mutex_lock(&st->cfgs_lock); in ad7124_set_channel()
511 mutex_unlock(&st->cfgs_lock); in ad7124_set_channel()
540 ret = ad_sd_write_reg(&st->sd, AD7124_CHANNEL(chan->address), 2, in ad7124_read_raw()
541 st->channels[chan->address].ain | AD7124_CHANNEL_EN(0)); in ad7124_read_raw()
547 mutex_lock(&st->cfgs_lock); in ad7124_read_raw()
549 idx = st->channels[chan->address].cfg.pga_bits; in ad7124_read_raw()
550 *val = st->channels[chan->address].cfg.vref_mv; in ad7124_read_raw()
551 if (st->channels[chan->address].cfg.bipolar) in ad7124_read_raw()
552 *val2 = chan->scan_type.realbits - 1 + idx; in ad7124_read_raw()
554 *val2 = chan->scan_type.realbits + idx; in ad7124_read_raw()
556 mutex_unlock(&st->cfgs_lock); in ad7124_read_raw()
559 mutex_lock(&st->cfgs_lock); in ad7124_read_raw()
560 if (st->channels[chan->address].cfg.bipolar) in ad7124_read_raw()
561 *val = -(1 << (chan->scan_type.realbits - 1)); in ad7124_read_raw()
565 mutex_unlock(&st->cfgs_lock); in ad7124_read_raw()
568 mutex_lock(&st->cfgs_lock); in ad7124_read_raw()
569 *val = st->channels[chan->address].cfg.odr; in ad7124_read_raw()
570 mutex_unlock(&st->cfgs_lock); in ad7124_read_raw()
574 mutex_lock(&st->cfgs_lock); in ad7124_read_raw()
575 *val = ad7124_get_3db_filter_freq(st, chan->scan_index); in ad7124_read_raw()
576 mutex_unlock(&st->cfgs_lock); in ad7124_read_raw()
580 return -EINVAL; in ad7124_read_raw()
592 mutex_lock(&st->cfgs_lock); in ad7124_write_raw()
597 ret = -EINVAL; in ad7124_write_raw()
601 ad7124_set_channel_odr(st, chan->address, val); in ad7124_write_raw()
605 ret = -EINVAL; in ad7124_write_raw()
609 if (st->channels[chan->address].cfg.bipolar) in ad7124_write_raw()
610 full_scale = 1 << (chan->scan_type.realbits - 1); in ad7124_write_raw()
612 full_scale = 1 << chan->scan_type.realbits; in ad7124_write_raw()
614 vref = st->channels[chan->address].cfg.vref_mv * 1000000LL; in ad7124_write_raw()
619 if (st->channels[chan->address].cfg.pga_bits != res) in ad7124_write_raw()
620 st->channels[chan->address].cfg.live = false; in ad7124_write_raw()
622 st->channels[chan->address].cfg.pga_bits = res; in ad7124_write_raw()
626 ret = -EINVAL; in ad7124_write_raw()
630 ad7124_set_3db_filter_freq(st, chan->address, val); in ad7124_write_raw()
633 ret = -EINVAL; in ad7124_write_raw()
636 mutex_unlock(&st->cfgs_lock); in ad7124_write_raw()
649 return -EINVAL; in ad7124_reg_access()
652 ret = ad_sd_read_reg(&st->sd, reg, ad7124_reg_size[reg], in ad7124_reg_access()
655 ret = ad_sd_write_reg(&st->sd, reg, ad7124_reg_size[reg], in ad7124_reg_access()
686 ret = ad_sd_reset(&st->sd, 64); in ad7124_soft_reset()
692 ret = ad_sd_read_reg(&st->sd, AD7124_STATUS, 1, &readval); in ad7124_soft_reset()
701 } while (--timeout); in ad7124_soft_reset()
703 dev_err(&st->sd.spi->dev, "Soft reset failed\n"); in ad7124_soft_reset()
705 return -EIO; in ad7124_soft_reset()
713 ret = ad_sd_read_reg(&st->sd, AD7124_ID, 1, &readval); in ad7124_check_chip_id()
720 if (chip_id != st->chip_info->chip_id) { in ad7124_check_chip_id()
721 dev_err(&st->sd.spi->dev, in ad7124_check_chip_id()
723 st->chip_info->chip_id, chip_id); in ad7124_check_chip_id()
724 return -ENODEV; in ad7124_check_chip_id()
728 dev_err(&st->sd.spi->dev, in ad7124_check_chip_id()
730 return -ENODEV; in ad7124_check_chip_id()
747 st->num_channels = of_get_available_child_count(np); in ad7124_of_parse_channel_config()
748 if (!st->num_channels) { in ad7124_of_parse_channel_config()
749 dev_err(indio_dev->dev.parent, "no channel children\n"); in ad7124_of_parse_channel_config()
750 return -ENODEV; in ad7124_of_parse_channel_config()
753 chan = devm_kcalloc(indio_dev->dev.parent, st->num_channels, in ad7124_of_parse_channel_config()
756 return -ENOMEM; in ad7124_of_parse_channel_config()
758 channels = devm_kcalloc(indio_dev->dev.parent, st->num_channels, sizeof(*channels), in ad7124_of_parse_channel_config()
761 return -ENOMEM; in ad7124_of_parse_channel_config()
763 indio_dev->channels = chan; in ad7124_of_parse_channel_config()
764 indio_dev->num_channels = st->num_channels; in ad7124_of_parse_channel_config()
765 st->channels = channels; in ad7124_of_parse_channel_config()
768 cfg = &st->channels[channel].cfg; in ad7124_of_parse_channel_config()
774 if (channel >= indio_dev->num_channels) { in ad7124_of_parse_channel_config()
775 dev_err(indio_dev->dev.parent, in ad7124_of_parse_channel_config()
777 ret = -EINVAL; in ad7124_of_parse_channel_config()
781 ret = of_property_read_u32_array(child, "diff-channels", in ad7124_of_parse_channel_config()
786 st->channels[channel].nr = channel; in ad7124_of_parse_channel_config()
787 st->channels[channel].ain = AD7124_CHANNEL_AINP(ain[0]) | in ad7124_of_parse_channel_config()
790 cfg->bipolar = of_property_read_bool(child, "bipolar"); in ad7124_of_parse_channel_config()
792 ret = of_property_read_u32(child, "adi,reference-select", &tmp); in ad7124_of_parse_channel_config()
794 cfg->refsel = AD7124_INT_REF; in ad7124_of_parse_channel_config()
796 cfg->refsel = tmp; in ad7124_of_parse_channel_config()
798 cfg->buf_positive = of_property_read_bool(child, "adi,buffered-positive"); in ad7124_of_parse_channel_config()
799 cfg->buf_negative = of_property_read_bool(child, "adi,buffered-negative"); in ad7124_of_parse_channel_config()
820 fclk = clk_get_rate(st->mclk); in ad7124_setup()
822 return -EINVAL; in ad7124_setup()
829 ret = clk_set_rate(st->mclk, fclk); in ad7124_setup()
835 st->adc_control &= ~AD7124_ADC_CTRL_PWR_MSK; in ad7124_setup()
836 st->adc_control |= AD7124_ADC_CTRL_PWR(power_mode); in ad7124_setup()
837 ret = ad_sd_write_reg(&st->sd, AD7124_ADC_CONTROL, 2, st->adc_control); in ad7124_setup()
841 mutex_init(&st->cfgs_lock); in ad7124_setup()
842 INIT_KFIFO(st->live_cfgs_fifo); in ad7124_setup()
843 for (i = 0; i < st->num_channels; i++) { in ad7124_setup()
845 ret = ad7124_init_config_vref(st, &st->channels[i].cfg); in ad7124_setup()
877 info = of_device_get_match_data(&spi->dev); in ad7124_probe()
879 return -ENODEV; in ad7124_probe()
881 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad7124_probe()
883 return -ENOMEM; in ad7124_probe()
887 st->chip_info = info; in ad7124_probe()
889 ad_sd_init(&st->sd, indio_dev, spi, &ad7124_sigma_delta_info); in ad7124_probe()
891 indio_dev->name = st->chip_info->name; in ad7124_probe()
892 indio_dev->modes = INDIO_DIRECT_MODE; in ad7124_probe()
893 indio_dev->info = &ad7124_info; in ad7124_probe()
895 ret = ad7124_of_parse_channel_config(indio_dev, spi->dev.of_node); in ad7124_probe()
899 for (i = 0; i < ARRAY_SIZE(st->vref); i++) { in ad7124_probe()
903 st->vref[i] = devm_regulator_get_optional(&spi->dev, in ad7124_probe()
905 if (PTR_ERR(st->vref[i]) == -ENODEV) in ad7124_probe()
907 else if (IS_ERR(st->vref[i])) in ad7124_probe()
908 return PTR_ERR(st->vref[i]); in ad7124_probe()
910 ret = regulator_enable(st->vref[i]); in ad7124_probe()
914 ret = devm_add_action_or_reset(&spi->dev, ad7124_reg_disable, in ad7124_probe()
915 st->vref[i]); in ad7124_probe()
920 st->mclk = devm_clk_get(&spi->dev, "mclk"); in ad7124_probe()
921 if (IS_ERR(st->mclk)) in ad7124_probe()
922 return PTR_ERR(st->mclk); in ad7124_probe()
924 ret = clk_prepare_enable(st->mclk); in ad7124_probe()
928 ret = devm_add_action_or_reset(&spi->dev, ad7124_clk_disable, st->mclk); in ad7124_probe()
944 ret = devm_ad_sd_setup_buffer_and_trigger(&spi->dev, indio_dev); in ad7124_probe()
948 return devm_iio_device_register(&spi->dev, indio_dev); in ad7124_probe()
953 { .compatible = "adi,ad7124-4",
955 { .compatible = "adi,ad7124-8",