summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarry Yang <harryy@codeaurora.org>2016-11-07 15:08:47 -0800
committerHarry Yang <harryy@codeaurora.org>2016-11-14 10:47:30 -0800
commit8947aae10bf1b8738bb53852887ee1b233429a45 (patch)
tree39bea52fd08012b83cc2305a8b799c7f26828f46
parentdd9faf508306cfd52a0b727af59f05ad029ae032 (diff)
qcom-charger: WA for cc2 removal with medium and high rd
In PMICv2, typec removal is known when CC detachment is detected, but this does not work due to a HW bug, when orientation is CC2 with medium or high rd. Currently in HW, after cable is removed, rd reading switches to std from medium or high. The software workaround is to catch this very change in cc state update, and then force a cc detach irq. CRs-Fixed: 1079913 Change-Id: I284ca8f2221f596432d67117d89e7d501d2bd9a8 Signed-off-by: Harry Yang <harryy@codeaurora.org>
-rw-r--r--drivers/power/qcom-charger/smb-lib.c22
-rw-r--r--drivers/power/qcom-charger/smb-lib.h1
2 files changed, 23 insertions, 0 deletions
diff --git a/drivers/power/qcom-charger/smb-lib.c b/drivers/power/qcom-charger/smb-lib.c
index 7d972103135d..9a697e2b81b9 100644
--- a/drivers/power/qcom-charger/smb-lib.c
+++ b/drivers/power/qcom-charger/smb-lib.c
@@ -2195,6 +2195,10 @@ static int smblib_cc2_sink_removal_enter(struct smb_charger *chg)
chg->cc2_sink_detach_flag = CC2_SINK_STD;
schedule_work(&chg->rdstd_cc2_detach_work);
break;
+ case POWER_SUPPLY_TYPEC_SOURCE_MEDIUM:
+ case POWER_SUPPLY_TYPEC_SOURCE_HIGH:
+ chg->cc2_sink_detach_flag = CC2_SINK_MEDIUM_HIGH;
+ break;
default:
break;
}
@@ -2831,6 +2835,24 @@ static void smblib_handle_typec_debounce_done(struct smb_charger *chg,
if (rc < 0)
smblib_err(chg, "Couldn't get prop typec mode rc=%d\n", rc);
+ /*
+ * HW BUG - after cable is removed, medium or high rd reading
+ * falls to std. Use it for signal of typec cc detachment in
+ * software WA.
+ */
+ if (chg->cc2_sink_detach_flag == CC2_SINK_MEDIUM_HIGH
+ && pval.intval == POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) {
+
+ chg->cc2_sink_detach_flag = CC2_SINK_WA_DONE;
+
+ rc = smblib_masked_write(chg,
+ TYPE_C_INTRPT_ENB_SOFTWARE_CTRL_REG,
+ EXIT_SNK_BASED_ON_CC_BIT, 0);
+ if (rc < 0)
+ smblib_err(chg, "Couldn't get prop typec mode rc=%d\n",
+ rc);
+ }
+
smblib_dbg(chg, PR_INTERRUPT, "IRQ: debounce-done %s; Type-C %s detected\n",
rising ? "rising" : "falling",
smblib_typec_mode_name[pval.intval]);
diff --git a/drivers/power/qcom-charger/smb-lib.h b/drivers/power/qcom-charger/smb-lib.h
index 723cd39b3c9f..000fd2654c95 100644
--- a/drivers/power/qcom-charger/smb-lib.h
+++ b/drivers/power/qcom-charger/smb-lib.h
@@ -57,6 +57,7 @@ enum smb_mode {
enum cc2_sink_type {
CC2_SINK_NONE = 0,
CC2_SINK_STD,
+ CC2_SINK_MEDIUM_HIGH,
CC2_SINK_WA_DONE,
};