Lines Matching +full:spi +full:- +full:hv
1 // SPDX-License-Identifier: GPL-2.0
20 #include <linux/spi/spi.h>
23 #include <linux/iio/buffer-dma.h>
24 #include <linux/iio/buffer-dmaengine.h>
77 struct spi_device *spi; member
96 ret = regmap_set_bits(state->regmap, AD8460_CTRL_REG(0x00), in ad8460_hv_reset()
103 return regmap_clear_bits(state->regmap, AD8460_CTRL_REG(0x00), in ad8460_hv_reset()
109 struct device *dev = &state->spi->dev; in ad8460_reset()
124 return regmap_write(state->regmap, AD8460_CTRL_REG(0x03), 1); in ad8460_reset()
131 ret = regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x02), in ad8460_enable_apg_mode()
137 return regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x00), in ad8460_enable_apg_mode()
146 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x0E), &val); in ad8460_read_shutdown_flag()
158 ret = regmap_bulk_read(state->regmap, AD8460_HVDAC_DATA_WORD(index), in ad8460_get_hvdac_word()
159 &state->spi_tx_buf, AD8460_DATA_BYTE_WORD_LENGTH); in ad8460_get_hvdac_word()
163 *val = le16_to_cpu(state->spi_tx_buf); in ad8460_get_hvdac_word()
170 state->spi_tx_buf = cpu_to_le16(FIELD_PREP(AD8460_DATA_BYTE_FULL_MSK, val)); in ad8460_set_hvdac_word()
172 return regmap_bulk_write(state->regmap, AD8460_HVDAC_DATA_WORD(index), in ad8460_set_hvdac_word()
173 &state->spi_tx_buf, AD8460_DATA_BYTE_WORD_LENGTH); in ad8460_set_hvdac_word()
202 guard(mutex)(&state->lock); in ad8460_dac_input_write()
214 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x02), ®); in ad8460_read_symbol()
233 guard(mutex)(&state->lock); in ad8460_write_symbol()
235 return regmap_update_bits(state->regmap, in ad8460_write_symbol()
248 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x02), ®); in ad8460_read_toggle_en()
267 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) in ad8460_write_toggle_en()
279 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x01), ®); in ad8460_read_powerdown()
299 guard(mutex)(&state->lock); in ad8460_write_powerdown()
302 * If powerdown is set, HVDAC is enabled and the HV driver is in ad8460_write_powerdown()
305 * as well as the HV driver. Quiescent current decreases and ouput is in ad8460_write_powerdown()
309 ret = regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x01), in ad8460_write_powerdown()
327 ret = regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x00), in ad8460_write_powerdown()
361 guard(mutex)(&state->lock); in ad8460_set_sample()
366 return regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x02), in ad8460_set_sample()
375 return regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x08 + fault), in ad8460_set_fault_threshold()
387 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x08 + fault), &val); in ad8460_get_fault_threshold()
399 return regmap_update_bits(state->regmap, AD8460_CTRL_REG(0x08 + fault), in ad8460_set_fault_threshold_en()
410 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x08 + fault), &val); in ad8460_get_fault_threshold_en()
427 switch (chan->type) { in ad8460_write_raw()
429 iio_device_claim_direct_scoped(return -EBUSY, indio_dev) in ad8460_write_raw()
433 return regmap_write(state->regmap, AD8460_CTRL_REG(0x04), in ad8460_write_raw()
436 return -EINVAL; in ad8460_write_raw()
439 return -EINVAL; in ad8460_write_raw()
451 switch (chan->type) { in ad8460_read_raw()
453 scoped_guard(mutex, &state->lock) { in ad8460_read_raw()
461 ret = regmap_read(state->regmap, AD8460_CTRL_REG(0x04), in ad8460_read_raw()
468 ret = iio_read_channel_raw(state->tmp_adc_channel, &data); in ad8460_read_raw()
474 return -EINVAL; in ad8460_read_raw()
477 *val = clk_get_rate(state->sync_clk); in ad8460_read_raw()
481 * vCONV = vNOMINAL_SPAN * (DAC_CODE / 2**14) - 40V in ad8460_read_raw()
482 * vMAX = vNOMINAL_SPAN * (2**14 / 2**14) - 40V in ad8460_read_raw()
483 * vMIN = vNOMINAL_SPAN * (0 / 2**14) - 40V in ad8460_read_raw()
485 * vSPAN = vADJ_MAX - vADJ_MIN in ad8460_read_raw()
486 * See datasheet page 49, section FULL-SCALE REDUCTION in ad8460_read_raw()
488 *val = AD8460_NOMINAL_VOLTAGE_SPAN * 2000 * state->refio_1p2v_mv; in ad8460_read_raw()
489 *val2 = state->ext_resistor_ohms * 1200; in ad8460_read_raw()
492 return -EINVAL; in ad8460_read_raw()
506 return -EINVAL; in ad8460_select_fault_type()
515 return -EINVAL; in ad8460_select_fault_type()
522 return -EINVAL; in ad8460_select_fault_type()
525 return -EINVAL; in ad8460_select_fault_type()
539 return -EINVAL; in ad8460_write_event_value()
542 return -EINVAL; in ad8460_write_event_value()
544 fault = ad8460_select_fault_type(chan->type, dir); in ad8460_write_event_value()
561 return -EINVAL; in ad8460_read_event_value()
564 return -EINVAL; in ad8460_read_event_value()
566 fault = ad8460_select_fault_type(chan->type, dir); in ad8460_read_event_value()
582 return -EINVAL; in ad8460_write_event_config()
584 fault = ad8460_select_fault_type(chan->type, dir); in ad8460_write_event_config()
601 return -EINVAL; in ad8460_read_event_config()
603 fault = ad8460_select_fault_type(chan->type, dir); in ad8460_read_event_config()
620 return regmap_read(state->regmap, reg, readval); in ad8460_reg_access()
622 return regmap_write(state->regmap, reg, writeval); in ad8460_reg_access()
755 .scan_index = -1, \
765 .scan_index = -1, \
791 static int ad8460_probe(struct spi_device *spi) in ad8460_probe() argument
793 struct device *dev = &spi->dev; in ad8460_probe()
799 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*state)); in ad8460_probe()
801 return -ENOMEM; in ad8460_probe()
805 indio_dev->name = "ad8460"; in ad8460_probe()
806 indio_dev->info = &ad8460_info; in ad8460_probe()
808 state->spi = spi; in ad8460_probe()
810 state->regmap = devm_regmap_init_spi(spi, &ad8460_regmap_config); in ad8460_probe()
811 if (IS_ERR(state->regmap)) in ad8460_probe()
812 return dev_err_probe(dev, PTR_ERR(state->regmap), in ad8460_probe()
815 ret = devm_mutex_init(dev, &state->lock); in ad8460_probe()
819 state->sync_clk = devm_clk_get_enabled(dev, NULL); in ad8460_probe()
820 if (IS_ERR(state->sync_clk)) in ad8460_probe()
821 return dev_err_probe(dev, PTR_ERR(state->sync_clk), in ad8460_probe()
824 state->tmp_adc_channel = devm_iio_channel_get(dev, "ad8460-tmp"); in ad8460_probe()
825 if (IS_ERR(state->tmp_adc_channel)) { in ad8460_probe()
826 if (PTR_ERR(state->tmp_adc_channel) == -EPROBE_DEFER) in ad8460_probe()
827 return -EPROBE_DEFER; in ad8460_probe()
828 indio_dev->channels = ad8460_channels; in ad8460_probe()
829 indio_dev->num_channels = ARRAY_SIZE(ad8460_channels); in ad8460_probe()
831 indio_dev->channels = ad8460_channels_with_tmp_adc; in ad8460_probe()
832 indio_dev->num_channels = ARRAY_SIZE(ad8460_channels_with_tmp_adc); in ad8460_probe()
842 if (ret < 0 && ret != -ENODEV) in ad8460_probe()
845 state->refio_1p2v_mv = ret == -ENODEV ? 1200 : ret / 1000; in ad8460_probe()
847 if (!in_range(state->refio_1p2v_mv, AD8460_MIN_VREFIO_UV / 1000, in ad8460_probe()
849 return dev_err_probe(dev, -EINVAL, in ad8460_probe()
851 state->refio_1p2v_mv, in ad8460_probe()
855 ret = device_property_read_u32(dev, "adi,external-resistor-ohms", in ad8460_probe()
856 &state->ext_resistor_ohms); in ad8460_probe()
858 state->ext_resistor_ohms = 2000; in ad8460_probe()
859 else if (!in_range(state->ext_resistor_ohms, AD8460_MIN_EXT_RESISTOR_OHMS, in ad8460_probe()
861 return dev_err_probe(dev, -EINVAL, in ad8460_probe()
863 state->ext_resistor_ohms, in ad8460_probe()
867 ret = device_property_read_u32_array(dev, "adi,range-microamp", in ad8460_probe()
871 regmap_write(state->regmap, AD8460_CTRL_REG(0x08), in ad8460_probe()
875 if (in_range(tmp[0], -AD8460_ABS_MAX_OVERCURRENT_UA, 0)) in ad8460_probe()
876 regmap_write(state->regmap, AD8460_CTRL_REG(0x09), in ad8460_probe()
881 ret = device_property_read_u32_array(dev, "adi,range-microvolt", in ad8460_probe()
885 regmap_write(state->regmap, AD8460_CTRL_REG(0x0A), in ad8460_probe()
889 if (in_range(tmp[0], -AD8460_ABS_MAX_OVERVOLTAGE_UV, 0)) in ad8460_probe()
890 regmap_write(state->regmap, AD8460_CTRL_REG(0x0B), in ad8460_probe()
895 ret = device_property_read_u32(dev, "adi,max-millicelsius", &temp); in ad8460_probe()
899 regmap_write(state->regmap, AD8460_CTRL_REG(0x0C), in ad8460_probe()
909 ret = regmap_clear_bits(state->regmap, AD8460_CTRL_REG(0x01), in ad8460_probe()
914 indio_dev->modes = INDIO_DIRECT_MODE; in ad8460_probe()
915 indio_dev->setup_ops = &ad8460_buffer_setup_ops; in ad8460_probe()
936 MODULE_DEVICE_TABLE(spi, ad8460_spi_match);