diff options
author | Harry Yang <harryy@codeaurora.org> | 2016-11-07 15:08:47 -0800 |
---|---|---|
committer | Harry Yang <harryy@codeaurora.org> | 2016-11-14 10:47:30 -0800 |
commit | 8947aae10bf1b8738bb53852887ee1b233429a45 (patch) | |
tree | 39bea52fd08012b83cc2305a8b799c7f26828f46 | |
parent | dd9faf508306cfd52a0b727af59f05ad029ae032 (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.c | 22 | ||||
-rw-r--r-- | drivers/power/qcom-charger/smb-lib.h | 1 |
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, }; |