summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavide Garberi <dade.garberi@gmail.com>2018-10-16 15:03:27 +0200
committerDavide Garberi <dade.garberi@gmail.com>2022-07-27 19:23:19 +0200
commit505c3a88400e48761979205b7aff769aae82d1db (patch)
tree09e39d74857206938f7f5648fde1fa000c6a3396
parentb427d5b005ddc61b92e284f5209608ce35dbf319 (diff)
power: qpnp-smbcharger: Limit the charging to 5V for z2_plus
* Apparently the z2_plus doesn't support this * Thanks YaroST12 for the suggestion Signed-off-by: Davide Garberi <dade.garberi@gmail.com> Change-Id: I820a7eac25c8a437d40885dd36577ccb218e36a0
-rw-r--r--drivers/power/supply/qcom/qpnp-smbcharger.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/power/supply/qcom/qpnp-smbcharger.c b/drivers/power/supply/qcom/qpnp-smbcharger.c
index ecdd80b70977..e61a9c96d681 100644
--- a/drivers/power/supply/qcom/qpnp-smbcharger.c
+++ b/drivers/power/supply/qcom/qpnp-smbcharger.c
@@ -47,6 +47,10 @@
#define SUPPORT_CCLOGIC_EVENT_TYPE
+#ifdef CONFIG_MACH_ZUK_Z2_PLUS
+#define SUPPORT_ONLY_5V_CHARGER
+#endif
+
/* Mask/Bit helpers */
#define _SMB_MASK(BITS, POS) \
((unsigned char)(((1 << (BITS)) - 1) << (POS)))
@@ -3884,6 +3888,7 @@ struct regulator_ops smbchg_otg_reg_ops = {
#define USBIN_ADAPTER_9V 0x3
#define USBIN_ADAPTER_5V_9V_CONT 0x2
#define USBIN_ADAPTER_5V_UNREGULATED_9V 0x5
+#define USBIN_ADAPTER_5V 0x0
static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev)
{
int rc = 0;
@@ -3913,9 +3918,15 @@ static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev)
return rc;
}
+#ifdef SUPPORT_ONLY_5V_CHARGER
+ rc = smbchg_sec_masked_write(chip,
+ chip->usb_chgpth_base + USBIN_CHGR_CFG,
+ 0xFF, USBIN_ADAPTER_5V);
+#else
rc = smbchg_sec_masked_write(chip,
chip->usb_chgpth_base + USBIN_CHGR_CFG,
0xFF, USBIN_ADAPTER_9V);
+#endif
if (rc < 0) {
dev_err(chip->dev, "Couldn't write usb allowance rc=%d\n", rc);
return rc;
@@ -4678,10 +4689,19 @@ static void restore_from_hvdcp_detection(struct smbchg_chip *chip)
if (rc < 0)
pr_err("Couldn't configure HVDCP 9V rc=%d\n", rc);
+#ifdef SUPPORT_ONLY_5V_CHARGER
+ /* disable HVDCP */
+ rc = smbchg_sec_masked_write(chip,
+ chip->usb_chgpth_base + CHGPTH_CFG,
+ HVDCP_EN_BIT, 0);
+ if (rc < 0)
+ pr_err("Couldn't disable HVDCP rc=%d\n", rc);
+#else
/* enable HVDCP */
rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, false, 1);
if (rc < 0)
pr_err("Couldn't enable HVDCP rc=%d\n", rc);
+#endif
/* enable APSD */
rc = smbchg_sec_masked_write(chip,
@@ -4691,9 +4711,15 @@ static void restore_from_hvdcp_detection(struct smbchg_chip *chip)
pr_err("Couldn't enable APSD rc=%d\n", rc);
/* Reset back to 5V unregulated */
+#ifdef SUPPORT_ONLY_5V_CHARGER
+ rc = smbchg_sec_masked_write(chip,
+ chip->usb_chgpth_base + USBIN_CHGR_CFG,
+ ADAPTER_ALLOWANCE_MASK, USBIN_ADAPTER_5V);
+#else
rc = smbchg_sec_masked_write(chip,
chip->usb_chgpth_base + USBIN_CHGR_CFG,
ADAPTER_ALLOWANCE_MASK, USBIN_ADAPTER_5V_UNREGULATED_9V);
+#endif
if (rc < 0)
pr_err("Couldn't write usb allowance rc=%d\n", rc);
@@ -5144,11 +5170,18 @@ static int fake_insertion_removal(struct smbchg_chip *chip, bool insertion)
pr_smb(PR_MISC, "Allow only %s charger\n",
insertion ? "5-9V" : "9V only");
+#ifdef SUPPORT_ONLY_5V_CHARGER
+ rc = smbchg_sec_masked_write(chip,
+ chip->usb_chgpth_base + USBIN_CHGR_CFG,
+ ADAPTER_ALLOWANCE_MASK,
+ USBIN_ADAPTER_5V);
+#else
rc = smbchg_sec_masked_write(chip,
chip->usb_chgpth_base + USBIN_CHGR_CFG,
ADAPTER_ALLOWANCE_MASK,
insertion ?
USBIN_ADAPTER_5V_9V_CONT : USBIN_ADAPTER_9V);
+#endif
if (rc < 0) {
pr_err("Couldn't write usb allowance rc=%d\n", rc);
return rc;
@@ -5330,6 +5363,17 @@ static int smbchg_unprepare_for_pulsing(struct smbchg_chip *chip)
return rc;
}
+#ifdef SUPPORT_ONLY_5V_CHARGER
+ /* disable HVDCP */
+ pr_smb(PR_MISC, "Disable HVDCP\n");
+ rc = smbchg_sec_masked_write(chip,
+ chip->usb_chgpth_base + CHGPTH_CFG,
+ HVDCP_EN_BIT, 0);
+ if (rc < 0) {
+ pr_err("Couldn't disable HVDCP rc=%d\n", rc);
+ return rc;
+ }
+#else
/* enable HVDCP */
pr_smb(PR_MISC, "Enable HVDCP\n");
rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, false, 1);
@@ -5337,6 +5381,7 @@ static int smbchg_unprepare_for_pulsing(struct smbchg_chip *chip)
pr_err("Couldn't enable HVDCP rc=%d\n", rc);
return rc;
}
+#endif
/* enable APSD */
pr_smb(PR_MISC, "Enabling APSD\n");