summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-02-09 22:09:30 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-02-09 22:09:29 -0800
commit487ff740cb8a0111016b0da2616aa8104cb0d440 (patch)
tree1a41dd0797f10eecc31555496d11dcb9dc35ebbf /drivers/power
parent3252149cd27aaaf073ae31f1da6eb3eb2fd7d729 (diff)
parent504aeb1158e37b140a5f6763ac3a3023ea9a5bae (diff)
Merge "power: qcom-charger: add support for USBIN-USBIN parallel configuration"
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/supply/qcom/Makefile2
-rw-r--r--drivers/power/supply/qcom/battery.c27
-rw-r--r--drivers/power/supply/qcom/qpnp-smb2.c12
-rw-r--r--drivers/power/supply/qcom/smb-lib.c6
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;
}