Lines Matching +full:1 +full:st
75 #define AD4030_REG_IO_MASK_IO2X BIT(1)
83 /* Sequence starting with "1 0 1" to enable reg access */
93 * This accounts for 1 sample per channel plus one s64 for the timestamp,
194 .indexed = 1, \
224 .indexed = 1, \
227 .channel2 = (_idx) * 2 + 1, \
230 .has_ext_scan_type = 1, \
236 1, 2, 4, 8, 16, 32, 64, 128,
241 static int ad4030_enter_config_mode(struct ad4030_state *st) in ad4030_enter_config_mode() argument
243 st->tx_data[0] = AD4030_REG_ACCESS; in ad4030_enter_config_mode()
246 .tx_buf = st->tx_data, in ad4030_enter_config_mode()
247 .len = 1, in ad4030_enter_config_mode()
251 return spi_sync_transfer(st->spi, &xfer, 1); in ad4030_enter_config_mode()
254 static int ad4030_exit_config_mode(struct ad4030_state *st) in ad4030_exit_config_mode() argument
256 st->tx_data[0] = 0; in ad4030_exit_config_mode()
257 st->tx_data[1] = AD4030_REG_EXIT_CFG_MODE; in ad4030_exit_config_mode()
258 st->tx_data[2] = AD4030_REG_EXIT_CFG_MODE_EXIT_MSK; in ad4030_exit_config_mode()
261 .tx_buf = st->tx_data, in ad4030_exit_config_mode()
266 return spi_sync_transfer(st->spi, &xfer, 1); in ad4030_exit_config_mode()
273 struct ad4030_state *st = context; in ad4030_spi_read() local
275 .tx_buf = st->tx_data, in ad4030_spi_read()
276 .rx_buf = st->rx_data.raw, in ad4030_spi_read()
281 if (xfer.len > sizeof(st->tx_data) || in ad4030_spi_read()
282 xfer.len > sizeof(st->rx_data.raw)) in ad4030_spi_read()
285 ret = ad4030_enter_config_mode(st); in ad4030_spi_read()
289 memset(st->tx_data, 0, sizeof(st->tx_data)); in ad4030_spi_read()
290 memcpy(st->tx_data, reg, reg_size); in ad4030_spi_read()
292 ret = spi_sync_transfer(st->spi, &xfer, 1); in ad4030_spi_read()
296 memcpy(val, &st->rx_data.raw[reg_size], val_size); in ad4030_spi_read()
298 return ad4030_exit_config_mode(st); in ad4030_spi_read()
304 struct ad4030_state *st = context; in ad4030_spi_write() local
307 ((u8 *)data)[1] == 0 && in ad4030_spi_write()
310 .tx_buf = st->tx_data, in ad4030_spi_write()
315 if (count > sizeof(st->tx_data)) in ad4030_spi_write()
318 ret = ad4030_enter_config_mode(st); in ad4030_spi_write()
322 memcpy(st->tx_data, data, count); in ad4030_spi_write()
324 ret = spi_sync_transfer(st->spi, &xfer, 1); in ad4030_spi_write()
338 return ad4030_exit_config_mode(st); in ad4030_spi_write()
385 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_get_chan_scale() local
388 scan_type = iio_get_current_scan_type(indio_dev, st->chip->channels); in ad4030_get_chan_scale()
393 *val = (st->vref_uv * 2) / MILLI; in ad4030_get_chan_scale()
395 *val = st->vref_uv / MILLI; in ad4030_get_chan_scale()
407 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_get_chan_calibscale() local
411 ret = regmap_bulk_read(st->regmap, AD4030_REG_GAIN_CHAN(chan->address), in ad4030_get_chan_calibscale()
412 st->rx_data.raw, AD4030_REG_GAIN_BYTES_NB); in ad4030_get_chan_calibscale()
416 gain = get_unaligned_be16(st->rx_data.raw); in ad4030_get_chan_calibscale()
426 /* Returns the offset where 1 LSB = (VREF/2^precision_bits - 1)/gain */
431 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_get_chan_calibbias() local
434 ret = regmap_bulk_read(st->regmap, in ad4030_get_chan_calibbias()
436 st->rx_data.raw, AD4030_REG_OFFSET_BYTES_NB); in ad4030_get_chan_calibbias()
440 switch (st->chip->precision_bits) { in ad4030_get_chan_calibbias()
442 *val = sign_extend32(get_unaligned_be16(st->rx_data.raw), 15); in ad4030_get_chan_calibbias()
446 *val = sign_extend32(get_unaligned_be24(st->rx_data.raw), 23); in ad4030_get_chan_calibbias()
459 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_set_chan_calibscale() local
472 st->tx_data); in ad4030_set_chan_calibscale()
474 return regmap_bulk_write(st->regmap, in ad4030_set_chan_calibscale()
476 st->tx_data, AD4030_REG_GAIN_BYTES_NB); in ad4030_set_chan_calibscale()
483 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_set_chan_calibbias() local
485 if (offset < st->offset_avail[0] || offset > st->offset_avail[2]) in ad4030_set_chan_calibbias()
488 st->tx_data[2] = 0; in ad4030_set_chan_calibbias()
490 switch (st->chip->precision_bits) { in ad4030_set_chan_calibbias()
492 put_unaligned_be16(offset, st->tx_data); in ad4030_set_chan_calibbias()
496 put_unaligned_be24(offset, st->tx_data); in ad4030_set_chan_calibbias()
503 return regmap_bulk_write(st->regmap, in ad4030_set_chan_calibbias()
505 st->tx_data, AD4030_REG_OFFSET_BYTES_NB); in ad4030_set_chan_calibbias()
510 struct ad4030_state *st = iio_priv(dev); in ad4030_set_avg_frame_len() local
512 unsigned int last_avg_idx = ARRAY_SIZE(ad4030_average_modes) - 1; in ad4030_set_avg_frame_len()
518 ret = regmap_write(st->regmap, AD4030_REG_AVG, in ad4030_set_avg_frame_len()
524 st->avg_log2 = avg_log2; in ad4030_set_avg_frame_len()
529 static bool ad4030_is_common_byte_asked(struct ad4030_state *st, in ad4030_is_common_byte_asked() argument
532 return mask & (st->chip->num_voltage_inputs == 1 ? in ad4030_is_common_byte_asked()
539 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_set_mode() local
541 if (st->avg_log2 > 0) { in ad4030_set_mode()
542 st->mode = AD4030_OUT_DATA_MD_30_AVERAGED_DIFF; in ad4030_set_mode()
543 } else if (ad4030_is_common_byte_asked(st, mask)) { in ad4030_set_mode()
544 switch (st->chip->precision_bits) { in ad4030_set_mode()
546 st->mode = AD4030_OUT_DATA_MD_16_DIFF_8_COM; in ad4030_set_mode()
550 st->mode = AD4030_OUT_DATA_MD_24_DIFF_8_COM; in ad4030_set_mode()
557 st->mode = AD4030_OUT_DATA_MD_DIFF; in ad4030_set_mode()
560 return regmap_update_bits(st->regmap, AD4030_REG_MODES, in ad4030_set_mode()
562 st->mode); in ad4030_set_mode()
567 * 1 bit for first number, 1 bit for the second, and so on...
578 l1 = src[i * 2 + 1]; in ad4030_extract_interleaved()
579 h1 = h0 << 1; in ad4030_extract_interleaved()
580 l0 = l1 >> 1; in ad4030_extract_interleaved()
606 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_conversion() local
610 unsigned long cnv_nb = BIT(st->avg_log2); in ad4030_conversion()
614 scan_type = iio_get_current_scan_type(indio_dev, st->chip->channels); in ad4030_conversion()
624 bytes_to_read += (st->mode == AD4030_OUT_DATA_MD_24_DIFF_8_COM || in ad4030_conversion()
625 st->mode == AD4030_OUT_DATA_MD_16_DIFF_8_COM) ? 1 : 0; in ad4030_conversion()
627 bytes_to_read *= st->chip->num_voltage_inputs; in ad4030_conversion()
630 gpiod_set_value_cansleep(st->cnv_gpio, 1); in ad4030_conversion()
632 gpiod_set_value_cansleep(st->cnv_gpio, 0); in ad4030_conversion()
633 ndelay(st->chip->tcyc_ns); in ad4030_conversion()
636 ret = spi_read(st->spi, st->rx_data.raw, bytes_to_read); in ad4030_conversion()
640 if (st->chip->num_voltage_inputs == 2) in ad4030_conversion()
641 ad4030_extract_interleaved(st->rx_data.raw, in ad4030_conversion()
642 &st->rx_data.dual.diff[0], in ad4030_conversion()
643 &st->rx_data.dual.diff[1]); in ad4030_conversion()
651 if (st->mode != AD4030_OUT_DATA_MD_16_DIFF_8_COM && in ad4030_conversion()
652 st->mode != AD4030_OUT_DATA_MD_24_DIFF_8_COM) in ad4030_conversion()
655 if (st->chip->num_voltage_inputs == 1) { in ad4030_conversion()
656 st->rx_data.single.common = st->rx_data.raw[diff_realbytes]; in ad4030_conversion()
660 for (i = 0; i < st->chip->num_voltage_inputs; i++) in ad4030_conversion()
661 st->rx_data.dual.common[i] = in ad4030_conversion()
662 st->rx_data.raw[diff_storagebytes * i + diff_realbytes]; in ad4030_conversion()
670 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_single_conversion() local
682 if (st->chip->num_voltage_inputs == 1) in ad4030_single_conversion()
683 *val = st->rx_data.single.diff; in ad4030_single_conversion()
685 *val = st->rx_data.dual.diff[chan->address]; in ad4030_single_conversion()
687 if (st->chip->num_voltage_inputs == 1) in ad4030_single_conversion()
688 *val = st->rx_data.single.common; in ad4030_single_conversion()
690 *val = st->rx_data.dual.common[chan->address]; in ad4030_single_conversion()
699 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_trigger_handler() local
706 iio_push_to_buffers_with_ts(indio_dev, &st->rx_data, sizeof(st->rx_data), in ad4030_trigger_handler()
718 { 1, 999969482 },
726 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_read_avail() local
730 *vals = st->offset_avail; in ad4030_read_avail()
754 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_read_raw_dispatch() local
767 *val = BIT(st->avg_log2); in ad4030_read_raw_dispatch()
834 const struct ad4030_state *st = iio_priv(indio_dev); in ad4030_reg_access() local
841 ret = regmap_read(st->regmap, reg, readval); in ad4030_reg_access()
843 ret = regmap_write(st->regmap, reg, writeval); in ad4030_reg_access()
862 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_get_current_scan_type() local
864 return st->avg_log2 ? AD4030_SCAN_TYPE_AVG : AD4030_SCAN_TYPE_NORMAL; in ad4030_get_current_scan_type()
886 struct ad4030_state *st = iio_priv(indio_dev); in ad4030_validate_scan_mask() local
889 if (st->avg_log2 && ad4030_is_common_byte_asked(st, *scan_mask)) in ad4030_validate_scan_mask()
899 static int ad4030_regulators_get(struct ad4030_state *st) in ad4030_regulators_get() argument
901 struct device *dev = &st->spi->dev; in ad4030_regulators_get()
902 static const char * const ids[] = { "vdd-5v", "vdd-1v8" }; in ad4030_regulators_get()
909 st->vio_uv = devm_regulator_get_enable_read_voltage(dev, "vio"); in ad4030_regulators_get()
910 if (st->vio_uv < 0) in ad4030_regulators_get()
911 return dev_err_probe(dev, st->vio_uv, in ad4030_regulators_get()
914 st->vref_uv = devm_regulator_get_enable_read_voltage(dev, "ref"); in ad4030_regulators_get()
915 if (st->vref_uv < 0) { in ad4030_regulators_get()
916 if (st->vref_uv != -ENODEV) in ad4030_regulators_get()
917 return dev_err_probe(dev, st->vref_uv, in ad4030_regulators_get()
921 st->vref_uv = devm_regulator_get_enable_read_voltage(dev, in ad4030_regulators_get()
923 if (st->vref_uv < 0) in ad4030_regulators_get()
924 return dev_err_probe(dev, st->vref_uv, in ad4030_regulators_get()
931 static int ad4030_reset(struct ad4030_state *st) in ad4030_reset() argument
933 struct device *dev = &st->spi->dev; in ad4030_reset()
947 return regmap_write(st->regmap, AD4030_REG_INTERFACE_CONFIG_A, in ad4030_reset()
951 static int ad4030_detect_chip_info(const struct ad4030_state *st) in ad4030_detect_chip_info() argument
956 ret = regmap_read(st->regmap, AD4030_REG_CHIP_GRADE, &grade); in ad4030_detect_chip_info()
961 if (grade != st->chip->grade) in ad4030_detect_chip_info()
962 dev_warn(&st->spi->dev, "Unknown grade(0x%x) for %s\n", grade, in ad4030_detect_chip_info()
963 st->chip->name); in ad4030_detect_chip_info()
968 static int ad4030_config(struct ad4030_state *st) in ad4030_config() argument
973 st->offset_avail[0] = (int)BIT(st->chip->precision_bits - 1) * -1; in ad4030_config()
974 st->offset_avail[1] = 1; in ad4030_config()
975 st->offset_avail[2] = BIT(st->chip->precision_bits - 1) - 1; in ad4030_config()
977 if (st->chip->num_voltage_inputs > 1) in ad4030_config()
984 ret = regmap_write(st->regmap, AD4030_REG_MODES, reg_modes); in ad4030_config()
988 if (st->vio_uv < AD4030_VIO_THRESHOLD_UV) in ad4030_config()
989 return regmap_write(st->regmap, AD4030_REG_IO, in ad4030_config()
999 struct ad4030_state *st; in ad4030_probe() local
1002 indio_dev = devm_iio_device_alloc(dev, sizeof(*st)); in ad4030_probe()
1006 st = iio_priv(indio_dev); in ad4030_probe()
1007 st->spi = spi; in ad4030_probe()
1009 st->regmap = devm_regmap_init(dev, &ad4030_regmap_bus, st, in ad4030_probe()
1011 if (IS_ERR(st->regmap)) in ad4030_probe()
1012 return dev_err_probe(dev, PTR_ERR(st->regmap), in ad4030_probe()
1015 st->chip = spi_get_device_match_data(spi); in ad4030_probe()
1016 if (!st->chip) in ad4030_probe()
1019 ret = ad4030_regulators_get(st); in ad4030_probe()
1029 ret = ad4030_reset(st); in ad4030_probe()
1033 ret = ad4030_detect_chip_info(st); in ad4030_probe()
1037 ret = ad4030_config(st); in ad4030_probe()
1041 st->cnv_gpio = devm_gpiod_get(dev, "cnv", GPIOD_OUT_LOW); in ad4030_probe()
1042 if (IS_ERR(st->cnv_gpio)) in ad4030_probe()
1043 return dev_err_probe(dev, PTR_ERR(st->cnv_gpio), in ad4030_probe()
1050 indio_dev->num_channels = 2 * st->chip->num_voltage_inputs + 1; in ad4030_probe()
1051 indio_dev->name = st->chip->name; in ad4030_probe()
1054 indio_dev->channels = st->chip->channels; in ad4030_probe()
1055 indio_dev->available_scan_masks = st->chip->available_masks; in ad4030_probe()
1072 GENMASK(1, 0),
1078 BIT(1) | BIT(0),
1123 AD4030_CHAN_CMO(1, 0),
1128 .num_voltage_inputs = 1,
1137 AD4030_CHAN_DIFF(1, ad4030_16_scan_types),
1139 AD4030_CHAN_CMO(3, 1),
1153 AD4030_CHAN_DIFF(1, ad4030_24_scan_types),
1155 AD4030_CHAN_CMO(3, 1),
1169 AD4030_CHAN_DIFF(1, ad4030_16_scan_types),
1171 AD4030_CHAN_CMO(3, 1),
1185 AD4030_CHAN_DIFF(1, ad4030_24_scan_types),
1187 AD4030_CHAN_CMO(3, 1),