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