• Home
  • Raw
  • Download

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

2  * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
29 #include <dt-bindings/iio/qcom,spmi-vadc.h>
31 #include "qcom-vadc-common.h"
84 * struct vadc_channel_prop - VADC channel property.
88 * @prescale: channel scaling performed on the input signal.
93 * @scale_fn_type: Represents the scaling function to convert voltage
107 * struct vadc_priv - VADC private structure.
147 return regmap_bulk_read(vadc->regmap, vadc->base + offset, data, 1); in vadc_read()
152 return regmap_write(vadc->regmap, vadc->base + offset, data); in vadc_write()
211 dev_err(vadc->dev, in vadc_show_status()
230 ret = vadc_write(vadc, VADC_ADC_CH_SEL_CTL, prop->channel); in vadc_configure()
235 decimation = prop->decimation << VADC_ADC_DIG_DEC_RATIO_SEL_SHIFT; in vadc_configure()
241 ret = vadc_write(vadc, VADC_HW_SETTLE_DELAY, prop->hw_settle_time); in vadc_configure()
245 ret = vadc_write(vadc, VADC_FAST_AVG_CTL, prop->avg_samples); in vadc_configure()
249 if (prop->avg_samples) in vadc_configure()
279 return -ETIMEDOUT; in vadc_poll_wait_eoc()
286 ret = regmap_bulk_read(vadc->regmap, vadc->base + VADC_DATA, data, 2); in vadc_read_result()
300 for (i = 0; i < vadc->nchannels; i++) in vadc_get_channel()
301 if (vadc->chan_props[i].channel == num) in vadc_get_channel()
302 return &vadc->chan_props[i]; in vadc_get_channel()
304 dev_dbg(vadc->dev, "no such channel %02x\n", num); in vadc_get_channel()
315 mutex_lock(&vadc->lock); in vadc_do_conversion()
321 if (!vadc->poll_eoc) in vadc_do_conversion()
322 reinit_completion(&vadc->complete); in vadc_do_conversion()
332 timeout = BIT(prop->avg_samples) * VADC_CONV_TIME_MIN_US * 2; in vadc_do_conversion()
334 if (vadc->poll_eoc) { in vadc_do_conversion()
337 ret = wait_for_completion_timeout(&vadc->complete, timeout); in vadc_do_conversion()
339 ret = -ETIMEDOUT; in vadc_do_conversion()
354 dev_err(vadc->dev, "conversion failed\n"); in vadc_do_conversion()
356 mutex_unlock(&vadc->lock); in vadc_do_conversion()
366 vadc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE; in vadc_measure_ref_points()
367 vadc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV; in vadc_measure_ref_points()
384 ret = -EINVAL; in vadc_measure_ref_points()
388 vadc->graph[VADC_CALIB_ABSOLUTE].dy = read_1 - read_2; in vadc_measure_ref_points()
389 vadc->graph[VADC_CALIB_ABSOLUTE].gnd = read_2; in vadc_measure_ref_points()
403 ret = -EINVAL; in vadc_measure_ref_points()
407 vadc->graph[VADC_CALIB_RATIOMETRIC].dy = read_1 - read_2; in vadc_measure_ref_points()
408 vadc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_2; in vadc_measure_ref_points()
411 dev_err(vadc->dev, "measure reference points failed\n"); in vadc_measure_ref_points()
418 unsigned int pre; in vadc_prescaling_from_dt() local
420 for (pre = 0; pre < ARRAY_SIZE(vadc_prescale_ratios); pre++) in vadc_prescaling_from_dt()
421 if (vadc_prescale_ratios[pre].num == num && in vadc_prescaling_from_dt()
422 vadc_prescale_ratios[pre].den == den) in vadc_prescaling_from_dt()
425 if (pre == ARRAY_SIZE(vadc_prescale_ratios)) in vadc_prescaling_from_dt()
426 return -EINVAL; in vadc_prescaling_from_dt()
428 return pre; in vadc_prescaling_from_dt()
434 return -EINVAL; in vadc_hw_settle_time_from_dt()
447 return -EINVAL; in vadc_avg_samples_from_dt()
463 prop = &vadc->chan_props[chan->address]; in vadc_read_raw()
468 ret = qcom_vadc_scale(prop->scale_fn_type, in vadc_read_raw()
469 &vadc->graph[prop->calibration], in vadc_read_raw()
470 &vadc_prescale_ratios[prop->prescale], in vadc_read_raw()
471 (prop->calibration == VADC_CALIB_ABSOLUTE), in vadc_read_raw()
478 prop = &vadc->chan_props[chan->address]; in vadc_read_raw()
486 ret = -EINVAL; in vadc_read_raw()
499 for (i = 0; i < vadc->nchannels; i++) in vadc_of_xlate()
500 if (vadc->iio_chans[i].channel == iiospec->args[0]) in vadc_of_xlate()
503 return -EINVAL; in vadc_of_xlate()
663 const char *name = node->name; in vadc_get_dt_channel_data()
675 return -EINVAL; in vadc_get_dt_channel_data()
679 prop->channel = chan; in vadc_get_dt_channel_data()
689 prop->decimation = ret; in vadc_get_dt_channel_data()
691 prop->decimation = VADC_DEF_DECIMATION; in vadc_get_dt_channel_data()
694 ret = of_property_read_u32_array(node, "qcom,pre-scaling", varr, 2); in vadc_get_dt_channel_data()
698 dev_err(dev, "%02x invalid pre-scaling <%d %d>\n", in vadc_get_dt_channel_data()
702 prop->prescale = ret; in vadc_get_dt_channel_data()
704 prop->prescale = vadc_chans[prop->channel].prescale_index; in vadc_get_dt_channel_data()
707 ret = of_property_read_u32(node, "qcom,hw-settle-time", &value); in vadc_get_dt_channel_data()
711 dev_err(dev, "%02x invalid hw-settle-time %d us\n", in vadc_get_dt_channel_data()
715 prop->hw_settle_time = ret; in vadc_get_dt_channel_data()
717 prop->hw_settle_time = VADC_DEF_HW_SETTLE_TIME; in vadc_get_dt_channel_data()
720 ret = of_property_read_u32(node, "qcom,avg-samples", &value); in vadc_get_dt_channel_data()
724 dev_err(dev, "%02x invalid avg-samples %d\n", in vadc_get_dt_channel_data()
728 prop->avg_samples = ret; in vadc_get_dt_channel_data()
730 prop->avg_samples = VADC_DEF_AVG_SAMPLES; in vadc_get_dt_channel_data()
734 prop->calibration = VADC_CALIB_RATIOMETRIC; in vadc_get_dt_channel_data()
736 prop->calibration = VADC_CALIB_ABSOLUTE; in vadc_get_dt_channel_data()
752 vadc->nchannels = of_get_available_child_count(node); in vadc_get_dt_data()
753 if (!vadc->nchannels) in vadc_get_dt_data()
754 return -EINVAL; in vadc_get_dt_data()
756 vadc->iio_chans = devm_kcalloc(vadc->dev, vadc->nchannels, in vadc_get_dt_data()
757 sizeof(*vadc->iio_chans), GFP_KERNEL); in vadc_get_dt_data()
758 if (!vadc->iio_chans) in vadc_get_dt_data()
759 return -ENOMEM; in vadc_get_dt_data()
761 vadc->chan_props = devm_kcalloc(vadc->dev, vadc->nchannels, in vadc_get_dt_data()
762 sizeof(*vadc->chan_props), GFP_KERNEL); in vadc_get_dt_data()
763 if (!vadc->chan_props) in vadc_get_dt_data()
764 return -ENOMEM; in vadc_get_dt_data()
766 iio_chan = vadc->iio_chans; in vadc_get_dt_data()
769 ret = vadc_get_dt_channel_data(vadc->dev, &prop, child); in vadc_get_dt_data()
776 vadc->chan_props[index] = prop; in vadc_get_dt_data()
780 iio_chan->channel = prop.channel; in vadc_get_dt_data()
781 iio_chan->datasheet_name = vadc_chan->datasheet_name; in vadc_get_dt_data()
782 iio_chan->info_mask_separate = vadc_chan->info_mask; in vadc_get_dt_data()
783 iio_chan->type = vadc_chan->type; in vadc_get_dt_data()
784 iio_chan->indexed = 1; in vadc_get_dt_data()
785 iio_chan->address = index++; in vadc_get_dt_data()
792 dev_err(vadc->dev, "Please define 1.25V channel\n"); in vadc_get_dt_data()
793 return -ENODEV; in vadc_get_dt_data()
797 dev_err(vadc->dev, "Please define 0.625V channel\n"); in vadc_get_dt_data()
798 return -ENODEV; in vadc_get_dt_data()
802 dev_err(vadc->dev, "Please define VDD channel\n"); in vadc_get_dt_data()
803 return -ENODEV; in vadc_get_dt_data()
807 dev_err(vadc->dev, "Please define GND channel\n"); in vadc_get_dt_data()
808 return -ENODEV; in vadc_get_dt_data()
818 complete(&vadc->complete); in vadc_isr()
833 dev_err(vadc->dev, "%d is not ADC\n", val); in vadc_check_revision()
834 return -ENODEV; in vadc_check_revision()
842 dev_err(vadc->dev, "%d is not VADC\n", val); in vadc_check_revision()
843 return -ENODEV; in vadc_check_revision()
851 dev_err(vadc->dev, "revision %d not supported\n", val); in vadc_check_revision()
852 return -ENODEV; in vadc_check_revision()
860 struct device_node *node = pdev->dev.of_node; in vadc_probe()
861 struct device *dev = &pdev->dev; in vadc_probe()
868 regmap = dev_get_regmap(dev->parent, NULL); in vadc_probe()
870 return -ENODEV; in vadc_probe()
878 return -ENOMEM; in vadc_probe()
881 vadc->regmap = regmap; in vadc_probe()
882 vadc->dev = dev; in vadc_probe()
883 vadc->base = reg; in vadc_probe()
884 vadc->are_ref_measured = false; in vadc_probe()
885 init_completion(&vadc->complete); in vadc_probe()
886 mutex_init(&vadc->lock); in vadc_probe()
898 if (irq_eoc == -EPROBE_DEFER || irq_eoc == -EINVAL) in vadc_probe()
900 vadc->poll_eoc = true; in vadc_probe()
903 "spmi-vadc", vadc); in vadc_probe()
918 indio_dev->dev.parent = dev; in vadc_probe()
919 indio_dev->dev.of_node = node; in vadc_probe()
920 indio_dev->name = pdev->name; in vadc_probe()
921 indio_dev->modes = INDIO_DIRECT_MODE; in vadc_probe()
922 indio_dev->info = &vadc_info; in vadc_probe()
923 indio_dev->channels = vadc->iio_chans; in vadc_probe()
924 indio_dev->num_channels = vadc->nchannels; in vadc_probe()
930 { .compatible = "qcom,spmi-vadc" },
937 .name = "qcom-spmi-vadc",
944 MODULE_ALIAS("platform:qcom-spmi-vadc");
947 MODULE_AUTHOR("Stanimir Varbanov <svarbanov@mm-sol.com>");
948 MODULE_AUTHOR("Ivan T. Ivanov <iivanov@mm-sol.com>");