Lines Matching refs:vadc
10 #include <linux/iio/adc/qcom-vadc-common.h>
23 #include <dt-bindings/iio/qcom,spmi-vadc.h>
139 static int vadc_read(struct vadc_priv *vadc, u16 offset, u8 *data)
141 return regmap_bulk_read(vadc->regmap, vadc->base + offset, data, 1);
144 static int vadc_write(struct vadc_priv *vadc, u16 offset, u8 data)
146 return regmap_write(vadc->regmap, vadc->base + offset, data);
149 static int vadc_reset(struct vadc_priv *vadc)
154 ret = vadc_write(vadc, VADC_ACCESS, VADC_ACCESS_DATA);
158 ret = vadc_read(vadc, VADC_PERH_RESET_CTL3, &data);
162 ret = vadc_write(vadc, VADC_ACCESS, VADC_ACCESS_DATA);
168 return vadc_write(vadc, VADC_PERH_RESET_CTL3, data);
171 static int vadc_set_state(struct vadc_priv *vadc, bool state)
173 return vadc_write(vadc, VADC_EN_CTL1, state ? VADC_EN_CTL1_SET : 0);
176 static void vadc_show_status(struct vadc_priv *vadc)
181 ret = vadc_read(vadc, VADC_MODE_CTL, &mode);
185 ret = vadc_read(vadc, VADC_ADC_DIG_PARAM, &dig);
189 ret = vadc_read(vadc, VADC_ADC_CH_SEL_CTL, &chan);
193 ret = vadc_read(vadc, VADC_CONV_REQ, &req);
197 ret = vadc_read(vadc, VADC_STATUS1, &sta1);
201 ret = vadc_read(vadc, VADC_EN_CTL1, &en);
205 dev_err(vadc->dev,
210 static int vadc_configure(struct vadc_priv *vadc,
219 ret = vadc_write(vadc, VADC_MODE_CTL, mode_ctrl);
224 ret = vadc_write(vadc, VADC_ADC_CH_SEL_CTL, prop->channel);
230 ret = vadc_write(vadc, VADC_ADC_DIG_PARAM, decimation);
235 ret = vadc_write(vadc, VADC_HW_SETTLE_DELAY, prop->hw_settle_time);
239 ret = vadc_write(vadc, VADC_FAST_AVG_CTL, prop->avg_samples);
244 ret = vadc_write(vadc, VADC_FAST_AVG_EN, VADC_FAST_AVG_EN_SET);
246 ret = vadc_write(vadc, VADC_FAST_AVG_EN, 0);
251 static int vadc_poll_wait_eoc(struct vadc_priv *vadc, unsigned int interval_us)
260 ret = vadc_read(vadc, VADC_STATUS1, &sta1);
271 vadc_show_status(vadc);
276 static int vadc_read_result(struct vadc_priv *vadc, u16 *data)
280 ret = regmap_bulk_read(vadc->regmap, vadc->base + VADC_DATA, data, 2);
289 static struct vadc_channel_prop *vadc_get_channel(struct vadc_priv *vadc,
294 for (i = 0; i < vadc->nchannels; i++)
295 if (vadc->chan_props[i].channel == num)
296 return &vadc->chan_props[i];
298 dev_dbg(vadc->dev, "no such channel %02x\n", num);
303 static int vadc_do_conversion(struct vadc_priv *vadc,
309 mutex_lock(&vadc->lock);
311 ret = vadc_configure(vadc, prop);
315 if (!vadc->poll_eoc)
316 reinit_completion(&vadc->complete);
318 ret = vadc_set_state(vadc, true);
322 ret = vadc_write(vadc, VADC_CONV_REQ, VADC_CONV_REQ_SET);
328 if (vadc->poll_eoc) {
329 ret = vadc_poll_wait_eoc(vadc, timeout);
331 ret = wait_for_completion_timeout(&vadc->complete, timeout);
338 ret = vadc_poll_wait_eoc(vadc, VADC_CONV_TIME_MIN_US);
343 ret = vadc_read_result(vadc, data);
346 vadc_set_state(vadc, false);
348 dev_err(vadc->dev, "conversion failed\n");
350 mutex_unlock(&vadc->lock);
354 static int vadc_measure_ref_points(struct vadc_priv *vadc)
360 vadc->graph[VADC_CALIB_RATIOMETRIC].dx = VADC_RATIOMETRIC_RANGE;
361 vadc->graph[VADC_CALIB_ABSOLUTE].dx = VADC_ABSOLUTE_RANGE_UV;
363 prop = vadc_get_channel(vadc, VADC_REF_1250MV);
364 ret = vadc_do_conversion(vadc, prop, &read_1);
369 prop = vadc_get_channel(vadc, VADC_SPARE1);
371 prop = vadc_get_channel(vadc, VADC_REF_625MV);
373 ret = vadc_do_conversion(vadc, prop, &read_2);
382 vadc->graph[VADC_CALIB_ABSOLUTE].dy = read_1 - read_2;
383 vadc->graph[VADC_CALIB_ABSOLUTE].gnd = read_2;
386 prop = vadc_get_channel(vadc, VADC_VDD_VADC);
387 ret = vadc_do_conversion(vadc, prop, &read_1);
391 prop = vadc_get_channel(vadc, VADC_GND_REF);
392 ret = vadc_do_conversion(vadc, prop, &read_2);
401 vadc->graph[VADC_CALIB_RATIOMETRIC].dy = read_1 - read_2;
402 vadc->graph[VADC_CALIB_RATIOMETRIC].gnd = read_2;
405 dev_err(vadc->dev, "measure reference points failed\n");
450 struct vadc_priv *vadc = iio_priv(indio_dev);
457 prop = &vadc->chan_props[chan->address];
458 ret = vadc_do_conversion(vadc, prop, &adc_code);
463 &vadc->graph[prop->calibration],
472 prop = &vadc->chan_props[chan->address];
473 ret = vadc_do_conversion(vadc, prop, &adc_code);
490 struct vadc_priv *vadc = iio_priv(indio_dev);
493 for (i = 0; i < vadc->nchannels; i++)
494 if (vadc->iio_chans[i].channel == iiospec->args[0])
503 struct vadc_priv *vadc = iio_priv(indio_dev);
504 const char *name = vadc->chan_props[chan->address].channel_name;
752 static int vadc_get_fw_data(struct vadc_priv *vadc)
761 vadc->nchannels = device_get_child_node_count(vadc->dev);
762 if (!vadc->nchannels)
765 vadc->iio_chans = devm_kcalloc(vadc->dev, vadc->nchannels,
766 sizeof(*vadc->iio_chans), GFP_KERNEL);
767 if (!vadc->iio_chans)
770 vadc->chan_props = devm_kcalloc(vadc->dev, vadc->nchannels,
771 sizeof(*vadc->chan_props), GFP_KERNEL);
772 if (!vadc->chan_props)
775 iio_chan = vadc->iio_chans;
777 device_for_each_child_node(vadc->dev, child) {
778 ret = vadc_get_fw_channel_data(vadc->dev, &prop, child);
785 vadc->chan_props[index] = prop;
800 if (!vadc_get_channel(vadc, VADC_REF_1250MV)) {
801 dev_err(vadc->dev, "Please define 1.25V channel\n");
805 if (!vadc_get_channel(vadc, VADC_REF_625MV)) {
806 dev_err(vadc->dev, "Please define 0.625V channel\n");
810 if (!vadc_get_channel(vadc, VADC_VDD_VADC)) {
811 dev_err(vadc->dev, "Please define VDD channel\n");
815 if (!vadc_get_channel(vadc, VADC_GND_REF)) {
816 dev_err(vadc->dev, "Please define GND channel\n");
825 struct vadc_priv *vadc = dev_id;
827 complete(&vadc->complete);
832 static int vadc_check_revision(struct vadc_priv *vadc)
837 ret = vadc_read(vadc, VADC_PERPH_TYPE, &val);
842 dev_err(vadc->dev, "%d is not ADC\n", val);
846 ret = vadc_read(vadc, VADC_PERPH_SUBTYPE, &val);
851 dev_err(vadc->dev, "%d is not VADC\n", val);
855 ret = vadc_read(vadc, VADC_REVISION2, &val);
860 dev_err(vadc->dev, "revision %d not supported\n", val);
871 struct vadc_priv *vadc;
884 indio_dev = devm_iio_device_alloc(dev, sizeof(*vadc));
888 vadc = iio_priv(indio_dev);
889 vadc->regmap = regmap;
890 vadc->dev = dev;
891 vadc->base = reg;
892 vadc->are_ref_measured = false;
893 init_completion(&vadc->complete);
894 mutex_init(&vadc->lock);
896 ret = vadc_check_revision(vadc);
900 ret = vadc_get_fw_data(vadc);
908 vadc->poll_eoc = true;
911 "spmi-vadc", vadc);
916 ret = vadc_reset(vadc);
922 ret = vadc_measure_ref_points(vadc);
929 indio_dev->channels = vadc->iio_chans;
930 indio_dev->num_channels = vadc->nchannels;
936 { .compatible = "qcom,spmi-vadc" },
943 .name = "qcom-spmi-vadc",
950 MODULE_ALIAS("platform:qcom-spmi-vadc");