iadc 118 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_read(struct iadc_chip *iadc, u16 offset, u8 *data) iadc 123 drivers/iio/adc/qcom-spmi-iadc.c ret = regmap_read(iadc->regmap, iadc->base + offset, &val); iadc 131 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_write(struct iadc_chip *iadc, u16 offset, u8 data) iadc 133 drivers/iio/adc/qcom-spmi-iadc.c return regmap_write(iadc->regmap, iadc->base + offset, data); iadc 136 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_reset(struct iadc_chip *iadc) iadc 141 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_SEC_ACCESS, IADC_SEC_ACCESS_DATA); iadc 145 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_PERH_RESET_CTL3, &data); iadc 149 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_SEC_ACCESS, IADC_SEC_ACCESS_DATA); iadc 155 drivers/iio/adc/qcom-spmi-iadc.c return iadc_write(iadc, IADC_PERH_RESET_CTL3, data); iadc 158 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_set_state(struct iadc_chip *iadc, bool state) iadc 160 drivers/iio/adc/qcom-spmi-iadc.c return iadc_write(iadc, IADC_EN_CTL1, state ? IADC_EN_CTL1_SET : 0); iadc 163 drivers/iio/adc/qcom-spmi-iadc.c static void iadc_status_show(struct iadc_chip *iadc) iadc 168 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_MODE_CTL, &mode); iadc 172 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_DIG_PARAM, &dig); iadc 176 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_CH_SEL_CTL, &chan); iadc 180 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_CONV_REQ, &req); iadc 184 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_STATUS1, &sta1); iadc 188 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_EN_CTL1, &en); iadc 192 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, iadc 197 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_configure(struct iadc_chip *iadc, int channel) iadc 204 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_MODE_CTL, mode); iadc 209 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_CH_SEL_CTL, channel); iadc 215 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_DIG_PARAM, decim); iadc 220 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_HW_SETTLE_DELAY, IADC_DEF_HW_SETTLE_TIME); iadc 224 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_FAST_AVG_CTL, IADC_DEF_AVG_SAMPLES); iadc 229 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_FAST_AVG_EN, IADC_FAST_AVG_EN_SET); iadc 231 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_write(iadc, IADC_FAST_AVG_EN, 0); iadc 236 drivers/iio/adc/qcom-spmi-iadc.c if (!iadc->poll_eoc) iadc 237 drivers/iio/adc/qcom-spmi-iadc.c reinit_completion(&iadc->complete); iadc 239 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_set_state(iadc, true); iadc 244 drivers/iio/adc/qcom-spmi-iadc.c return iadc_write(iadc, IADC_CONV_REQ, IADC_CONV_REQ_SET); iadc 247 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_poll_wait_eoc(struct iadc_chip *iadc, unsigned int interval_us) iadc 256 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_STATUS1, &sta1); iadc 267 drivers/iio/adc/qcom-spmi-iadc.c iadc_status_show(iadc); iadc 272 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_read_result(struct iadc_chip *iadc, u16 *data) iadc 274 drivers/iio/adc/qcom-spmi-iadc.c return regmap_bulk_read(iadc->regmap, iadc->base + IADC_DATA, data, 2); iadc 277 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_do_conversion(struct iadc_chip *iadc, int chan, u16 *data) iadc 282 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_configure(iadc, chan); iadc 288 drivers/iio/adc/qcom-spmi-iadc.c if (iadc->poll_eoc) { iadc 289 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_poll_wait_eoc(iadc, wait); iadc 291 drivers/iio/adc/qcom-spmi-iadc.c ret = wait_for_completion_timeout(&iadc->complete, iadc 297 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_poll_wait_eoc(iadc, IADC_CONV_TIME_MIN_US); iadc 301 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read_result(iadc, data); iadc 303 drivers/iio/adc/qcom-spmi-iadc.c iadc_set_state(iadc, false); iadc 305 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "conversion failed\n"); iadc 314 drivers/iio/adc/qcom-spmi-iadc.c struct iadc_chip *iadc = iio_priv(indio_dev); iadc 321 drivers/iio/adc/qcom-spmi-iadc.c mutex_lock(&iadc->lock); iadc 322 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_do_conversion(iadc, chan->channel, &adc_raw); iadc 323 drivers/iio/adc/qcom-spmi-iadc.c mutex_unlock(&iadc->lock); iadc 327 drivers/iio/adc/qcom-spmi-iadc.c vsense_raw = adc_raw - iadc->offset[chan->channel]; iadc 330 drivers/iio/adc/qcom-spmi-iadc.c vsense_uv /= (s32)iadc->gain - iadc->offset[chan->channel]; iadc 332 drivers/iio/adc/qcom-spmi-iadc.c isense_ua = vsense_uv / iadc->rsense[chan->channel]; iadc 334 drivers/iio/adc/qcom-spmi-iadc.c dev_dbg(iadc->dev, "off %d gain %d adc %d %duV I %duA\n", iadc 335 drivers/iio/adc/qcom-spmi-iadc.c iadc->offset[chan->channel], iadc->gain, iadc 355 drivers/iio/adc/qcom-spmi-iadc.c struct iadc_chip *iadc = dev_id; iadc 357 drivers/iio/adc/qcom-spmi-iadc.c complete(&iadc->complete); iadc 362 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_update_offset(struct iadc_chip *iadc) iadc 366 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_do_conversion(iadc, IADC_GAIN_17P857MV, &iadc->gain); iadc 370 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_do_conversion(iadc, IADC_INT_OFFSET_CSP2_CSN2, iadc 371 drivers/iio/adc/qcom-spmi-iadc.c &iadc->offset[IADC_INT_RSENSE]); iadc 375 drivers/iio/adc/qcom-spmi-iadc.c if (iadc->gain == iadc->offset[IADC_INT_RSENSE]) { iadc 376 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "error: internal offset == gain %d\n", iadc 377 drivers/iio/adc/qcom-spmi-iadc.c iadc->gain); iadc 381 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_do_conversion(iadc, IADC_EXT_OFFSET_CSP_CSN, iadc 382 drivers/iio/adc/qcom-spmi-iadc.c &iadc->offset[IADC_EXT_RSENSE]); iadc 386 drivers/iio/adc/qcom-spmi-iadc.c if (iadc->gain == iadc->offset[IADC_EXT_RSENSE]) { iadc 387 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "error: external offset == gain %d\n", iadc 388 drivers/iio/adc/qcom-spmi-iadc.c iadc->gain); iadc 395 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_version_check(struct iadc_chip *iadc) iadc 400 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_PERPH_TYPE, &val); iadc 405 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "%d is not ADC\n", val); iadc 409 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_PERPH_SUBTYPE, &val); iadc 414 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "%d is not IADC\n", val); iadc 418 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_REVISION2, &val); iadc 423 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "revision %d not supported\n", val); iadc 430 drivers/iio/adc/qcom-spmi-iadc.c static int iadc_rsense_read(struct iadc_chip *iadc, struct device_node *node) iadc 436 drivers/iio/adc/qcom-spmi-iadc.c &iadc->rsense[IADC_EXT_RSENSE]); iadc 438 drivers/iio/adc/qcom-spmi-iadc.c iadc->rsense[IADC_EXT_RSENSE] = IADC_INT_RSENSE_IDEAL_VALUE; iadc 440 drivers/iio/adc/qcom-spmi-iadc.c if (!iadc->rsense[IADC_EXT_RSENSE]) { iadc 441 drivers/iio/adc/qcom-spmi-iadc.c dev_err(iadc->dev, "external resistor can't be zero Ohms"); iadc 445 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_read(iadc, IADC_NOMINAL_RSENSE, &deviation); iadc 462 drivers/iio/adc/qcom-spmi-iadc.c iadc->rsense[IADC_INT_RSENSE] = int_sense; iadc 490 drivers/iio/adc/qcom-spmi-iadc.c struct iadc_chip *iadc; iadc 494 drivers/iio/adc/qcom-spmi-iadc.c indio_dev = devm_iio_device_alloc(dev, sizeof(*iadc)); iadc 498 drivers/iio/adc/qcom-spmi-iadc.c iadc = iio_priv(indio_dev); iadc 499 drivers/iio/adc/qcom-spmi-iadc.c iadc->dev = dev; iadc 501 drivers/iio/adc/qcom-spmi-iadc.c iadc->regmap = dev_get_regmap(dev->parent, NULL); iadc 502 drivers/iio/adc/qcom-spmi-iadc.c if (!iadc->regmap) iadc 505 drivers/iio/adc/qcom-spmi-iadc.c init_completion(&iadc->complete); iadc 506 drivers/iio/adc/qcom-spmi-iadc.c mutex_init(&iadc->lock); iadc 512 drivers/iio/adc/qcom-spmi-iadc.c iadc->base = res; iadc 514 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_version_check(iadc); iadc 518 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_rsense_read(iadc, node); iadc 522 drivers/iio/adc/qcom-spmi-iadc.c dev_dbg(iadc->dev, "sense resistors %d and %d micro Ohm\n", iadc 523 drivers/iio/adc/qcom-spmi-iadc.c iadc->rsense[IADC_INT_RSENSE], iadc 524 drivers/iio/adc/qcom-spmi-iadc.c iadc->rsense[IADC_EXT_RSENSE]); iadc 531 drivers/iio/adc/qcom-spmi-iadc.c iadc->poll_eoc = true; iadc 533 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_reset(iadc); iadc 539 drivers/iio/adc/qcom-spmi-iadc.c if (!iadc->poll_eoc) { iadc 541 drivers/iio/adc/qcom-spmi-iadc.c "spmi-iadc", iadc); iadc 547 drivers/iio/adc/qcom-spmi-iadc.c device_init_wakeup(iadc->dev, 1); iadc 550 drivers/iio/adc/qcom-spmi-iadc.c ret = iadc_update_offset(iadc);