Lines Matching +full:differential +full:- +full:pair

1 // SPDX-License-Identifier: GPL-2.0+
7 * AD7172-2/AD7172-4/AD7173-8/AD7175-2
8 * AD7175-8/AD7176-2/AD7177-2
18 #include <linux/clk-provider.h>
149 (pin2) < st->info->num_voltage_in && \
150 (pin2) >= st->info->num_voltage_in_div)
156 #define AD7173_MODE_CAL_INT_ZERO 0x4 /* Internal Zero-Scale Calibration */
157 #define AD7173_MODE_CAL_INT_FULL 0x5 /* Internal Full-Scale Calibration */
158 #define AD7173_MODE_CAL_SYS_ZERO 0x6 /* System Zero-Scale Calibration */
159 #define AD7173_MODE_CAL_SYS_FULL 0x7 /* System Full-Scale Calibration */
240 24845000, 24845000, 20725000, 20725000, /* 0-3 */
241 15564000, 13841000, 10390000, 10390000, /* 4-7 */
242 4994000, 2499000, 1000000, 500000, /* 8-11 */
243 395500, 200000, 100000, 59890, /* 12-15 */
244 49920, 20000, 16660, 10000, /* 16-19 */
245 5000, 2500, 2500, /* 20-22 */
249 12422360, 12422360, 12422360, 12422360, /* 0-3 */
250 10362690, 10362690, 7782100, 6290530, /* 4-7 */
251 5194800, 2496900, 1007600, 499900, /* 8-11 */
252 390600, 200300, 100000, 59750, /* 12-15 */
253 49840, 20000, 16650, 10000, /* 16-19 */
254 5000, 2500, 1250, /* 20-22 */
258 6211000, 6211000, 6211000, 6211000, 6211000, 6211000, 5181000, 4444000, /* 0-7 */
259 3115000, 2597000, 1007000, 503800, 381000, 200300, 100500, 59520, /* 8-15 */
260 49680, 20010, 16333, 10000, 5000, 2500, 1250, /* 16-22 */
264 50000000, 41667000, 31250000, 27778000, /* 0-3 */
265 20833000, 17857000, 12500000, 10000000, /* 4-7 */
266 5000000, 2500000, 1000000, 500000, /* 8-11 */
267 397500, 200000, 100000, 59920, /* 12-15 */
268 49960, 20000, 16666, 10000, /* 16-19 */
283 [AD7173_SETUP_REF_SEL_INT_REF] = "refout-avss",
288 "ext-clk", "xtal"
326 st->channels[chan->channel].syscalib_mode = mode; in ad7173_set_syscalib_mode()
336 return st->channels[chan->channel].syscalib_mode; in ad7173_get_syscalib_mode()
353 return -EBUSY; in ad7173_write_syscalib()
355 mode = st->channels[chan->channel].syscalib_mode; in ad7173_write_syscalib()
358 ret = ad_sd_calibrate(&st->sd, AD7173_MODE_CAL_SYS_ZERO, in ad7173_write_syscalib()
359 chan->address); in ad7173_write_syscalib()
361 ret = ad_sd_calibrate(&st->sd, AD7173_MODE_CAL_SYS_FULL, in ad7173_write_syscalib()
362 chan->address); in ad7173_write_syscalib()
395 for (i = 0; i < st->num_channels; i++) { in ad7173_calibrate_all()
396 if (indio_dev->channels[i].type != IIO_VOLTAGE) in ad7173_calibrate_all()
399 ret = ad_sd_calibrate(&st->sd, AD7173_MODE_CAL_INT_ZERO, st->channels[i].ain); in ad7173_calibrate_all()
403 if (st->info->has_internal_fs_calibration) { in ad7173_calibrate_all()
404 ret = ad_sd_calibrate(&st->sd, AD7173_MODE_CAL_INT_FULL, in ad7173_calibrate_all()
405 st->channels[i].ain); in ad7173_calibrate_all()
416 * The array is indexed by ain and gives the associated channel pair
418 * the channel pair [0] is for non differential and pair [1]
419 * is for differential inputs
422 /* AIN Single Differential */
442 struct ad7173_channel *adchan = &st->channels[chan->address]; in ad4111_openwire_event()
443 struct ad7173_channel_config *cfg = &adchan->cfg; in ad4111_openwire_event()
446 ret = regmap_set_bits(st->reg_gpiocon_regmap, AD7173_REG_GPIO, in ad4111_openwire_event()
451 adchan->cfg.openwire_comp_chan = in ad4111_openwire_event()
452 openwire_ain_to_channel_pair[chan->channel][chan->differential][0]; in ad4111_openwire_event()
456 dev_err(&indio_dev->dev, in ad4111_openwire_event()
461 adchan->cfg.openwire_comp_chan = in ad4111_openwire_event()
462 openwire_ain_to_channel_pair[chan->channel][chan->differential][1]; in ad4111_openwire_event()
466 dev_err(&indio_dev->dev, in ad4111_openwire_event()
471 if (abs(val1 - val2) > cfg->openwire_thrsh_raw) in ad4111_openwire_event()
473 IIO_UNMOD_EVENT_CODE(IIO_VOLTAGE, chan->address, in ad4111_openwire_event()
478 adchan->cfg.openwire_comp_chan = -1; in ad4111_openwire_event()
479 regmap_clear_bits(st->reg_gpiocon_regmap, AD7173_REG_GPIO, in ad4111_openwire_event()
508 regmap_update_bits(st->reg_gpiocon_regmap, AD7173_REG_GPIO, mask, ~mask); in ad7173_gpio_disable()
514 struct device *dev = &st->sd.spi->dev; in ad7173_gpio_init()
518 st->reg_gpiocon_regmap = devm_regmap_init_spi(st->sd.spi, &ad7173_regmap_config); in ad7173_gpio_init()
519 ret = PTR_ERR_OR_ZERO(st->reg_gpiocon_regmap); in ad7173_gpio_init()
524 regmap_update_bits(st->reg_gpiocon_regmap, AD7173_REG_GPIO, mask, mask); in ad7173_gpio_init()
531 gpio_regmap.regmap = st->reg_gpiocon_regmap; in ad7173_gpio_init()
532 gpio_regmap.ngpio = st->info->num_gpios; in ad7173_gpio_init()
534 if (st->info->higher_gpio_bits) in ad7173_gpio_init()
539 st->gpio_regmap = devm_gpio_regmap_register(dev, &gpio_regmap); in ad7173_gpio_init()
540 ret = PTR_ERR_OR_ZERO(st->gpio_regmap); in ad7173_gpio_init()
542 return dev_err_probe(dev, ret, "Unable to init gpio-regmap\n"); in ad7173_gpio_init()
567 ida_destroy(&st->cfg_slots_status); in ad7173_ida_destroy()
572 memset64(st->config_cnts, 0, st->info->num_configs); in ad7173_reset_usage_cnts()
573 st->config_usage_counter = 0; in ad7173_reset_usage_cnts()
594 for (i = 0; i < st->num_channels; i++) { in ad7173_find_live_config()
595 cfg_aux = &st->channels[i].cfg; in ad7173_find_live_config()
597 if (cfg_aux->live && in ad7173_find_live_config()
598 cfg->bipolar == cfg_aux->bipolar && in ad7173_find_live_config()
599 cfg->input_buf == cfg_aux->input_buf && in ad7173_find_live_config()
600 cfg->odr == cfg_aux->odr && in ad7173_find_live_config()
601 cfg->ref_sel == cfg_aux->ref_sel) in ad7173_find_live_config()
612 for (i = 1; i < st->info->num_configs; i++) in ad7173_free_config_slot_lru()
613 if (st->config_cnts[i] < st->config_cnts[lru_position]) in ad7173_free_config_slot_lru()
616 for (i = 0; i < st->num_channels; i++) in ad7173_free_config_slot_lru()
617 if (st->channels[i].cfg.cfg_slot == lru_position) in ad7173_free_config_slot_lru()
618 st->channels[i].cfg.live = false; in ad7173_free_config_slot_lru()
620 ida_free(&st->cfg_slots_status, lru_position); in ad7173_free_config_slot_lru()
621 return ida_alloc(&st->cfg_slots_status, GFP_KERNEL); in ad7173_free_config_slot_lru()
631 free_cfg_slot = ida_alloc_range(&st->cfg_slots_status, 0, in ad7173_load_config()
632 st->info->num_configs - 1, GFP_KERNEL); in ad7173_load_config()
636 cfg->cfg_slot = free_cfg_slot; in ad7173_load_config()
637 config = FIELD_PREP(AD7173_SETUP_REF_SEL_MASK, cfg->ref_sel); in ad7173_load_config()
639 if (cfg->bipolar) in ad7173_load_config()
642 if (cfg->input_buf) in ad7173_load_config()
645 ret = ad_sd_write_reg(&st->sd, AD7173_REG_SETUP(free_cfg_slot), 2, config); in ad7173_load_config()
649 return ad_sd_write_reg(&st->sd, AD7173_REG_FILTER(free_cfg_slot), 2, in ad7173_load_config()
650 AD7173_FILTER_ODR0_MASK & cfg->odr); in ad7173_load_config()
655 struct ad7173_channel_config *cfg = &st->channels[addr].cfg; in ad7173_config_channel()
659 if (!cfg->live) { in ad7173_config_channel()
662 cfg->cfg_slot = live_cfg->cfg_slot; in ad7173_config_channel()
667 cfg->live = true; in ad7173_config_channel()
671 if (st->config_usage_counter == U64_MAX) in ad7173_config_channel()
674 st->config_usage_counter++; in ad7173_config_channel()
675 st->config_cnts[cfg->cfg_slot] = st->config_usage_counter; in ad7173_config_channel()
691 FIELD_PREP(AD7173_CH_SETUP_SEL_MASK, st->channels[channel].cfg.cfg_slot) | in ad7173_set_channel()
692 st->channels[channel].ain; in ad7173_set_channel()
694 if (st->channels[channel].cfg.openwire_comp_chan >= 0) in ad7173_set_channel()
695 channel = st->channels[channel].cfg.openwire_comp_chan; in ad7173_set_channel()
697 return ad_sd_write_reg(&st->sd, AD7173_REG_CH(channel), 2, val); in ad7173_set_channel()
705 st->adc_mode &= ~AD7173_ADC_MODE_MODE_MASK; in ad7173_set_mode()
706 st->adc_mode |= FIELD_PREP(AD7173_ADC_MODE_MODE_MASK, mode); in ad7173_set_mode()
708 return ad_sd_write_reg(&st->sd, AD7173_REG_ADC_MODE, 2, st->adc_mode); in ad7173_set_mode()
714 unsigned int interface_mode = st->interface_mode; in ad7173_append_status()
719 ret = ad_sd_write_reg(&st->sd, AD7173_REG_INTERFACE_MODE, 2, interface_mode); in ad7173_append_status()
723 st->interface_mode = interface_mode; in ad7173_append_status()
734 for (i = 0; i < st->num_channels; i++) { in ad7173_disable_all()
747 if (st->channels[chan].cfg.openwire_comp_chan >= 0) in ad7173_disable_one()
748 chan = st->channels[chan].cfg.openwire_comp_chan; in ad7173_disable_one()
905 .name = "ad7172-2",
922 .name = "ad7172-4",
938 .name = "ad7173-8",
955 .name = "ad7175-2",
972 .name = "ad7175-8",
990 .name = "ad7176-2",
1004 .name = "ad7177-2",
1024 struct device *dev = &st->sd.spi->dev; in ad7173_setup()
1031 ret = spi_write_then_read(st->sd.spi, buf, sizeof(buf), NULL, 0); in ad7173_setup()
1038 ret = ad_sd_read_reg(&st->sd, AD7173_REG_ID, 2, &id); in ad7173_setup()
1043 if (id != st->info->id) in ad7173_setup()
1045 id, st->info->id); in ad7173_setup()
1047 st->adc_mode |= AD7173_ADC_MODE_SING_CYC; in ad7173_setup()
1048 st->interface_mode = 0x0; in ad7173_setup()
1050 st->config_usage_counter = 0; in ad7173_setup()
1051 st->config_cnts = devm_kcalloc(dev, st->info->num_configs, in ad7173_setup()
1052 sizeof(*st->config_cnts), GFP_KERNEL); in ad7173_setup()
1053 if (!st->config_cnts) in ad7173_setup()
1054 return -ENOMEM; in ad7173_setup()
1061 return ad7173_disable_all(&st->sd); in ad7173_setup()
1071 vref = regulator_get_voltage(st->regulators[0].consumer); in ad7173_get_ref_voltage_milli()
1075 vref = regulator_get_voltage(st->regulators[1].consumer); in ad7173_get_ref_voltage_milli()
1083 vref = regulator_get_voltage(st->regulators[2].consumer); in ad7173_get_ref_voltage_milli()
1087 return -EINVAL; in ad7173_get_ref_voltage_milli()
1101 struct ad7173_channel *ch = &st->channels[chan->address]; in ad7173_read_raw()
1112 if (ch->openwire_det_en) { in ad7173_read_raw()
1121 switch (chan->type) { in ad7173_read_raw()
1126 *val2 = chan->scan_type.realbits; in ad7173_read_raw()
1129 *val = ad7173_get_ref_voltage_milli(st, ch->cfg.ref_sel); in ad7173_read_raw()
1130 *val2 = chan->scan_type.realbits - !!(ch->cfg.bipolar); in ad7173_read_raw()
1132 if (chan->channel < st->info->num_voltage_in_div) in ad7173_read_raw()
1136 *val = ad7173_get_ref_voltage_milli(st, ch->cfg.ref_sel); in ad7173_read_raw()
1138 *val2 = chan->scan_type.realbits - ch->cfg.bipolar; in ad7173_read_raw()
1141 return -EINVAL; in ad7173_read_raw()
1145 switch (chan->type) { in ad7173_read_raw()
1147 /* 0 Kelvin -> raw sample */ in ad7173_read_raw()
1148 temp = -ABSOLUTE_ZERO_MILLICELSIUS; in ad7173_read_raw()
1150 temp <<= chan->scan_type.realbits; in ad7173_read_raw()
1154 *val = -temp; in ad7173_read_raw()
1158 *val = -BIT(chan->scan_type.realbits - 1); in ad7173_read_raw()
1161 return -EINVAL; in ad7173_read_raw()
1164 reg = st->channels[chan->address].cfg.odr; in ad7173_read_raw()
1166 *val = st->info->sinc5_data_rates[reg] / MILLI; in ad7173_read_raw()
1167 *val2 = (st->info->sinc5_data_rates[reg] % MILLI) * (MICRO / MILLI); in ad7173_read_raw()
1171 return -EINVAL; in ad7173_read_raw()
1185 return -EBUSY; in ad7173_write_raw()
1205 for (i = st->info->odr_start_value; i < st->info->num_sinc5_data_rates - 1; i++) in ad7173_write_raw()
1206 if (freq >= st->info->sinc5_data_rates[i]) in ad7173_write_raw()
1209 cfg = &st->channels[chan->address].cfg; in ad7173_write_raw()
1210 cfg->odr = i; in ad7173_write_raw()
1211 cfg->live = false; in ad7173_write_raw()
1215 ret = -EINVAL; in ad7173_write_raw()
1229 for (i = 0; i < indio_dev->num_channels; i++) { in ad7173_update_scan_mode()
1231 ret = ad7173_set_channel(&st->sd, i); in ad7173_update_scan_mode()
1233 ret = ad_sd_write_reg(&st->sd, AD7173_REG_CH(i), 2, 0); in ad7173_update_scan_mode()
1256 return ad_sd_read_reg(&st->sd, reg, reg_size, readval); in ad7173_debug_reg_access()
1258 return ad_sd_write_reg(&st->sd, reg, reg_size, writeval); in ad7173_debug_reg_access()
1268 struct ad7173_channel *adchan = &st->channels[chan->address]; in ad7173_write_event_config()
1272 adchan->openwire_det_en = state; in ad7173_write_event_config()
1275 return -EINVAL; in ad7173_write_event_config()
1285 struct ad7173_channel *adchan = &st->channels[chan->address]; in ad7173_read_event_config()
1289 return adchan->openwire_det_en; in ad7173_read_event_config()
1291 return -EINVAL; in ad7173_read_event_config()
1354 regulator_bulk_disable(ARRAY_SIZE(st->regulators), st->regulators); in ad7173_disable_regulators()
1367 st->adc_mode &= ~AD7173_ADC_MODE_CLOCKSEL_MASK; in ad7173_sel_clk()
1368 st->adc_mode |= FIELD_PREP(AD7173_ADC_MODE_CLOCKSEL_MASK, clk_sel); in ad7173_sel_clk()
1369 ret = ad_sd_write_reg(&st->sd, AD7173_REG_ADC_MODE, 0x2, st->adc_mode); in ad7173_sel_clk()
1379 return st->info->clock / HZ_PER_KHZ; in ad7173_clk_recalc_rate()
1387 clk_sel = FIELD_GET(AD7173_ADC_MODE_CLOCKSEL_MASK, st->adc_mode); in ad7173_clk_output_is_enabled()
1415 struct device *dev = indio_dev->dev.parent; in ad7173_register_clk_provider()
1426 st->int_clk_hw.init = &init; in ad7173_register_clk_provider()
1427 ret = devm_clk_hw_register(dev, &st->int_clk_hw); in ad7173_register_clk_provider()
1432 &st->int_clk_hw); in ad7173_register_clk_provider()
1438 struct device *dev = &st->sd.spi->dev; in ad4111_validate_current_ain()
1440 if (!st->info->has_current_inputs) in ad4111_validate_current_ain()
1441 return dev_err_probe(dev, -EINVAL, in ad4111_validate_current_ain()
1443 st->info->name); in ad4111_validate_current_ain()
1446 return dev_err_probe(dev, -EINVAL, in ad4111_validate_current_ain()
1447 "For current channels single-channel must be <[0-3]>\n"); in ad4111_validate_current_ain()
1455 struct device *dev = &st->sd.spi->dev; in ad7173_validate_voltage_ain_inputs()
1458 /* (AVDD1-AVSS)/5 power supply monitoring */ in ad7173_validate_voltage_ain_inputs()
1460 st->info->has_pow_supply_monitoring) in ad7173_validate_voltage_ain_inputs()
1464 (ain0 == AD4111_VINCOM_INPUT && st->info->has_vincom_input); in ad7173_validate_voltage_ain_inputs()
1466 (ain1 == AD4111_VINCOM_INPUT && st->info->has_vincom_input); in ad7173_validate_voltage_ain_inputs()
1468 if ((ain0 >= st->info->num_voltage_in && !special_input0) || in ad7173_validate_voltage_ain_inputs()
1469 (ain1 >= st->info->num_voltage_in && !special_input1)) { in ad7173_validate_voltage_ain_inputs()
1471 return dev_err_probe(dev, -EINVAL, in ad7173_validate_voltage_ain_inputs()
1472 "VINCOM not supported for %s\n", st->info->name); in ad7173_validate_voltage_ain_inputs()
1474 return dev_err_probe(dev, -EINVAL, in ad7173_validate_voltage_ain_inputs()
1475 "Input pin number out of range for pair (%d %d).\n", in ad7173_validate_voltage_ain_inputs()
1481 return dev_err_probe(dev, -EINVAL, in ad7173_validate_voltage_ain_inputs()
1485 ((ain0 >= st->info->num_voltage_in_div) != in ad7173_validate_voltage_ain_inputs()
1486 (ain1 >= st->info->num_voltage_in_div))) in ad7173_validate_voltage_ain_inputs()
1487 return dev_err_probe(dev, -EINVAL, in ad7173_validate_voltage_ain_inputs()
1496 struct device *dev = &st->sd.spi->dev; in ad7173_validate_reference()
1499 if (ref_sel == AD7173_SETUP_REF_SEL_INT_REF && !st->info->has_int_ref) in ad7173_validate_reference()
1500 return dev_err_probe(dev, -EINVAL, in ad7173_validate_reference()
1503 if (ref_sel == AD7173_SETUP_REF_SEL_EXT_REF2 && !st->info->has_ref2) in ad7173_validate_reference()
1504 return dev_err_probe(dev, -EINVAL, in ad7173_validate_reference()
1516 bool differential, in ad7173_validate_openwire_ain_inputs() argument
1521 * If the channel is configured as differential, in ad7173_validate_openwire_ain_inputs()
1524 if (differential) in ad7173_validate_openwire_ain_inputs()
1525 return (ain0 % 2) ? (ain0 - 1) == ain1 : (ain0 + 1) == ain1; in ad7173_validate_openwire_ain_inputs()
1537 BIT(chan->scan_type.realbits - !!(chan_st_priv->cfg.bipolar)) in ad7173_calc_openwire_thrsh_raw()
1539 / ad7173_get_ref_voltage_milli(st, chan_st_priv->cfg.ref_sel); in ad7173_calc_openwire_thrsh_raw()
1540 if (chan->channel < st->info->num_voltage_in_div) in ad7173_calc_openwire_thrsh_raw()
1550 struct device *dev = indio_dev->dev.parent; in ad7173_fw_parse_channel_config()
1557 if (st->info->has_temp) in ad7173_fw_parse_channel_config()
1561 return dev_err_probe(dev, -ENODATA, "No channels specified\n"); in ad7173_fw_parse_channel_config()
1563 if (num_channels > st->info->num_channels) in ad7173_fw_parse_channel_config()
1564 return dev_err_probe(dev, -EINVAL, in ad7173_fw_parse_channel_config()
1566 st->info->num_channels); in ad7173_fw_parse_channel_config()
1568 indio_dev->num_channels = num_channels; in ad7173_fw_parse_channel_config()
1569 st->num_channels = num_channels; in ad7173_fw_parse_channel_config()
1571 chan_arr = devm_kcalloc(dev, sizeof(*indio_dev->channels), in ad7173_fw_parse_channel_config()
1572 st->num_channels, GFP_KERNEL); in ad7173_fw_parse_channel_config()
1574 return -ENOMEM; in ad7173_fw_parse_channel_config()
1576 chans_st_arr = devm_kcalloc(dev, st->num_channels, sizeof(*st->channels), in ad7173_fw_parse_channel_config()
1579 return -ENOMEM; in ad7173_fw_parse_channel_config()
1581 indio_dev->channels = chan_arr; in ad7173_fw_parse_channel_config()
1582 st->channels = chans_st_arr; in ad7173_fw_parse_channel_config()
1584 if (st->info->has_temp) { in ad7173_fw_parse_channel_config()
1587 chan_st_priv->ain = in ad7173_fw_parse_channel_config()
1590 chan_st_priv->cfg.bipolar = false; in ad7173_fw_parse_channel_config()
1591 chan_st_priv->cfg.input_buf = st->info->has_input_buf; in ad7173_fw_parse_channel_config()
1592 chan_st_priv->cfg.ref_sel = AD7173_SETUP_REF_SEL_INT_REF; in ad7173_fw_parse_channel_config()
1593 chan_st_priv->cfg.openwire_comp_chan = -1; in ad7173_fw_parse_channel_config()
1594 st->adc_mode |= AD7173_ADC_MODE_REF_EN; in ad7173_fw_parse_channel_config()
1595 if (st->info->data_reg_only_16bit) in ad7173_fw_parse_channel_config()
1607 ret = fwnode_property_read_u32_array(child, "diff-channels", in ad7173_fw_parse_channel_config()
1610 ret = fwnode_property_read_u32(child, "single-channel", in ad7173_fw_parse_channel_config()
1614 "Channel must define one of diff-channels or single-channel.\n"); in ad7173_fw_parse_channel_config()
1616 is_current_chan = fwnode_property_read_bool(child, "adi,current-channel"); in ad7173_fw_parse_channel_config()
1618 chan->differential = true; in ad7173_fw_parse_channel_config()
1626 if (!chan->differential) { in ad7173_fw_parse_channel_config()
1628 "common-mode-channel", ain + 1); in ad7173_fw_parse_channel_config()
1631 "common-mode-channel must be defined for single-ended channels.\n"); in ad7173_fw_parse_channel_config()
1639 "adi,reference-select", in ad7173_fw_parse_channel_config()
1652 st->adc_mode |= AD7173_ADC_MODE_REF_EN; in ad7173_fw_parse_channel_config()
1653 chan_st_priv->cfg.ref_sel = ref_sel; in ad7173_fw_parse_channel_config()
1655 chan->address = chan_index; in ad7173_fw_parse_channel_config()
1656 chan->scan_index = chan_index; in ad7173_fw_parse_channel_config()
1657 chan->channel = ain[0]; in ad7173_fw_parse_channel_config()
1658 chan_st_priv->cfg.input_buf = st->info->has_input_buf; in ad7173_fw_parse_channel_config()
1659 chan_st_priv->cfg.odr = 0; in ad7173_fw_parse_channel_config()
1660 chan_st_priv->cfg.openwire_comp_chan = -1; in ad7173_fw_parse_channel_config()
1662 chan_st_priv->cfg.bipolar = fwnode_property_read_bool(child, "bipolar"); in ad7173_fw_parse_channel_config()
1663 if (chan_st_priv->cfg.bipolar) in ad7173_fw_parse_channel_config()
1664 chan->info_mask_separate |= BIT(IIO_CHAN_INFO_OFFSET); in ad7173_fw_parse_channel_config()
1667 chan->type = IIO_CURRENT; in ad7173_fw_parse_channel_config()
1668 chan->differential = false; in ad7173_fw_parse_channel_config()
1669 chan->channel2 = 0; in ad7173_fw_parse_channel_config()
1670 chan_st_priv->ain = ad4111_current_channel_config[ain[0]]; in ad7173_fw_parse_channel_config()
1672 chan_st_priv->cfg.input_buf = st->info->has_input_buf; in ad7173_fw_parse_channel_config()
1673 chan->channel2 = ain[1]; in ad7173_fw_parse_channel_config()
1674 chan_st_priv->ain = AD7173_CH_ADDRESS(ain[0], ain[1]); in ad7173_fw_parse_channel_config()
1675 if (st->info->has_openwire_det && in ad7173_fw_parse_channel_config()
1676 ad7173_validate_openwire_ain_inputs(st, chan->differential, ain[0], ain[1])) { in ad7173_fw_parse_channel_config()
1677 chan->event_spec = ad4111_events; in ad7173_fw_parse_channel_config()
1678 chan->num_event_specs = ARRAY_SIZE(ad4111_events); in ad7173_fw_parse_channel_config()
1679 chan_st_priv->cfg.openwire_thrsh_raw = in ad7173_fw_parse_channel_config()
1685 if (st->info->data_reg_only_16bit) in ad7173_fw_parse_channel_config()
1696 struct device *dev = indio_dev->dev.parent; in ad7173_fw_parse_device_config()
1699 st->regulators[0].supply = ad7173_ref_sel_str[AD7173_SETUP_REF_SEL_EXT_REF]; in ad7173_fw_parse_device_config()
1700 st->regulators[1].supply = ad7173_ref_sel_str[AD7173_SETUP_REF_SEL_EXT_REF2]; in ad7173_fw_parse_device_config()
1701 st->regulators[2].supply = ad7173_ref_sel_str[AD7173_SETUP_REF_SEL_AVDD1_AVSS]; in ad7173_fw_parse_device_config()
1709 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(st->regulators), in ad7173_fw_parse_device_config()
1710 st->regulators); in ad7173_fw_parse_device_config()
1714 ret = regulator_bulk_enable(ARRAY_SIZE(st->regulators), st->regulators); in ad7173_fw_parse_device_config()
1723 ret = device_property_match_property_string(dev, "clock-names", in ad7173_fw_parse_device_config()
1727 st->adc_mode |= FIELD_PREP(AD7173_ADC_MODE_CLOCKSEL_MASK, in ad7173_fw_parse_device_config()
1731 st->adc_mode |= FIELD_PREP(AD7173_ADC_MODE_CLOCKSEL_MASK, in ad7173_fw_parse_device_config()
1733 st->ext_clk = devm_clk_get(dev, ad7173_clk_sel[ret]); in ad7173_fw_parse_device_config()
1734 if (IS_ERR(st->ext_clk)) in ad7173_fw_parse_device_config()
1735 return dev_err_probe(dev, PTR_ERR(st->ext_clk), in ad7173_fw_parse_device_config()
1738 ret = clk_prepare_enable(st->ext_clk); in ad7173_fw_parse_device_config()
1744 st->ext_clk); in ad7173_fw_parse_device_config()
1754 struct device *dev = &spi->dev; in ad7173_probe()
1761 return -ENOMEM; in ad7173_probe()
1764 st->info = spi_get_device_match_data(spi); in ad7173_probe()
1765 if (!st->info) in ad7173_probe()
1766 return -ENODEV; in ad7173_probe()
1768 ida_init(&st->cfg_slots_status); in ad7173_probe()
1773 indio_dev->name = st->info->name; in ad7173_probe()
1774 indio_dev->modes = INDIO_DIRECT_MODE; in ad7173_probe()
1775 indio_dev->info = &ad7173_info; in ad7173_probe()
1777 spi->mode = SPI_MODE_3; in ad7173_probe()
1780 ret = ad_sd_init(&st->sd, indio_dev, spi, st->info->sd_info); in ad7173_probe()
1813 { .compatible = "adi,ad7172-2", .data = &ad7172_2_device_info },
1814 { .compatible = "adi,ad7172-4", .data = &ad7172_4_device_info },
1815 { .compatible = "adi,ad7173-8", .data = &ad7173_8_device_info },
1816 { .compatible = "adi,ad7175-2", .data = &ad7175_2_device_info },
1817 { .compatible = "adi,ad7175-8", .data = &ad7175_8_device_info },
1818 { .compatible = "adi,ad7176-2", .data = &ad7176_2_device_info },
1819 { .compatible = "adi,ad7177-2", .data = &ad7177_2_device_info },
1831 { "ad7172-2", (kernel_ulong_t)&ad7172_2_device_info },
1832 { "ad7172-4", (kernel_ulong_t)&ad7172_4_device_info },
1833 { "ad7173-8", (kernel_ulong_t)&ad7173_8_device_info },
1834 { "ad7175-2", (kernel_ulong_t)&ad7175_2_device_info },
1835 { "ad7175-8", (kernel_ulong_t)&ad7175_8_device_info },
1836 { "ad7176-2", (kernel_ulong_t)&ad7176_2_device_info },
1837 { "ad7177-2", (kernel_ulong_t)&ad7177_2_device_info },
1853 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafo.de>");