Lines Matching refs:gpadc

236  * the completion of an gpadc conversion cycle
238 * @irq_sw: interrupt number that is used by gpadc for software ADC conversion
239 * @irq_hw: interrupt number that is used by gpadc for hardware ADC conversion
255 ab8500_gpadc_get_channel(struct ab8500_gpadc *gpadc, u8 chan)
260 for (i = 0; i < gpadc->nchans; i++) {
261 ch = &gpadc->chans[i];
265 if (i == gpadc->nchans)
273 * @gpadc: GPADC instance
277 static int ab8500_gpadc_ad_to_voltage(struct ab8500_gpadc *gpadc,
286 if (!gpadc->cal_data[AB8500_CAL_VMAIN].gain) {
293 res = (int) (ad_value * gpadc->cal_data[AB8500_CAL_VMAIN].gain +
294 gpadc->cal_data[AB8500_CAL_VMAIN].offset) / AB8500_GPADC_CALIB_SCALE;
304 if (!gpadc->cal_data[AB8500_CAL_BTEMP].gain) {
311 res = (int) (ad_value * gpadc->cal_data[AB8500_CAL_BTEMP].gain +
312 gpadc->cal_data[AB8500_CAL_BTEMP].offset) / AB8500_GPADC_CALIB_SCALE;
318 if (!gpadc->cal_data[AB8500_CAL_VBAT].gain) {
325 res = (int) (ad_value * gpadc->cal_data[AB8500_CAL_VBAT].gain +
326 gpadc->cal_data[AB8500_CAL_VBAT].offset) / AB8500_GPADC_CALIB_SCALE;
362 if (!gpadc->cal_data[AB8500_CAL_IBAT].gain) {
369 res = (int) (ad_value * gpadc->cal_data[AB8500_CAL_IBAT].gain +
370 gpadc->cal_data[AB8500_CAL_IBAT].offset)
375 dev_err(gpadc->dev,
386 static int ab8500_gpadc_read(struct ab8500_gpadc *gpadc,
401 if (!gpadc)
405 if ((gpadc->irq_sw <= 0) && !ch->hardware_control)
407 if ((gpadc->irq_hw <= 0) && ch->hardware_control)
411 pm_runtime_get_sync(gpadc->dev);
415 ret = abx500_get_register_interruptible(gpadc->dev,
424 dev_err(gpadc->dev, "gpadc_conversion: GPADC busy");
449 ret = abx500_set_register_interruptible(gpadc->dev,
455 ret = abx500_set_register_interruptible(gpadc->dev,
459 dev_err(gpadc->dev,
476 if (!is_ab8500_2p0_or_earlier(gpadc->ab8500)) {
494 ret = abx500_set_register_interruptible(gpadc->dev,
497 dev_err(gpadc->dev,
507 ret = abx500_set_register_interruptible(gpadc->dev,
511 dev_err(gpadc->dev,
520 ret = abx500_mask_and_set_register_interruptible(gpadc->dev,
525 dev_err(gpadc->dev,
535 if (!wait_for_completion_timeout(&gpadc->complete,
537 dev_err(gpadc->dev,
544 ret = abx500_get_register_interruptible(gpadc->dev,
547 dev_err(gpadc->dev,
552 ret = abx500_get_register_interruptible(gpadc->dev,
555 dev_err(gpadc->dev,
569 dev_err(gpadc->dev,
574 ret = abx500_get_register_interruptible(gpadc->dev,
578 dev_err(gpadc->dev,
583 ret = abx500_get_register_interruptible(gpadc->dev,
587 dev_err(gpadc->dev,
594 dev_warn(gpadc->dev,
602 ret = abx500_set_register_interruptible(gpadc->dev, AB8500_GPADC,
605 dev_err(gpadc->dev, "gpadc_conversion: disable gpadc failed\n");
610 pm_runtime_mark_last_busy(gpadc->dev);
611 pm_runtime_put_autosuspend(gpadc->dev);
622 (void) abx500_set_register_interruptible(gpadc->dev, AB8500_GPADC,
624 pm_runtime_put(gpadc->dev);
625 dev_err(gpadc->dev,
632 * ab8500_bm_gpadcconvend_handler() - isr for gpadc conversion completion
636 * This is a interrupt service routine for gpadc conversion completion.
637 * Notifies the gpadc completion is completed and the converted raw value
643 struct ab8500_gpadc *gpadc = data;
645 complete(&gpadc->complete);
666 static void ab8500_gpadc_read_calibration_data(struct ab8500_gpadc *gpadc)
681 ret[i] = abx500_get_register_interruptible(gpadc->dev,
685 dev_err(gpadc->dev, "%s: read otp reg 0x%02x failed\n",
761 if (is_ab8540(gpadc->ab8500)) {
768 gpadc->cal_data[AB8500_CAL_VMAIN].otp_calib_hi =
770 gpadc->cal_data[AB8500_CAL_VMAIN].otp_calib_lo =
773 gpadc->cal_data[AB8500_CAL_VMAIN].gain = AB8500_GPADC_CALIB_SCALE *
775 gpadc->cal_data[AB8500_CAL_VMAIN].offset = AB8500_GPADC_CALIB_SCALE *
779 gpadc->cal_data[AB8500_CAL_VMAIN].gain = 0;
785 gpadc->dev, AB8500_OTP_EMUL,
788 dev_err(gpadc->dev,
800 gpadc->cal_data[AB8500_CAL_IBAT].otp_calib_hi =
802 gpadc->cal_data[AB8500_CAL_IBAT].otp_calib_lo =
823 gpadc->cal_data[AB8500_CAL_IBAT].gain =
825 gpadc->cal_data[AB8500_CAL_IBAT].offset =
828 gpadc->cal_data[AB8500_CAL_IBAT].gain = 0;
838 gpadc->cal_data[AB8500_CAL_VMAIN].otp_calib_hi =
840 gpadc->cal_data[AB8500_CAL_VMAIN].otp_calib_lo =
843 gpadc->cal_data[AB8500_CAL_VMAIN].gain = AB8500_GPADC_CALIB_SCALE *
846 gpadc->cal_data[AB8500_CAL_VMAIN].offset = AB8500_GPADC_CALIB_SCALE *
850 gpadc->cal_data[AB8500_CAL_VMAIN].gain = 0;
860 gpadc->cal_data[AB8500_CAL_BTEMP].otp_calib_hi = (u16)btemp_high;
861 gpadc->cal_data[AB8500_CAL_BTEMP].otp_calib_lo = (u16)btemp_low;
863 gpadc->cal_data[AB8500_CAL_BTEMP].gain =
865 gpadc->cal_data[AB8500_CAL_BTEMP].offset = AB8500_GPADC_CALIB_SCALE * 1300 -
869 gpadc->cal_data[AB8500_CAL_BTEMP].gain = 0;
877 gpadc->cal_data[AB8500_CAL_VBAT].otp_calib_hi = (u16)vbat_high;
878 gpadc->cal_data[AB8500_CAL_VBAT].otp_calib_lo = (u16)vbat_low;
880 gpadc->cal_data[AB8500_CAL_VBAT].gain = AB8500_GPADC_CALIB_SCALE *
882 gpadc->cal_data[AB8500_CAL_VBAT].offset = AB8500_GPADC_CALIB_SCALE * 4700 -
886 gpadc->cal_data[AB8500_CAL_VBAT].gain = 0;
894 struct ab8500_gpadc *gpadc = iio_priv(indio_dev);
899 ch = ab8500_gpadc_get_channel(gpadc, chan->address);
901 dev_err(gpadc->dev, "no such channel %lu\n",
906 raw_val = ab8500_gpadc_read(gpadc, ch, NULL);
916 processed = ab8500_gpadc_ad_to_voltage(gpadc, ch->id, raw_val);
949 struct ab8500_gpadc *gpadc = iio_priv(indio_dev);
951 regulator_disable(gpadc->vddadc);
959 struct ab8500_gpadc *gpadc = iio_priv(indio_dev);
962 ret = regulator_enable(gpadc->vddadc);
1025 * @gpadc: the GPADC to configure the channels for
1030 static int ab8500_gpadc_parse_channels(struct ab8500_gpadc *gpadc,
1043 dev_err(gpadc->dev, "no channel children\n");
1046 dev_info(gpadc->dev, "found %d ADC channels\n", nchans);
1048 iio_chans = devm_kcalloc(gpadc->dev, nchans,
1053 gpadc->chans = devm_kcalloc(gpadc->dev, nchans,
1054 sizeof(*gpadc->chans), GFP_KERNEL);
1055 if (!gpadc->chans)
1063 ch = &gpadc->chans[i];
1066 ret = ab8500_gpadc_parse_channel(gpadc->dev, child, ch,
1074 gpadc->nchans = nchans;
1083 struct ab8500_gpadc *gpadc;
1091 indio_dev = devm_iio_device_alloc(dev, sizeof(*gpadc));
1096 gpadc = iio_priv(indio_dev);
1098 gpadc->dev = dev;
1099 gpadc->ab8500 = dev_get_drvdata(dev->parent);
1101 ret = ab8500_gpadc_parse_channels(gpadc, np, &iio_chans, &n_iio_chans);
1105 gpadc->irq_sw = platform_get_irq_byname(pdev, "SW_CONV_END");
1106 if (gpadc->irq_sw < 0) {
1108 return gpadc->irq_sw;
1111 gpadc->irq_hw = platform_get_irq_byname(pdev, "HW_CONV_END");
1112 if (gpadc->irq_hw < 0) {
1114 return gpadc->irq_hw;
1118 init_completion(&gpadc->complete);
1121 ret = devm_request_threaded_irq(dev, gpadc->irq_sw, NULL,
1123 "ab8500-gpadc-sw", gpadc);
1127 gpadc->irq_sw);
1131 ret = devm_request_threaded_irq(dev, gpadc->irq_hw, NULL,
1133 "ab8500-gpadc-hw", gpadc);
1137 gpadc->irq_hw);
1142 gpadc->vddadc = devm_regulator_get(dev, "vddadc");
1143 if (IS_ERR(gpadc->vddadc)) {
1144 ret = PTR_ERR(gpadc->vddadc);
1149 ret = regulator_enable(gpadc->vddadc);
1162 ab8500_gpadc_read_calibration_data(gpadc);
1166 indio_dev->name = "ab8500-gpadc";
1182 regulator_disable(gpadc->vddadc);
1190 struct ab8500_gpadc *gpadc = iio_priv(indio_dev);
1192 pm_runtime_get_sync(gpadc->dev);
1193 pm_runtime_put_noidle(gpadc->dev);
1194 pm_runtime_disable(gpadc->dev);
1195 regulator_disable(gpadc->vddadc);
1212 .name = "ab8500-gpadc",