Lines Matching +full:output +full:- +full:range +full:- +full:microamp
1 // SPDX-License-Identifier: GPL-2.0
204 * Synchronize consecutive operations when doing a one-shot
386 [AD74115_ADC_RANGE_12V_BIPOLAR] = { -12000000, 12000000 },
387 [AD74115_ADC_RANGE_2_5V_BIPOLAR] = { -2500000, 2500000 },
388 [AD74115_ADC_RANGE_2_5V_NEG] = { -2500000, 0 },
391 [AD74115_ADC_RANGE_104MV_BIPOLAR] = { -104000, 104000 },
406 return -EINVAL; in _ad74115_find_tbl_index()
428 ad74115_format_reg_write(reg, val, st->reg_tx_buf); in ad74115_reg_write()
430 return spi_write(st->spi, st->reg_tx_buf, AD74115_FRAME_SIZE); in ad74115_reg_write()
435 struct device *dev = &st->spi->dev; in ad74115_crc_check()
441 return -EINVAL; in ad74115_crc_check()
452 .tx_buf = st->reg_tx_buf, in ad74115_reg_read()
453 .len = sizeof(st->reg_tx_buf), in ad74115_reg_read()
457 .rx_buf = st->reg_rx_buf, in ad74115_reg_read()
458 .len = sizeof(st->reg_rx_buf), in ad74115_reg_read()
463 ad74115_format_reg_write(AD74115_READ_SELECT_REG, reg, st->reg_tx_buf); in ad74115_reg_read()
465 ret = spi_sync_transfer(st->spi, reg_read_xfer, ARRAY_SIZE(reg_read_xfer)); in ad74115_reg_read()
469 ret = ad74115_crc_check(st, st->reg_rx_buf); in ad74115_reg_read()
473 *val = get_unaligned_be16(&st->reg_rx_buf[1]); in ad74115_reg_read()
488 return regmap_update_bits(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), in ad74115_gpio_config_set()
499 *valid_mask = st->gpio_valid_mask; in ad74115_gpio_init_valid_mask()
510 ret = regmap_read(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), &val); in ad74115_gpio_get_direction()
538 ret = regmap_read(st->regmap, AD74115_GPIO_CONFIG_X_REG(offset), &val); in ad74115_gpio_get()
550 return regmap_update_bits(st->regmap, in ad74115_gpio_set()
567 i = len - 1; in ad74115_set_comp_debounce()
569 return regmap_update_bits(st->regmap, AD74115_DIN_CONFIG1_REG, in ad74115_set_comp_debounce()
592 return -ENOTSUPP; in ad74115_comp_gpio_set_config()
602 ret = regmap_read(st->regmap, AD74115_DIN_COMP_OUT_REG, &val); in ad74115_comp_gpio_get()
612 struct iio_dev *indio_dev = pf->indio_dev; in ad74115_trigger_handler()
616 ret = spi_sync(st->spi, &st->adc_samples_msg); in ad74115_trigger_handler()
620 iio_push_to_buffers(indio_dev, st->adc_samples_rx_buf); in ad74115_trigger_handler()
623 iio_trigger_notify_done(indio_dev->trig); in ad74115_trigger_handler()
634 iio_trigger_poll(st->trig); in ad74115_adc_data_interrupt()
636 complete(&st->adc_data_completion); in ad74115_adc_data_interrupt()
646 return regmap_update_bits(st->regmap, AD74115_ADC_CONV_CTRL_REG, mask, in ad74115_set_adc_ch_en()
653 return regmap_update_bits(st->regmap, AD74115_ADC_CONV_CTRL_REG, in ad74115_set_adc_conv_seq()
662 struct spi_transfer *xfer = st->adc_samples_xfer; in ad74115_update_scan_mode()
663 u8 *rx_buf = st->adc_samples_rx_buf; in ad74115_update_scan_mode()
664 u8 *tx_buf = st->adc_samples_tx_buf; in ad74115_update_scan_mode()
668 mutex_lock(&st->lock); in ad74115_update_scan_mode()
670 spi_message_init(&st->adc_samples_msg); in ad74115_update_scan_mode()
695 if (xfer == st->adc_samples_xfer) in ad74115_update_scan_mode()
696 xfer->rx_buf = NULL; in ad74115_update_scan_mode()
698 xfer->rx_buf = rx_buf; in ad74115_update_scan_mode()
700 xfer->tx_buf = tx_buf; in ad74115_update_scan_mode()
701 xfer->len = AD74115_FRAME_SIZE; in ad74115_update_scan_mode()
702 xfer->cs_change = 1; in ad74115_update_scan_mode()
707 spi_message_add_tail(xfer, &st->adc_samples_msg); in ad74115_update_scan_mode()
710 if (xfer != st->adc_samples_xfer) in ad74115_update_scan_mode()
715 xfer->rx_buf = rx_buf; in ad74115_update_scan_mode()
716 xfer->tx_buf = NULL; in ad74115_update_scan_mode()
717 xfer->len = AD74115_FRAME_SIZE; in ad74115_update_scan_mode()
718 xfer->cs_change = 0; in ad74115_update_scan_mode()
720 spi_message_add_tail(xfer, &st->adc_samples_msg); in ad74115_update_scan_mode()
723 mutex_unlock(&st->lock); in ad74115_update_scan_mode()
741 mutex_lock(&st->lock); in ad74115_buffer_predisable()
758 mutex_unlock(&st->lock); in ad74115_buffer_predisable()
778 ret = regmap_read(st->regmap, AD74115_ADC_CONFIG_REG, &i); in ad74115_get_adc_rate()
798 reinit_completion(&st->adc_data_completion); in _ad74115_get_adc_code()
808 if (st->irq) { in _ad74115_get_adc_code()
809 ret = wait_for_completion_timeout(&st->adc_data_completion, in _ad74115_get_adc_code()
812 return -ETIMEDOUT; in _ad74115_get_adc_code()
823 ret = regmap_read_poll_timeout(st->regmap, AD74115_LIVE_STATUS_REG, in _ad74115_get_adc_code()
833 * Although the datasheet mentions that the bit will auto-clear in _ad74115_get_adc_code()
837 ret = regmap_write_bits(st->regmap, AD74115_LIVE_STATUS_REG, in _ad74115_get_adc_code()
844 ret = regmap_read(st->regmap, ad74115_adc_ch_data_regs_tbl[channel], &uval); in _ad74115_get_adc_code()
868 return -EBUSY; in ad74115_get_adc_code()
870 mutex_lock(&st->lock); in ad74115_get_adc_code()
872 mutex_unlock(&st->lock); in ad74115_get_adc_code()
882 code--; in ad74115_adc_code_to_resistance()
885 *val2 = AD74115_ADC_CODE_MAX - code; in ad74115_adc_code_to_resistance()
894 return -EINVAL; in ad74115_set_dac_code()
898 return -EINVAL; in ad74115_set_dac_code()
900 return regmap_update_bits(st->regmap, AD74115_DIN_CONFIG2_REG, in ad74115_set_dac_code()
906 return -EINVAL; in ad74115_set_dac_code()
908 return regmap_write(st->regmap, AD74115_DAC_CODE_REG, val); in ad74115_set_dac_code()
918 return -EINVAL; in ad74115_get_dac_code()
920 ret = regmap_read(st->regmap, AD74115_DAC_ACTIVE_REG, &uval); in ad74115_get_dac_code()
940 return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG, in ad74115_set_adc_rate()
944 return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG, in ad74115_set_adc_rate()
954 ret = regmap_read(st->regmap, AD74115_OUTPUT_CONFIG_REG, &tmp); in ad74115_get_dac_rate()
969 return -EINVAL; in ad74115_get_dac_rate()
997 return regmap_update_bits(st->regmap, AD74115_OUTPUT_CONFIG_REG, mask, tmp); in ad74115_set_dac_rate()
1004 if (chan->channel == AD74115_DAC_CH_MAIN) { in ad74115_get_dac_scale()
1005 if (chan->type == IIO_VOLTAGE) { in ad74115_get_dac_scale()
1008 if (st->dac_bipolar) in ad74115_get_dac_scale()
1017 if (st->din_threshold_mode == AD74115_DIN_THRESHOLD_MODE_AVDD) { in ad74115_get_dac_scale()
1018 *val = 196 * st->avdd_mv; in ad74115_get_dac_scale()
1032 if (chan->channel == AD74115_DAC_CH_MAIN) { in ad74115_get_dac_offset()
1033 if (chan->type == IIO_VOLTAGE && st->dac_bipolar) in ad74115_get_dac_offset()
1034 *val = -AD74115_DAC_CODE_HALF; in ad74115_get_dac_offset()
1038 if (st->din_threshold_mode == AD74115_DIN_THRESHOLD_MODE_AVDD) in ad74115_get_dac_offset()
1039 *val = -48; in ad74115_get_dac_offset()
1041 *val = -38; in ad74115_get_dac_offset()
1052 ret = regmap_read(st->regmap, AD74115_ADC_CONFIG_REG, val); in ad74115_get_adc_range()
1065 unsigned int range, in ad74115_get_adc_resistance_scale() argument
1068 *val = ad74115_adc_gain_tbl[range][1] * AD74115_REF_RESISTOR_OHMS; in ad74115_get_adc_resistance_scale()
1069 *val2 = ad74115_adc_gain_tbl[range][0]; in ad74115_get_adc_resistance_scale()
1071 if (ad74115_adc_bipolar_tbl[range]) in ad74115_get_adc_resistance_scale()
1083 unsigned int range; in ad74115_get_adc_scale() local
1086 ret = ad74115_get_adc_range(st, chan->channel, &range); in ad74115_get_adc_scale()
1090 if (chan->type == IIO_RESISTANCE) in ad74115_get_adc_scale()
1091 return ad74115_get_adc_resistance_scale(st, range, val, val2); in ad74115_get_adc_scale()
1093 *val = ad74115_adc_conv_mul_tbl[range]; in ad74115_get_adc_scale()
1096 if (chan->type == IIO_CURRENT) in ad74115_get_adc_scale()
1103 unsigned int range, in ad74115_get_adc_resistance_offset() argument
1107 * ad74115_adc_gain_tbl[range][1]; in ad74115_get_adc_resistance_offset()
1111 if (ad74115_adc_bipolar_tbl[range]) in ad74115_get_adc_resistance_offset()
1112 *val -= AD74115_ADC_CODE_HALF; in ad74115_get_adc_resistance_offset()
1116 if (!st->rtd_mode_4_wire) { in ad74115_get_adc_resistance_offset()
1117 /* Add 0.2 Ohm to the final result for 3-wire RTD. */ in ad74115_get_adc_resistance_offset()
1118 unsigned int v = 2 * ad74115_adc_gain_tbl[range][0]; in ad74115_get_adc_resistance_offset()
1120 if (ad74115_adc_bipolar_tbl[range]) in ad74115_get_adc_resistance_offset()
1137 unsigned int range; in ad74115_get_adc_offset() local
1140 ret = ad74115_get_adc_range(st, chan->channel, &range); in ad74115_get_adc_offset()
1144 if (chan->type == IIO_RESISTANCE) in ad74115_get_adc_offset()
1145 return ad74115_get_adc_resistance_offset(st, range, val, val2); in ad74115_get_adc_offset()
1147 if (ad74115_adc_bipolar_tbl[range]) in ad74115_get_adc_offset()
1148 *val = -AD74115_ADC_CODE_HALF; in ad74115_get_adc_offset()
1149 else if (range == AD74115_ADC_RANGE_2_5V_NEG) in ad74115_get_adc_offset()
1150 *val = -AD74115_ADC_CODE_MAX; in ad74115_get_adc_offset()
1166 if (chan->output) in ad74115_read_raw()
1167 return ad74115_get_dac_code(st, chan->channel, val); in ad74115_read_raw()
1169 return ad74115_get_adc_code(indio_dev, chan->channel, val); in ad74115_read_raw()
1171 ret = ad74115_get_adc_code(indio_dev, chan->channel, val); in ad74115_read_raw()
1177 if (chan->output) in ad74115_read_raw()
1182 if (chan->output) in ad74115_read_raw()
1187 if (chan->output) in ad74115_read_raw()
1190 return ad74115_get_adc_rate(st, chan->channel, val); in ad74115_read_raw()
1192 return -EINVAL; in ad74115_read_raw()
1204 if (!chan->output) in ad74115_write_raw()
1205 return -EINVAL; in ad74115_write_raw()
1207 return ad74115_set_dac_code(st, chan->channel, val); in ad74115_write_raw()
1209 if (chan->output) in ad74115_write_raw()
1212 return ad74115_set_adc_rate(st, chan->channel, val); in ad74115_write_raw()
1214 return -EINVAL; in ad74115_write_raw()
1224 if (chan->output) { in ad74115_read_avail()
1236 return -EINVAL; in ad74115_read_avail()
1246 return regmap_read(st->regmap, reg, readval); in ad74115_reg_access()
1248 return regmap_write(st->regmap, reg, writeval); in ad74115_reg_access()
1264 .output = 1, \
1265 .scan_index = -1, \
1374 .name = "adi,gpio" __stringify(i) "-mode", \
1389 AD74115_FW_PROP_BOOL("adi,digital-input-threshold-mode-fixed",
1393 AD74115_FW_PROP_BOOL("adi,dac-bipolar", AD74115_OUTPUT_CONFIG_REG, BIT(7));
1396 AD74115_FW_PROP("adi,ch-func", AD74115_CH_FUNC_MAX,
1400 AD74115_FW_PROP_BOOL("adi,4-wire-rtd", AD74115_RTD3W4W_CONFIG_REG, BIT(3));
1403 AD74115_FW_PROP_BOOL("adi,digital-input-sink-range-high",
1407 AD74115_FW_PROP_TBL("adi,ext2-burnout-current-nanoamp",
1412 AD74115_FW_PROP_TBL("adi,ext1-burnout-current-nanoamp",
1417 AD74115_FW_PROP_TBL("adi,viout-burnout-current-nanoamp",
1422 AD74115_FW_PROP("adi,conv2-mux", 3,
1425 AD74115_FW_PROP_BOOL_NEG("adi,sense-agnd-buffer-low-power",
1427 AD74115_FW_PROP_BOOL_NEG("adi,lf-buffer-low-power",
1429 AD74115_FW_PROP_BOOL_NEG("adi,hf-buffer-low-power",
1431 AD74115_FW_PROP_BOOL_NEG("adi,ext2-buffer-low-power",
1433 AD74115_FW_PROP_BOOL_NEG("adi,ext1-buffer-low-power",
1436 AD74115_FW_PROP_BOOL("adi,comparator-invert",
1438 AD74115_FW_PROP_BOOL("adi,digital-input-debounce-mode-counter-reset",
1441 AD74115_FW_PROP_BOOL("adi,digital-input-unbuffered",
1443 AD74115_FW_PROP_BOOL("adi,digital-input-short-circuit-detection",
1445 AD74115_FW_PROP_BOOL("adi,digital-input-open-circuit-detection",
1448 AD74115_FW_PROP_BOOL("adi,dac-current-limit-low",
1451 AD74115_FW_PROP_BOOL("adi,3-wire-rtd-excitation-swap",
1453 AD74115_FW_PROP_TBL("adi,rtd-excitation-current-microamp",
1457 AD74115_FW_PROP_BOOL("adi,ext2-burnout-current-polarity-sourcing",
1459 AD74115_FW_PROP_BOOL("adi,ext1-burnout-current-polarity-sourcing",
1461 AD74115_FW_PROP_BOOL("adi,viout-burnout-current-polarity-sourcing",
1464 AD74115_FW_PROP_BOOL("adi,charge-pump",
1471 struct device *dev = &st->spi->dev; in ad74115_apply_fw_prop()
1475 if (prop->is_boolean) { in ad74115_apply_fw_prop()
1476 val = device_property_read_bool(dev, prop->name); in ad74115_apply_fw_prop()
1478 ret = device_property_read_u32(dev, prop->name, &val); in ad74115_apply_fw_prop()
1479 if (ret && prop->lookup_tbl) in ad74115_apply_fw_prop()
1480 val = prop->lookup_tbl[0]; in ad74115_apply_fw_prop()
1485 if (prop->negate) in ad74115_apply_fw_prop()
1488 if (prop->lookup_tbl) in ad74115_apply_fw_prop()
1489 ret = _ad74115_find_tbl_index(prop->lookup_tbl, in ad74115_apply_fw_prop()
1490 prop->lookup_tbl_len, val, &val); in ad74115_apply_fw_prop()
1491 else if (prop->max && val > prop->max) in ad74115_apply_fw_prop()
1492 ret = -EINVAL; in ad74115_apply_fw_prop()
1497 return dev_err_probe(dev, -EINVAL, in ad74115_apply_fw_prop()
1499 val, prop->name); in ad74115_apply_fw_prop()
1501 WARN(!prop->mask, "Prop %s mask is empty\n", prop->name); in ad74115_apply_fw_prop()
1503 val = (val << __ffs(prop->mask)) & prop->mask; in ad74115_apply_fw_prop()
1505 return regmap_update_bits(st->regmap, prop->reg, prop->mask, val); in ad74115_apply_fw_prop()
1511 const char *prop_name = "adi,conv2-range-microvolt"; in ad74115_setup_adc_conv2_range()
1516 struct device *dev = &st->spi->dev; in ad74115_setup_adc_conv2_range()
1527 return dev_err_probe(dev, -EINVAL, in ad74115_setup_adc_conv2_range()
1531 return regmap_update_bits(st->regmap, AD74115_ADC_CONFIG_REG, in ad74115_setup_adc_conv2_range()
1539 struct device *dev = &st->spi->dev; in ad74115_setup_iio_channels()
1543 indio_dev->num_channels, GFP_KERNEL); in ad74115_setup_iio_channels()
1545 return -ENOMEM; in ad74115_setup_iio_channels()
1547 indio_dev->channels = channels; in ad74115_setup_iio_channels()
1549 memcpy(channels, ad74115_channels_map[st->ch_func].channels, in ad74115_setup_iio_channels()
1550 sizeof(*channels) * ad74115_channels_map[st->ch_func].num_channels); in ad74115_setup_iio_channels()
1552 if (channels[0].output && channels[0].channel == AD74115_DAC_CH_MAIN && in ad74115_setup_iio_channels()
1553 channels[0].type == IIO_VOLTAGE && !st->dac_hart_slew) { in ad74115_setup_iio_channels()
1563 struct device *dev = &st->spi->dev; in ad74115_setup_gpio_chip()
1565 if (!st->gpio_valid_mask) in ad74115_setup_gpio_chip()
1568 st->gc = (struct gpio_chip) { in ad74115_setup_gpio_chip()
1571 .base = -1, in ad74115_setup_gpio_chip()
1583 return devm_gpiochip_add_data(dev, &st->gc, st); in ad74115_setup_gpio_chip()
1588 struct device *dev = &st->spi->dev; in ad74115_setup_comp_gpio_chip()
1592 ret = regmap_read(st->regmap, AD74115_DIN_CONFIG1_REG, &val); in ad74115_setup_comp_gpio_chip()
1599 st->comp_gc = (struct gpio_chip) { in ad74115_setup_comp_gpio_chip()
1602 .base = -1, in ad74115_setup_comp_gpio_chip()
1611 return devm_gpiochip_add_data(dev, &st->comp_gc, st); in ad74115_setup_comp_gpio_chip()
1617 struct device *dev = &st->spi->dev; in ad74115_setup()
1626 indio_dev->num_channels += ad74115_channels_map[val].num_channels; in ad74115_setup()
1627 st->ch_func = val; in ad74115_setup()
1633 val = device_property_read_bool(dev, "adi,dac-hart-slew"); in ad74115_setup()
1635 st->dac_hart_slew = val; in ad74115_setup()
1637 ret = regmap_update_bits(st->regmap, AD74115_OUTPUT_CONFIG_REG, in ad74115_setup()
1650 ret = device_property_read_u32(dev, "adi,digital-input-sink-microamp", &val); in ad74115_setup()
1660 ret = regmap_update_bits(st->regmap, AD74115_DIN_CONFIG1_REG, in ad74115_setup()
1671 if (val == AD74115_DIN_THRESHOLD_MODE_AVDD && !st->avdd_mv) in ad74115_setup()
1672 return dev_err_probe(dev, -EINVAL, in ad74115_setup()
1675 st->din_threshold_mode = val; in ad74115_setup()
1681 st->dac_bipolar = val; in ad74115_setup()
1687 st->rtd_mode_4_wire = val; in ad74115_setup()
1694 ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG, in ad74115_setup()
1706 ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG, in ad74115_setup()
1718 ret = regmap_update_bits(st->regmap, AD74115_BURNOUT_CONFIG_REG, in ad74115_setup()
1731 st->gpio_valid_mask |= BIT(i); in ad74115_setup()
1753 struct device *dev = &st->spi->dev; in ad74115_reset()
1767 ret = regmap_write(st->regmap, AD74115_CMD_KEY_REG, in ad74115_reset()
1772 ret = regmap_write(st->regmap, AD74115_CMD_KEY_REG, in ad74115_reset()
1786 struct device *dev = &st->spi->dev; in ad74115_setup_trigger()
1789 st->irq = fwnode_irq_get_byname(dev_fwnode(dev), "adc_rdy"); in ad74115_setup_trigger()
1791 if (st->irq == -EPROBE_DEFER) in ad74115_setup_trigger()
1792 return -EPROBE_DEFER; in ad74115_setup_trigger()
1794 if (st->irq < 0) { in ad74115_setup_trigger()
1795 st->irq = 0; in ad74115_setup_trigger()
1799 ret = devm_request_irq(dev, st->irq, ad74115_adc_data_interrupt, in ad74115_setup_trigger()
1804 st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", AD74115_NAME, in ad74115_setup_trigger()
1806 if (!st->trig) in ad74115_setup_trigger()
1807 return -ENOMEM; in ad74115_setup_trigger()
1809 st->trig->ops = &ad74115_trigger_ops; in ad74115_setup_trigger()
1810 iio_trigger_set_drvdata(st->trig, st); in ad74115_setup_trigger()
1812 ret = devm_iio_trigger_register(dev, st->trig); in ad74115_setup_trigger()
1816 indio_dev->trig = iio_trigger_get(st->trig); in ad74115_setup_trigger()
1826 struct device *dev = &spi->dev; in ad74115_probe()
1833 return -ENOMEM; in ad74115_probe()
1837 st->spi = spi; in ad74115_probe()
1838 mutex_init(&st->lock); in ad74115_probe()
1839 init_completion(&st->adc_data_completion); in ad74115_probe()
1841 indio_dev->name = AD74115_NAME; in ad74115_probe()
1842 indio_dev->modes = INDIO_DIRECT_MODE; in ad74115_probe()
1843 indio_dev->info = &ad74115_info; in ad74115_probe()
1856 st->avdd_mv = ret / 1000; in ad74115_probe()
1864 st->regmap = devm_regmap_init(dev, NULL, st, &ad74115_regmap_config); in ad74115_probe()
1865 if (IS_ERR(st->regmap)) in ad74115_probe()
1866 return PTR_ERR(st->regmap); in ad74115_probe()