diff --git a/drivers/iio/adc/qcom-spmi-adc5.c b/drivers/iio/adc/qcom-spmi-adc5.c index 0fa010a58c63..9ed8000ce6c4 100644 --- a/drivers/iio/adc/qcom-spmi-adc5.c +++ b/drivers/iio/adc/qcom-spmi-adc5.c @@ -618,6 +618,8 @@ static const struct adc5_channels adc7_chans_pmic[ADC5_MAX_CHANNEL] = { SCALE_HW_CALIB_DEFAULT) [ADC7_AMUX_THM3] = ADC5_CHAN_TEMP("smb_temp", 0, SCALE_HW_CALIB_PM7_SMB_TEMP) + [ADC7_CHG_TEMP] = ADC5_CHAN_TEMP("chg_temp", 0, + SCALE_HW_CALIB_PM7_CHG_TEMP) [ADC7_DIE_TEMP] = ADC5_CHAN_TEMP("die_temp", 0, SCALE_HW_CALIB_PMIC_THERM_PM7) [ADC7_AMUX_THM1_100K_PU] = ADC5_CHAN_TEMP("amux_thm1_pu2", 0, diff --git a/drivers/iio/adc/qcom-vadc-common.c b/drivers/iio/adc/qcom-vadc-common.c index e604a2695c34..ace40258dac5 100644 --- a/drivers/iio/adc/qcom-vadc-common.c +++ b/drivers/iio/adc/qcom-vadc-common.c @@ -572,6 +572,10 @@ static int qcom_vadc_scale_hw_chg5_temp( const struct u32_fract *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); +static int qcom_vadc_scale_hw_pm7_chg_temp( + const struct u32_fract *prescale, + const struct adc5_data *data, + u16 adc_code, int *result_mdec); static int qcom_vadc_scale_hw_calib_die_temp( const struct u32_fract *prescale, const struct adc5_data *data, @@ -600,6 +604,7 @@ static struct qcom_adc5_scale_type scale_adc5_fn[] = { [SCALE_HW_CALIB_PM5_SMB_TEMP] = {qcom_vadc_scale_hw_smb_temp}, [SCALE_HW_CALIB_PM5_SMB1398_TEMP] = {qcom_vadc_scale_hw_smb1398_temp}, [SCALE_HW_CALIB_PM7_SMB_TEMP] = {qcom_vadc_scale_hw_pm7_smb_temp}, + [SCALE_HW_CALIB_PM7_CHG_TEMP] = {qcom_vadc_scale_hw_pm7_chg_temp}, }; static int qcom_vadc_map_voltage_temp(const struct vadc_map_pt *pts, @@ -917,6 +922,26 @@ static int qcom_vadc7_scale_hw_calib_die_temp( voltage, result_mdec); } +static int qcom_vadc_scale_hw_pm7_chg_temp( + const struct u32_fract *prescale, + const struct adc5_data *data, + u16 adc_code, int *result_mdec) +{ + s64 temp; + int result_uv; + + result_uv = qcom_vadc_scale_code_voltage_factor(adc_code, + prescale, data, 1); + + /* T(C) = Vadc/0.0033 – 277.12 */ + temp = div_s64((30303LL * result_uv) - (27712 * 1000000LL), 100000); + pr_debug("adc_code: %u result_uv: %d temp: %lld\n", adc_code, result_uv, + temp); + *result_mdec = temp > 0 ? temp : 0; + + return 0; +} + static int qcom_vadc_scale_hw_pm7_smb_temp( const struct u32_fract *prescale, const struct adc5_data *data, diff --git a/include/linux/iio/adc/qcom-vadc-common.h b/include/linux/iio/adc/qcom-vadc-common.h index 59cd0fe9a0ea..4f1af5aeb25e 100644 --- a/include/linux/iio/adc/qcom-vadc-common.h +++ b/include/linux/iio/adc/qcom-vadc-common.h @@ -120,6 +120,8 @@ struct vadc_linear_graph { * SMB1398 temperature. * SCALE_HW_CALIB_PM7_SMB_TEMP: Returns result in millidegrees for PMIC7 * SMB139x temperature. + * SCALE_HW_CALIB_PM7_CHG_TEMP: Returns result in millidegrees for PMIC7 + * charger temperature. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, @@ -140,6 +142,7 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_BATT_THERM_400K, SCALE_HW_CALIB_PM5_SMB1398_TEMP, SCALE_HW_CALIB_PM7_SMB_TEMP, + SCALE_HW_CALIB_PM7_CHG_TEMP, SCALE_HW_CALIB_INVALID, };