static
void
smblite_lib_typec_role_check_work(
struct
work_struct *work)
{
struct
smb_charger *chg = container_of(work,
struct
smb_charger,
role_reversal_check.work);
int
rc = 0;
if
(chg->connector_type == POWER_SUPPLY_CONNECTOR_MICRO_USB) {
chg->pr_swap_in_progress =
false
;
vote(chg->awake_votable, TYPEC_SWAP_VOTER,
false
, 0);
return
;
}
mutex_lock(&chg->typec_lock);
switch
(chg->dr_mode) {
case
TYPEC_PORT_SNK:
if
(chg->typec_mode < POWER_SUPPLY_TYPEC_SOURCE_DEFAULT) {
smblite_lib_dbg(chg, PR_MISC,
"Role reversal not latched to UFP in %d msecs. Resetting to DRP mode\n"
,
ROLE_REVERSAL_DELAY_MS);
rc = smblite_lib_force_dr_mode(chg, TYPEC_PORT_DRP);
if
(rc < 0)
smblite_lib_err(chg,
"Couldn't to set DRP mode, rc=%d\n"
,
rc);
}
else
{
chg->power_role = POWER_SUPPLY_TYPEC_PR_SINK;
typec_set_pwr_role(chg->typec_port, TYPEC_SINK);
typec_set_data_role(chg->typec_port, TYPEC_DEVICE);
smblite_lib_dbg(chg, PR_MISC,
"Role changed successfully to SINK"
);
}
break
;
case
TYPEC_PORT_SRC:
if
(chg->typec_mode >= POWER_SUPPLY_TYPEC_SOURCE_DEFAULT
|| chg->typec_mode == POWER_SUPPLY_TYPEC_NONE) {
smblite_lib_dbg(chg, PR_MISC,
"Role reversal not latched to DFP in %d msecs. Resetting to DRP mode\n"
,
ROLE_REVERSAL_DELAY_MS);
chg->pr_swap_in_progress =
false
;
chg->typec_role_swap_failed =
true
;
rc = smblite_lib_force_dr_mode(chg,
TYPEC_PORT_DRP);
if
(rc < 0)
smblite_lib_err(chg,
"Couldn't to set DRP mode, rc=%d\n"
,
rc);
}
else
{
chg->power_role = POWER_SUPPLY_TYPEC_PR_SOURCE;
typec_set_pwr_role(chg->typec_port, TYPEC_SOURCE);
typec_set_data_role(chg->typec_port, TYPEC_HOST);
smblite_lib_dbg(chg, PR_MISC,
"Role changed successfully to SOURCE"
);
}
break
;
default
:
pr_debug(
"Already in DRP mode\n"
);
break
;
}
chg->pr_swap_in_progress =
false
;
vote(chg->awake_votable, TYPEC_SWAP_VOTER,
false
, 0);
mutex_unlock(&chg->typec_lock);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)