diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-02-09 22:09:30 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-02-09 22:09:29 -0800 |
| commit | 487ff740cb8a0111016b0da2616aa8104cb0d440 (patch) | |
| tree | 1a41dd0797f10eecc31555496d11dcb9dc35ebbf /drivers/power | |
| parent | 3252149cd27aaaf073ae31f1da6eb3eb2fd7d729 (diff) | |
| parent | 504aeb1158e37b140a5f6763ac3a3023ea9a5bae (diff) | |
Merge "power: qcom-charger: add support for USBIN-USBIN parallel configuration"
Diffstat (limited to 'drivers/power')
| -rw-r--r-- | drivers/power/supply/qcom/Makefile | 2 | ||||
| -rw-r--r-- | drivers/power/supply/qcom/battery.c | 27 | ||||
| -rw-r--r-- | drivers/power/supply/qcom/qpnp-smb2.c | 12 | ||||
| -rw-r--r-- | drivers/power/supply/qcom/smb-lib.c | 6 |
4 files changed, 37 insertions, 10 deletions
diff --git a/drivers/power/supply/qcom/Makefile b/drivers/power/supply/qcom/Makefile index 912acb0c788a..a3aff858c190 100644 --- a/drivers/power/supply/qcom/Makefile +++ b/drivers/power/supply/qcom/Makefile @@ -2,7 +2,7 @@ obj-$(CONFIG_QPNP_SMBCHARGER) += qpnp-smbcharger.o batterydata-lib.o pmic-voter. obj-$(CONFIG_QPNP_FG) += qpnp-fg.o obj-$(CONFIG_QPNP_FG_GEN3) += qpnp-fg-gen3.o fg-memif.o fg-util.o obj-$(CONFIG_SMB135X_CHARGER) += smb135x-charger.o pmic-voter.o -obj-$(CONFIG_SMB1351_USB_CHARGER) += smb1351-charger.o pmic-voter.o +obj-$(CONFIG_SMB1351_USB_CHARGER) += smb1351-charger.o pmic-voter.o battery.o obj-$(CONFIG_MSM_BCL_CTL) += msm_bcl.o obj-$(CONFIG_MSM_BCL_PERIPHERAL_CTL) += bcl_peripheral.o obj-$(CONFIG_BATTERY_BCL) += battery_current_limit.o diff --git a/drivers/power/supply/qcom/battery.c b/drivers/power/supply/qcom/battery.c index 86e1bc040266..efa88c239379 100644 --- a/drivers/power/supply/qcom/battery.c +++ b/drivers/power/supply/qcom/battery.c @@ -34,6 +34,7 @@ #define PL_TAPER_EARLY_BAD_VOTER "PL_TAPER_EARLY_BAD_VOTER" #define PARALLEL_PSY_VOTER "PARALLEL_PSY_VOTER" #define PL_HW_ABSENT_VOTER "PL_HW_ABSENT_VOTER" +#define PL_VOTER "PL_VOTER" struct pl_data { int pl_mode; @@ -50,8 +51,9 @@ struct pl_data { struct power_supply *main_psy; struct power_supply *pl_psy; struct power_supply *batt_psy; - int settled_ua; int charge_type; + int main_settled_ua; + int pl_settled_ua; struct class qcom_batt_class; struct wakeup_source *pl_ws; struct notifier_block nb; @@ -85,7 +87,7 @@ enum { static void split_settled(struct pl_data *chip) { int slave_icl_pct; - int slave_ua = 0; + int slave_ua = 0, main_settled_ua = 0; union power_supply_propval pval = {0, }; int rc; @@ -108,10 +110,11 @@ static void split_settled(struct pl_data *chip) pr_err("Couldn't get aicl settled value rc=%d\n", rc); return; } - chip->settled_ua = pval.intval; + main_settled_ua = pval.intval; /* slave gets 10 percent points less for ICL */ slave_icl_pct = max(0, chip->slave_pct - 10); - slave_ua = (chip->settled_ua * slave_icl_pct) / 100; + slave_ua = ((main_settled_ua + chip->pl_settled_ua) + * slave_icl_pct) / 100; } /* ICL_REDUCTION on main could be 0mA when pl is disabled */ @@ -131,6 +134,11 @@ static void split_settled(struct pl_data *chip) pr_err("Couldn't set parallel icl, rc=%d\n", rc); return; } + + /* main_settled_ua represents the total capability of adapter */ + if (!chip->main_settled_ua) + chip->main_settled_ua = main_settled_ua; + chip->pl_settled_ua = slave_ua; } static ssize_t version_show(struct class *c, struct class_attribute *attr, @@ -379,8 +387,9 @@ static int pl_disable_vote_callback(struct votable *votable, union power_supply_propval pval = {0, }; int rc; - chip->settled_ua = 0; chip->taper_pct = 100; + chip->main_settled_ua = 0; + chip->pl_settled_ua = 0; if (!pl_disable) { /* enable */ rc = power_supply_get_property(chip->pl_psy, @@ -561,6 +570,7 @@ static void handle_main_charge_type(struct pl_data *chip) chip->charge_type = pval.intval; } +#define MIN_ICL_CHANGE_DELTA_UA 300000 static void handle_settled_aicl_split(struct pl_data *chip) { union power_supply_propval pval = {0, }; @@ -579,10 +589,11 @@ static void handle_settled_aicl_split(struct pl_data *chip) pr_err("Couldn't get aicl settled value rc=%d\n", rc); return; } - if (chip->settled_ua != pval.intval) { - chip->settled_ua = pval.intval; + + /* If ICL change is small skip splitting */ + if (abs((chip->main_settled_ua - chip->pl_settled_ua) + - pval.intval) > MIN_ICL_CHANGE_DELTA_UA) split_settled(chip); - } } } diff --git a/drivers/power/supply/qcom/qpnp-smb2.c b/drivers/power/supply/qcom/qpnp-smb2.c index 16b7dd8c2ccd..3bfab47dd6c9 100644 --- a/drivers/power/supply/qcom/qpnp-smb2.c +++ b/drivers/power/supply/qcom/qpnp-smb2.c @@ -1380,6 +1380,18 @@ static int smb2_init_hw(struct smb2 *chip) vote(chg->hvdcp_enable_votable, MICRO_USB_VOTER, chg->micro_usb_mode, 0); + /* + * AICL configuration: + * start from min and AICL ADC disable + */ + rc = smblib_masked_write(chg, USBIN_AICL_OPTIONS_CFG_REG, + USBIN_AICL_START_AT_MAX_BIT + | USBIN_AICL_ADC_EN_BIT, 0); + if (rc < 0) { + dev_err(chg->dev, "Couldn't configure AICL rc=%d\n", rc); + return rc; + } + /* Configure charge enable for software control; active high */ rc = smblib_masked_write(chg, CHGR_CFG2_REG, CHG_EN_POLARITY_BIT | diff --git a/drivers/power/supply/qcom/smb-lib.c b/drivers/power/supply/qcom/smb-lib.c index 6e01ec6174d5..11c82b53a9a1 100644 --- a/drivers/power/supply/qcom/smb-lib.c +++ b/drivers/power/supply/qcom/smb-lib.c @@ -774,13 +774,17 @@ static int smblib_usb_icl_vote_callback(struct votable *votable, void *data, if (chg->usb_psy_desc.type != POWER_SUPPLY_TYPE_USB) { if (client) { rc = smblib_set_charge_param(chg, &chg->param.usb_icl, - icl_ua); + icl_ua - chg->icl_reduction_ua); if (rc < 0) { smblib_err(chg, "Couldn't set HC ICL rc=%d\n", rc); return rc; } } + + smblib_dbg(chg, PR_PARALLEL, + "icl_ua=%d icl_reduction=%d\n", + icl_ua, chg->icl_reduction_ua); goto out; } |
