Loading drivers/iio/adc/qcom-rradc.c +70 −8 Original line number Diff line number Diff line Loading @@ -180,6 +180,9 @@ #define FG_ADC_RR_VOLT_INPUT_FACTOR 8 #define FG_ADC_RR_CURR_INPUT_FACTOR 2000 #define FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL 1886 #define FG_ADC_RR_CURR_USBIN_660_FACTOR_MIL 9 #define FG_ADC_RR_CURR_USBIN_660_UV_VAL 579500 #define FG_ADC_SCALE_MILLI_FACTOR 1000 #define FG_ADC_KELVINMIL_CELSIUSMIL 273150 Loading @@ -192,6 +195,9 @@ #define FG_RR_CONV_CONTINUOUS_TIME_MIN_US 50000 #define FG_RR_CONV_CONTINUOUS_TIME_MAX_US 51000 #define FG_RR_CONV_MAX_RETRY_CNT 50 #define FG_RR_TP_REV_VERSION1 21 #define FG_RR_TP_REV_VERSION2 29 #define FG_RR_TP_REV_VERSION3 32 /* * The channel number is not a physical index in hardware, Loading Loading @@ -228,6 +234,7 @@ struct rradc_chip { struct rradc_chan_prop *chan_props; struct device_node *revid_dev_node; struct pmic_revid_data *pmic_fab_id; int volt; }; struct rradc_channels { Loading Loading @@ -353,7 +360,7 @@ static int rradc_post_process_volt(struct rradc_chip *chip, return 0; } static int rradc_post_process_curr(struct rradc_chip *chip, static int rradc_post_process_usbin_curr(struct rradc_chip *chip, struct rradc_chan_prop *prop, u16 adc_code, int *result_ua) { Loading @@ -361,11 +368,33 @@ static int rradc_post_process_curr(struct rradc_chip *chip, if (!prop) return -EINVAL; if (prop->channel == RR_ADC_USBIN_I) if (chip->revid_dev_node) { switch (chip->pmic_fab_id->pmic_subtype) { case PM660_SUBTYPE: if (((chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION1) && (chip->pmic_fab_id->tp_rev <= FG_RR_TP_REV_VERSION2)) || (chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION3)) { chip->volt = div64_s64(chip->volt, 1000); chip->volt = chip->volt * FG_ADC_RR_CURR_USBIN_660_FACTOR_MIL; chip->volt = FG_ADC_RR_CURR_USBIN_660_UV_VAL - (chip->volt); chip->volt = div64_s64(1000000000, chip->volt); scale = chip->volt; } else scale = FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL; else scale = FG_ADC_RR_CURR_INPUT_FACTOR; break; case PMI8998_SUBTYPE: scale = FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL; break; default: pr_err("No PMIC subtype found\n"); return -EINVAL; } } /* scale * V/A; 2.5V ADC full scale */ ua = ((int64_t)adc_code * scale); Loading @@ -376,6 +405,24 @@ static int rradc_post_process_curr(struct rradc_chip *chip, return 0; } static int rradc_post_process_dcin_curr(struct rradc_chip *chip, struct rradc_chan_prop *prop, u16 adc_code, int *result_ua) { int64_t ua = 0; if (!prop) return -EINVAL; /* 0.5 V/A; 2.5V ADC full scale */ ua = ((int64_t)adc_code * FG_ADC_RR_CURR_INPUT_FACTOR); ua *= (FG_ADC_RR_FS_VOLTAGE_MV * FG_ADC_SCALE_MILLI_FACTOR); ua = div64_s64(ua, (FG_MAX_ADC_READINGS * 1000)); *result_ua = ua; return 0; } static int rradc_post_process_die_temp(struct rradc_chip *chip, struct rradc_chan_prop *prop, u16 adc_code, int *result_millidegc) Loading Loading @@ -591,13 +638,13 @@ static const struct rradc_channels rradc_chans[] = { BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_PROCESSED), FG_ADC_RR_SKIN_TEMP_LSB, FG_ADC_RR_SKIN_TEMP_MSB, FG_ADC_RR_AUX_THERM_STS) RR_ADC_CHAN_CURRENT("usbin_i", &rradc_post_process_curr, RR_ADC_CHAN_CURRENT("usbin_i", &rradc_post_process_usbin_curr, FG_ADC_RR_USB_IN_I_LSB, FG_ADC_RR_USB_IN_I_MSB, FG_ADC_RR_USB_IN_I_STS) RR_ADC_CHAN_VOLT("usbin_v", &rradc_post_process_volt, FG_ADC_RR_USB_IN_V_LSB, FG_ADC_RR_USB_IN_V_MSB, FG_ADC_RR_USB_IN_V_STS) RR_ADC_CHAN_CURRENT("dcin_i", &rradc_post_process_curr, RR_ADC_CHAN_CURRENT("dcin_i", &rradc_post_process_dcin_curr, FG_ADC_RR_DC_IN_I_LSB, FG_ADC_RR_DC_IN_I_MSB, FG_ADC_RR_DC_IN_I_STS) RR_ADC_CHAN_VOLT("dcin_v", &rradc_post_process_volt, Loading Loading @@ -955,6 +1002,21 @@ static int rradc_read_raw(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_PROCESSED: if (((chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION1) && (chip->pmic_fab_id->tp_rev <= FG_RR_TP_REV_VERSION2)) || (chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION3)) { if (chan->address == RR_ADC_USBIN_I) { prop = &chip->chan_props[RR_ADC_USBIN_V]; rc = rradc_do_conversion(chip, prop, &adc_code); if (rc) break; prop->scale(chip, prop, adc_code, &chip->volt); } } prop = &chip->chan_props[chan->address]; rc = rradc_do_conversion(chip, prop, &adc_code); if (rc) Loading Loading
drivers/iio/adc/qcom-rradc.c +70 −8 Original line number Diff line number Diff line Loading @@ -180,6 +180,9 @@ #define FG_ADC_RR_VOLT_INPUT_FACTOR 8 #define FG_ADC_RR_CURR_INPUT_FACTOR 2000 #define FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL 1886 #define FG_ADC_RR_CURR_USBIN_660_FACTOR_MIL 9 #define FG_ADC_RR_CURR_USBIN_660_UV_VAL 579500 #define FG_ADC_SCALE_MILLI_FACTOR 1000 #define FG_ADC_KELVINMIL_CELSIUSMIL 273150 Loading @@ -192,6 +195,9 @@ #define FG_RR_CONV_CONTINUOUS_TIME_MIN_US 50000 #define FG_RR_CONV_CONTINUOUS_TIME_MAX_US 51000 #define FG_RR_CONV_MAX_RETRY_CNT 50 #define FG_RR_TP_REV_VERSION1 21 #define FG_RR_TP_REV_VERSION2 29 #define FG_RR_TP_REV_VERSION3 32 /* * The channel number is not a physical index in hardware, Loading Loading @@ -228,6 +234,7 @@ struct rradc_chip { struct rradc_chan_prop *chan_props; struct device_node *revid_dev_node; struct pmic_revid_data *pmic_fab_id; int volt; }; struct rradc_channels { Loading Loading @@ -353,7 +360,7 @@ static int rradc_post_process_volt(struct rradc_chip *chip, return 0; } static int rradc_post_process_curr(struct rradc_chip *chip, static int rradc_post_process_usbin_curr(struct rradc_chip *chip, struct rradc_chan_prop *prop, u16 adc_code, int *result_ua) { Loading @@ -361,11 +368,33 @@ static int rradc_post_process_curr(struct rradc_chip *chip, if (!prop) return -EINVAL; if (prop->channel == RR_ADC_USBIN_I) if (chip->revid_dev_node) { switch (chip->pmic_fab_id->pmic_subtype) { case PM660_SUBTYPE: if (((chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION1) && (chip->pmic_fab_id->tp_rev <= FG_RR_TP_REV_VERSION2)) || (chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION3)) { chip->volt = div64_s64(chip->volt, 1000); chip->volt = chip->volt * FG_ADC_RR_CURR_USBIN_660_FACTOR_MIL; chip->volt = FG_ADC_RR_CURR_USBIN_660_UV_VAL - (chip->volt); chip->volt = div64_s64(1000000000, chip->volt); scale = chip->volt; } else scale = FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL; else scale = FG_ADC_RR_CURR_INPUT_FACTOR; break; case PMI8998_SUBTYPE: scale = FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL; break; default: pr_err("No PMIC subtype found\n"); return -EINVAL; } } /* scale * V/A; 2.5V ADC full scale */ ua = ((int64_t)adc_code * scale); Loading @@ -376,6 +405,24 @@ static int rradc_post_process_curr(struct rradc_chip *chip, return 0; } static int rradc_post_process_dcin_curr(struct rradc_chip *chip, struct rradc_chan_prop *prop, u16 adc_code, int *result_ua) { int64_t ua = 0; if (!prop) return -EINVAL; /* 0.5 V/A; 2.5V ADC full scale */ ua = ((int64_t)adc_code * FG_ADC_RR_CURR_INPUT_FACTOR); ua *= (FG_ADC_RR_FS_VOLTAGE_MV * FG_ADC_SCALE_MILLI_FACTOR); ua = div64_s64(ua, (FG_MAX_ADC_READINGS * 1000)); *result_ua = ua; return 0; } static int rradc_post_process_die_temp(struct rradc_chip *chip, struct rradc_chan_prop *prop, u16 adc_code, int *result_millidegc) Loading Loading @@ -591,13 +638,13 @@ static const struct rradc_channels rradc_chans[] = { BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_PROCESSED), FG_ADC_RR_SKIN_TEMP_LSB, FG_ADC_RR_SKIN_TEMP_MSB, FG_ADC_RR_AUX_THERM_STS) RR_ADC_CHAN_CURRENT("usbin_i", &rradc_post_process_curr, RR_ADC_CHAN_CURRENT("usbin_i", &rradc_post_process_usbin_curr, FG_ADC_RR_USB_IN_I_LSB, FG_ADC_RR_USB_IN_I_MSB, FG_ADC_RR_USB_IN_I_STS) RR_ADC_CHAN_VOLT("usbin_v", &rradc_post_process_volt, FG_ADC_RR_USB_IN_V_LSB, FG_ADC_RR_USB_IN_V_MSB, FG_ADC_RR_USB_IN_V_STS) RR_ADC_CHAN_CURRENT("dcin_i", &rradc_post_process_curr, RR_ADC_CHAN_CURRENT("dcin_i", &rradc_post_process_dcin_curr, FG_ADC_RR_DC_IN_I_LSB, FG_ADC_RR_DC_IN_I_MSB, FG_ADC_RR_DC_IN_I_STS) RR_ADC_CHAN_VOLT("dcin_v", &rradc_post_process_volt, Loading Loading @@ -955,6 +1002,21 @@ static int rradc_read_raw(struct iio_dev *indio_dev, switch (mask) { case IIO_CHAN_INFO_PROCESSED: if (((chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION1) && (chip->pmic_fab_id->tp_rev <= FG_RR_TP_REV_VERSION2)) || (chip->pmic_fab_id->tp_rev >= FG_RR_TP_REV_VERSION3)) { if (chan->address == RR_ADC_USBIN_I) { prop = &chip->chan_props[RR_ADC_USBIN_V]; rc = rradc_do_conversion(chip, prop, &adc_code); if (rc) break; prop->scale(chip, prop, adc_code, &chip->volt); } } prop = &chip->chan_props[chan->address]; rc = rradc_do_conversion(chip, prop, &adc_code); if (rc) Loading