summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorNicholas Troast <ntroast@codeaurora.org>2016-07-20 16:03:15 -0700
committerAbhijeet Dharmapurikar <adharmap@codeaurora.org>2016-10-17 11:54:05 -0700
commit9fde5f583073dd842d7beff5702e0b34c6bb7920 (patch)
tree0ecf175f3b2cad3f323986fa45beac26a1b309b5 /drivers/power
parent257eedaa90a5c5f82cd654781f71c6cc87649bf3 (diff)
qcom-charger: qpnp-smb2: configure float options from DT
When a float charger is detected by APSD there are configuration options that change the behavior of the charger. These options should be configurable from the device tree. Add a DT parameter "qcom,float-option" and configure it as follows: 1 - Treat as a DCP 2 - Treat as a SDP 3 - Disable charging 4 - Suspend USB input Change-Id: Ia9219bc232f2092569dfb1a14f628e788173c4ff Signed-off-by: Nicholas Troast <ntroast@codeaurora.org>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/qcom-charger/qpnp-smb2.c36
-rw-r--r--drivers/power/qcom-charger/smb-reg.h1
2 files changed, 37 insertions, 0 deletions
diff --git a/drivers/power/qcom-charger/qpnp-smb2.c b/drivers/power/qcom-charger/qpnp-smb2.c
index bb12e74fe8bd..2b2847230b9f 100644
--- a/drivers/power/qcom-charger/qpnp-smb2.c
+++ b/drivers/power/qcom-charger/qpnp-smb2.c
@@ -217,6 +217,7 @@ struct smb_dt_props {
u32 step_soc_threshold[STEP_CHARGING_MAX_STEPS - 1];
s32 step_cc_delta[STEP_CHARGING_MAX_STEPS];
struct device_node *revid_dev_node;
+ int float_option;
};
struct smb2 {
@@ -322,6 +323,12 @@ static int smb2_parse_dt(struct smb2 *chip)
}
}
+ of_property_read_u32(node, "qcom,float-option", &chip->dt.float_option);
+ if (chip->dt.float_option < 0 || chip->dt.float_option > 4) {
+ pr_err("qcom,float-option is out of range [0, 4]\n");
+ return -EINVAL;
+ }
+
return 0;
}
@@ -1121,6 +1128,35 @@ static int smb2_init_hw(struct smb2 *chip)
return rc;
}
+ /* configure float charger options */
+ switch (chip->dt.float_option) {
+ case 1:
+ rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
+ FLOAT_OPTIONS_MASK, 0);
+ break;
+ case 2:
+ rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
+ FLOAT_OPTIONS_MASK, FORCE_FLOAT_SDP_CFG_BIT);
+ break;
+ case 3:
+ rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
+ FLOAT_OPTIONS_MASK, FLOAT_DIS_CHGING_CFG_BIT);
+ break;
+ case 4:
+ rc = smblib_masked_write(chg, USBIN_OPTIONS_2_CFG_REG,
+ FLOAT_OPTIONS_MASK, SUSPEND_FLOAT_CFG_BIT);
+ break;
+ default:
+ rc = 0;
+ break;
+ }
+
+ if (rc < 0) {
+ dev_err(chg->dev, "Couldn't configure float charger options rc=%d\n",
+ rc);
+ return rc;
+ }
+
return rc;
}
diff --git a/drivers/power/qcom-charger/smb-reg.h b/drivers/power/qcom-charger/smb-reg.h
index 8a49a8fb38ba..91d9ab08c90f 100644
--- a/drivers/power/qcom-charger/smb-reg.h
+++ b/drivers/power/qcom-charger/smb-reg.h
@@ -585,6 +585,7 @@ enum {
#define DCD_TIMEOUT_SEL_BIT BIT(5)
#define OCD_CURRENT_SEL_BIT BIT(4)
#define SLOW_PLUGIN_TIMER_EN_CFG_BIT BIT(3)
+#define FLOAT_OPTIONS_MASK GENMASK(2, 0)
#define FLOAT_DIS_CHGING_CFG_BIT BIT(2)
#define SUSPEND_FLOAT_CFG_BIT BIT(1)
#define FORCE_FLOAT_SDP_CFG_BIT BIT(0)