summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 a00ad8343a88..37188e236775 100644
--- a/drivers/power/qcom-charger/qpnp-smb2.c
+++ b/drivers/power/qcom-charger/qpnp-smb2.c
@@ -1256,6 +1256,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 9cbba5a34195..d254c59514ee 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"
@@ -3106,3 +3107,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 2809ddadbd90..d61c16d93756 100644
--- a/drivers/power/qcom-charger/smb-lib.h
+++ b/drivers/power/qcom-charger/smb-lib.h
@@ -345,6 +345,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 */