Loading drivers/iio/adc/qcom-spmi-adc5.c +5 −3 Original line number Diff line number Diff line Loading @@ -529,11 +529,11 @@ static const struct adc_channels adc_chans_pmic5[ADC_MAX_CHANNEL] = { SCALE_HW_CALIB_DEFAULT) [ADC_XO_THERM_PU2] = ADC_CHAN_TEMP("xo_therm", 1, SCALE_HW_CALIB_XOTHERM) [ADC_AMUX_THM1_PU2] = ADC_CHAN_TEMP("amux_thm1", 1, [ADC_AMUX_THM1_PU2] = ADC_CHAN_TEMP("amux_thm1_pu2", 1, SCALE_HW_CALIB_THERM_100K_PULLUP) [ADC_AMUX_THM2_PU2] = ADC_CHAN_TEMP("amux_thm2", 1, [ADC_AMUX_THM2_PU2] = ADC_CHAN_TEMP("amux_thm2_pu2", 1, SCALE_HW_CALIB_THERM_100K_PULLUP) [ADC_AMUX_THM3_PU2] = ADC_CHAN_TEMP("amux_thm3", 1, [ADC_AMUX_THM3_PU2] = ADC_CHAN_TEMP("amux_thm3_pu2", 1, SCALE_HW_CALIB_THERM_100K_PULLUP) [ADC_INT_EXT_ISENSE_VBAT_VDATA] = ADC_CHAN_POWER("int_ext_isense", 1, SCALE_HW_CALIB_CUR) Loading @@ -541,6 +541,8 @@ static const struct adc_channels adc_chans_pmic5[ADC_MAX_CHANNEL] = { SCALE_HW_CALIB_CUR) [ADC_PARALLEL_ISENSE_VBAT_VDATA] = ADC_CHAN_POWER("parallel_isense", 1, SCALE_HW_CALIB_CUR) [ADC_AMUX_THM2] = ADC_CHAN_TEMP("amux_thm2", 1, SCALE_HW_CALIB_PM5_SMB_TEMP) }; static const struct adc_channels adc_chans_rev2[ADC_MAX_CHANNEL] = { Loading drivers/iio/adc/qcom-vadc-common.c +32 −0 Original line number Diff line number Diff line Loading @@ -306,6 +306,35 @@ static int qcom_vadc_scale_hw_calib_die_temp( return 0; } static int qcom_vadc_scale_hw_smb_temp( const struct vadc_prescale_ratio *prescale, const struct adc_data *data, u16 adc_code, int *result_mdec) { s64 voltage = 0, adc_vdd_ref_mv = 1875; u64 temp; if (adc_code > VADC5_MAX_CODE) adc_code = 0; /* (ADC code * vref_vadc (1.875V)) / full_scale_code */ voltage = (s64) adc_code * adc_vdd_ref_mv * 1000; voltage = div64_s64(voltage, data->full_scale_code_volt); if (voltage > 0) { temp = voltage * prescale->den; temp *= 100; do_div(temp, prescale->num * PMIC5_SMB_TEMP_SCALE_FACTOR); voltage = temp; } else { voltage = 0; } voltage = PMIC5_SMB_TEMP_CONSTANT - voltage; *result_mdec = voltage; return 0; } static int qcom_vadc_scale_hw_chg5_temp( const struct vadc_prescale_ratio *prescale, const struct adc_data *data, Loading Loading @@ -412,6 +441,9 @@ int qcom_vadc_hw_scale(enum vadc_scale_fn_type scaletype, case SCALE_HW_CALIB_PM5_CHG_TEMP: return qcom_vadc_scale_hw_chg5_temp(prescale, data, adc_code, result); case SCALE_HW_CALIB_PM5_SMB_TEMP: return qcom_vadc_scale_hw_smb_temp(prescale, data, adc_code, result); default: return -EINVAL; } Loading drivers/iio/adc/qcom-vadc-common.h +5 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ #define KELVINMIL_CELSIUSMIL 273150 #define PMIC5_CHG_TEMP_SCALE_FACTOR 377500 #define PMIC5_SMB_TEMP_CONSTANT 419400 #define PMIC5_SMB_TEMP_SCALE_FACTOR 356 #define PMI_CHG_SCALE_1 -138890 #define PMI_CHG_SCALE_2 391750000000LL Loading Loading @@ -114,6 +116,8 @@ struct vadc_prescale_ratio { * SCALE_HW_CALIB_CUR: Returns result in uA for PMIC5. * SCALE_HW_CALIB_PM5_CHG_TEMP: Returns result in millidegrees for PMIC5 * charger temperature. * SCALE_HW_CALIB_PM5_SMB_TEMP: Returns result in millidegrees for PMIC5 * SMB1390 temperature. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, Loading @@ -127,6 +131,7 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_PMIC_THERM, SCALE_HW_CALIB_CUR, SCALE_HW_CALIB_PM5_CHG_TEMP, SCALE_HW_CALIB_PM5_SMB_TEMP, }; struct adc_data { Loading Loading
drivers/iio/adc/qcom-spmi-adc5.c +5 −3 Original line number Diff line number Diff line Loading @@ -529,11 +529,11 @@ static const struct adc_channels adc_chans_pmic5[ADC_MAX_CHANNEL] = { SCALE_HW_CALIB_DEFAULT) [ADC_XO_THERM_PU2] = ADC_CHAN_TEMP("xo_therm", 1, SCALE_HW_CALIB_XOTHERM) [ADC_AMUX_THM1_PU2] = ADC_CHAN_TEMP("amux_thm1", 1, [ADC_AMUX_THM1_PU2] = ADC_CHAN_TEMP("amux_thm1_pu2", 1, SCALE_HW_CALIB_THERM_100K_PULLUP) [ADC_AMUX_THM2_PU2] = ADC_CHAN_TEMP("amux_thm2", 1, [ADC_AMUX_THM2_PU2] = ADC_CHAN_TEMP("amux_thm2_pu2", 1, SCALE_HW_CALIB_THERM_100K_PULLUP) [ADC_AMUX_THM3_PU2] = ADC_CHAN_TEMP("amux_thm3", 1, [ADC_AMUX_THM3_PU2] = ADC_CHAN_TEMP("amux_thm3_pu2", 1, SCALE_HW_CALIB_THERM_100K_PULLUP) [ADC_INT_EXT_ISENSE_VBAT_VDATA] = ADC_CHAN_POWER("int_ext_isense", 1, SCALE_HW_CALIB_CUR) Loading @@ -541,6 +541,8 @@ static const struct adc_channels adc_chans_pmic5[ADC_MAX_CHANNEL] = { SCALE_HW_CALIB_CUR) [ADC_PARALLEL_ISENSE_VBAT_VDATA] = ADC_CHAN_POWER("parallel_isense", 1, SCALE_HW_CALIB_CUR) [ADC_AMUX_THM2] = ADC_CHAN_TEMP("amux_thm2", 1, SCALE_HW_CALIB_PM5_SMB_TEMP) }; static const struct adc_channels adc_chans_rev2[ADC_MAX_CHANNEL] = { Loading
drivers/iio/adc/qcom-vadc-common.c +32 −0 Original line number Diff line number Diff line Loading @@ -306,6 +306,35 @@ static int qcom_vadc_scale_hw_calib_die_temp( return 0; } static int qcom_vadc_scale_hw_smb_temp( const struct vadc_prescale_ratio *prescale, const struct adc_data *data, u16 adc_code, int *result_mdec) { s64 voltage = 0, adc_vdd_ref_mv = 1875; u64 temp; if (adc_code > VADC5_MAX_CODE) adc_code = 0; /* (ADC code * vref_vadc (1.875V)) / full_scale_code */ voltage = (s64) adc_code * adc_vdd_ref_mv * 1000; voltage = div64_s64(voltage, data->full_scale_code_volt); if (voltage > 0) { temp = voltage * prescale->den; temp *= 100; do_div(temp, prescale->num * PMIC5_SMB_TEMP_SCALE_FACTOR); voltage = temp; } else { voltage = 0; } voltage = PMIC5_SMB_TEMP_CONSTANT - voltage; *result_mdec = voltage; return 0; } static int qcom_vadc_scale_hw_chg5_temp( const struct vadc_prescale_ratio *prescale, const struct adc_data *data, Loading Loading @@ -412,6 +441,9 @@ int qcom_vadc_hw_scale(enum vadc_scale_fn_type scaletype, case SCALE_HW_CALIB_PM5_CHG_TEMP: return qcom_vadc_scale_hw_chg5_temp(prescale, data, adc_code, result); case SCALE_HW_CALIB_PM5_SMB_TEMP: return qcom_vadc_scale_hw_smb_temp(prescale, data, adc_code, result); default: return -EINVAL; } Loading
drivers/iio/adc/qcom-vadc-common.h +5 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,8 @@ #define KELVINMIL_CELSIUSMIL 273150 #define PMIC5_CHG_TEMP_SCALE_FACTOR 377500 #define PMIC5_SMB_TEMP_CONSTANT 419400 #define PMIC5_SMB_TEMP_SCALE_FACTOR 356 #define PMI_CHG_SCALE_1 -138890 #define PMI_CHG_SCALE_2 391750000000LL Loading Loading @@ -114,6 +116,8 @@ struct vadc_prescale_ratio { * SCALE_HW_CALIB_CUR: Returns result in uA for PMIC5. * SCALE_HW_CALIB_PM5_CHG_TEMP: Returns result in millidegrees for PMIC5 * charger temperature. * SCALE_HW_CALIB_PM5_SMB_TEMP: Returns result in millidegrees for PMIC5 * SMB1390 temperature. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, Loading @@ -127,6 +131,7 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_PMIC_THERM, SCALE_HW_CALIB_CUR, SCALE_HW_CALIB_PM5_CHG_TEMP, SCALE_HW_CALIB_PM5_SMB_TEMP, }; struct adc_data { Loading