Lines Matching refs:iadc

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