Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e213f1b4 authored by Jishnu Prakash's avatar Jishnu Prakash
Browse files

hwmon: qpnp-adc: Add support for USB_IN_V channel on PMI632



USB_IN_V cannot be measured similarly to other channels due to
its low pre-scaling factor, which can cause its reading to be
distorted by residual voltage from previous ADC measurements.
Add support to lower calibration frequency and add delay before
measurement to ensure accurate reading.

Change-Id: If35f5c692a996d6f732038fabd5e1205525dbc03
Signed-off-by: default avatarJishnu Prakash <jprakash@codeaurora.org>
parent f82ab04c
Loading
Loading
Loading
Loading
+43 −1
Original line number Diff line number Diff line
@@ -162,6 +162,10 @@
#define QPNP_VADC_HC1_CONV_TIME_MAX_US				214
#define QPNP_VADC_HC1_ERR_COUNT					1600

#define QPNP_VADC_CAL_DELAY_CTL_1					0x3744
#define QPNP_VADC_CAL_DELAY_MEAS_SLOW					0x73
#define QPNP_VADC_CAL_DELAY_MEAS_DEFAULT				0x3

struct qpnp_vadc_mode_state {
	bool				meas_int_mode;
	bool				meas_int_request_in_queue;
@@ -489,7 +493,8 @@ int32_t qpnp_vadc_hc_read(struct qpnp_vadc_chip *vadc,
				struct qpnp_vadc_result *result)
{
	int rc = 0, scale_type, amux_prescaling, dt_index = 0, calib_type = 0;
	struct qpnp_adc_amux_properties amux_prop;
	u8 val = QPNP_VADC_CAL_DELAY_MEAS_SLOW;
	struct qpnp_adc_amux_properties amux_prop, conv;

	if (qpnp_vadc_is_valid(vadc))
		return -EPROBE_DEFER;
@@ -525,6 +530,31 @@ int32_t qpnp_vadc_hc_read(struct qpnp_vadc_chip *vadc,
		goto fail_unlock;
	}

	if (channel == VADC_USB_IN_V_DIV_16_PM5 &&
			vadc->adc->adc_prop->is_pmic_5) {
		rc = regmap_bulk_write(vadc->adc->regmap,
				QPNP_VADC_CAL_DELAY_CTL_1, &val, 1);
		if (rc < 0) {
			pr_err("qpnp adc write cal_delay failed with %d\n", rc);
			return rc;
		}
		msleep(20);

		conv.amux_channel = VADC_VREF_GND;
		conv.decimation = DECIMATION_TYPE2;
		conv.mode_sel = ADC_OP_NORMAL_MODE << QPNP_VADC_OP_MODE_SHIFT;
		conv.hw_settle_time = ADC_CHANNEL_HW_SETTLE_DELAY_0US;
		conv.fast_avg_setup = ADC_FAST_AVG_SAMPLE_1;
		conv.cal_val = ADC_HC_ABS_CAL;

		rc = qpnp_vadc_hc_configure(vadc, &conv);
		if (rc) {
			pr_err("qpnp_vadc configure failed with %d\n", rc);
			goto fail_unlock;
		}

	}

	amux_prop.decimation =
			vadc->adc->adc_channels[dt_index].adc_decimation;
	amux_prop.calib_type = vadc->adc->adc_channels[dt_index].calib_type;
@@ -561,6 +591,18 @@ int32_t qpnp_vadc_hc_read(struct qpnp_vadc_chip *vadc,
		}
	}

	val = QPNP_VADC_CAL_DELAY_MEAS_DEFAULT;

	if (channel == VADC_USB_IN_V_DIV_16_PM5 &&
			vadc->adc->adc_prop->is_pmic_5) {
		rc = regmap_bulk_write(vadc->adc->regmap,
				QPNP_VADC_CAL_DELAY_CTL_1, &val, 1);
		if (rc < 0) {
			pr_err("qpnp adc write cal_delay failed with %d\n", rc);
			return rc;
		}
	}

	rc = qpnp_vadc_hc_read_data(vadc, &result->adc_code);
	if (rc) {
		pr_err("qpnp vadc read adc code failed with %d\n", rc);