iio: rradc: Update RRADC USBIN scaling
Update scaling factor for RRADC USBIN current based on USBIN voltage. Change-Id: I87b2ac56166f2e0812ec56d88c68298094eb86ac Signed-off-by: Rama Krishna Phani A <rphani@codeaurora.org>
This commit is contained in:
parent
36c8f370e0
commit
cec2333062
1 changed files with 70 additions and 8 deletions
|
@ -180,6 +180,9 @@
|
||||||
#define FG_ADC_RR_VOLT_INPUT_FACTOR 8
|
#define FG_ADC_RR_VOLT_INPUT_FACTOR 8
|
||||||
#define FG_ADC_RR_CURR_INPUT_FACTOR 2000
|
#define FG_ADC_RR_CURR_INPUT_FACTOR 2000
|
||||||
#define FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL 1886
|
#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_SCALE_MILLI_FACTOR 1000
|
||||||
#define FG_ADC_KELVINMIL_CELSIUSMIL 273150
|
#define FG_ADC_KELVINMIL_CELSIUSMIL 273150
|
||||||
|
|
||||||
|
@ -192,6 +195,9 @@
|
||||||
#define FG_RR_CONV_CONTINUOUS_TIME_MIN_US 50000
|
#define FG_RR_CONV_CONTINUOUS_TIME_MIN_US 50000
|
||||||
#define FG_RR_CONV_CONTINUOUS_TIME_MAX_US 51000
|
#define FG_RR_CONV_CONTINUOUS_TIME_MAX_US 51000
|
||||||
#define FG_RR_CONV_MAX_RETRY_CNT 50
|
#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,
|
* The channel number is not a physical index in hardware,
|
||||||
|
@ -228,6 +234,7 @@ struct rradc_chip {
|
||||||
struct rradc_chan_prop *chan_props;
|
struct rradc_chan_prop *chan_props;
|
||||||
struct device_node *revid_dev_node;
|
struct device_node *revid_dev_node;
|
||||||
struct pmic_revid_data *pmic_fab_id;
|
struct pmic_revid_data *pmic_fab_id;
|
||||||
|
int volt;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct rradc_channels {
|
struct rradc_channels {
|
||||||
|
@ -353,7 +360,7 @@ static int rradc_post_process_volt(struct rradc_chip *chip,
|
||||||
return 0;
|
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,
|
struct rradc_chan_prop *prop, u16 adc_code,
|
||||||
int *result_ua)
|
int *result_ua)
|
||||||
{
|
{
|
||||||
|
@ -361,11 +368,33 @@ static int rradc_post_process_curr(struct rradc_chip *chip,
|
||||||
|
|
||||||
if (!prop)
|
if (!prop)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (chip->revid_dev_node) {
|
||||||
if (prop->channel == RR_ADC_USBIN_I)
|
switch (chip->pmic_fab_id->pmic_subtype) {
|
||||||
scale = FG_ADC_RR_CURR_USBIN_INPUT_FACTOR_MIL;
|
case PM660_SUBTYPE:
|
||||||
else
|
if (((chip->pmic_fab_id->tp_rev
|
||||||
scale = FG_ADC_RR_CURR_INPUT_FACTOR;
|
>= 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;
|
||||||
|
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 */
|
/* scale * V/A; 2.5V ADC full scale */
|
||||||
ua = ((int64_t)adc_code * scale);
|
ua = ((int64_t)adc_code * scale);
|
||||||
|
@ -376,6 +405,24 @@ static int rradc_post_process_curr(struct rradc_chip *chip,
|
||||||
return 0;
|
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,
|
static int rradc_post_process_die_temp(struct rradc_chip *chip,
|
||||||
struct rradc_chan_prop *prop, u16 adc_code,
|
struct rradc_chan_prop *prop, u16 adc_code,
|
||||||
int *result_millidegc)
|
int *result_millidegc)
|
||||||
|
@ -591,13 +638,13 @@ static const struct rradc_channels rradc_chans[] = {
|
||||||
BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_PROCESSED),
|
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_SKIN_TEMP_LSB, FG_ADC_RR_SKIN_TEMP_MSB,
|
||||||
FG_ADC_RR_AUX_THERM_STS)
|
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_LSB, FG_ADC_RR_USB_IN_I_MSB,
|
||||||
FG_ADC_RR_USB_IN_I_STS)
|
FG_ADC_RR_USB_IN_I_STS)
|
||||||
RR_ADC_CHAN_VOLT("usbin_v", &rradc_post_process_volt,
|
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_LSB, FG_ADC_RR_USB_IN_V_MSB,
|
||||||
FG_ADC_RR_USB_IN_V_STS)
|
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_LSB, FG_ADC_RR_DC_IN_I_MSB,
|
||||||
FG_ADC_RR_DC_IN_I_STS)
|
FG_ADC_RR_DC_IN_I_STS)
|
||||||
RR_ADC_CHAN_VOLT("dcin_v", &rradc_post_process_volt,
|
RR_ADC_CHAN_VOLT("dcin_v", &rradc_post_process_volt,
|
||||||
|
@ -955,6 +1002,21 @@ static int rradc_read_raw(struct iio_dev *indio_dev,
|
||||||
|
|
||||||
switch (mask) {
|
switch (mask) {
|
||||||
case IIO_CHAN_INFO_PROCESSED:
|
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];
|
prop = &chip->chan_props[chan->address];
|
||||||
rc = rradc_do_conversion(chip, prop, &adc_code);
|
rc = rradc_do_conversion(chip, prop, &adc_code);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
|
Loading…
Add table
Reference in a new issue