Loading drivers/iio/adc/qcom-vadc-common.c +32 −0 Original line number Diff line number Diff line Loading @@ -1208,6 +1208,35 @@ static int qcom_vadc_scale_hw_smb1398_temp( return 0; } static int qcom_vadc_scale_hw_pm2250_s3_die_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; 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) { voltage *= prescale->den; voltage = div64_s64(voltage, prescale->num); } else { voltage = 0; } voltage = PMIC5_PM2250_S3_DIE_TEMP_CONSTANT - voltage; voltage *= 100000; voltage = div64_s64(voltage, PMIC5_PM2250_S3_DIE_TEMP_SCALE_FACTOR); *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 @@ -1329,6 +1358,9 @@ int qcom_vadc_hw_scale(enum vadc_scale_fn_type scaletype, case SCALE_HW_CALIB_PM5_SMB1398_TEMP: return qcom_vadc_scale_hw_smb1398_temp(prescale, data, adc_code, result); case SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: return qcom_vadc_scale_hw_pm2250_s3_die_temp(prescale, data, adc_code, result); case SCALE_HW_CALIB_THERM_100K_PU_PM7: return qcom_vadc7_scale_hw_calib_therm(prescale, data, adc_code, result); Loading drivers/iio/adc/qcom-vadc-common.h +6 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,9 @@ #define PMIC5_SMB1398_TEMP_SCALE_FACTOR 340 #define PMIC5_SMB1398_TEMP_CONSTANT 268235 #define PMIC5_PM2250_S3_DIE_TEMP_SCALE_FACTOR 187263 #define PMIC5_PM2250_S3_DIE_TEMP_CONSTANT 720100 #define PMI_CHG_SCALE_1 -138890 #define PMI_CHG_SCALE_2 391750000000LL Loading Loading @@ -172,6 +175,8 @@ struct vadc_prescale_ratio { * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor voltage in * decidegC using 400k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: Returns result in millidegrees for * S3 die temperature channel on PM2250. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, Loading @@ -190,6 +195,7 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_BATT_THERM_30K, SCALE_HW_CALIB_BATT_THERM_400K, SCALE_HW_CALIB_PM5_SMB1398_TEMP, SCALE_HW_CALIB_PM2250_S3_DIE_TEMP, SCALE_HW_CALIB_THERM_100K_PU_PM7, SCALE_HW_CALIB_PMIC_THERM_PM7, SCALE_HW_CALIB_MAX, Loading include/dt-bindings/iio/qcom,spmi-vadc.h +1 −0 Original line number Diff line number Diff line Loading @@ -241,6 +241,7 @@ #define ADC_SCALE_HW_CALIB_BATT_THERM_30K 0xD #define ADC_SCALE_HW_CALIB_BATT_THERM_400K 0xE #define ADC_SCALE_HW_CALIB_PM5_SMB1398_TEMP 0xF #define ADC_SCALE_HW_CALIB_PM2250_S3_DIE_TEMP 0x10 /* ADC channels for ADC for PMIC7 */ Loading Loading
drivers/iio/adc/qcom-vadc-common.c +32 −0 Original line number Diff line number Diff line Loading @@ -1208,6 +1208,35 @@ static int qcom_vadc_scale_hw_smb1398_temp( return 0; } static int qcom_vadc_scale_hw_pm2250_s3_die_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; 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) { voltage *= prescale->den; voltage = div64_s64(voltage, prescale->num); } else { voltage = 0; } voltage = PMIC5_PM2250_S3_DIE_TEMP_CONSTANT - voltage; voltage *= 100000; voltage = div64_s64(voltage, PMIC5_PM2250_S3_DIE_TEMP_SCALE_FACTOR); *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 @@ -1329,6 +1358,9 @@ int qcom_vadc_hw_scale(enum vadc_scale_fn_type scaletype, case SCALE_HW_CALIB_PM5_SMB1398_TEMP: return qcom_vadc_scale_hw_smb1398_temp(prescale, data, adc_code, result); case SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: return qcom_vadc_scale_hw_pm2250_s3_die_temp(prescale, data, adc_code, result); case SCALE_HW_CALIB_THERM_100K_PU_PM7: return qcom_vadc7_scale_hw_calib_therm(prescale, data, adc_code, result); Loading
drivers/iio/adc/qcom-vadc-common.h +6 −0 Original line number Diff line number Diff line Loading @@ -47,6 +47,9 @@ #define PMIC5_SMB1398_TEMP_SCALE_FACTOR 340 #define PMIC5_SMB1398_TEMP_CONSTANT 268235 #define PMIC5_PM2250_S3_DIE_TEMP_SCALE_FACTOR 187263 #define PMIC5_PM2250_S3_DIE_TEMP_CONSTANT 720100 #define PMI_CHG_SCALE_1 -138890 #define PMI_CHG_SCALE_2 391750000000LL Loading Loading @@ -172,6 +175,8 @@ struct vadc_prescale_ratio { * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor voltage in * decidegC using 400k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: Returns result in millidegrees for * S3 die temperature channel on PM2250. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, Loading @@ -190,6 +195,7 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_BATT_THERM_30K, SCALE_HW_CALIB_BATT_THERM_400K, SCALE_HW_CALIB_PM5_SMB1398_TEMP, SCALE_HW_CALIB_PM2250_S3_DIE_TEMP, SCALE_HW_CALIB_THERM_100K_PU_PM7, SCALE_HW_CALIB_PMIC_THERM_PM7, SCALE_HW_CALIB_MAX, Loading
include/dt-bindings/iio/qcom,spmi-vadc.h +1 −0 Original line number Diff line number Diff line Loading @@ -241,6 +241,7 @@ #define ADC_SCALE_HW_CALIB_BATT_THERM_30K 0xD #define ADC_SCALE_HW_CALIB_BATT_THERM_400K 0xE #define ADC_SCALE_HW_CALIB_PM5_SMB1398_TEMP 0xF #define ADC_SCALE_HW_CALIB_PM2250_S3_DIE_TEMP 0x10 /* ADC channels for ADC for PMIC7 */ Loading