Lines Matching refs:vadc

21 #include <dt-bindings/iio/qcom,spmi-vadc.h>
23 #include "qcom-vadc-common.h"
137 static int vadc_read(struct vadc_priv *vadc, u16 offset, u8 *data)
139 return regmap_bulk_read(vadc->regmap, vadc->base + offset, data, 1);
142 static int vadc_write(struct vadc_priv *vadc, u16 offset, u8 data)
144 return regmap_write(vadc->regmap, vadc->base + offset, data);
147 static int vadc_reset(struct vadc_priv *vadc)
152 ret = vadc_write(vadc, VADC_ACCESS, VADC_ACCESS_DATA);
156 ret = vadc_read(vadc, VADC_PERH_RESET_CTL3, &data);
160 ret = vadc_write(vadc, VADC_ACCESS, VADC_ACCESS_DATA);
166 return vadc_write(vadc, VADC_PERH_RESET_CTL3, data);
169 static int vadc_set_state(struct vadc_priv *vadc, bool state)
171 return vadc_write(vadc, VADC_EN_CTL1, state ? VADC_EN_CTL1_SET : 0);
174 static void vadc_show_status(struct vadc_priv *vadc)
179 ret = vadc_read(vadc, VADC_MODE_CTL, &mode);
183 ret = vadc_read(vadc, VADC_ADC_DIG_PARAM, &dig);
187 ret = vadc_read(vadc, VADC_ADC_CH_SEL_CTL, &chan);
191 ret = vadc_read(vadc, VADC_CONV_REQ, &req);
195 ret = vadc_read(vadc, VADC_STATUS1, &sta1);
199 ret = vadc_read(vadc, VADC_EN_CTL1, &en);
203 dev_err(vadc->dev,
208 static int vadc_configure(struct vadc_priv *vadc,
217 ret = vadc_write(vadc, VADC_MODE_CTL, mode_ctrl);
222 ret = vadc_write(vadc, VADC_ADC_CH_SEL_CTL, prop->channel);
228 ret = vadc_write(vadc, VADC_ADC_DIG_PARAM, decimation);
233 ret = vadc_write(vadc, VADC_HW_SETTLE_DELAY, prop->hw_settle_time);
237 ret = vadc_write(vadc, VADC_FAST_AVG_CTL, prop->avg_samples);
242 ret = vadc_write(vadc, VADC_FAST_AVG_EN, VADC_FAST_AVG_EN_SET);
244 ret = vadc_write(vadc, VADC_FAST_AVG_EN, 0);
249 static int vadc_poll_wait_eoc(struct vadc_priv *vadc, unsigned int interval_us)
258 ret = vadc_read(vadc, VADC_STATUS1, &sta1);
269 vadc_show_status(vadc);
274 static int vadc_read_result(struct vadc_priv *vadc, u16 *data)
278 ret = regmap_bulk_read(vadc->regmap, vadc->base + VADC_DATA, data, 2);
287 static struct vadc_channel_prop *vadc_get_channel(struct vadc_priv *vadc,
292 for (i = 0; i < vadc->nchannels; i++)
293 if (vadc->chan_props[i].channel == num)
294 return &vadc->chan_props[i];
296 dev_dbg(vadc->dev, "no such channel %02x\n", num);
301 static int vadc_do_conversion(struct vadc_priv *vadc,
307 mutex_lock(&vadc->lock);
309 ret = vadc_configure(vadc, prop);
313 if (!vadc->poll_eoc)
314 reinit_completion(&vadc->complete);
316 ret = vadc_set_state(vadc, true);
320 ret = vadc_write(vadc, VADC_CONV_REQ, VADC_CONV_REQ_SET);
326 if (vadc->poll_eoc) {
327 ret = vadc_poll_wait_eoc(vadc, timeout);
329 ret = wait_for_completion_timeout(&vadc->complete, timeout);
336 ret = vadc_poll_wait_eoc(vadc, VADC_CONV_TIME_MIN_US);
341 ret = vadc_read_result(vadc, data);
344 vadc_set_state(vadc, false);
346 dev_err(vadc->dev, "conversion failed\n");
348 mutex_unlock(&vadc->lock);
352 static int vadc_measure_ref_points(struct vadc_priv *vadc)
358 vadc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE;
359 vadc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV;
361 prop = vadc_get_channel(vadc, VADC_REF_1250MV);
362 ret = vadc_do_conversion(vadc, prop, &read_1);
367 prop = vadc_get_channel(vadc, VADC_SPARE1);
369 prop = vadc_get_channel(vadc, VADC_REF_625MV);
371 ret = vadc_do_conversion(vadc, prop, &read_2);
380 vadc->graph[VADC_CALIB_ABSOLUTE].dy = read_1 - read_2;
381 vadc->graph[VADC_CALIB_ABSOLUTE].gnd = read_2;
384 prop = vadc_get_channel(vadc, VADC_VDD_VADC);
385 ret = vadc_do_conversion(vadc, prop, &read_1);
389 prop = vadc_get_channel(vadc, VADC_GND_REF);
390 ret = vadc_do_conversion(vadc, prop, &read_2);
399 vadc->graph[VADC_CALIB_RATIOMETRIC].dy = read_1 - read_2;
400 vadc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_2;
403 dev_err(vadc->dev, "measure reference points failed\n");
448 struct vadc_priv *vadc = iio_priv(indio_dev);
455 prop = &vadc->chan_props[chan->address];
456 ret = vadc_do_conversion(vadc, prop, &adc_code);
461 &vadc->graph[prop->calibration],
470 prop = &vadc->chan_props[chan->address];
471 ret = vadc_do_conversion(vadc, prop, &adc_code);
488 struct vadc_priv *vadc = iio_priv(indio_dev);
491 for (i = 0; i < vadc->nchannels; i++)
492 if (vadc->iio_chans[i].channel == iiospec->args[0])
735 static int vadc_get_dt_data(struct vadc_priv *vadc, struct device_node *node)
744 vadc->nchannels = of_get_available_child_count(node);
745 if (!vadc->nchannels)
748 vadc->iio_chans = devm_kcalloc(vadc->dev, vadc->nchannels,
749 sizeof(*vadc->iio_chans), GFP_KERNEL);
750 if (!vadc->iio_chans)
753 vadc->chan_props = devm_kcalloc(vadc->dev, vadc->nchannels,
754 sizeof(*vadc->chan_props), GFP_KERNEL);
755 if (!vadc->chan_props)
758 iio_chan = vadc->iio_chans;
761 ret = vadc_get_dt_channel_data(vadc->dev, &prop, child);
768 vadc->chan_props[index] = prop;
783 if (!vadc_get_channel(vadc, VADC_REF_1250MV)) {
784 dev_err(vadc->dev, "Please define 1.25V channel\n");
788 if (!vadc_get_channel(vadc, VADC_REF_625MV)) {
789 dev_err(vadc->dev, "Please define 0.625V channel\n");
793 if (!vadc_get_channel(vadc, VADC_VDD_VADC)) {
794 dev_err(vadc->dev, "Please define VDD channel\n");
798 if (!vadc_get_channel(vadc, VADC_GND_REF)) {
799 dev_err(vadc->dev, "Please define GND channel\n");
808 struct vadc_priv *vadc = dev_id;
810 complete(&vadc->complete);
815 static int vadc_check_revision(struct vadc_priv *vadc)
820 ret = vadc_read(vadc, VADC_PERPH_TYPE, &val);
825 dev_err(vadc->dev, "%d is not ADC\n", val);
829 ret = vadc_read(vadc, VADC_PERPH_SUBTYPE, &val);
834 dev_err(vadc->dev, "%d is not VADC\n", val);
838 ret = vadc_read(vadc, VADC_REVISION2, &val);
843 dev_err(vadc->dev, "revision %d not supported\n", val);
855 struct vadc_priv *vadc;
868 indio_dev = devm_iio_device_alloc(dev, sizeof(*vadc));
872 vadc = iio_priv(indio_dev);
873 vadc->regmap = regmap;
874 vadc->dev = dev;
875 vadc->base = reg;
876 vadc->are_ref_measured = false;
877 init_completion(&vadc->complete);
878 mutex_init(&vadc->lock);
880 ret = vadc_check_revision(vadc);
884 ret = vadc_get_dt_data(vadc, node);
892 vadc->poll_eoc = true;
895 "spmi-vadc", vadc);
900 ret = vadc_reset(vadc);
906 ret = vadc_measure_ref_points(vadc);
913 indio_dev->channels = vadc->iio_chans;
914 indio_dev->num_channels = vadc->nchannels;
920 { .compatible = "qcom,spmi-vadc" },
927 .name = "qcom-spmi-vadc",
934 MODULE_ALIAS("platform:qcom-spmi-vadc");