• Home
  • Raw
  • Download

Lines Matching +full:pre +full:- +full:scaling

6  * specific-purpose and general purpose ADC converters and channels.
23 #include "qcom-vadc-common.h"
27 * Qualcomm tree. Their kernel has two out-of-tree drivers for the ADC:
28 * drivers/misc/pmic8058-xoadc.c
29 * drivers/hwmon/pm8xxx-adc.c
138 * PM8058 AMUX premux scaling, two bits. This is done of the channel before
141 #define PM8058_AMUX_PRESCALE_0 0x0 /* No scaling on the signal */
142 #define PM8058_AMUX_PRESCALE_1 0x1 /* Unity scaling selected by the user */
155 * struct xoadc_channel - encodes channel properties and defaults
162 * @prescale: the channels have hard-coded prescale ratios defined
172 * selects the reference voltage for ratiometric scaling
185 * struct xoadc_variant - encodes the XOADC variant characteristics
188 * @broken_ratiometric: if the PMIC has broken ratiometric scaling (this
212 * _scale: scaling function type, this selects how the raw valued is mangled
228 * Taken from arch/arm/mach-msm/board-9615.c in the vendor tree:
245 * Taken from arch/arm/mach-msm/board-8930-pmic.c in the vendor tree:
270 * This was created by cross-referencing the vendor tree
271 * arch/arm/mach-msm/board-msm8x60.c msm_adc_channels_data[]
287 * 1-to-1 onto MPP5 thru 9, so naming them MPP5 thru MPP9 is
306 * The PM8921 has some pre-muxing on its channels, this comes from the vendor tree
307 * include/linux/mfd/pm8xxx/pm8xxx-adc.h
308 * board-flo-pmic.c (Nexus 7) and board-8064-pmic.c
324 /* FIXME: look into the scaling of this temperature */
329 /* Set scaling to 1/2 based on the name for these two */
369 * struct pm8xxx_chan_info - ADC channel information
371 * @hwchan: pointer to hardware channel information (muxing & scaling settings)
373 * @scale_fn_type: scaling function type
387 * struct pm8xxx_xoadc - state container for the XOADC
393 * @chans: the channel information per-channel, configured by the device tree
418 complete(&adc->complete); in pm8xxx_eoc_irq()
428 for (i = 0; i < adc->nchans; i++) { in pm8xxx_get_channel()
429 struct pm8xxx_chan_info *ch = &adc->chans[i]; in pm8xxx_get_channel()
430 if (ch->hwchan->amux_channel == chan) in pm8xxx_get_channel()
446 dev_dbg(adc->dev, "read channel \"%s\", amux %d, prescale/mux: %d, rsv %d\n", in pm8xxx_read_channel_rsv()
447 ch->name, ch->hwchan->amux_channel, ch->hwchan->pre_scale_mux, rsv); in pm8xxx_read_channel_rsv()
449 mutex_lock(&adc->lock); in pm8xxx_read_channel_rsv()
452 val = ch->hwchan->amux_channel << ADC_AMUX_SEL_SHIFT; in pm8xxx_read_channel_rsv()
453 val |= ch->hwchan->pre_scale_mux << ADC_AMUX_PREMUX_SHIFT; in pm8xxx_read_channel_rsv()
454 ret = regmap_write(adc->map, ADC_ARB_USRP_AMUX_CNTRL, val); in pm8xxx_read_channel_rsv()
461 if (adc->variant->broken_ratiometric && !force_ratiometric) { in pm8xxx_read_channel_rsv()
464 * reflected in the vendor tree drivers/misc/pmix8058-xoadc.c in pm8xxx_read_channel_rsv()
478 if (ch->hwchan->amux_channel == PM8XXX_CHANNEL_MUXOFF) in pm8xxx_read_channel_rsv()
484 rsvval = (ch->amux_ip_rsv << ADC_RSV_IP_SEL_SHIFT) | in pm8xxx_read_channel_rsv()
491 ret = regmap_update_bits(adc->map, in pm8xxx_read_channel_rsv()
498 ret = regmap_write(adc->map, ADC_ARB_USRP_ANA_PARAM, in pm8xxx_read_channel_rsv()
504 ret = regmap_write(adc->map, ADC_ARB_USRP_DIG_PARAM, in pm8xxx_read_channel_rsv()
507 ch->decimation << ADC_DIG_PARAM_DEC_SHIFT); in pm8xxx_read_channel_rsv()
511 ret = regmap_write(adc->map, ADC_ARB_USRP_ANA_PARAM, in pm8xxx_read_channel_rsv()
517 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, in pm8xxx_read_channel_rsv()
521 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, in pm8xxx_read_channel_rsv()
528 reinit_completion(&adc->complete); in pm8xxx_read_channel_rsv()
529 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, in pm8xxx_read_channel_rsv()
536 ret = wait_for_completion_timeout(&adc->complete, in pm8xxx_read_channel_rsv()
539 dev_err(adc->dev, "conversion timed out\n"); in pm8xxx_read_channel_rsv()
540 ret = -ETIMEDOUT; in pm8xxx_read_channel_rsv()
544 ret = regmap_read(adc->map, ADC_ARB_USRP_DATA0, &val); in pm8xxx_read_channel_rsv()
548 ret = regmap_read(adc->map, ADC_ARB_USRP_DATA1, &val); in pm8xxx_read_channel_rsv()
555 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, 0); in pm8xxx_read_channel_rsv()
558 ret = regmap_write(adc->map, ADC_ARB_USRP_CNTRL, 0); in pm8xxx_read_channel_rsv()
563 mutex_unlock(&adc->lock); in pm8xxx_read_channel_rsv()
588 adc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV; in pm8xxx_calibrate_device()
589 adc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE; in pm8xxx_calibrate_device()
594 return -ENODEV; in pm8xxx_calibrate_device()
597 dev_err(adc->dev, "could not read 1.25V reference channel\n"); in pm8xxx_calibrate_device()
598 return -ENODEV; in pm8xxx_calibrate_device()
602 return -ENODEV; in pm8xxx_calibrate_device()
605 dev_err(adc->dev, "could not read 0.625V reference channel\n"); in pm8xxx_calibrate_device()
606 return -ENODEV; in pm8xxx_calibrate_device()
609 dev_err(adc->dev, "read same ADC code for 1.25V and 0.625V\n"); in pm8xxx_calibrate_device()
610 return -ENODEV; in pm8xxx_calibrate_device()
613 adc->graph[VADC_CALIB_ABSOLUTE].dy = read_1250v - read_0625v; in pm8xxx_calibrate_device()
614 adc->graph[VADC_CALIB_ABSOLUTE].gnd = read_0625v; in pm8xxx_calibrate_device()
616 dev_info(adc->dev, "absolute calibration dx = %d uV, dy = %d units\n", in pm8xxx_calibrate_device()
617 VADC_ABSOLUTE_RANGE_UV, adc->graph[VADC_CALIB_ABSOLUTE].dy); in pm8xxx_calibrate_device()
622 return -ENODEV; in pm8xxx_calibrate_device()
626 dev_err(adc->dev, "could not read MUXOFF reference channel\n"); in pm8xxx_calibrate_device()
627 return -ENODEV; in pm8xxx_calibrate_device()
632 dev_err(adc->dev, "could not read MUXOFF reference channel\n"); in pm8xxx_calibrate_device()
633 return -ENODEV; in pm8xxx_calibrate_device()
635 adc->graph[VADC_CALIB_RATIOMETRIC].dy = in pm8xxx_calibrate_device()
636 read_nomux_rsv5 - read_nomux_rsv4; in pm8xxx_calibrate_device()
637 adc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_nomux_rsv4; in pm8xxx_calibrate_device()
639 dev_info(adc->dev, "ratiometric calibration dx = %d, dy = %d units\n", in pm8xxx_calibrate_device()
641 adc->graph[VADC_CALIB_RATIOMETRIC].dy); in pm8xxx_calibrate_device()
657 ch = pm8xxx_get_channel(adc, chan->address); in pm8xxx_read_raw()
659 dev_err(adc->dev, "no such channel %lu\n", in pm8xxx_read_raw()
660 chan->address); in pm8xxx_read_raw()
661 return -EINVAL; in pm8xxx_read_raw()
667 ret = qcom_vadc_scale(ch->hwchan->scale_fn_type, in pm8xxx_read_raw()
668 &adc->graph[ch->calibration], in pm8xxx_read_raw()
669 &ch->hwchan->prescale, in pm8xxx_read_raw()
670 (ch->calibration == VADC_CALIB_ABSOLUTE), in pm8xxx_read_raw()
677 ch = pm8xxx_get_channel(adc, chan->address); in pm8xxx_read_raw()
679 dev_err(adc->dev, "no such channel %lu\n", in pm8xxx_read_raw()
680 chan->address); in pm8xxx_read_raw()
681 return -EINVAL; in pm8xxx_read_raw()
690 return -EINVAL; in pm8xxx_read_raw()
706 if (iiospec->args_count != 2) { in pm8xxx_of_xlate()
707 dev_err(&indio_dev->dev, "wrong number of arguments for %s need 2 got %d\n", in pm8xxx_of_xlate()
708 iiospec->np->name, in pm8xxx_of_xlate()
709 iiospec->args_count); in pm8xxx_of_xlate()
710 return -EINVAL; in pm8xxx_of_xlate()
712 pre_scale_mux = (u8)iiospec->args[0]; in pm8xxx_of_xlate()
713 amux_channel = (u8)iiospec->args[1]; in pm8xxx_of_xlate()
714 dev_dbg(&indio_dev->dev, "pre scale/mux: %02x, amux: %02x\n", in pm8xxx_of_xlate()
718 for (i = 0; i < adc->nchans; i++) in pm8xxx_of_xlate()
719 if (adc->chans[i].hwchan->pre_scale_mux == pre_scale_mux && in pm8xxx_of_xlate()
720 adc->chans[i].hwchan->amux_channel == amux_channel) in pm8xxx_of_xlate()
723 return -EINVAL; in pm8xxx_of_xlate()
737 const char *name = np->name; in pm8xxx_xoadc_parse_channel()
746 dev_err(dev, "invalid pre scale/mux number %s\n", name); in pm8xxx_xoadc_parse_channel()
758 while (hwchan && hwchan->datasheet_name) { in pm8xxx_xoadc_parse_channel()
759 if (hwchan->pre_scale_mux == pre_scale_mux && in pm8xxx_xoadc_parse_channel()
760 hwchan->amux_channel == amux_channel) in pm8xxx_xoadc_parse_channel()
766 if (!hwchan->datasheet_name) { in pm8xxx_xoadc_parse_channel()
769 return -EINVAL; in pm8xxx_xoadc_parse_channel()
771 ch->name = name; in pm8xxx_xoadc_parse_channel()
772 ch->hwchan = hwchan; in pm8xxx_xoadc_parse_channel()
774 ch->calibration = VADC_CALIB_ABSOLUTE; in pm8xxx_xoadc_parse_channel()
776 ch->decimation = VADC_DEF_DECIMATION; in pm8xxx_xoadc_parse_channel()
779 ch->calibration = VADC_CALIB_RATIOMETRIC; in pm8xxx_xoadc_parse_channel()
782 return -EINVAL; in pm8xxx_xoadc_parse_channel()
786 return -EINVAL; in pm8xxx_xoadc_parse_channel()
799 ch->decimation = ret; in pm8xxx_xoadc_parse_channel()
802 iio_chan->channel = chid; in pm8xxx_xoadc_parse_channel()
803 iio_chan->address = hwchan->amux_channel; in pm8xxx_xoadc_parse_channel()
804 iio_chan->datasheet_name = hwchan->datasheet_name; in pm8xxx_xoadc_parse_channel()
805 iio_chan->type = hwchan->type; in pm8xxx_xoadc_parse_channel()
807 iio_chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | in pm8xxx_xoadc_parse_channel()
809 iio_chan->indexed = 1; in pm8xxx_xoadc_parse_channel()
814 hwchan->pre_scale_mux, hwchan->amux_channel, ch->name, in pm8xxx_xoadc_parse_channel()
815 ch->amux_ip_rsv, ch->decimation, hwchan->prescale.num, in pm8xxx_xoadc_parse_channel()
816 hwchan->prescale.den, hwchan->scale_fn_type); in pm8xxx_xoadc_parse_channel()
829 adc->nchans = of_get_available_child_count(np); in pm8xxx_xoadc_parse_channels()
830 if (!adc->nchans) { in pm8xxx_xoadc_parse_channels()
831 dev_err(adc->dev, "no channel children\n"); in pm8xxx_xoadc_parse_channels()
832 return -ENODEV; in pm8xxx_xoadc_parse_channels()
834 dev_dbg(adc->dev, "found %d ADC channels\n", adc->nchans); in pm8xxx_xoadc_parse_channels()
836 adc->iio_chans = devm_kcalloc(adc->dev, adc->nchans, in pm8xxx_xoadc_parse_channels()
837 sizeof(*adc->iio_chans), GFP_KERNEL); in pm8xxx_xoadc_parse_channels()
838 if (!adc->iio_chans) in pm8xxx_xoadc_parse_channels()
839 return -ENOMEM; in pm8xxx_xoadc_parse_channels()
841 adc->chans = devm_kcalloc(adc->dev, adc->nchans, in pm8xxx_xoadc_parse_channels()
842 sizeof(*adc->chans), GFP_KERNEL); in pm8xxx_xoadc_parse_channels()
843 if (!adc->chans) in pm8xxx_xoadc_parse_channels()
844 return -ENOMEM; in pm8xxx_xoadc_parse_channels()
848 ch = &adc->chans[i]; in pm8xxx_xoadc_parse_channels()
849 ret = pm8xxx_xoadc_parse_channel(adc->dev, child, in pm8xxx_xoadc_parse_channels()
850 adc->variant->channels, in pm8xxx_xoadc_parse_channels()
851 &adc->iio_chans[i], in pm8xxx_xoadc_parse_channels()
863 dev_err(adc->dev, "missing 1.25V reference channel\n"); in pm8xxx_xoadc_parse_channels()
864 return -ENODEV; in pm8xxx_xoadc_parse_channels()
868 dev_err(adc->dev, "missing 0.625V reference channel\n"); in pm8xxx_xoadc_parse_channels()
869 return -ENODEV; in pm8xxx_xoadc_parse_channels()
873 dev_err(adc->dev, "missing MUXOFF reference channel\n"); in pm8xxx_xoadc_parse_channels()
874 return -ENODEV; in pm8xxx_xoadc_parse_channels()
885 struct device_node *np = pdev->dev.of_node; in pm8xxx_xoadc_probe()
887 struct device *dev = &pdev->dev; in pm8xxx_xoadc_probe()
892 return -ENODEV; in pm8xxx_xoadc_probe()
896 return -ENOMEM; in pm8xxx_xoadc_probe()
900 adc->dev = dev; in pm8xxx_xoadc_probe()
901 adc->variant = variant; in pm8xxx_xoadc_probe()
902 init_completion(&adc->complete); in pm8xxx_xoadc_probe()
903 mutex_init(&adc->lock); in pm8xxx_xoadc_probe()
909 map = dev_get_regmap(dev->parent, NULL); in pm8xxx_xoadc_probe()
912 return -ENXIO; in pm8xxx_xoadc_probe()
914 adc->map = map; in pm8xxx_xoadc_probe()
917 adc->vref = devm_regulator_get(dev, "xoadc-ref"); in pm8xxx_xoadc_probe()
918 if (IS_ERR(adc->vref)) { in pm8xxx_xoadc_probe()
920 return PTR_ERR(adc->vref); in pm8xxx_xoadc_probe()
922 ret = regulator_enable(adc->vref); in pm8xxx_xoadc_probe()
929 pm8xxx_eoc_irq, NULL, 0, variant->name, indio_dev); in pm8xxx_xoadc_probe()
935 indio_dev->dev.parent = dev; in pm8xxx_xoadc_probe()
936 indio_dev->dev.of_node = np; in pm8xxx_xoadc_probe()
937 indio_dev->name = variant->name; in pm8xxx_xoadc_probe()
938 indio_dev->modes = INDIO_DIRECT_MODE; in pm8xxx_xoadc_probe()
939 indio_dev->info = &pm8xxx_xoadc_info; in pm8xxx_xoadc_probe()
940 indio_dev->channels = adc->iio_chans; in pm8xxx_xoadc_probe()
941 indio_dev->num_channels = adc->nchans; in pm8xxx_xoadc_probe()
951 dev_info(dev, "%s XOADC driver enabled\n", variant->name); in pm8xxx_xoadc_probe()
958 regulator_disable(adc->vref); in pm8xxx_xoadc_probe()
970 regulator_disable(adc->vref); in pm8xxx_xoadc_remove()
976 .name = "PM8018-XOADC",
981 .name = "PM8038-XOADC",
986 .name = "PM8058-XOADC",
993 .name = "PM8921-XOADC",
1000 .compatible = "qcom,pm8018-adc",
1004 .compatible = "qcom,pm8038-adc",
1008 .compatible = "qcom,pm8058-adc",
1012 .compatible = "qcom,pm8921-adc",
1021 .name = "pm8xxx-adc",
1031 MODULE_ALIAS("platform:pm8xxx-xoadc");