Lines Matching +full:excitation +full:- +full:pin +full:- +full:2

1 // SPDX-License-Identifier: GPL-2.0+
3 * Analog Devices AD4170-4 ADC driver
6 * Author: Ana-Maria Cusco <ana-maria.cusco@analog.com>
17 #include <linux/clk-provider.h>
54 * DIG_AUX1_CTRL field of PIN_MUXING register to disable DIG_AUX1 pin.
73 #define AD4170_CURRENT_SRC_REG(x) (0x139 + 2 * (x))
81 /* AD4170_CONFIG_A_REG - INTERFACE_CONFIG_A REGISTER */
99 #define AD4170_CHAN_SETUP_SETUP_MSK GENMASK(2, 0)
121 #define AD4170_CURRENT_SRC_I_OUT_VAL_MSK GENMASK(2, 0)
125 #define AD4170_GPIO_MODE_GPIO1_MSK GENMASK(3, 2)
183 #define AD4170_GPIO_MODE_GPIO_OUTPUT 2
194 #define AD4170_SPI_INST_PHASE_LEN 2
218 /* Analog pin functions */
224 /* GPIO pin functions */
235 [AD4170_PIN_MUXING_REG] = 2,
236 [AD4170_CLOCK_CTRL_REG] = 2,
237 [AD4170_ADC_CTRL_REG] = 2,
238 [AD4170_CHAN_EN_REG] = 2,
240 * CHANNEL_SETUP and CHANNEL_MAP register are all 2 byte size each and
246 [AD4170_CHAN_SETUP_REG(0) ... AD4170_CHAN_MAP_REG(AD4170_MAX_ADC_CHANNELS - 1)] = 2,
249 * also interleaved but MISC, AFE, FILTER, FILTER_FS, OFFSET are 16-bit
250 * while OFFSET, GAIN are 24-bit registers so we can't init them all to
253 [AD4170_MISC_REG(0) ... AD4170_FILTER_FS_REG(0)] = 2,
254 [AD4170_MISC_REG(1) ... AD4170_FILTER_FS_REG(1)] = 2,
255 [AD4170_MISC_REG(2) ... AD4170_FILTER_FS_REG(2)] = 2,
256 [AD4170_MISC_REG(3) ... AD4170_FILTER_FS_REG(3)] = 2,
257 [AD4170_MISC_REG(4) ... AD4170_FILTER_FS_REG(4)] = 2,
258 [AD4170_MISC_REG(5) ... AD4170_FILTER_FS_REG(5)] = 2,
259 [AD4170_MISC_REG(6) ... AD4170_FILTER_FS_REG(6)] = 2,
260 [AD4170_MISC_REG(7) ... AD4170_FILTER_FS_REG(7)] = 2,
263 [AD4170_OFFSET_REG(2) ... AD4170_GAIN_REG(2)] = 3,
269 [AD4170_V_BIAS_REG] = 2,
270 [AD4170_CURRENT_SRC_REG(0) ... AD4170_CURRENT_SRC_REG(3)] = 2,
271 [AD4170_GPIO_MODE_REG] = 2,
272 [AD4170_GPIO_OUTPUT_REG] = 2,
273 [AD4170_GPIO_INPUT_REG] = 2,
278 AD4170_REF_BUF_PRE, /* Pre-charge referrence buffer */
283 /* maps adi,positive/negative-reference-buffer property values to enum */
315 "ext-clk", "xtal",
329 4, 8, 12, 16, 20, 40, 48, 80, /* 0 - 7 */
330 100, 256, 500, 1000, 5000, 8332, 10000, 25000, /* 8 - 15 */
331 50000, 65532, /* 16 - 17 */
337 1, 2, 4, 8, 12, 16, 20, 40, 48, 80, 100, 256,
343 AD4170_CURRENT_SRC_I_OUT_PIN_AIN(2),
352 AD4170_CURRENT_SRC_I_OUT_PIN_GPIO(2),
363 AD4170_RTD_SENSOR = 2,
367 /* maps adi,sensor-type property value to enum */
380 .name = "ad4170-4",
384 .name = "ad4190-4",
388 .name = "ad4195-4",
427 u32 scale_tbl[10][2];
439 struct mutex lock; /* Protect read-modify-write and multi write sequences */
448 int sps_tbl[ARRAY_SIZE(ad4170_filt_names)][AD4170_MAX_FS_TBL_SIZE][2];
476 tmp0 = div_u64_rem(st->mclk_hz, 32 * ad4170_sinc3_filt_fs_tbl[i], in ad4170_fill_sps_tbl()
480 st->sps_tbl[AD4170_SINC5_AVG][i][0] = tmp0; /* Integer part */ in ad4170_fill_sps_tbl()
481 st->sps_tbl[AD4170_SINC5_AVG][i][1] = tmp1; /* Fractional part */ in ad4170_fill_sps_tbl()
484 st->sps_tbl[AD4170_SINC3][i][0] = tmp0; /* Integer part */ in ad4170_fill_sps_tbl()
485 st->sps_tbl[AD4170_SINC3][i][1] = tmp1; /* Fractional part */ in ad4170_fill_sps_tbl()
489 tmp0 = div_u64_rem(st->mclk_hz, 32 * ad4170_sinc5_filt_fs_tbl[i], in ad4170_fill_sps_tbl()
493 st->sps_tbl[AD4170_SINC5][i][0] = tmp0; /* Integer part */ in ad4170_fill_sps_tbl()
494 st->sps_tbl[AD4170_SINC5][i][1] = tmp1; /* Fractional part */ in ad4170_fill_sps_tbl()
505 return regmap_read(st->regmap, reg, readval); in ad4170_debugfs_reg_access()
507 return regmap_write(st->regmap, reg, writeval); in ad4170_debugfs_reg_access()
514 return -EINVAL; in ad4170_get_reg_size()
537 case 2: in ad4170_reg_write()
546 return spi_write_then_read(st->spi, tx_buf, 1, NULL, 0); in ad4170_reg_write()
548 return -EINVAL; in ad4170_reg_write()
551 return spi_write_then_read(st->spi, tx_buf, in ad4170_reg_write()
568 ret = spi_write_then_read(st->spi, tx_buf, ARRAY_SIZE(tx_buf), in ad4170_reg_read()
569 st->rx_buf, size); in ad4170_reg_read()
575 *val = get_unaligned_be24(st->rx_buf); in ad4170_reg_read()
577 case 2: in ad4170_reg_read()
578 *val = get_unaligned_be16(st->rx_buf); in ad4170_reg_read()
581 *val = st->rx_buf[0]; in ad4170_reg_read()
584 return -EINVAL; in ad4170_reg_read()
595 if (a->misc != b->misc || in ad4170_setup_eq()
596 a->afe != b->afe || in ad4170_setup_eq()
597 a->filter != b->filter || in ad4170_setup_eq()
598 a->filter_fs != b->filter_fs || in ad4170_setup_eq()
599 a->offset != b->offset || in ad4170_setup_eq()
600 a->gain != b->gain) in ad4170_setup_eq()
616 struct ad4170_setup_info *setup_info = &st->setup_infos[i]; in ad4170_find_setup()
619 if (ad4170_setup_eq(target_setup, &setup_info->setup)) { in ad4170_find_setup()
625 if (setup_info->enabled_channels) in ad4170_find_setup()
630 setup_info->channels < st->setup_infos[*setup_num].channels) in ad4170_find_setup()
635 return -EINVAL; in ad4170_find_setup()
643 struct ad4170_chan_info *chan_info = &st->chan_infos[channel]; in ad4170_unlink_channel()
644 struct ad4170_setup_info *setup_info = &st->setup_infos[chan_info->setup_num]; in ad4170_unlink_channel()
646 chan_info->setup_num = AD4170_INVALID_SETUP; in ad4170_unlink_channel()
647 setup_info->channels--; in ad4170_unlink_channel()
655 struct ad4170_chan_info *chan_info = &st->chan_infos[i]; in ad4170_unlink_setup()
657 if (!chan_info->initialized || chan_info->setup_num != setup_num) in ad4170_unlink_setup()
669 struct ad4170_setup_info *setup_info = &st->setup_infos[setup_num]; in ad4170_link_channel_setup()
670 struct ad4170_chan_info *chan_info = &st->chan_infos[chan_addr]; in ad4170_link_channel_setup()
673 ret = regmap_update_bits(st->regmap, AD4170_CHAN_SETUP_REG(chan_addr), in ad4170_link_channel_setup()
679 chan_info->setup_num = setup_num; in ad4170_link_channel_setup()
680 setup_info->channels++; in ad4170_link_channel_setup()
693 ret = regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_write_setup()
700 ret = regmap_write(st->regmap, AD4170_MISC_REG(setup_num), setup->misc); in ad4170_write_setup()
704 ret = regmap_write(st->regmap, AD4170_AFE_REG(setup_num), setup->afe); in ad4170_write_setup()
708 ret = regmap_write(st->regmap, AD4170_FILTER_REG(setup_num), in ad4170_write_setup()
709 setup->filter); in ad4170_write_setup()
713 ret = regmap_write(st->regmap, AD4170_FILTER_FS_REG(setup_num), in ad4170_write_setup()
714 setup->filter_fs); in ad4170_write_setup()
718 ret = regmap_write(st->regmap, AD4170_OFFSET_REG(setup_num), in ad4170_write_setup()
719 setup->offset); in ad4170_write_setup()
723 ret = regmap_write(st->regmap, AD4170_GAIN_REG(setup_num), setup->gain); in ad4170_write_setup()
727 memcpy(&st->setup_infos[setup_num].setup, setup, sizeof(*setup)); in ad4170_write_setup()
734 struct ad4170_chan_info *chan_info = &st->chan_infos[chan_addr]; in ad4170_write_channel_setup()
743 * - Find a setup. If not possible, return error. in ad4170_write_channel_setup()
744 * - Unlink channel from current setup. in ad4170_write_channel_setup()
745 * - If the setup found has only disabled channels linked to it, in ad4170_write_channel_setup()
747 * - Link channel to new setup. in ad4170_write_channel_setup()
749 * 2. Soon to be enabled and unlinked channel: in ad4170_write_channel_setup()
750 * - Find a setup. If not possible, return error. in ad4170_write_channel_setup()
751 * - If the setup found has only disabled channels linked to it, in ad4170_write_channel_setup()
753 * - Link channel to the setup. in ad4170_write_channel_setup()
756 * - Unlink channel from current setup. in ad4170_write_channel_setup()
760 * - Do nothing. in ad4170_write_channel_setup()
764 if (chan_info->setup_num != AD4170_INVALID_SETUP) { in ad4170_write_channel_setup()
770 if (!chan_info->enabled) { in ad4170_write_channel_setup()
774 } else if (!on_enable && !chan_info->enabled) { in ad4170_write_channel_setup()
779 /* Cases 1 & 2 */ in ad4170_write_channel_setup()
780 ret = ad4170_find_setup(st, &chan_info->setup, &setup_num, &overwrite); in ad4170_write_channel_setup()
784 if (chan_info->setup_num != AD4170_INVALID_SETUP) in ad4170_write_channel_setup()
793 ret = ad4170_write_setup(st, setup_num, &chan_info->setup); in ad4170_write_channel_setup()
804 struct ad4170_chan_info *chan_info = &st->chan_infos[chan_addr]; in ad4170_set_channel_enable()
808 if (chan_info->enabled == status) in ad4170_set_channel_enable()
817 setup_info = &st->setup_infos[chan_info->setup_num]; in ad4170_set_channel_enable()
819 ret = regmap_update_bits(st->regmap, AD4170_CHAN_EN_REG, in ad4170_set_channel_enable()
825 setup_info->enabled_channels += status ? 1 : -1; in ad4170_set_channel_enable()
826 chan_info->enabled = status; in ad4170_set_channel_enable()
842 return -EINVAL; in __ad4170_get_filter_type()
851 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_set_filter_type()
852 struct ad4170_setup *setup = &chan_info->setup; in ad4170_set_filter_type()
867 return -EINVAL; in ad4170_set_filter_type()
878 scoped_guard(mutex, &st->lock) { in ad4170_set_filter_type()
880 return -EBUSY; in ad4170_set_filter_type()
883 setup->filter_fs = clamp(val, AD4170_SINC3_MIN_FS, in ad4170_set_filter_type()
886 setup->filter_fs = clamp(val, AD4170_SINC5_MIN_FS, in ad4170_set_filter_type()
889 setup->filter &= ~AD4170_FILTER_FILTER_TYPE_MSK; in ad4170_set_filter_type()
890 setup->filter |= FIELD_PREP(AD4170_FILTER_FILTER_TYPE_MSK, in ad4170_set_filter_type()
893 ret = ad4170_write_channel_setup(st, chan->address, false); in ad4170_set_filter_type()
904 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_get_filter_type()
905 struct ad4170_setup *setup = &chan_info->setup; in ad4170_get_filter_type()
907 return __ad4170_get_filter_type(setup->filter); in ad4170_get_filter_type()
976 struct device *dev = &st->spi->dev; in ad4170_get_ain_voltage_uv()
981 * The voltage bias (vbias) sets the common-mode voltage of the channel in ad4170_get_ain_voltage_uv()
982 * to (AVDD + AVSS)/2. If provided, AVSS supply provides the magnitude in ad4170_get_ain_voltage_uv()
983 * (absolute value) of the negative voltage supplied to the AVSS pin. in ad4170_get_ain_voltage_uv()
984 * So, we do AVDD - AVSS to compute the DC voltage generated by the bias in ad4170_get_ain_voltage_uv()
987 if (st->pins_fn[ain_n] & AD4170_PIN_VBIAS) { in ad4170_get_ain_voltage_uv()
988 int v_diff = st->vrefs_uv[AD4170_AVDD_SUP] - st->vrefs_uv[AD4170_AVSS_SUP]; in ad4170_get_ain_voltage_uv()
989 *ain_voltage = v_diff / 2; in ad4170_get_ain_voltage_uv()
998 v_diff = st->vrefs_uv[AD4170_AVDD_SUP] - st->vrefs_uv[AD4170_AVSS_SUP]; in ad4170_get_ain_voltage_uv()
1002 *ain_voltage = st->vrefs_uv[AD4170_IOVDD_SUP] / 5; in ad4170_get_ain_voltage_uv()
1005 *ain_voltage = st->vrefs_uv[AD4170_AVSS_SUP]; in ad4170_get_ain_voltage_uv()
1011 if (st->vrefs_uv[AD4170_REFIN1P_SUP] == -ENODEV) in ad4170_get_ain_voltage_uv()
1012 return dev_err_probe(dev, -ENODEV, in ad4170_get_ain_voltage_uv()
1015 *ain_voltage = st->vrefs_uv[AD4170_REFIN1P_SUP]; in ad4170_get_ain_voltage_uv()
1018 if (st->vrefs_uv[AD4170_REFIN1N_SUP] == -ENODEV) in ad4170_get_ain_voltage_uv()
1019 return dev_err_probe(dev, -ENODEV, in ad4170_get_ain_voltage_uv()
1020 "input set to REFIN- but ref not provided\n"); in ad4170_get_ain_voltage_uv()
1022 *ain_voltage = st->vrefs_uv[AD4170_REFIN1N_SUP]; in ad4170_get_ain_voltage_uv()
1025 if (st->vrefs_uv[AD4170_REFIN2P_SUP] == -ENODEV) in ad4170_get_ain_voltage_uv()
1026 return dev_err_probe(dev, -ENODEV, in ad4170_get_ain_voltage_uv()
1029 *ain_voltage = st->vrefs_uv[AD4170_REFIN2P_SUP]; in ad4170_get_ain_voltage_uv()
1032 if (st->vrefs_uv[AD4170_REFIN2N_SUP] == -ENODEV) in ad4170_get_ain_voltage_uv()
1033 return dev_err_probe(dev, -ENODEV, in ad4170_get_ain_voltage_uv()
1034 "input set to REFIN2- but ref not provided\n"); in ad4170_get_ain_voltage_uv()
1036 *ain_voltage = st->vrefs_uv[AD4170_REFIN2N_SUP]; in ad4170_get_ain_voltage_uv()
1040 *ain_voltage = st->vrefs_uv[AD4170_AVSS_SUP] + AD4170_INT_REF_2_5V; in ad4170_get_ain_voltage_uv()
1043 return -EINVAL; in ad4170_get_ain_voltage_uv()
1047 static int ad4170_validate_analog_input(struct ad4170_state *st, int pin) in ad4170_validate_analog_input() argument
1049 if (pin <= AD4170_MAX_ANALOG_PINS) { in ad4170_validate_analog_input()
1050 if (st->pins_fn[pin] & AD4170_PIN_CURRENT_OUT) in ad4170_validate_analog_input()
1051 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_validate_analog_input()
1052 "Pin %d already used with fn %u.\n", in ad4170_validate_analog_input()
1053 pin, st->pins_fn[pin]); in ad4170_validate_analog_input()
1055 st->pins_fn[pin] |= AD4170_PIN_ANALOG_IN; in ad4170_validate_analog_input()
1060 static int ad4170_validate_channel_input(struct ad4170_state *st, int pin, bool com) in ad4170_validate_channel_input() argument
1062 /* Check common-mode input pin is mapped to a special input. */ in ad4170_validate_channel_input()
1063 if (com && (pin < AD4170_CHAN_MAP_AVDD_AVSS_P || pin > AD4170_CHAN_MAP_REFOUT)) in ad4170_validate_channel_input()
1064 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_validate_channel_input()
1065 "Invalid common-mode input pin number. %d\n", in ad4170_validate_channel_input()
1066 pin); in ad4170_validate_channel_input()
1068 /* Check differential input pin is mapped to a analog input pin. */ in ad4170_validate_channel_input()
1069 if (!com && pin > AD4170_MAX_ANALOG_PINS) in ad4170_validate_channel_input()
1070 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_validate_channel_input()
1071 "Invalid analog input pin number. %d\n", in ad4170_validate_channel_input()
1072 pin); in ad4170_validate_channel_input()
1074 return ad4170_validate_analog_input(st, pin); in ad4170_validate_channel_input()
1080 * Returns 0 on valid channel input configuration. -EINVAL otherwise.
1087 ret = ad4170_validate_channel_input(st, chan->channel, false); in ad4170_validate_channel()
1091 return ad4170_validate_channel_input(st, chan->channel2, in ad4170_validate_channel()
1092 !chan->differential); in ad4170_validate_channel()
1104 bool bipolar = chan->scan_type.sign == 's'; in ad4170_get_input_range()
1105 struct device *dev = &st->spi->dev; in ad4170_get_input_range()
1110 if (st->vrefs_uv[AD4170_REFIN1P_SUP] == -ENODEV || in ad4170_get_input_range()
1111 st->vrefs_uv[AD4170_REFIN1N_SUP] == -ENODEV) in ad4170_get_input_range()
1112 return dev_err_probe(dev, -ENODEV, in ad4170_get_input_range()
1115 refp = st->vrefs_uv[AD4170_REFIN1P_SUP]; in ad4170_get_input_range()
1116 refn = st->vrefs_uv[AD4170_REFIN1N_SUP]; in ad4170_get_input_range()
1119 if (st->vrefs_uv[AD4170_REFIN2P_SUP] == -ENODEV || in ad4170_get_input_range()
1120 st->vrefs_uv[AD4170_REFIN2N_SUP] == -ENODEV) in ad4170_get_input_range()
1121 return dev_err_probe(dev, -ENODEV, in ad4170_get_input_range()
1124 refp = st->vrefs_uv[AD4170_REFIN2P_SUP]; in ad4170_get_input_range()
1125 refn = st->vrefs_uv[AD4170_REFIN2N_SUP]; in ad4170_get_input_range()
1128 refp = st->vrefs_uv[AD4170_AVDD_SUP]; in ad4170_get_input_range()
1129 refn = st->vrefs_uv[AD4170_AVSS_SUP]; in ad4170_get_input_range()
1133 refp = st->vrefs_uv[AD4170_AVSS_SUP] + AD4170_INT_REF_2_5V; in ad4170_get_input_range()
1134 refn = st->vrefs_uv[AD4170_AVSS_SUP]; in ad4170_get_input_range()
1137 return -EINVAL; in ad4170_get_input_range()
1143 * AD4170 channels are either differential or pseudo-differential. in ad4170_get_input_range()
1145 * Pseudo-diff input voltage range: 0 to VREF/gain (datasheet page 6) in ad4170_get_input_range()
1147 if (chan->differential) { in ad4170_get_input_range()
1149 return dev_err_probe(dev, -EINVAL, in ad4170_get_input_range()
1155 * avss-supply is never above 0V. in ad4170_get_input_range()
1156 * Assuming refin1n-supply not above 0V. in ad4170_get_input_range()
1157 * Assuming refin2n-supply not above 0V. in ad4170_get_input_range()
1163 * For example, if AVSS = -2.5V, REF_SELECT set to REFOUT (REFOUT/AVSS), in ad4170_get_input_range()
1164 * and pseudo-diff channel configuration set, then the input range in ad4170_get_input_range()
1165 * should go from 0V to +VREF (single-ended - datasheet pg 10), but in ad4170_get_input_range()
1166 * REFOUT/AVSS range would be -2.5V to 0V. in ad4170_get_input_range()
1167 * Check the positive reference is higher than 0V for pseudo-diff in ad4170_get_input_range()
1174 return dev_err_probe(dev, -EINVAL, in ad4170_get_input_range()
1175 "REF+ == GND for pseudo-diff chan %u\n", in ad4170_get_input_range()
1182 * Pseudo-differential unipolar channel. in ad4170_get_input_range()
1183 * Input expected to swing from IN- to +VREF. in ad4170_get_input_range()
1185 ret = ad4170_get_ain_voltage_uv(st, chan->channel2, &ain_voltage); in ad4170_get_input_range()
1189 if (refp - ain_voltage <= 0) in ad4170_get_input_range()
1190 return dev_err_probe(dev, -EINVAL, in ad4170_get_input_range()
1191 "Negative input >= REF+ for pseudo-diff chan %u\n", in ad4170_get_input_range()
1194 return refp - ain_voltage; in ad4170_get_input_range()
1204 reinit_completion(&st->completion); in __ad4170_read_sample()
1205 ret = regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in __ad4170_read_sample()
1220 settling_time_ms = DIV_ROUND_UP(6291164 * MILLI, st->mclk_hz); in __ad4170_read_sample()
1221 ret = wait_for_completion_timeout(&st->completion, in __ad4170_read_sample()
1224 dev_dbg(&st->spi->dev, in __ad4170_read_sample()
1227 ret = regmap_read(st->regmap, AD4170_DATA_24B_REG, val); in __ad4170_read_sample()
1231 if (chan->scan_type.sign == 's') in __ad4170_read_sample()
1232 *val = sign_extend32(*val, chan->scan_type.realbits - 1); in __ad4170_read_sample()
1241 struct device *dev = &st->spi->dev; in ad4170_read_sample()
1248 * channel on single-shot read. in ad4170_read_sample()
1250 ret = ad4170_set_channel_enable(st, chan->address, true); in ad4170_read_sample()
1258 ret2 = ad4170_set_channel_enable(st, chan->address, false); in ad4170_read_sample()
1265 ret = ad4170_set_channel_enable(st, chan->address, false); in ad4170_read_sample()
1277 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_read_raw()
1278 struct ad4170_setup *setup = &chan_info->setup; in ad4170_read_raw()
1283 guard(mutex)(&st->lock); in ad4170_read_raw()
1287 return -EBUSY; in ad4170_read_raw()
1293 pga = FIELD_GET(AD4170_AFE_PGA_GAIN_MSK, setup->afe); in ad4170_read_raw()
1294 switch (chan->type) { in ad4170_read_raw()
1296 *val = chan_info->scale_tbl[pga][0]; in ad4170_read_raw()
1297 *val2 = chan_info->scale_tbl[pga][1]; in ad4170_read_raw()
1308 *val2 = DIV_ROUND_CLOSEST(chan_info->scale_tbl[pga][1] * MILLI, 477) * in ad4170_read_raw()
1312 return -EINVAL; in ad4170_read_raw()
1315 pga = FIELD_GET(AD4170_AFE_PGA_GAIN_MSK, setup->afe); in ad4170_read_raw()
1316 *val = chan_info->offset_tbl[pga]; in ad4170_read_raw()
1319 f_type = __ad4170_get_filter_type(setup->filter); in ad4170_read_raw()
1323 fs_idx = find_closest(setup->filter_fs, in ad4170_read_raw()
1326 *val = st->sps_tbl[f_type][fs_idx][0]; in ad4170_read_raw()
1327 *val2 = st->sps_tbl[f_type][fs_idx][1]; in ad4170_read_raw()
1330 fs_idx = find_closest(setup->filter_fs, in ad4170_read_raw()
1333 *val = st->sps_tbl[f_type][fs_idx][0]; in ad4170_read_raw()
1334 *val2 = st->sps_tbl[f_type][fs_idx][1]; in ad4170_read_raw()
1337 return -EINVAL; in ad4170_read_raw()
1340 *val = setup->offset; in ad4170_read_raw()
1343 *val = setup->gain; in ad4170_read_raw()
1346 return -EINVAL; in ad4170_read_raw()
1354 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_fill_scale_tbl()
1355 struct device *dev = &st->spi->dev; in ad4170_fill_scale_tbl()
1356 int bipolar = chan->scan_type.sign == 's' ? 1 : 0; in ad4170_fill_scale_tbl()
1357 int precision_bits = chan->scan_type.realbits; in ad4170_fill_scale_tbl()
1362 ret = ad4170_get_ain_voltage_uv(st, chan->channel2, &ainm_voltage); in ad4170_fill_scale_tbl()
1372 * a gain of 2^0 (no actual gain), and 7 meaning a gain of 2^7. in ad4170_fill_scale_tbl()
1374 * be attenuated by 2 rather than amplified. Option 9, allows in ad4170_fill_scale_tbl()
1379 * _scale = (input_range / gain) / 2^precision in ad4170_fill_scale_tbl()
1380 * AD4170 gain is a power of 2 so the above can be written as in ad4170_fill_scale_tbl()
1381 * _scale = input_range / 2^(precision + gain) in ad4170_fill_scale_tbl()
1386 nv = (u64)chan_info->input_range_uv * NANO; in ad4170_fill_scale_tbl()
1388 rshift = precision_bits - bipolar + (pga & GENMASK(2, 0)) - lshift; in ad4170_fill_scale_tbl()
1389 chan_info->scale_tbl[pga][0] = 0; in ad4170_fill_scale_tbl()
1390 chan_info->scale_tbl[pga][1] = div_u64(nv >> rshift, MILLI); in ad4170_fill_scale_tbl()
1394 * (which is relative to IN-) will be offset by the level at IN-. in ad4170_fill_scale_tbl()
1402 offset = DIV_ROUND_CLOSEST_ULL(offset, chan_info->scale_tbl[pga][1]); in ad4170_fill_scale_tbl()
1410 chan_info->offset_tbl[pga] = -(int)(offset); in ad4170_fill_scale_tbl()
1412 chan_info->offset_tbl[pga] = (int)(offset); in ad4170_fill_scale_tbl()
1423 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_read_avail()
1428 *vals = (int *)chan_info->scale_tbl; in ad4170_read_avail()
1429 *length = ARRAY_SIZE(chan_info->scale_tbl) * 2; in ad4170_read_avail()
1439 *vals = (int *)st->sps_tbl[f_type]; in ad4170_read_avail()
1440 *length = ARRAY_SIZE(ad4170_sinc3_filt_fs_tbl) * 2; in ad4170_read_avail()
1444 *vals = (int *)st->sps_tbl[f_type]; in ad4170_read_avail()
1445 *length = ARRAY_SIZE(ad4170_sinc5_filt_fs_tbl) * 2; in ad4170_read_avail()
1448 return -EINVAL; in ad4170_read_avail()
1451 return -EINVAL; in ad4170_read_avail()
1458 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_set_pga()
1459 struct ad4170_setup *setup = &chan_info->setup; in ad4170_set_pga()
1463 if (val == chan_info->scale_tbl[pga][0] && in ad4170_set_pga()
1464 val2 == chan_info->scale_tbl[pga][1]) in ad4170_set_pga()
1469 return -EINVAL; in ad4170_set_pga()
1471 guard(mutex)(&st->lock); in ad4170_set_pga()
1472 setup->afe &= ~AD4170_AFE_PGA_GAIN_MSK; in ad4170_set_pga()
1473 setup->afe |= FIELD_PREP(AD4170_AFE_PGA_GAIN_MSK, pga); in ad4170_set_pga()
1475 return ad4170_write_channel_setup(st, chan->address, false); in ad4170_set_pga()
1482 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_set_channel_freq()
1483 struct ad4170_setup *setup = &chan_info->setup; in ad4170_set_channel_freq()
1484 enum ad4170_filter_type f_type = __ad4170_get_filter_type(setup->filter); in ad4170_set_channel_freq()
1498 if (st->sps_tbl[f_type][i][0] == val && in ad4170_set_channel_freq()
1499 st->sps_tbl[f_type][i][1] == val2) in ad4170_set_channel_freq()
1503 return -EINVAL; in ad4170_set_channel_freq()
1505 guard(mutex)(&st->lock); in ad4170_set_channel_freq()
1507 setup->filter_fs = ad4170_sinc5_filt_fs_tbl[i]; in ad4170_set_channel_freq()
1509 setup->filter_fs = ad4170_sinc3_filt_fs_tbl[i]; in ad4170_set_channel_freq()
1511 return ad4170_write_channel_setup(st, chan->address, false); in ad4170_set_channel_freq()
1517 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_set_calib_offset()
1518 struct ad4170_setup *setup = &chan_info->setup; in ad4170_set_calib_offset()
1520 guard(mutex)(&st->lock); in ad4170_set_calib_offset()
1521 setup->offset = val; in ad4170_set_calib_offset()
1523 return ad4170_write_channel_setup(st, chan->address, false); in ad4170_set_calib_offset()
1529 struct ad4170_chan_info *chan_info = &st->chan_infos[chan->address]; in ad4170_set_calib_gain()
1530 struct ad4170_setup *setup = &chan_info->setup; in ad4170_set_calib_gain()
1532 guard(mutex)(&st->lock); in ad4170_set_calib_gain()
1533 setup->gain = val; in ad4170_set_calib_gain()
1535 return ad4170_write_channel_setup(st, chan->address, false); in ad4170_set_calib_gain()
1554 return -EINVAL; in __ad4170_write_raw()
1565 return -EBUSY; in ad4170_write_raw()
1585 return -EINVAL; in ad4170_write_raw_get_fmt()
1617 ret = regmap_write(st->regmap, AD4170_CONFIG_A_REG, in ad4170_soft_reset()
1622 /* AD4170-4 requires 1 ms between reset and any register access. */ in ad4170_soft_reset()
1636 return -EBUSY; in ad4170_gpio_get()
1638 ret = regmap_read(st->regmap, AD4170_GPIO_MODE_REG, &val); in ad4170_gpio_get()
1647 if (val & BIT(offset * 2)) in ad4170_gpio_get()
1648 ret = regmap_read(st->regmap, AD4170_GPIO_INPUT_REG, &val); in ad4170_gpio_get()
1650 ret = regmap_read(st->regmap, AD4170_GPIO_OUTPUT_REG, &val); in ad4170_gpio_get()
1668 return -EBUSY; in ad4170_gpio_set()
1670 ret = regmap_assign_bits(st->regmap, AD4170_GPIO_OUTPUT_REG, in ad4170_gpio_set()
1685 return -EBUSY; in ad4170_gpio_get_direction()
1687 ret = regmap_read(st->regmap, AD4170_GPIO_MODE_REG, &val); in ad4170_gpio_get_direction()
1691 if (val & BIT(offset * 2 + 1)) in ad4170_gpio_get_direction()
1710 return -EBUSY; in ad4170_gpio_direction_input()
1719 case 2: in ad4170_gpio_direction_input()
1726 ret = -EINVAL; in ad4170_gpio_direction_input()
1729 ret = regmap_update_bits(st->regmap, AD4170_GPIO_MODE_REG, gpio_mask, in ad4170_gpio_direction_input()
1730 AD4170_GPIO_MODE_GPIO_INPUT << (2 * offset)); in ad4170_gpio_direction_input()
1751 return -EBUSY; in ad4170_gpio_direction_output()
1760 case 2: in ad4170_gpio_direction_output()
1767 ret = -EINVAL; in ad4170_gpio_direction_output()
1770 ret = regmap_update_bits(st->regmap, AD4170_GPIO_MODE_REG, gpio_mask, in ad4170_gpio_direction_output()
1771 AD4170_GPIO_MODE_GPIO_OUTPUT << (2 * offset)); in ad4170_gpio_direction_output()
1788 bool valid = st->gpio_fn[i] == AD4170_GPIO_UNASSIGNED; in ad4170_gpio_init_valid_mask()
1800 st->gpiochip.label = "ad4170_gpios"; in ad4170_gpio_init()
1801 st->gpiochip.base = -1; in ad4170_gpio_init()
1802 st->gpiochip.ngpio = AD4170_NUM_GPIO_PINS; in ad4170_gpio_init()
1803 st->gpiochip.parent = &st->spi->dev; in ad4170_gpio_init()
1804 st->gpiochip.can_sleep = true; in ad4170_gpio_init()
1805 st->gpiochip.init_valid_mask = ad4170_gpio_init_valid_mask; in ad4170_gpio_init()
1806 st->gpiochip.get_direction = ad4170_gpio_get_direction; in ad4170_gpio_init()
1807 st->gpiochip.direction_input = ad4170_gpio_direction_input; in ad4170_gpio_init()
1808 st->gpiochip.direction_output = ad4170_gpio_direction_output; in ad4170_gpio_init()
1809 st->gpiochip.get = ad4170_gpio_get; in ad4170_gpio_init()
1810 st->gpiochip.set = ad4170_gpio_set; in ad4170_gpio_init()
1811 st->gpiochip.owner = THIS_MODULE; in ad4170_gpio_init()
1813 return devm_gpiochip_add_data(&st->spi->dev, &st->gpiochip, indio_dev); in ad4170_gpio_init()
1816 static int ad4170_validate_excitation_pin(struct ad4170_state *st, u32 pin) in ad4170_validate_excitation_pin() argument
1818 struct device *dev = &st->spi->dev; in ad4170_validate_excitation_pin()
1821 /* Check the pin number is valid */ in ad4170_validate_excitation_pin()
1823 if (ad4170_iout_pin_tbl[i] == pin) in ad4170_validate_excitation_pin()
1827 return dev_err_probe(dev, -EINVAL, in ad4170_validate_excitation_pin()
1828 "Invalid excitation pin: %u\n", in ad4170_validate_excitation_pin()
1829 pin); in ad4170_validate_excitation_pin()
1831 /* Check the pin is available */ in ad4170_validate_excitation_pin()
1832 if (pin <= AD4170_MAX_ANALOG_PINS) { in ad4170_validate_excitation_pin()
1833 if (st->pins_fn[pin] != AD4170_PIN_UNASSIGNED) in ad4170_validate_excitation_pin()
1834 return dev_err_probe(dev, -EINVAL, in ad4170_validate_excitation_pin()
1835 "Pin %u already used with fn %u\n", in ad4170_validate_excitation_pin()
1836 pin, st->pins_fn[pin]); in ad4170_validate_excitation_pin()
1838 st->pins_fn[pin] |= AD4170_PIN_CURRENT_OUT; in ad4170_validate_excitation_pin()
1840 unsigned int gpio = pin - AD4170_CURRENT_SRC_I_OUT_PIN_GPIO(0); in ad4170_validate_excitation_pin()
1842 if (st->gpio_fn[gpio] != AD4170_GPIO_UNASSIGNED) in ad4170_validate_excitation_pin()
1843 return dev_err_probe(dev, -EINVAL, in ad4170_validate_excitation_pin()
1845 gpio, st->gpio_fn[gpio]); in ad4170_validate_excitation_pin()
1847 st->gpio_fn[gpio] |= AD4170_GPIO_AC_EXCITATION; in ad4170_validate_excitation_pin()
1868 "adi,excitation-pin-0",
1869 "adi,excitation-pin-1",
1870 "adi,excitation-pin-2",
1871 "adi,excitation-pin-3",
1875 "adi,excitation-current-0-microamp",
1876 "adi,excitation-current-1-microamp",
1877 "adi,excitation-current-2-microamp",
1878 "adi,excitation-current-3-microamp",
1883 * excitation currents (IOUT0 to IOUT3) that can be configured independently.
1884 * Excitation currents are added if they are output on the same pin.
1892 struct device *dev = &st->spi->dev; in ad4170_parse_exc_current()
1894 u32 pin, val; in ad4170_parse_exc_current() local
1899 /* Parse excitation current output pin properties. */ in ad4170_parse_exc_current()
1900 pin = AD4170_CURRENT_SRC_I_OUT_PIN_AIN(0); in ad4170_parse_exc_current()
1902 &pin); in ad4170_parse_exc_current()
1906 exc_pins[num_pins] = pin; in ad4170_parse_exc_current()
1908 /* Parse excitation current value properties. */ in ad4170_parse_exc_current()
1918 return dev_err_probe(dev, -EINVAL, "Invalid %s: %uuA\n", in ad4170_parse_exc_current()
1940 unsigned int pin = exc_pins[i]; in ad4170_setup_current_src() local
1944 if (st->cur_src_pins[j] == AD4170_CURRENT_SRC_DISABLED) in ad4170_setup_current_src()
1948 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_setup_current_src()
1949 "Too many excitation current sources\n"); in ad4170_setup_current_src()
1951 current_src |= FIELD_PREP(AD4170_CURRENT_SRC_I_OUT_PIN_MSK, pin); in ad4170_setup_current_src()
1953 st->cur_src_pins[j] = pin; in ad4170_setup_current_src()
1954 ret = regmap_write(st->regmap, AD4170_CURRENT_SRC_REG(j), in ad4170_setup_current_src()
1963 if (num_exc_pins < 2) in ad4170_setup_current_src()
1964 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_setup_current_src()
1965 "Current chopping requested but only one pin provided: %u\n", in ad4170_setup_current_src()
1970 * - 2 pairs of excitation currents; in ad4170_setup_current_src()
1971 * - 1 pair of excitation currents. in ad4170_setup_current_src()
1975 if (st->cur_src_pins[i] != exc_pins[i]) in ad4170_setup_current_src()
1976 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_setup_current_src()
1980 * Excitation current chopping is configured in pairs. Current in ad4170_setup_current_src()
1982 * pair 2. So, if current chopping was requested, check if the in ad4170_setup_current_src()
1983 * first end of the first pair of excitation currents is in ad4170_setup_current_src()
1987 i = st->cur_src_pins[0] == exc_pins[0] ? 0 : 2; in ad4170_setup_current_src()
1989 if (st->cur_src_pins[i] != exc_pins[0] || in ad4170_setup_current_src()
1990 st->cur_src_pins[i + 1] != exc_pins[1]) in ad4170_setup_current_src()
1991 return dev_err_probe(&st->spi->dev, -EINVAL, in ad4170_setup_current_src()
1994 st->cur_src_pins[i] = exc_pins[0]; in ad4170_setup_current_src()
1995 st->cur_src_pins[i + 1] = exc_pins[1]; in ad4170_setup_current_src()
2004 * Configure excitation current chopping. in ad4170_setup_current_src()
2005 * Chop both pairs if using four excitation pins. in ad4170_setup_current_src()
2007 setup->misc |= FIELD_PREP(AD4170_MISC_CHOP_IEXC_MSK, in ad4170_setup_current_src()
2008 num_exc_pins == 2 ? in ad4170_setup_current_src()
2027 * adi,excitation-current-n-microamp, set excitation pins provided in ad4170_setup_bridge()
2028 * through adi,excitation-pin-n to excite the bridge circuit. in ad4170_setup_bridge()
2040 * excitation, use ACX1 and ACX2 (GPIO2 and GPIO3). in ad4170_setup_bridge()
2042 * Also, to avoid any short-circuit condition when more than one channel in ad4170_setup_bridge()
2044 * DC excite the bridge whenever a channel without AC excitation is in ad4170_setup_bridge()
2047 * excitation. See datasheet Figure 113 Weigh Scale (AC Excitation) for in ad4170_setup_bridge()
2050 if (num_exc_pins == 2) { in ad4170_setup_bridge()
2051 setup->misc |= FIELD_PREP(AD4170_MISC_CHOP_ADC_MSK, 0x3); in ad4170_setup_bridge()
2054 ret = regmap_update_bits(st->regmap, AD4170_GPIO_MODE_REG, gpio_mask, in ad4170_setup_bridge()
2067 AD4170_GPIO_OUTPUT_GPIO_MSK(2); in ad4170_setup_bridge()
2068 ret = regmap_update_bits(st->regmap, AD4170_GPIO_OUTPUT_REG, gpio_mask, in ad4170_setup_bridge()
2070 FIELD_PREP(AD4170_GPIO_OUTPUT_GPIO_MSK(2), 1)); in ad4170_setup_bridge()
2074 st->gpio_fn[3] |= AD4170_GPIO_OUTPUT; in ad4170_setup_bridge()
2075 st->gpio_fn[2] |= AD4170_GPIO_OUTPUT; in ad4170_setup_bridge()
2077 setup->misc |= FIELD_PREP(AD4170_MISC_CHOP_ADC_MSK, 0x2); in ad4170_setup_bridge()
2081 ret = regmap_update_bits(st->regmap, AD4170_GPIO_MODE_REG, gpio_mask, in ad4170_setup_bridge()
2098 AD4170_GPIO_OUTPUT_GPIO_MSK(2) | in ad4170_setup_bridge()
2101 ret = regmap_update_bits(st->regmap, AD4170_GPIO_OUTPUT_REG, gpio_mask, in ad4170_setup_bridge()
2103 FIELD_PREP(AD4170_GPIO_OUTPUT_GPIO_MSK(2), 1) | in ad4170_setup_bridge()
2109 st->gpio_fn[3] |= AD4170_GPIO_OUTPUT; in ad4170_setup_bridge()
2110 st->gpio_fn[2] |= AD4170_GPIO_OUTPUT; in ad4170_setup_bridge()
2111 st->gpio_fn[1] |= AD4170_GPIO_OUTPUT; in ad4170_setup_bridge()
2112 st->gpio_fn[0] |= AD4170_GPIO_OUTPUT; in ad4170_setup_bridge()
2134 struct device *dev = &st->spi->dev; in ad4170_parse_external_sensor()
2135 u32 pins[2], exc_pins[4], exc_curs[4]; in ad4170_parse_external_sensor()
2139 ret = fwnode_property_read_u32_array(child, "diff-channels", pins, in ad4170_parse_external_sensor()
2143 "Failed to read sensor diff-channels\n"); in ad4170_parse_external_sensor()
2145 chan->differential = true; in ad4170_parse_external_sensor()
2146 chan->channel = pins[0]; in ad4170_parse_external_sensor()
2147 chan->channel2 = pins[1]; in ad4170_parse_external_sensor()
2153 /* The external sensor may not need excitation from the ADC chip. */ in ad4170_parse_external_sensor()
2161 ac_excited = fwnode_property_read_bool(child, "adi,excitation-ac"); in ad4170_parse_external_sensor()
2164 if (st->pins_fn[chan->channel2] & AD4170_PIN_VBIAS) { in ad4170_parse_external_sensor()
2165 reg_val = BIT(chan->channel2); in ad4170_parse_external_sensor()
2166 ret = regmap_write(st->regmap, AD4170_V_BIAS_REG, reg_val); in ad4170_parse_external_sensor()
2185 struct device *dev = &st->spi->dev; in ad4170_parse_reference()
2191 propname = "adi,positive-reference-buffer"; in ad4170_parse_reference()
2197 setup->afe |= FIELD_PREP(AD4170_AFE_REF_BUF_P_MSK, in ad4170_parse_reference()
2201 propname = "adi,negative-reference-buffer"; in ad4170_parse_reference()
2207 setup->afe |= FIELD_PREP(AD4170_AFE_REF_BUF_M_MSK, in ad4170_parse_reference()
2211 propname = "adi,reference-select"; in ad4170_parse_reference()
2215 return dev_err_probe(dev, -EINVAL, "Invalid %s: %u\n", in ad4170_parse_reference()
2218 setup->afe |= FIELD_PREP(AD4170_AFE_REF_SELECT_MSK, aux); in ad4170_parse_reference()
2229 u32 pins[2]; in ad4170_parse_adc_channel_type()
2231 propname = "single-channel"; in ad4170_parse_adc_channel_type()
2232 propname2 = "diff-channels"; in ad4170_parse_adc_channel_type()
2235 return dev_err_probe(dev, -EINVAL, in ad4170_parse_adc_channel_type()
2243 chan->differential = true; in ad4170_parse_adc_channel_type()
2244 chan->channel = pins[0]; in ad4170_parse_adc_channel_type()
2245 chan->channel2 = pins[1]; in ad4170_parse_adc_channel_type()
2248 /* Failed to parse diff chan so try pseudo-diff chan props */ in ad4170_parse_adc_channel_type()
2250 propname2 = "common-mode-channel"; in ad4170_parse_adc_channel_type()
2253 return dev_err_probe(dev, -EINVAL, in ad4170_parse_adc_channel_type()
2257 /* Parse pseudo-differential channel configuration */ in ad4170_parse_adc_channel_type()
2262 chan->differential = false; in ad4170_parse_adc_channel_type()
2263 chan->channel = pins[0]; in ad4170_parse_adc_channel_type()
2264 chan->channel2 = pins[1]; in ad4170_parse_adc_channel_type()
2267 return dev_err_probe(dev, -EINVAL, in ad4170_parse_adc_channel_type()
2269 chan->address, ret, ret2); in ad4170_parse_adc_channel_type()
2278 struct device *dev = &st->spi->dev; in ad4170_parse_channel_node()
2292 return dev_err_probe(dev, -EINVAL, in ad4170_parse_channel_node()
2295 chan = &st->chans[chan_num]; in ad4170_parse_channel_node()
2298 chan->address = ch_reg; in ad4170_parse_channel_node()
2299 chan->scan_index = ch_reg; in ad4170_parse_channel_node()
2300 chan_info = &st->chan_infos[chan->address]; in ad4170_parse_channel_node()
2302 chan_info->setup_num = AD4170_INVALID_SETUP; in ad4170_parse_channel_node()
2303 chan_info->initialized = true; in ad4170_parse_channel_node()
2305 setup = &chan_info->setup; in ad4170_parse_channel_node()
2310 ret = fwnode_property_match_property_string(child, "adi,sensor-type", in ad4170_parse_channel_node()
2332 return -EINVAL; in ad4170_parse_channel_node()
2336 setup->afe |= FIELD_PREP(AD4170_AFE_BIPOLAR_MSK, bipolar); in ad4170_parse_channel_node()
2338 chan->scan_type.sign = 's'; in ad4170_parse_channel_node()
2340 chan->scan_type.sign = 'u'; in ad4170_parse_channel_node()
2346 ref_select = FIELD_GET(AD4170_AFE_REF_SELECT_MSK, setup->afe); in ad4170_parse_channel_node()
2351 chan_info->input_range_uv = ret; in ad4170_parse_channel_node()
2358 struct device *dev = &st->spi->dev; in ad4170_parse_channels()
2366 return dev_err_probe(dev, -EINVAL, "Too many channels\n"); in ad4170_parse_channels()
2383 struct ad4170_setup *setup = &st->chan_infos[chan_num].setup; in ad4170_parse_channels()
2385 st->chans[chan_num] = ad4170_temp_channel_template; in ad4170_parse_channels()
2386 st->chans[chan_num].address = chan_num; in ad4170_parse_channels()
2387 st->chans[chan_num].scan_index = chan_num; in ad4170_parse_channels()
2389 st->chan_infos[chan_num].setup_num = AD4170_INVALID_SETUP; in ad4170_parse_channels()
2390 st->chan_infos[chan_num].initialized = true; in ad4170_parse_channels()
2392 setup->afe |= FIELD_PREP(AD4170_AFE_REF_SELECT_MSK, in ad4170_parse_channels()
2395 ret = ad4170_get_input_range(st, &st->chans[chan_num], chan_num, in ad4170_parse_channels()
2400 st->chan_infos[chan_num].input_range_uv = ret; in ad4170_parse_channels()
2407 st->chans[chan_num] = ts_chan; in ad4170_parse_channels()
2410 indio_dev->num_channels = num_channels; in ad4170_parse_channels()
2411 indio_dev->channels = st->chans; in ad4170_parse_channels()
2424 st->clock_ctrl &= ~AD4170_CLOCK_CTRL_CLOCKSEL_MSK; in ad4170_sel_clk()
2425 st->clock_ctrl |= FIELD_PREP(AD4170_CLOCK_CTRL_CLOCKSEL_MSK, clk_sel); in ad4170_sel_clk()
2426 return regmap_write(st->regmap, AD4170_CLOCK_CTRL_REG, st->clock_ctrl); in ad4170_sel_clk()
2440 clk_sel = FIELD_GET(AD4170_CLOCK_CTRL_CLOCKSEL_MSK, st->clock_ctrl); in ad4170_clk_output_is_enabled()
2468 struct device *dev = indio_dev->dev.parent; in ad4170_register_clk_provider()
2472 if (device_property_read_string(dev, "clock-output-names", &init.name)) { in ad4170_register_clk_provider()
2476 return -ENOMEM; in ad4170_register_clk_provider()
2481 st->int_clk_hw.init = &init; in ad4170_register_clk_provider()
2482 ret = devm_clk_hw_register(dev, &st->int_clk_hw); in ad4170_register_clk_provider()
2487 &st->int_clk_hw); in ad4170_register_clk_provider()
2493 struct device *dev = &st->spi->dev; in ad4170_clock_select()
2504 st->mclk_hz = AD4170_INT_CLOCK_16MHZ; in ad4170_clock_select()
2505 st->clock_ctrl |= FIELD_PREP(AD4170_CLOCK_CTRL_CLOCKSEL_MSK, in ad4170_clock_select()
2508 if (!device_property_present(&st->spi->dev, "#clock-cells")) in ad4170_clock_select()
2514 /* Read optional clock-names prop to specify the external clock type */ in ad4170_clock_select()
2515 ret = device_property_match_property_string(dev, "clock-names", in ad4170_clock_select()
2519 ret = ret < 0 ? 0 : ret; /* Default to external clock if no clock-names */ in ad4170_clock_select()
2520 st->clock_ctrl |= FIELD_PREP(AD4170_CLOCK_CTRL_CLOCKSEL_MSK, in ad4170_clock_select()
2523 st->mclk_hz = clk_get_rate(ext_clk); in ad4170_clock_select()
2524 if (st->mclk_hz < AD4170_EXT_CLOCK_MHZ_MIN || in ad4170_clock_select()
2525 st->mclk_hz > AD4170_EXT_CLOCK_MHZ_MAX) { in ad4170_clock_select()
2526 return dev_err_probe(dev, -EINVAL, in ad4170_clock_select()
2528 st->mclk_hz); in ad4170_clock_select()
2538 struct device *dev = &st->spi->dev; in ad4170_parse_firmware()
2548 ret = regmap_write(st->regmap, AD4170_CLOCK_CTRL_REG, st->clock_ctrl); in ad4170_parse_firmware()
2553 st->cur_src_pins[i] = AD4170_CURRENT_SRC_DISABLED; in ad4170_parse_firmware()
2555 /* On power on, device defaults to using SDO pin for data ready signal */ in ad4170_parse_firmware()
2557 ret = device_property_match_property_string(dev, "interrupt-names", in ad4170_parse_firmware()
2568 ret = regmap_update_bits(st->regmap, AD4170_PIN_MUXING_REG, in ad4170_parse_firmware()
2573 ret = device_property_count_u32(dev, "adi,vbias-pins"); in ad4170_parse_firmware()
2576 return dev_err_probe(dev, -EINVAL, in ad4170_parse_firmware()
2581 ret = device_property_read_u32_array(dev, "adi,vbias-pins", in ad4170_parse_firmware()
2589 st->pins_fn[vbias_pins[i]] |= AD4170_PIN_VBIAS; in ad4170_parse_firmware()
2597 if (device_property_read_bool(dev, "gpio-controller")) { in ad4170_parse_firmware()
2609 struct device *dev = &st->spi->dev; in ad4170_initial_config()
2615 ret = regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_initial_config()
2623 for (i = 0; i < indio_dev->num_channels; i++) { in ad4170_initial_config()
2629 chan = &indio_dev->channels[i]; in ad4170_initial_config()
2630 if (chan->type == IIO_TIMESTAMP) in ad4170_initial_config()
2633 chan_info = &st->chan_infos[chan->address]; in ad4170_initial_config()
2635 setup = &chan_info->setup; in ad4170_initial_config()
2636 setup->gain = AD4170_GAIN_REG_DEFAULT; in ad4170_initial_config()
2637 ret = ad4170_write_channel_setup(st, chan->address, false); in ad4170_initial_config()
2642 val = FIELD_PREP(AD4170_CHAN_MAP_AINP_MSK, chan->channel) | in ad4170_initial_config()
2643 FIELD_PREP(AD4170_CHAN_MAP_AINM_MSK, chan->channel2); in ad4170_initial_config()
2645 ret = regmap_write(st->regmap, AD4170_CHAN_MAP_REG(i), val); in ad4170_initial_config()
2663 ret = regmap_write(st->regmap, AD4170_CHAN_EN_REG, 0); in ad4170_initial_config()
2673 return regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_initial_config()
2685 st->xfer.rx_buf = &st->rx_buf; in ad4170_prepare_spi_message()
2686 st->xfer.len = BITS_TO_BYTES(ad4170_channel_template.scan_type.realbits); in ad4170_prepare_spi_message()
2688 spi_message_init_with_transfers(&st->msg, &st->xfer, 1); in ad4170_prepare_spi_message()
2690 return devm_spi_optimize_message(&st->spi->dev, st->spi, &st->msg); in ad4170_prepare_spi_message()
2698 ret = regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_buffer_postenable()
2709 return regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_buffer_postenable()
2726 ret = regmap_write(st->regmap, AD4170_ADC_CTRL_CONT_READ_EXIT_REG, 0); in ad4170_buffer_predisable()
2730 ret = regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_buffer_predisable()
2737 ret = regmap_update_bits(st->regmap, AD4170_ADC_CTRL_REG, in ad4170_buffer_predisable()
2747 * single-shot read (or buffered read with different active_scan_mask) in ad4170_buffer_predisable()
2751 for (i = 0; i < indio_dev->num_channels; i++) { in ad4170_buffer_predisable()
2752 if (indio_dev->channels[i].type == IIO_TIMESTAMP) in ad4170_buffer_predisable()
2792 struct iio_dev *indio_dev = pf->indio_dev; in ad4170_trigger_handler()
2799 ret = spi_sync(st->spi, &st->msg); in ad4170_trigger_handler()
2803 memcpy(&st->bounce_buffer[i++], st->rx_buf, ARRAY_SIZE(st->rx_buf)); in ad4170_trigger_handler()
2806 iio_push_to_buffers_with_ts(indio_dev, st->bounce_buffer, in ad4170_trigger_handler()
2807 sizeof(st->bounce_buffer), in ad4170_trigger_handler()
2810 iio_trigger_notify_done(indio_dev->trig); in ad4170_trigger_handler()
2824 iio_trigger_poll(st->trig); in ad4170_irq_handler()
2826 complete(&st->completion); in ad4170_irq_handler()
2834 struct device *dev = &st->spi->dev; in ad4170_trigger_setup()
2837 st->trig = devm_iio_trigger_alloc(dev, "%s-trig%d", in ad4170_trigger_setup()
2838 indio_dev->name, in ad4170_trigger_setup()
2840 if (!st->trig) in ad4170_trigger_setup()
2841 return -ENOMEM; in ad4170_trigger_setup()
2843 st->trig->ops = &ad4170_trigger_ops; in ad4170_trigger_setup()
2845 iio_trigger_set_drvdata(st->trig, indio_dev); in ad4170_trigger_setup()
2846 ret = devm_iio_trigger_register(dev, st->trig); in ad4170_trigger_setup()
2850 indio_dev->trig = iio_trigger_get(st->trig); in ad4170_trigger_setup()
2857 struct device *dev = &st->spi->dev; in ad4170_regulator_setup()
2865 st->vrefs_uv[AD4170_AVDD_SUP] = ret; in ad4170_regulator_setup()
2871 st->vrefs_uv[AD4170_IOVDD_SUP] = ret; in ad4170_regulator_setup()
2875 if (ret < 0 && ret != -ENODEV) in ad4170_regulator_setup()
2886 st->vrefs_uv[AD4170_AVSS_SUP] = ret == -ENODEV ? 0 : -ret; in ad4170_regulator_setup()
2889 if (ret < 0 && ret != -ENODEV) in ad4170_regulator_setup()
2892 st->vrefs_uv[AD4170_REFIN1P_SUP] = ret; in ad4170_regulator_setup()
2895 if (ret < 0 && ret != -ENODEV) in ad4170_regulator_setup()
2896 return dev_err_probe(dev, ret, "Failed to get REFIN- voltage.\n"); in ad4170_regulator_setup()
2903 st->vrefs_uv[AD4170_REFIN1N_SUP] = ret == -ENODEV ? -ENODEV : -ret; in ad4170_regulator_setup()
2906 if (ret < 0 && ret != -ENODEV) in ad4170_regulator_setup()
2909 st->vrefs_uv[AD4170_REFIN2P_SUP] = ret; in ad4170_regulator_setup()
2912 if (ret < 0 && ret != -ENODEV) in ad4170_regulator_setup()
2913 return dev_err_probe(dev, ret, "Failed to get REFIN2- voltage.\n"); in ad4170_regulator_setup()
2920 st->vrefs_uv[AD4170_REFIN2N_SUP] = ret == -ENODEV ? -ENODEV : -ret; in ad4170_regulator_setup()
2928 struct device *dev = &spi->dev; in ad4170_probe()
2933 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad4170_probe()
2935 return -ENOMEM; in ad4170_probe()
2938 st->spi = spi; in ad4170_probe()
2940 ret = devm_mutex_init(dev, &st->lock); in ad4170_probe()
2946 return -EINVAL; in ad4170_probe()
2948 indio_dev->name = chip->name; in ad4170_probe()
2949 indio_dev->info = &ad4170_info; in ad4170_probe()
2951 st->regmap = devm_regmap_init(dev, NULL, st, &ad4170_regmap_config); in ad4170_probe()
2952 if (IS_ERR(st->regmap)) in ad4170_probe()
2953 return dev_err_probe(dev, PTR_ERR(st->regmap), in ad4170_probe()
2972 init_completion(&st->completion); in ad4170_probe()
2974 if (spi->irq) { in ad4170_probe()
2975 ret = devm_request_irq(dev, spi->irq, &ad4170_irq_handler, in ad4170_probe()
2976 IRQF_ONESHOT, indio_dev->name, indio_dev); in ad4170_probe()
2999 { "ad4170-4", (kernel_ulong_t)&ad4170_chip_info },
3000 { "ad4190-4", (kernel_ulong_t)&ad4190_chip_info },
3001 { "ad4195-4", (kernel_ulong_t)&ad4195_chip_info },
3007 { .compatible = "adi,ad4170-4", .data = &ad4170_chip_info },
3008 { .compatible = "adi,ad4190-4", .data = &ad4190_chip_info },
3009 { .compatible = "adi,ad4195-4", .data = &ad4195_chip_info },
3016 .name = "ad4170-4",
3024 MODULE_AUTHOR("Ana-Maria Cusco <ana-maria.cusco@analog.com>");