Lines Matching full:adc

7  * specific-purpose and general purpose ADC converters and channels.
13 #include <linux/iio/adc/qcom-vadc-common.h>
27 * Qualcomm tree. Their kernel has two out-of-tree drivers for the ADC:
29 * drivers/hwmon/pm8xxx-adc.c
57 /* Proper ADC registers */
99 * On a later ADC the decimation factors are defined as
167 * ADC code to the value that IIO expects, in uV or millicelsius
307 * include/linux/mfd/pm8xxx/pm8xxx-adc.h
369 * struct pm8xxx_chan_info - ADC channel information
417 struct pm8xxx_xoadc *adc = iio_priv(indio_dev); in pm8xxx_eoc_irq() local
419 complete(&adc->complete); in pm8xxx_eoc_irq()
425 pm8xxx_get_channel(struct pm8xxx_xoadc *adc, u8 chan) in pm8xxx_get_channel() argument
429 for (i = 0; i < adc->nchans; i++) { in pm8xxx_get_channel()
430 struct pm8xxx_chan_info *ch = &adc->chans[i]; in pm8xxx_get_channel()
437 static int pm8xxx_read_channel_rsv(struct pm8xxx_xoadc *adc, in pm8xxx_read_channel_rsv() argument
447 dev_dbg(adc->dev, "read channel \"%s\", amux %d, prescale/mux: %d, rsv %d\n", in pm8xxx_read_channel_rsv()
450 mutex_lock(&adc->lock); in pm8xxx_read_channel_rsv()
455 ret = regmap_write(adc->map, ADC_ARB_USRP_AMUX_CNTRL, val); in pm8xxx_read_channel_rsv()
462 if (adc->variant->broken_ratiometric && !force_ratiometric) { in pm8xxx_read_channel_rsv()
492 ret = regmap_update_bits(adc->map, in pm8xxx_read_channel_rsv()
499 ret = regmap_write(adc->map, ADC_ARB_USRP_ANA_PARAM, in pm8xxx_read_channel_rsv()
505 ret = regmap_write(adc->map, ADC_ARB_USRP_DIG_PARAM, in pm8xxx_read_channel_rsv()
512 ret = regmap_write(adc->map, ADC_ARB_USRP_ANA_PARAM, in pm8xxx_read_channel_rsv()
518 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, in pm8xxx_read_channel_rsv()
522 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, in pm8xxx_read_channel_rsv()
529 reinit_completion(&adc->complete); in pm8xxx_read_channel_rsv()
530 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, in pm8xxx_read_channel_rsv()
537 ret = wait_for_completion_timeout(&adc->complete, in pm8xxx_read_channel_rsv()
540 dev_err(adc->dev, "conversion timed out\n"); in pm8xxx_read_channel_rsv()
545 ret = regmap_read(adc->map, ADC_ARB_USRP_DATA0, &val); in pm8xxx_read_channel_rsv()
549 ret = regmap_read(adc->map, ADC_ARB_USRP_DATA1, &val); in pm8xxx_read_channel_rsv()
555 /* Turn off the ADC by setting the arbiter to 0 twice */ in pm8xxx_read_channel_rsv()
556 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, 0); in pm8xxx_read_channel_rsv()
559 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, 0); in pm8xxx_read_channel_rsv()
564 mutex_unlock(&adc->lock); in pm8xxx_read_channel_rsv()
568 static int pm8xxx_read_channel(struct pm8xxx_xoadc *adc, in pm8xxx_read_channel() argument
577 return pm8xxx_read_channel_rsv(adc, ch, 0xff, adc_code, false); in pm8xxx_read_channel()
580 static int pm8xxx_calibrate_device(struct pm8xxx_xoadc *adc) in pm8xxx_calibrate_device() argument
589 adc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV; in pm8xxx_calibrate_device()
590 adc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE; in pm8xxx_calibrate_device()
593 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_125V); in pm8xxx_calibrate_device()
596 ret = pm8xxx_read_channel(adc, ch, &read_1250v); in pm8xxx_calibrate_device()
598 dev_err(adc->dev, "could not read 1.25V reference channel\n"); in pm8xxx_calibrate_device()
601 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_INTERNAL); in pm8xxx_calibrate_device()
604 ret = pm8xxx_read_channel(adc, ch, &read_0625v); in pm8xxx_calibrate_device()
606 dev_err(adc->dev, "could not read 0.625V reference channel\n"); in pm8xxx_calibrate_device()
610 dev_err(adc->dev, "read same ADC code for 1.25V and 0.625V\n"); in pm8xxx_calibrate_device()
614 adc->graph[VADC_CALIB_ABSOLUTE].dy = read_1250v - read_0625v; in pm8xxx_calibrate_device()
615 adc->graph[VADC_CALIB_ABSOLUTE].gnd = read_0625v; in pm8xxx_calibrate_device()
617 dev_info(adc->dev, "absolute calibration dx = %d uV, dy = %d units\n", in pm8xxx_calibrate_device()
618 VADC_ABSOLUTE_RANGE_UV, adc->graph[VADC_CALIB_ABSOLUTE].dy); in pm8xxx_calibrate_device()
621 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_MUXOFF); in pm8xxx_calibrate_device()
624 ret = pm8xxx_read_channel_rsv(adc, ch, AMUX_RSV5, in pm8xxx_calibrate_device()
627 dev_err(adc->dev, "could not read MUXOFF reference channel\n"); in pm8xxx_calibrate_device()
630 ret = pm8xxx_read_channel_rsv(adc, ch, AMUX_RSV4, in pm8xxx_calibrate_device()
633 dev_err(adc->dev, "could not read MUXOFF reference channel\n"); in pm8xxx_calibrate_device()
636 adc->graph[VADC_CALIB_RATIOMETRIC].dy = in pm8xxx_calibrate_device()
638 adc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_nomux_rsv4; in pm8xxx_calibrate_device()
640 dev_info(adc->dev, "ratiometric calibration dx = %d, dy = %d units\n", in pm8xxx_calibrate_device()
642 adc->graph[VADC_CALIB_RATIOMETRIC].dy); in pm8xxx_calibrate_device()
651 struct pm8xxx_xoadc *adc = iio_priv(indio_dev); in pm8xxx_read_raw() local
658 ch = pm8xxx_get_channel(adc, chan->address); in pm8xxx_read_raw()
660 dev_err(adc->dev, "no such channel %lu\n", in pm8xxx_read_raw()
664 ret = pm8xxx_read_channel(adc, ch, &adc_code); in pm8xxx_read_raw()
669 &adc->graph[ch->calibration], in pm8xxx_read_raw()
678 ch = pm8xxx_get_channel(adc, chan->address); in pm8xxx_read_raw()
680 dev_err(adc->dev, "no such channel %lu\n", in pm8xxx_read_raw()
684 ret = pm8xxx_read_channel(adc, ch, &adc_code); in pm8xxx_read_raw()
698 struct pm8xxx_xoadc *adc = iio_priv(indio_dev); in pm8xxx_of_xlate() local
719 for (i = 0; i < adc->nchans; i++) in pm8xxx_of_xlate()
720 if (adc->chans[i].hwchan->pre_scale_mux == pre_scale_mux && in pm8xxx_of_xlate()
721 adc->chans[i].hwchan->amux_channel == amux_channel) in pm8xxx_of_xlate()
822 static int pm8xxx_xoadc_parse_channels(struct pm8xxx_xoadc *adc, in pm8xxx_xoadc_parse_channels() argument
830 adc->nchans = of_get_available_child_count(np); in pm8xxx_xoadc_parse_channels()
831 if (!adc->nchans) { in pm8xxx_xoadc_parse_channels()
832 dev_err(adc->dev, "no channel children\n"); in pm8xxx_xoadc_parse_channels()
835 dev_dbg(adc->dev, "found %d ADC channels\n", adc->nchans); in pm8xxx_xoadc_parse_channels()
837 adc->iio_chans = devm_kcalloc(adc->dev, adc->nchans, in pm8xxx_xoadc_parse_channels()
838 sizeof(*adc->iio_chans), GFP_KERNEL); in pm8xxx_xoadc_parse_channels()
839 if (!adc->iio_chans) in pm8xxx_xoadc_parse_channels()
842 adc->chans = devm_kcalloc(adc->dev, adc->nchans, in pm8xxx_xoadc_parse_channels()
843 sizeof(*adc->chans), GFP_KERNEL); in pm8xxx_xoadc_parse_channels()
844 if (!adc->chans) in pm8xxx_xoadc_parse_channels()
849 ch = &adc->chans[i]; in pm8xxx_xoadc_parse_channels()
850 ret = pm8xxx_xoadc_parse_channel(adc->dev, child, in pm8xxx_xoadc_parse_channels()
851 adc->variant->channels, in pm8xxx_xoadc_parse_channels()
852 &adc->iio_chans[i], in pm8xxx_xoadc_parse_channels()
862 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_125V); in pm8xxx_xoadc_parse_channels()
864 dev_err(adc->dev, "missing 1.25V reference channel\n"); in pm8xxx_xoadc_parse_channels()
867 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_INTERNAL); in pm8xxx_xoadc_parse_channels()
869 dev_err(adc->dev, "missing 0.625V reference channel\n"); in pm8xxx_xoadc_parse_channels()
872 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_MUXOFF); in pm8xxx_xoadc_parse_channels()
874 dev_err(adc->dev, "missing MUXOFF reference channel\n"); in pm8xxx_xoadc_parse_channels()
884 struct pm8xxx_xoadc *adc; in pm8xxx_xoadc_probe() local
895 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc)); in pm8xxx_xoadc_probe()
900 adc = iio_priv(indio_dev); in pm8xxx_xoadc_probe()
901 adc->dev = dev; in pm8xxx_xoadc_probe()
902 adc->variant = variant; in pm8xxx_xoadc_probe()
903 init_completion(&adc->complete); in pm8xxx_xoadc_probe()
904 mutex_init(&adc->lock); in pm8xxx_xoadc_probe()
906 ret = pm8xxx_xoadc_parse_channels(adc, np); in pm8xxx_xoadc_probe()
915 adc->map = map; in pm8xxx_xoadc_probe()
918 adc->vref = devm_regulator_get(dev, "xoadc-ref"); in pm8xxx_xoadc_probe()
919 if (IS_ERR(adc->vref)) { in pm8xxx_xoadc_probe()
921 return PTR_ERR(adc->vref); in pm8xxx_xoadc_probe()
923 ret = regulator_enable(adc->vref); in pm8xxx_xoadc_probe()
939 indio_dev->channels = adc->iio_chans; in pm8xxx_xoadc_probe()
940 indio_dev->num_channels = adc->nchans; in pm8xxx_xoadc_probe()
946 ret = pm8xxx_calibrate_device(adc); in pm8xxx_xoadc_probe()
957 regulator_disable(adc->vref); in pm8xxx_xoadc_probe()
965 struct pm8xxx_xoadc *adc = iio_priv(indio_dev); in pm8xxx_xoadc_remove() local
969 regulator_disable(adc->vref); in pm8xxx_xoadc_remove()
999 .compatible = "qcom,pm8018-adc",
1003 .compatible = "qcom,pm8038-adc",
1007 .compatible = "qcom,pm8058-adc",
1011 .compatible = "qcom,pm8921-adc",
1020 .name = "pm8xxx-adc",