Loading arch/arm/configs/vendor/monaco.config +1 −1 Original line number Diff line number Diff line Loading @@ -159,7 +159,7 @@ CONFIG_QCOM_SPMI_TEMP_ALARM=y CONFIG_IIO=y CONFIG_PINCTRL_QCOM_SPMI_PMIC=y CONFIG_INPUT_QPNP_POWER_ON=y CONFIG_QCOM_SPMI_ADC5=y CONFIG_QCOM_SPMI_ADC5_GEN3=y CONFIG_NVMEM_SPMI_SDAM=y CONFIG_RTC_CLASS=y CONFIG_RTC_DRV_PM8XXX=y Loading drivers/iio/adc/qcom-spmi-adc5-gen3.c +6 −2 Original line number Diff line number Diff line Loading @@ -1322,12 +1322,16 @@ static const struct adc5_channels adc5_chans_pmic[ADC5_MAX_CHANNEL] = { SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_VPH_PWR] = ADC5_CHAN_VOLT("vph_pwr", 1, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_VBAT_SNS_QBG] = ADC5_CHAN_VOLT("vbat_sns", 3, [ADC5_GEN3_VBAT_SNS_QBG] = ADC5_CHAN_VOLT("vbat_sns", 1, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_AMUX3_THM] = ADC5_CHAN_TEMP("smb_temp", 0, SCALE_HW_CALIB_PM7_SMB_TEMP) [ADC5_GEN3_CHG_TEMP] = ADC5_CHAN_TEMP("chg_temp", 0, SCALE_HW_CALIB_PM7_CHG_TEMP) [ADC5_GEN3_USB_SNS_V_16] = ADC5_CHAN_TEMP("usb_sns_v_div_16", 3, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_VIN_DIV16_MUX] = ADC5_CHAN_TEMP("vin_div_16", 3, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_IIN_FB] = ADC5_CHAN_CUR("iin_fb", 4, SCALE_HW_CALIB_CUR) [ADC5_GEN3_ICHG_SMB] = ADC5_CHAN_CUR("ichg_smb", 5, Loading Loading @@ -1510,7 +1514,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, static const struct adc5_data adc5_gen3_data_pmic = { .name = "pm-adc5-gen3", .full_scale_code_volt = 0x70e4, .full_scale_code_cur = 0x2710, .full_scale_code_cur = 0x2ee0, .adc_chans = adc5_chans_pmic, .decimation = (unsigned int [ADC5_DECIMATION_SAMPLES_MAX]) {85, 340, 1360}, Loading drivers/iio/adc/qcom-vadc-common.c +160 −0 Original line number Diff line number Diff line Loading @@ -508,6 +508,82 @@ static const struct vadc_map_pt adcmap7_100k[] = { { 2420, 130048 } }; /* * Resistance to temperature table for batt_therm. */ static const struct vadc_map_pt adcmap_gen3_batt_therm_100k[] = { { 5319890, -400 }, { 4555860, -380 }, { 3911780, -360 }, { 3367320, -340 }, { 2905860, -320 }, { 2513730, -300 }, { 2179660, -280 }, { 1894360, -260 }, { 1650110, -240 }, { 1440520, -220 }, { 1260250, -200 }, { 1104850, -180 }, { 970600, -160 }, { 854370, -140 }, { 753530, -120 }, { 665860, -100 }, { 589490, -80 }, { 522830, -60 }, { 464540, -40 }, { 413470, -20 }, { 368640, 0 }, { 329220, 20 }, { 294490, 40 }, { 263850, 60 }, { 236770, 80 }, { 212790, 100 }, { 191530, 120 }, { 172640, 140 }, { 155840, 160 }, { 140880, 180 }, { 127520, 200 }, { 115590, 220 }, { 104910, 240 }, { 95350, 260 }, { 86760, 280 }, { 79050, 300 }, { 72110, 320 }, { 65860, 340 }, { 60220, 360 }, { 55130, 380 }, { 50520, 400 }, { 46350, 420 }, { 42570, 440 }, { 39140, 460 }, { 36030, 480 }, { 33190, 500 }, { 30620, 520 }, { 28260, 540 }, { 26120, 560 }, { 24160, 580 }, { 22370, 600 }, { 20730, 620 }, { 19230, 640 }, { 17850, 660 }, { 16580, 680 }, { 15420, 700 }, { 14350, 720 }, { 13370, 740 }, { 12470, 760 }, { 11630, 780 }, { 10860, 800 }, { 10150, 820 }, { 9490, 840 }, { 8880, 860 }, { 8320, 880 }, { 7800, 900 }, { 7310, 920 }, { 6860, 940 }, { 6450, 960 }, { 6060, 980 } }; static int qcom_vadc_scale_hw_calib_volt( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, Loading Loading @@ -563,6 +639,18 @@ static int qcom_vadc_scale_hw_pm2250_s3_die_temp( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_adc5_gen3_scale_hw_calib_batt_therm_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_adc5_gen3_scale_hw_calib_batt_id_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_adc5_gen3_scale_hw_calib_usb_in_current( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_vadc_scale_hw_chg5_temp( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, Loading Loading @@ -602,6 +690,9 @@ 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_PM2250_S3_DIE_TEMP] = {qcom_vadc_scale_hw_pm2250_s3_die_temp}, [SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K] = {qcom_adc5_gen3_scale_hw_calib_batt_therm_100}, [SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K] = {qcom_adc5_gen3_scale_hw_calib_batt_id_100}, [SCALE_HW_CALIB_PM5_GEN3_USB_IN_I] = {qcom_adc5_gen3_scale_hw_calib_usb_in_current}, [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}, }; Loading Loading @@ -1147,6 +1238,75 @@ static int qcom_vadc_scale_hw_pm2250_s3_die_temp( return 0; } static int qcom_adc5_gen3_scale_hw_calib_batt_therm_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec) { s64 resistance = 0; int ret, result = 0; if (adc_code >= RATIO_MAX_ADC7) return -EINVAL; /* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/ resistance = (s64) adc_code * R_PU_100K; resistance = div64_s64(resistance, (RATIO_MAX_ADC7 - adc_code)); ret = qcom_vadc_map_voltage_temp(adcmap_gen3_batt_therm_100k, ARRAY_SIZE(adcmap_gen3_batt_therm_100k), resistance, &result); if (ret) return ret; *result_mdec = result; return 0; } static int qcom_adc5_gen3_scale_hw_calib_batt_id_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec) { s64 resistance = 0; if (adc_code >= RATIO_MAX_ADC7) return -EINVAL; /* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/ resistance = (s64) adc_code * R_PU_100K; resistance = div64_s64(resistance, (RATIO_MAX_ADC7 - adc_code)); *result_mdec = (int)resistance; return 0; }; static int qcom_adc5_gen3_scale_hw_calib_usb_in_current( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_ua) { s64 voltage = 0, result = 0; bool positive = true; if (adc_code & ADC5_USR_DATA_CHECK) { adc_code = ~adc_code + 1; positive = false; } voltage = (s64)(s16) adc_code * 1000000; voltage = div64_s64(voltage, PMIC5_GEN3_USB_IN_I_SCALE_FACTOR); result = div64_s64(voltage * prescale->den, prescale->num); *result_ua = (int)result; if (!positive) *result_ua = -(int)result; return 0; }; static int qcom_vadc_scale_hw_chg5_temp( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, Loading drivers/iio/adc/qcom-vadc-common.h +14 −3 Original line number Diff line number Diff line Loading @@ -65,6 +65,8 @@ #define DIE_TEMP_ADC7_SCALE_FACTOR 1000 #define DIE_TEMP_ADC7_MAX 160000 #define PMIC5_GEN3_USB_IN_I_SCALE_FACTOR 9248 #define ADC_VDD_REF 1875000 /** Loading Loading @@ -184,13 +186,13 @@ struct adc_tm_client_info { * charger temperature. * SCALE_HW_CALIB_PM5_SMB_TEMP: Returns result in millidegrees for PMIC5 * SMB1390 temperature. * SCALE_HW_CALIB_BATT_THERM_100K: Returns battery thermistor voltage in * SCALE_HW_CALIB_BATT_THERM_100K: Returns battery thermistor temperature in * decidegC using 100k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_BATT_THERM_30K: Returns battery thermistor voltage in * SCALE_HW_CALIB_BATT_THERM_30K: Returns battery thermistor temperature in * decidegC using 30k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor voltage in * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor temperature in * decidegC using 400k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_PM5_SMB1398_TEMP: Returns result in millidegrees for PMIC5 Loading @@ -207,6 +209,12 @@ struct adc_tm_client_info { * that uses raw ADC code. * SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: Returns result in millidegrees for * S3 die temperature channel on PM2250. * SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K: Returns battery thermistor * temperature in decidegC using 100k pullup. The hardware applies * offset/slope to adc code. * SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K: Returns battery ID resistance * in ohms using 100k pullup. The hardware applies offset/slope to adc code. * SCALE_HW_CALIB_PM5_GEN3_USB_IN_I: Returns USB input current in microamperes. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, Loading @@ -232,6 +240,9 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_CUR_RAW, SCALE_HW_CALIB_PM2250_S3_DIE_TEMP, SCALE_HW_CALIB_PM5_CUR, SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K, SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K, SCALE_HW_CALIB_PM5_GEN3_USB_IN_I, SCALE_HW_CALIB_INVALID, }; Loading include/dt-bindings/iio/qcom,spmi-adc5-gen3-pm5100.h +10 −14 Original line number Diff line number Diff line Loading @@ -17,8 +17,8 @@ #define PM5100_ADC5_GEN3_DIE_TEMP (PM5100_SID << 8 | 0x03) #define PM5100_ADC5_GEN3_AMUX1_THM (PM5100_SID << 8 | 0x04) #define PM5100_ADC5_GEN3_AMUX2_THM (PM5100_SID << 8 | 0x05) #define PM5100_ADC5_GEN3_AMUX3_THM (PM5100_SID << 8 | 0x06) #define PM5100_ADC5_GEN3_BAT_ID (PM5100_SID << 8 | 0x05) #define PM5100_ADC5_GEN3_BATT_THM (PM5100_SID << 8 | 0x06) #define PM5100_ADC5_GEN3_AMUX4_THM (PM5100_SID << 8 | 0x07) #define PM5100_ADC5_GEN3_AMUX5_THM (PM5100_SID << 8 | 0x08) #define PM5100_ADC5_GEN3_AMUX6_THM (PM5100_SID << 8 | 0x09) Loading @@ -30,13 +30,13 @@ #define PM5100_ADC5_GEN3_CHG_TEMP (PM5100_SID << 8 | 0x10) #define PM5100_ADC5_GEN3_USB_SNS_V_16 (PM5100_SID << 8 | 0x11) #define PM5100_ADC5_GEN3_VIN_DIV16_MUX (PM5100_SID << 8 | 0x12) #define PM5100_ADC5_GEN3_IIN_FB (PM5100_SID << 8 | 0x17) #define PM5100_ADC5_GEN3_USB_IN_I (PM5100_SID << 8 | 0x17) #define PM5100_ADC5_GEN3_ICHG_FB (PM5100_SID << 8 | 0xa1) /* 30k pull-up1 */ #define PM5100_ADC5_GEN3_AMUX1_THM_30K_PU (PM5100_SID << 8 | 0x24) #define PM5100_ADC5_GEN3_AMUX2_THM_30K_PU (PM5100_SID << 8 | 0x25) #define PM5100_ADC5_GEN3_AMUX3_THM_30K_PU (PM5100_SID << 8 | 0x26) #define PM5100_ADC5_GEN3_BAT_ID_30K_PU (PM5100_SID << 8 | 0x25) #define PM5100_ADC5_GEN3_BATT_THM_30K_PU (PM5100_SID << 8 | 0x26) #define PM5100_ADC5_GEN3_AMUX4_THM_30K_PU (PM5100_SID << 8 | 0x27) #define PM5100_ADC5_GEN3_AMUX5_THM_30K_PU (PM5100_SID << 8 | 0x28) #define PM5100_ADC5_GEN3_AMUX6_THM_30K_PU (PM5100_SID << 8 | 0x29) Loading @@ -45,14 +45,10 @@ #define PM5100_ADC5_GEN3_AMUX3_GPIO_30K_PU (PM5100_SID << 8 | 0x2c) #define PM5100_ADC5_GEN3_AMUX4_GPIO_30K_PU (PM5100_SID << 8 | 0x2d) #define ADC5_GEN3_AMUX2_GPIO_100K_PU 0x4b /* 100k pull-up2 */ #define PM5100_ADC5_GEN3_AMUX1_THM_100K_PU (PM5100_SID << 8 | 0x44) #define PM5100_ADC5_GEN3_AMUX2_THM_100K_PU (PM5100_SID << 8 | 0x45) #define PM5100_ADC5_GEN3_AMUX3_THM_100K_PU (PM5100_SID << 8 | 0x46) #define PM5100_ADC5_GEN3_BAT_ID_100K_PU (PM5100_SID << 8 | 0x45) #define PM5100_ADC5_GEN3_BATT_THM_100K_PU (PM5100_SID << 8 | 0x46) #define PM5100_ADC5_GEN3_AMUX4_THM_100K_PU (PM5100_SID << 8 | 0x47) #define PM5100_ADC5_GEN3_AMUX5_THM_100K_PU (PM5100_SID << 8 | 0x48) #define PM5100_ADC5_GEN3_AMUX6_THM_100K_PU (PM5100_SID << 8 | 0x49) Loading @@ -63,8 +59,8 @@ /* 400k pull-up3 */ #define PM5100_ADC5_GEN3_AMUX1_THM_400K_PU (PM5100_SID << 8 | 0x64) #define PM5100_ADC5_GEN3_AMUX2_THM_400K_PU (PM5100_SID << 8 | 0x65) #define PM5100_ADC5_GEN3_AMUX3_THM_400K_PU (PM5100_SID << 8 | 0x66) #define PM5100_ADC5_GEN3_BAT_ID_400K_PU (PM5100_SID << 8 | 0x65) #define PM5100_ADC5_GEN3_BATT_THM_400K_PU (PM5100_SID << 8 | 0x66) #define PM5100_ADC5_GEN3_AMUX4_THM_400K_PU (PM5100_SID << 8 | 0x67) #define PM5100_ADC5_GEN3_AMUX5_THM_400K_PU (PM5100_SID << 8 | 0x68) #define PM5100_ADC5_GEN3_AMUX6_THM_400K_PU (PM5100_SID << 8 | 0x69) Loading Loading
arch/arm/configs/vendor/monaco.config +1 −1 Original line number Diff line number Diff line Loading @@ -159,7 +159,7 @@ CONFIG_QCOM_SPMI_TEMP_ALARM=y CONFIG_IIO=y CONFIG_PINCTRL_QCOM_SPMI_PMIC=y CONFIG_INPUT_QPNP_POWER_ON=y CONFIG_QCOM_SPMI_ADC5=y CONFIG_QCOM_SPMI_ADC5_GEN3=y CONFIG_NVMEM_SPMI_SDAM=y CONFIG_RTC_CLASS=y CONFIG_RTC_DRV_PM8XXX=y Loading
drivers/iio/adc/qcom-spmi-adc5-gen3.c +6 −2 Original line number Diff line number Diff line Loading @@ -1322,12 +1322,16 @@ static const struct adc5_channels adc5_chans_pmic[ADC5_MAX_CHANNEL] = { SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_VPH_PWR] = ADC5_CHAN_VOLT("vph_pwr", 1, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_VBAT_SNS_QBG] = ADC5_CHAN_VOLT("vbat_sns", 3, [ADC5_GEN3_VBAT_SNS_QBG] = ADC5_CHAN_VOLT("vbat_sns", 1, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_AMUX3_THM] = ADC5_CHAN_TEMP("smb_temp", 0, SCALE_HW_CALIB_PM7_SMB_TEMP) [ADC5_GEN3_CHG_TEMP] = ADC5_CHAN_TEMP("chg_temp", 0, SCALE_HW_CALIB_PM7_CHG_TEMP) [ADC5_GEN3_USB_SNS_V_16] = ADC5_CHAN_TEMP("usb_sns_v_div_16", 3, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_VIN_DIV16_MUX] = ADC5_CHAN_TEMP("vin_div_16", 3, SCALE_HW_CALIB_DEFAULT) [ADC5_GEN3_IIN_FB] = ADC5_CHAN_CUR("iin_fb", 4, SCALE_HW_CALIB_CUR) [ADC5_GEN3_ICHG_SMB] = ADC5_CHAN_CUR("ichg_smb", 5, Loading Loading @@ -1510,7 +1514,7 @@ static int adc5_get_dt_channel_data(struct adc5_chip *adc, static const struct adc5_data adc5_gen3_data_pmic = { .name = "pm-adc5-gen3", .full_scale_code_volt = 0x70e4, .full_scale_code_cur = 0x2710, .full_scale_code_cur = 0x2ee0, .adc_chans = adc5_chans_pmic, .decimation = (unsigned int [ADC5_DECIMATION_SAMPLES_MAX]) {85, 340, 1360}, Loading
drivers/iio/adc/qcom-vadc-common.c +160 −0 Original line number Diff line number Diff line Loading @@ -508,6 +508,82 @@ static const struct vadc_map_pt adcmap7_100k[] = { { 2420, 130048 } }; /* * Resistance to temperature table for batt_therm. */ static const struct vadc_map_pt adcmap_gen3_batt_therm_100k[] = { { 5319890, -400 }, { 4555860, -380 }, { 3911780, -360 }, { 3367320, -340 }, { 2905860, -320 }, { 2513730, -300 }, { 2179660, -280 }, { 1894360, -260 }, { 1650110, -240 }, { 1440520, -220 }, { 1260250, -200 }, { 1104850, -180 }, { 970600, -160 }, { 854370, -140 }, { 753530, -120 }, { 665860, -100 }, { 589490, -80 }, { 522830, -60 }, { 464540, -40 }, { 413470, -20 }, { 368640, 0 }, { 329220, 20 }, { 294490, 40 }, { 263850, 60 }, { 236770, 80 }, { 212790, 100 }, { 191530, 120 }, { 172640, 140 }, { 155840, 160 }, { 140880, 180 }, { 127520, 200 }, { 115590, 220 }, { 104910, 240 }, { 95350, 260 }, { 86760, 280 }, { 79050, 300 }, { 72110, 320 }, { 65860, 340 }, { 60220, 360 }, { 55130, 380 }, { 50520, 400 }, { 46350, 420 }, { 42570, 440 }, { 39140, 460 }, { 36030, 480 }, { 33190, 500 }, { 30620, 520 }, { 28260, 540 }, { 26120, 560 }, { 24160, 580 }, { 22370, 600 }, { 20730, 620 }, { 19230, 640 }, { 17850, 660 }, { 16580, 680 }, { 15420, 700 }, { 14350, 720 }, { 13370, 740 }, { 12470, 760 }, { 11630, 780 }, { 10860, 800 }, { 10150, 820 }, { 9490, 840 }, { 8880, 860 }, { 8320, 880 }, { 7800, 900 }, { 7310, 920 }, { 6860, 940 }, { 6450, 960 }, { 6060, 980 } }; static int qcom_vadc_scale_hw_calib_volt( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, Loading Loading @@ -563,6 +639,18 @@ static int qcom_vadc_scale_hw_pm2250_s3_die_temp( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_adc5_gen3_scale_hw_calib_batt_therm_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_adc5_gen3_scale_hw_calib_batt_id_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_adc5_gen3_scale_hw_calib_usb_in_current( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec); static int qcom_vadc_scale_hw_chg5_temp( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, Loading Loading @@ -602,6 +690,9 @@ 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_PM2250_S3_DIE_TEMP] = {qcom_vadc_scale_hw_pm2250_s3_die_temp}, [SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K] = {qcom_adc5_gen3_scale_hw_calib_batt_therm_100}, [SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K] = {qcom_adc5_gen3_scale_hw_calib_batt_id_100}, [SCALE_HW_CALIB_PM5_GEN3_USB_IN_I] = {qcom_adc5_gen3_scale_hw_calib_usb_in_current}, [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}, }; Loading Loading @@ -1147,6 +1238,75 @@ static int qcom_vadc_scale_hw_pm2250_s3_die_temp( return 0; } static int qcom_adc5_gen3_scale_hw_calib_batt_therm_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec) { s64 resistance = 0; int ret, result = 0; if (adc_code >= RATIO_MAX_ADC7) return -EINVAL; /* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/ resistance = (s64) adc_code * R_PU_100K; resistance = div64_s64(resistance, (RATIO_MAX_ADC7 - adc_code)); ret = qcom_vadc_map_voltage_temp(adcmap_gen3_batt_therm_100k, ARRAY_SIZE(adcmap_gen3_batt_therm_100k), resistance, &result); if (ret) return ret; *result_mdec = result; return 0; } static int qcom_adc5_gen3_scale_hw_calib_batt_id_100( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_mdec) { s64 resistance = 0; if (adc_code >= RATIO_MAX_ADC7) return -EINVAL; /* (ADC code * R_PULLUP (100Kohm)) / (full_scale_code - ADC code)*/ resistance = (s64) adc_code * R_PU_100K; resistance = div64_s64(resistance, (RATIO_MAX_ADC7 - adc_code)); *result_mdec = (int)resistance; return 0; }; static int qcom_adc5_gen3_scale_hw_calib_usb_in_current( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, u16 adc_code, int *result_ua) { s64 voltage = 0, result = 0; bool positive = true; if (adc_code & ADC5_USR_DATA_CHECK) { adc_code = ~adc_code + 1; positive = false; } voltage = (s64)(s16) adc_code * 1000000; voltage = div64_s64(voltage, PMIC5_GEN3_USB_IN_I_SCALE_FACTOR); result = div64_s64(voltage * prescale->den, prescale->num); *result_ua = (int)result; if (!positive) *result_ua = -(int)result; return 0; }; static int qcom_vadc_scale_hw_chg5_temp( const struct vadc_prescale_ratio *prescale, const struct adc5_data *data, Loading
drivers/iio/adc/qcom-vadc-common.h +14 −3 Original line number Diff line number Diff line Loading @@ -65,6 +65,8 @@ #define DIE_TEMP_ADC7_SCALE_FACTOR 1000 #define DIE_TEMP_ADC7_MAX 160000 #define PMIC5_GEN3_USB_IN_I_SCALE_FACTOR 9248 #define ADC_VDD_REF 1875000 /** Loading Loading @@ -184,13 +186,13 @@ struct adc_tm_client_info { * charger temperature. * SCALE_HW_CALIB_PM5_SMB_TEMP: Returns result in millidegrees for PMIC5 * SMB1390 temperature. * SCALE_HW_CALIB_BATT_THERM_100K: Returns battery thermistor voltage in * SCALE_HW_CALIB_BATT_THERM_100K: Returns battery thermistor temperature in * decidegC using 100k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_BATT_THERM_30K: Returns battery thermistor voltage in * SCALE_HW_CALIB_BATT_THERM_30K: Returns battery thermistor temperature in * decidegC using 30k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor voltage in * SCALE_HW_CALIB_BATT_THERM_400K: Returns battery thermistor temperature in * decidegC using 400k pullup. The hardware applies offset/slope to adc * code. * SCALE_HW_CALIB_PM5_SMB1398_TEMP: Returns result in millidegrees for PMIC5 Loading @@ -207,6 +209,12 @@ struct adc_tm_client_info { * that uses raw ADC code. * SCALE_HW_CALIB_PM2250_S3_DIE_TEMP: Returns result in millidegrees for * S3 die temperature channel on PM2250. * SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K: Returns battery thermistor * temperature in decidegC using 100k pullup. The hardware applies * offset/slope to adc code. * SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K: Returns battery ID resistance * in ohms using 100k pullup. The hardware applies offset/slope to adc code. * SCALE_HW_CALIB_PM5_GEN3_USB_IN_I: Returns USB input current in microamperes. */ enum vadc_scale_fn_type { SCALE_DEFAULT = 0, Loading @@ -232,6 +240,9 @@ enum vadc_scale_fn_type { SCALE_HW_CALIB_CUR_RAW, SCALE_HW_CALIB_PM2250_S3_DIE_TEMP, SCALE_HW_CALIB_PM5_CUR, SCALE_HW_CALIB_PM5_GEN3_BATT_THERM_100K, SCALE_HW_CALIB_PM5_GEN3_BATT_ID_100K, SCALE_HW_CALIB_PM5_GEN3_USB_IN_I, SCALE_HW_CALIB_INVALID, }; Loading
include/dt-bindings/iio/qcom,spmi-adc5-gen3-pm5100.h +10 −14 Original line number Diff line number Diff line Loading @@ -17,8 +17,8 @@ #define PM5100_ADC5_GEN3_DIE_TEMP (PM5100_SID << 8 | 0x03) #define PM5100_ADC5_GEN3_AMUX1_THM (PM5100_SID << 8 | 0x04) #define PM5100_ADC5_GEN3_AMUX2_THM (PM5100_SID << 8 | 0x05) #define PM5100_ADC5_GEN3_AMUX3_THM (PM5100_SID << 8 | 0x06) #define PM5100_ADC5_GEN3_BAT_ID (PM5100_SID << 8 | 0x05) #define PM5100_ADC5_GEN3_BATT_THM (PM5100_SID << 8 | 0x06) #define PM5100_ADC5_GEN3_AMUX4_THM (PM5100_SID << 8 | 0x07) #define PM5100_ADC5_GEN3_AMUX5_THM (PM5100_SID << 8 | 0x08) #define PM5100_ADC5_GEN3_AMUX6_THM (PM5100_SID << 8 | 0x09) Loading @@ -30,13 +30,13 @@ #define PM5100_ADC5_GEN3_CHG_TEMP (PM5100_SID << 8 | 0x10) #define PM5100_ADC5_GEN3_USB_SNS_V_16 (PM5100_SID << 8 | 0x11) #define PM5100_ADC5_GEN3_VIN_DIV16_MUX (PM5100_SID << 8 | 0x12) #define PM5100_ADC5_GEN3_IIN_FB (PM5100_SID << 8 | 0x17) #define PM5100_ADC5_GEN3_USB_IN_I (PM5100_SID << 8 | 0x17) #define PM5100_ADC5_GEN3_ICHG_FB (PM5100_SID << 8 | 0xa1) /* 30k pull-up1 */ #define PM5100_ADC5_GEN3_AMUX1_THM_30K_PU (PM5100_SID << 8 | 0x24) #define PM5100_ADC5_GEN3_AMUX2_THM_30K_PU (PM5100_SID << 8 | 0x25) #define PM5100_ADC5_GEN3_AMUX3_THM_30K_PU (PM5100_SID << 8 | 0x26) #define PM5100_ADC5_GEN3_BAT_ID_30K_PU (PM5100_SID << 8 | 0x25) #define PM5100_ADC5_GEN3_BATT_THM_30K_PU (PM5100_SID << 8 | 0x26) #define PM5100_ADC5_GEN3_AMUX4_THM_30K_PU (PM5100_SID << 8 | 0x27) #define PM5100_ADC5_GEN3_AMUX5_THM_30K_PU (PM5100_SID << 8 | 0x28) #define PM5100_ADC5_GEN3_AMUX6_THM_30K_PU (PM5100_SID << 8 | 0x29) Loading @@ -45,14 +45,10 @@ #define PM5100_ADC5_GEN3_AMUX3_GPIO_30K_PU (PM5100_SID << 8 | 0x2c) #define PM5100_ADC5_GEN3_AMUX4_GPIO_30K_PU (PM5100_SID << 8 | 0x2d) #define ADC5_GEN3_AMUX2_GPIO_100K_PU 0x4b /* 100k pull-up2 */ #define PM5100_ADC5_GEN3_AMUX1_THM_100K_PU (PM5100_SID << 8 | 0x44) #define PM5100_ADC5_GEN3_AMUX2_THM_100K_PU (PM5100_SID << 8 | 0x45) #define PM5100_ADC5_GEN3_AMUX3_THM_100K_PU (PM5100_SID << 8 | 0x46) #define PM5100_ADC5_GEN3_BAT_ID_100K_PU (PM5100_SID << 8 | 0x45) #define PM5100_ADC5_GEN3_BATT_THM_100K_PU (PM5100_SID << 8 | 0x46) #define PM5100_ADC5_GEN3_AMUX4_THM_100K_PU (PM5100_SID << 8 | 0x47) #define PM5100_ADC5_GEN3_AMUX5_THM_100K_PU (PM5100_SID << 8 | 0x48) #define PM5100_ADC5_GEN3_AMUX6_THM_100K_PU (PM5100_SID << 8 | 0x49) Loading @@ -63,8 +59,8 @@ /* 400k pull-up3 */ #define PM5100_ADC5_GEN3_AMUX1_THM_400K_PU (PM5100_SID << 8 | 0x64) #define PM5100_ADC5_GEN3_AMUX2_THM_400K_PU (PM5100_SID << 8 | 0x65) #define PM5100_ADC5_GEN3_AMUX3_THM_400K_PU (PM5100_SID << 8 | 0x66) #define PM5100_ADC5_GEN3_BAT_ID_400K_PU (PM5100_SID << 8 | 0x65) #define PM5100_ADC5_GEN3_BATT_THM_400K_PU (PM5100_SID << 8 | 0x66) #define PM5100_ADC5_GEN3_AMUX4_THM_400K_PU (PM5100_SID << 8 | 0x67) #define PM5100_ADC5_GEN3_AMUX5_THM_400K_PU (PM5100_SID << 8 | 0x68) #define PM5100_ADC5_GEN3_AMUX6_THM_400K_PU (PM5100_SID << 8 | 0x69) Loading