Lines Matching defs:adc
30 * drivers/hwmon/pm8xxx-adc.c
308 * include/linux/mfd/pm8xxx/pm8xxx-adc.h
418 struct pm8xxx_xoadc *adc = iio_priv(indio_dev);
420 complete(&adc->complete);
426 pm8xxx_get_channel(struct pm8xxx_xoadc *adc, u8 chan)
430 for (i = 0; i < adc->nchans; i++) {
431 struct pm8xxx_chan_info *ch = &adc->chans[i];
438 static int pm8xxx_read_channel_rsv(struct pm8xxx_xoadc *adc,
448 dev_dbg(adc->dev, "read channel \"%s\", amux %d, prescale/mux: %d, rsv %d\n",
451 mutex_lock(&adc->lock);
456 ret = regmap_write(adc->map, ADC_ARB_USRP_AMUX_CNTRL, val);
463 if (adc->variant->broken_ratiometric && !force_ratiometric) {
493 ret = regmap_update_bits(adc->map,
500 ret = regmap_write(adc->map, ADC_ARB_USRP_ANA_PARAM,
506 ret = regmap_write(adc->map, ADC_ARB_USRP_DIG_PARAM,
513 ret = regmap_write(adc->map, ADC_ARB_USRP_ANA_PARAM,
519 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL,
523 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL,
530 reinit_completion(&adc->complete);
531 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL,
538 ret = wait_for_completion_timeout(&adc->complete,
541 dev_err(adc->dev, "conversion timed out\n");
546 ret = regmap_read(adc->map, ADC_ARB_USRP_DATA0, &val);
550 ret = regmap_read(adc->map, ADC_ARB_USRP_DATA1, &val);
557 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, 0);
560 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, 0);
565 mutex_unlock(&adc->lock);
569 static int pm8xxx_read_channel(struct pm8xxx_xoadc *adc,
578 return pm8xxx_read_channel_rsv(adc, ch, 0xff, adc_code, false);
581 static int pm8xxx_calibrate_device(struct pm8xxx_xoadc *adc)
590 adc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV;
591 adc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE;
594 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_125V);
597 ret = pm8xxx_read_channel(adc, ch, &read_1250v);
599 dev_err(adc->dev, "could not read 1.25V reference channel\n");
602 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_INTERNAL);
605 ret = pm8xxx_read_channel(adc, ch, &read_0625v);
607 dev_err(adc->dev, "could not read 0.625V reference channel\n");
611 dev_err(adc->dev, "read same ADC code for 1.25V and 0.625V\n");
615 adc->graph[VADC_CALIB_ABSOLUTE].dy = read_1250v - read_0625v;
616 adc->graph[VADC_CALIB_ABSOLUTE].gnd = read_0625v;
618 dev_info(adc->dev, "absolute calibration dx = %d uV, dy = %d units\n",
619 VADC_ABSOLUTE_RANGE_UV, adc->graph[VADC_CALIB_ABSOLUTE].dy);
622 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_MUXOFF);
625 ret = pm8xxx_read_channel_rsv(adc, ch, AMUX_RSV5,
628 dev_err(adc->dev, "could not read MUXOFF reference channel\n");
631 ret = pm8xxx_read_channel_rsv(adc, ch, AMUX_RSV4,
634 dev_err(adc->dev, "could not read MUXOFF reference channel\n");
637 adc->graph[VADC_CALIB_RATIOMETRIC].dy =
639 adc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_nomux_rsv4;
641 dev_info(adc->dev, "ratiometric calibration dx = %d, dy = %d units\n",
643 adc->graph[VADC_CALIB_RATIOMETRIC].dy);
652 struct pm8xxx_xoadc *adc = iio_priv(indio_dev);
659 ch = pm8xxx_get_channel(adc, chan->address);
661 dev_err(adc->dev, "no such channel %lu\n",
665 ret = pm8xxx_read_channel(adc, ch, &adc_code);
670 &adc->graph[ch->calibration],
679 ch = pm8xxx_get_channel(adc, chan->address);
681 dev_err(adc->dev, "no such channel %lu\n",
685 ret = pm8xxx_read_channel(adc, ch, &adc_code);
699 struct pm8xxx_xoadc *adc = iio_priv(indio_dev);
720 for (i = 0; i < adc->nchans; i++)
721 if (adc->chans[i].hwchan->pre_scale_mux == pre_scale_mux &&
722 adc->chans[i].hwchan->amux_channel == amux_channel)
823 static int pm8xxx_xoadc_parse_channels(struct pm8xxx_xoadc *adc,
831 adc->nchans = of_get_available_child_count(np);
832 if (!adc->nchans) {
833 dev_err(adc->dev, "no channel children\n");
836 dev_dbg(adc->dev, "found %d ADC channels\n", adc->nchans);
838 adc->iio_chans = devm_kcalloc(adc->dev, adc->nchans,
839 sizeof(*adc->iio_chans), GFP_KERNEL);
840 if (!adc->iio_chans)
843 adc->chans = devm_kcalloc(adc->dev, adc->nchans,
844 sizeof(*adc->chans), GFP_KERNEL);
845 if (!adc->chans)
850 ch = &adc->chans[i];
851 ret = pm8xxx_xoadc_parse_channel(adc->dev, child,
852 adc->variant->channels,
853 &adc->iio_chans[i],
863 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_125V);
865 dev_err(adc->dev, "missing 1.25V reference channel\n");
868 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_INTERNAL);
870 dev_err(adc->dev, "missing 0.625V reference channel\n");
873 ch = pm8xxx_get_channel(adc, PM8XXX_CHANNEL_MUXOFF);
875 dev_err(adc->dev, "missing MUXOFF reference channel\n");
885 struct pm8xxx_xoadc *adc;
896 indio_dev = devm_iio_device_alloc(dev, sizeof(*adc));
901 adc = iio_priv(indio_dev);
902 adc->dev = dev;
903 adc->variant = variant;
904 init_completion(&adc->complete);
905 mutex_init(&adc->lock);
907 ret = pm8xxx_xoadc_parse_channels(adc, np);
916 adc->map = map;
919 adc->vref = devm_regulator_get(dev, "xoadc-ref");
920 if (IS_ERR(adc->vref)) {
922 return PTR_ERR(adc->vref);
924 ret = regulator_enable(adc->vref);
940 indio_dev->channels = adc->iio_chans;
941 indio_dev->num_channels = adc->nchans;
947 ret = pm8xxx_calibrate_device(adc);
958 regulator_disable(adc->vref);
966 struct pm8xxx_xoadc *adc = iio_priv(indio_dev);
970 regulator_disable(adc->vref);
1000 .compatible = "qcom,pm8018-adc",
1004 .compatible = "qcom,pm8038-adc",
1008 .compatible = "qcom,pm8058-adc",
1012 .compatible = "qcom,pm8921-adc",
1021 .name = "pm8xxx-adc",