summaryrefslogtreecommitdiff
path: root/drivers/power
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2016-11-18 20:31:54 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2016-11-18 20:31:53 -0800
commit43c797f34ce2d6d77bde725929fe4f8e392dd85d (patch)
tree946a00be95c8569fbc170a088965abd93ddd6071 /drivers/power
parentbf9bb2a461306c94e20cb6a55e5b635f285c64b7 (diff)
parent64e8b62cdf1cbc5ab7f8bc3feff9d8f6a9ad7fcb (diff)
Merge "qcom-charger: WA for legacy bit set on hard reboot"
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/qcom-charger/qpnp-smb2.c7
-rw-r--r--drivers/power/qcom-charger/smb-lib.c38
-rw-r--r--drivers/power/qcom-charger/smb-lib.h2
3 files changed, 47 insertions, 0 deletions
diff --git a/drivers/power/qcom-charger/qpnp-smb2.c b/drivers/power/qcom-charger/qpnp-smb2.c
index 6968ab2ab11c..4f98e864acfd 100644
--- a/drivers/power/qcom-charger/qpnp-smb2.c
+++ b/drivers/power/qcom-charger/qpnp-smb2.c
@@ -1280,6 +1280,13 @@ static int smb2_init_hw(struct smb2 *chip)
return rc;
}
+ rc = smblib_validate_initial_typec_legacy_status(chg);
+ if (rc < 0) {
+ dev_err(chg->dev, "Couldn't validate typec legacy status rc=%d\n",
+ rc);
+ return rc;
+ }
+
return rc;
}
diff --git a/drivers/power/qcom-charger/smb-lib.c b/drivers/power/qcom-charger/smb-lib.c
index 6aae7d49271f..48b1824853eb 100644
--- a/drivers/power/qcom-charger/smb-lib.c
+++ b/drivers/power/qcom-charger/smb-lib.c
@@ -16,6 +16,7 @@
#include <linux/iio/consumer.h>
#include <linux/power_supply.h>
#include <linux/regulator/driver.h>
+#include <linux/qpnp/power-on.h>
#include <linux/irq.h>
#include "smb-lib.h"
#include "smb-reg.h"
@@ -3356,3 +3357,40 @@ int smblib_deinit(struct smb_charger *chg)
return 0;
}
+
+int smblib_validate_initial_typec_legacy_status(struct smb_charger *chg)
+{
+ int rc;
+ u8 stat;
+
+
+ if (qpnp_pon_is_warm_reset())
+ return 0;
+
+ rc = smblib_read(chg, TYPE_C_STATUS_5_REG, &stat);
+ if (rc < 0) {
+ smblib_err(chg, "Couldn't read TYPE_C_STATUS_5 rc=%d\n", rc);
+ return rc;
+ }
+
+ if ((stat & TYPEC_LEGACY_CABLE_STATUS_BIT) == 0)
+ return 0;
+
+ rc = smblib_masked_write(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
+ TYPEC_DISABLE_CMD_BIT, TYPEC_DISABLE_CMD_BIT);
+ if (rc < 0) {
+ smblib_err(chg, "Couldn't disable typec rc=%d\n", rc);
+ return rc;
+ }
+
+ usleep_range(150000, 151000);
+
+ rc = smblib_masked_write(chg, TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
+ TYPEC_DISABLE_CMD_BIT, 0);
+ if (rc < 0) {
+ smblib_err(chg, "Couldn't enable typec rc=%d\n", rc);
+ return rc;
+ }
+
+ return 0;
+}
diff --git a/drivers/power/qcom-charger/smb-lib.h b/drivers/power/qcom-charger/smb-lib.h
index a0237412ee8b..e158f224fe4c 100644
--- a/drivers/power/qcom-charger/smb-lib.h
+++ b/drivers/power/qcom-charger/smb-lib.h
@@ -354,6 +354,8 @@ int smblib_set_prop_pd_in_hard_reset(struct smb_charger *chg,
int smblib_get_prop_slave_current_now(struct smb_charger *chg,
union power_supply_propval *val);
+int smblib_validate_initial_typec_legacy_status(struct smb_charger *chg);
+
int smblib_init(struct smb_charger *chg);
int smblib_deinit(struct smb_charger *chg);
#endif /* __SMB2_CHARGER_H */