2 * USB PD Driver - Policy Engine
5 #include <linux/device.h>
6 #include <linux/workqueue.h>
7 #include <linux/slab.h>
8 #include <linux/sched.h>
9 #include <linux/ccic/usbpd.h>
10 #include <linux/delay.h>
11 #include <linux/completion.h>
13 #include <linux/muic/muic.h>
14 #if defined(CONFIG_MUIC_NOTIFIER)
15 #include <linux/muic/muic_notifier.h>
16 #endif /* CONFIG_MUIC_NOTIFIER */
18 #include <linux/usb_notify.h>
20 #if (defined CONFIG_IFCONN_NOTIFIER || defined CONFIG_DUAL_ROLE_USB_INTF)
21 #include <linux/ccic/usbpd_ext.h>
24 #if defined(CONFIG_IFCONN_NOTIFIER)
25 #include <linux/ifconn/ifconn_notifier.h>
28 #include <linux/ccic/usbpd-s2mu106.h>
30 #define CHECK_MSG(pd, msg, ret) do {\
31 if (pd->phy_ops.get_status(pd, msg))\
35 #define CHECK_CMD(pd, event, ret) do {\
36 if (pd->manager.cmd & event) {\
37 pd->manager.cmd &= ~event; \
42 policy_state
usbpd_policy_src_startup(struct policy_data
*policy
)
44 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
45 int ret
= PE_SRC_Send_Capabilities
;
48 /**********************************************
52 Start SwapSourceStartTimer (only after Swap)
53 **********************************************/
55 /* 1) PD State Inform for AP */
56 dev_info(pd_data
->dev
, "%s\n", __func__
);
58 /* 2) CapsCounter Reset */
59 pd_data
->counter
.caps_counter
= 0;
61 /* 3) PD Protocol Initialization */
62 usbpd_init_protocol(pd_data
);
64 /* 4) Fro tSrcrecover after PE_SRC_Transition_to_default */
65 if (policy
->txhardresetflag
== 1) {
66 policy
->txhardresetflag
= 0;
68 usbpd_timer1_start(pd_data
);
70 if (policy
->plug_valid
== 0) {
74 ms
= usbpd_check_time1(pd_data
);
80 /* 5) Configuration Channel On */
81 pd_data
->phy_ops
.set_cc_control(pd_data
, USBPD_CC_ON
);
86 policy_state
usbpd_policy_src_discovery(struct policy_data
*policy
)
88 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
92 /**********************************************
94 Initialize and run SourceCapabilityTimer
95 **********************************************/
97 /* 1) PD State Inform for AP */
98 dev_info(pd_data
->dev
, "%s\n", __func__
);
101 usbpd_timer1_start(pd_data
);
103 if (policy
->plug_valid
== 0) {
104 ret
= PE_SRC_Discovery
;
107 ms
= usbpd_check_time1(pd_data
);
108 if (ms
>= tTypeCSendSourceCap
)
112 if (ret
== PE_SRC_Discovery
)
114 /* 3) Caps Counter Check */
115 if (pd_data
->counter
.caps_counter
<= USBPD_nCapsCount
)
116 return PE_SRC_Send_Capabilities
;
118 return PE_SRC_Disabled
;
121 policy_state
usbpd_policy_src_send_capabilities(struct policy_data
*policy
)
123 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
124 bool received_goodcrc
= 0;
128 /**********************************************
130 Request present source capabilities from Device Policy Manager
131 Send PD Capabilities message
132 Increment CapsCounter (optional)
134 - stop NoResponseTimer
135 - reset HardResetCounter and CapsCounter
136 - initialize and run SenderResponseTimer
137 **********************************************/
139 /* 1) PD State Inform for AP */
140 dev_info(pd_data
->dev
, "%s\n", __func__
);
142 /* 2) Source Capabilities PDO Read & Write */
143 policy
->tx_msg_header
.word
= pd_data
->source_msg_header
.word
;
144 policy
->tx_data_obj
[0].object
= pd_data
->source_data_obj
.object
;
146 /* 3) Interrupt Status Bit Clear */
147 pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
| MSG_REQUEST
|
149 /* 4) Add Caps Counter */
150 pd_data
->counter
.caps_counter
++;
152 /* 5) Send Message */
153 usbpd_send_msg(pd_data
, &policy
->tx_msg_header
, policy
->tx_data_obj
);
156 usbpd_timer1_start(pd_data
); // Setting 25ms is actual 25 ~ 29ms
157 /* 7) Wait Message or State */
159 if (policy
->plug_valid
== 0) {
160 ret
= PE_SRC_Send_Capabilities
;
163 ms
= usbpd_check_time1(pd_data
);
164 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REQUEST
)) {
165 pd_data
->counter
.hard_reset_counter
= 0;
166 pd_data
->counter
.caps_counter
= 0;
167 pd_data
->source_request_obj
.object
168 = policy
->rx_data_obj
[0].object
;
169 dev_info(pd_data
->dev
, "got Request.\n");
170 ret
= PE_SRC_Negotiate_Capability
;
174 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
))
175 received_goodcrc
= 1;
177 if (policy
->rx_hardreset
) {
182 /* TD.PD.SRC.E14 Atomic Message Sequence */
183 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GET_SNK_CAP
)) {
184 ret
= PE_SRC_Send_Soft_Reset
;
188 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
189 ret
= PE_SRC_Discovery
;
193 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_PING
)) {
194 ret
= PE_SRC_Send_Soft_Reset
;
198 if (ms
>= tSenderResponse
) {
199 if (received_goodcrc
) {
200 ret
= PE_SRC_Hard_Reset
;
202 if (pd_data
->counter
.hard_reset_counter
> USBPD_nHardResetCount
)
203 ret
= Error_Recovery
;
210 ret
= PE_SRC_Discovery
;
218 policy_state
usbpd_policy_src_negotiate_capability(struct policy_data
*policy
)
220 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
221 int ret
= PE_SRC_Negotiate_Capability
;
224 /**********************************************
226 Get Device Policy Manager evaluation of sink request:
229 - Could be met later from Power Reserve
230 If the sink request for Operating Current or Operating Power can be met,
231 but the sink still requires more power Capability Mismatch this
232 information will be passed to Device Policy Manager
233 **********************************************/
235 /* 1) PD State Inform for AP */
236 dev_info(pd_data
->dev
, "%s\n", __func__
);
238 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
240 mutex_lock(&pd_data
->accept_mutex
);
241 /* 2) Analysis Received Request Message */
242 if (usbpd_manager_match_request(pd_data
) == 0) {
243 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Accept
,
244 data_role
, USBPD_SOURCE
);
245 dev_info(pd_data
->dev
, "%s sended accept\n", __func__
);
246 ret
= PE_SRC_Transition_Supply
; /* Accept */
248 ret
= PE_SRC_Capability_Response
; /* Reject */
250 mutex_unlock(&pd_data
->accept_mutex
);
255 policy_state
usbpd_policy_src_transition_supply(struct policy_data
*policy
)
257 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
258 int ret
= PE_SRC_Ready
;
259 int ms1
= 0, ms2
= 0;
261 /**********************************************
263 Initialize and run SourceActivityTimer (see Section 8.3.3.5)
264 If GotoMin send GotoMin message
265 Else send Accept message (within tReceiverResponse)
266 Wait tSrcTransition and request Device Policy Manager to transition Power Supply
270 **********************************************/
272 /* 1) PD State Inform for AP */
273 dev_info(pd_data
->dev
, "%s\n", __func__
);
275 /* 2) Send Message */
276 // Move to PE_SRC_Nego
277 //usbpd_send_ctrl_msg(pd_data, &policy->tx_msg_header, USBPD_Accept, USBPD_DFP, USBPD_SOURCE);
280 usbpd_timer1_start(pd_data
);
282 /* 4) Wait Message or State */
284 if (policy
->plug_valid
== 0) {
285 ret
= PE_SRC_Transition_Supply
;
288 ms1
= usbpd_check_time1(pd_data
);
289 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
291 usbpd_timer2_start(pd_data
);
293 if (policy
->plug_valid
== 0) {
294 ret
= PE_SRC_Transition_Supply
;
297 ms2
= usbpd_check_time2(pd_data
);
298 if (ms2
> tSrcTransition
)
302 if (ret
== PE_SRC_Transition_Supply
)
305 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_PS_RDY
, USBPD_DFP
, USBPD_SOURCE
);
306 pd_data
->phy_ops
.set_rp_control(pd_data
, PLUG_CTRL_RP180
);
312 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
313 ret
= PE_SRC_Send_Soft_Reset
;
318 ret
= PE_SRC_Hard_Reset
;
326 policy_state
usbpd_policy_src_ready(struct policy_data
*policy
)
328 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
331 /**********************************************
333 Initialize and run SourceActivityTimer (see Section 8.3.3.5)
334 Initialize and run DiscoverIdentityTimer
335 **********************************************/
337 /* 1) PD State Inform for AP */
338 dev_info(pd_data
->dev
, "%s\n", __func__
);
340 if (pd_data
->pd_support
== 0) {
341 pd_data
->pd_support
= 1;
342 pd_data
->phy_ops
.set_pwr_opmode(pd_data
, TYPEC_PWR_MODE_PD
);
345 /* 2) Wait Message or State */
346 CHECK_MSG(pd_data
, MSG_GET_SRC_CAP
, PE_SRC_Give_Source_Cap
);
347 CHECK_MSG(pd_data
, MSG_REQUEST
, PE_SRC_Negotiate_Capability
);
348 CHECK_MSG(pd_data
, MSG_PR_SWAP
, PE_PRS_SRC_SNK_Evaluate_Swap
);
349 CHECK_MSG(pd_data
, MSG_DR_SWAP
, PE_DRS_Evaluate_Port
);
350 CHECK_MSG(pd_data
, MSG_VCONN_SWAP
, PE_VCS_Evaluate_Swap
);
351 CHECK_MSG(pd_data
, MSG_GET_SNK_CAP
, PE_DR_SRC_Give_Sink_Cap
);
352 CHECK_MSG(pd_data
, MSG_SOFTRESET
, PE_SRC_Soft_Reset
);
353 CHECK_MSG(pd_data
, MSG_ERROR
, PE_SRC_Send_Soft_Reset
);
354 CHECK_MSG(pd_data
, MSG_BIST
, PE_BIST_Receive_Mode
);
357 CHECK_MSG(pd_data
, VDM_DISCOVER_IDENTITY
, PE_UFP_VDM_Get_Identity
);
358 CHECK_MSG(pd_data
, VDM_DISCOVER_SVID
, PE_UFP_VDM_Get_SVIDs
);
359 CHECK_MSG(pd_data
, VDM_DISCOVER_MODE
, PE_UFP_VDM_Get_Modes
);
360 CHECK_MSG(pd_data
, VDM_ENTER_MODE
, PE_UFP_VDM_Evaluate_Mode_Entry
);
361 CHECK_MSG(pd_data
, VDM_ATTENTION
, PE_DFP_VDM_Attention_Request
);
362 CHECK_MSG(pd_data
, VDM_DP_STATUS_UPDATE
, PE_UFP_VDM_Evaluate_Status
);
363 CHECK_MSG(pd_data
, VDM_DP_CONFIGURE
, PE_UFP_VDM_Evaluate_Configure
);
364 CHECK_MSG(pd_data
, UVDM_MSG
, PE_DFP_UVDM_Receive_Message
);
366 /* 3) Command Check from AP */
367 CHECK_CMD(pd_data
, MANAGER_REQ_GET_SNKCAP
, PE_SRC_Get_Sink_Cap
);
368 CHECK_CMD(pd_data
, MANAGER_REQ_GOTOMIN
, PE_SRC_Transition_Supply
);
369 CHECK_CMD(pd_data
, MANAGER_REQ_SRCCAP_CHANGE
, PE_SRC_Send_Capabilities
);
370 CHECK_CMD(pd_data
, MANAGER_REQ_PR_SWAP
, PE_PRS_SRC_SNK_Send_Swap
);
371 CHECK_CMD(pd_data
, MANAGER_REQ_DR_SWAP
, PE_DRS_Evaluate_Send_Port
);
372 CHECK_CMD(pd_data
, MANAGER_REQ_VCONN_SWAP
, PE_VCS_Send_Swap
);
373 CHECK_CMD(pd_data
, MANAGER_REQ_UVDM_SEND_MESSAGE
,
374 PE_DFP_UVDM_Send_Message
);
375 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DISCOVER_IDENTITY
, PE_DFP_VDM_Identity_Request
);
376 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DISCOVER_SVID
, PE_DFP_VDM_SVIDs_Request
);
377 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DISCOVER_MODE
, PE_DFP_VDM_Modes_Request
);
378 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_ENTER_MODE
, PE_DFP_VDM_Mode_Entry_Request
);
379 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_EXIT_MODE
, PE_DFP_VDM_Mode_Exit_Request
);
380 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_STATUS_UPDATE
, PE_DFP_VDM_Status_Update
);
381 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DisplayPort_Configure
, PE_DFP_VDM_DisplayPort_Configure
);
382 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_ATTENTION
, PE_UFP_VDM_Attention_Request
);
385 /* for data role swap test
386 if (usbpd_manager_vdm_request_enabled(pd_data)) {
387 msleep(tDiscoverIdentity);
388 return PE_DRS_Evaluate_Send_Port;
391 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
394 if (data_role
== USBPD_DFP
)
395 usbpd_manager_vdm_request_enabled(pd_data
);
400 policy_state
usbpd_policy_src_disabled(struct policy_data
*policy
)
402 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
404 /**********************************************
406 Disable Power Delivery
407 **********************************************/
409 /* 1) PD State Inform for AP */
410 dev_info(pd_data
->dev
, "%s\n", __func__
);
412 return PE_SRC_Disabled
;
415 policy_state
usbpd_policy_src_capability_response(struct policy_data
*policy
)
417 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
422 /**********************************************
424 Send Reject message if request can't be met
425 Send Wait message if request could be met later from the Power
426 Reserve and present Contract is still valid
427 **********************************************/
429 /* 1) PD State Inform for AP */
430 dev_info(pd_data
->dev
, "%s\n", __func__
);
432 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
434 /* 2) Send Message */
435 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Reject
,
436 data_role
, USBPD_SOURCE
);
439 usbpd_timer1_start(pd_data
);
441 /* 4) Wait Message or State */
443 if (policy
->plug_valid
== 0) {
444 ret
= PE_SRC_Capability_Response
;
447 ms
= usbpd_check_time1(pd_data
);
448 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
453 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
454 ret
= PE_SRC_Send_Soft_Reset
;
458 ret
= PE_SRC_Hard_Reset
;
466 policy_state
usbpd_policy_src_hard_reset(struct policy_data
*policy
)
468 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
469 int ret
= PE_SRC_Transition_to_default
;
472 /**********************************************
474 Generate Hard Reset signalling
475 Start PSHardResetTimer
476 Increment HardResetCounter
477 **********************************************/
479 /* 1) PD State Inform for AP */
480 dev_info(pd_data
->dev
, "%s\n", __func__
);
482 /* 2) Send Hardreset */
483 pd_data
->phy_ops
.hard_reset(pd_data
);
485 /* 3) Configuration Channel On */
486 pd_data
->phy_ops
.set_cc_control(pd_data
, USBPD_CC_OFF
);
488 /* 4) Set Tx HardReset Flag After SRC_HADRESET */
489 policy
->txhardresetflag
= 1;
491 /* 5) Delay : Setting 25 is actual 57.3ms */
492 usbpd_timer1_start(pd_data
);
494 if (policy
->plug_valid
== 0) {
495 ret
= PE_SRC_Hard_Reset
;
498 ms
= usbpd_check_time1(pd_data
);
499 if (ms
>= tPSHardReset
)
503 if (ret
== PE_SRC_Hard_Reset
)
506 /* 6) Add Hardreset Counter */
507 pd_data
->counter
.hard_reset_counter
++;
509 return PE_SRC_Transition_to_default
;
512 policy_state
usbpd_policy_src_hard_reset_received(struct policy_data
*policy
)
514 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
515 int ret
= PE_SRC_Transition_to_default
;
518 /**********************************************
520 Start PSHardResetTimer
521 **********************************************/
523 /* 1) PD State Inform for AP */
524 dev_info(pd_data
->dev
, "%s\n", __func__
);
527 usbpd_timer1_start(pd_data
);
529 if (policy
->plug_valid
== 0) {
530 ret
= PE_SRC_Hard_Reset_Received
;
533 ms
= usbpd_check_time1(pd_data
);
534 if (ms
>= tPSHardReset
)
538 if (ret
== PE_SRC_Hard_Reset_Received
)
541 /* 3) Set Tx HardReset Flag After SRC_HADRESET */
542 policy
->txhardresetflag
= 1;
544 return PE_SRC_Transition_to_default
;
547 policy_state
usbpd_policy_src_transition_to_default(struct policy_data
*policy
)
549 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
550 int ret
= PE_SRC_Startup
;
553 /**********************************************
555 Request Device Policy Manager to request power
556 supply Hard Resets to vSafe5V via vSafe0V
558 If Type-C request Device Policy Manager to set
559 Port Data Role to DFP and turn off VCONN
560 **********************************************/
562 /* 1) PD State Inform for AP */
563 dev_info(pd_data
->dev
, "%s\n", __func__
);
565 /* 2) VBUS Turn off */
566 pd_data
->phy_ops
.set_otg_control(pd_data
, 0);
569 usbpd_timer1_start(pd_data
);
571 if (policy
->plug_valid
== 0) {
572 ret
= PE_SRC_Transition_to_default
;
575 ms
= usbpd_check_time1(pd_data
);
576 if (ms
>= tSrcRecover
)
580 if (ret
== PE_SRC_Transition_to_default
)
583 /* 4) initial reset */
584 pd_data
->phy_ops
.driver_reset(pd_data
);
586 pd_data
->phy_ops
.set_otg_control(pd_data
, 1);
588 Request Device Policy Manager to request power
589 supply Hard Resets to vSafe5V via vSafe0V
591 If(Type-C request Device Policy Manager to set Port Data Role to DFP)
596 Request Device Policy Manager to turn on VCONN
597 Initialize and start NoResponseTimer
598 Inform Protocol Layer Hard Reset complete
601 /* confirm VBUS ON : done by set_otg_control */
602 return PE_SRC_Startup
;
605 policy_state
usbpd_policy_src_give_source_cap(struct policy_data
*policy
)
607 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
608 int ret
= PE_SRC_Give_Source_Cap
;
612 /**********************************************
614 Request source capabilities from Device Policy Manager
615 Send Capabilities message
616 **********************************************/
618 /* 1) PD State Inform for AP */
619 dev_info(pd_data
->dev
, "%s\n", __func__
);
621 /* 2) Read Data Role */
622 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
624 /* 3) Message Setting */
625 policy
->tx_msg_header
.msg_type
= USBPD_Source_Capabilities
;
626 policy
->tx_msg_header
.port_data_role
= data_role
;
627 policy
->tx_msg_header
.port_power_role
= USBPD_SOURCE
;
628 policy
->tx_msg_header
.num_data_objs
= 1;
630 policy
->tx_data_obj
[0].power_data_obj
.max_current
= 1500 / 10;
631 policy
->tx_data_obj
[0].power_data_obj
.voltage
= 5000 / 50;
632 policy
->tx_data_obj
[0].power_data_obj
.peak_current
= 0;
633 policy
->tx_data_obj
[0].power_data_obj
.data_role_swap
= 1;
634 policy
->tx_data_obj
[0].power_data_obj
.usb_comm_capable
= 1;
635 policy
->tx_data_obj
[0].power_data_obj
.externally_powered
= 0;
636 policy
->tx_data_obj
[0].power_data_obj
.usb_suspend_support
= 1;
637 policy
->tx_data_obj
[0].power_data_obj
.dual_role_power
= 1;
638 policy
->tx_data_obj
[0].power_data_obj
.supply
= 0;
640 /* 4) Send Message */
641 usbpd_send_msg(pd_data
, &policy
->tx_msg_header
, policy
->tx_data_obj
);
644 usbpd_timer1_start(pd_data
);
646 if (policy
->plug_valid
== 0) {
647 ret
= PE_SRC_Give_Source_Cap
;
650 ms
= usbpd_check_time1(pd_data
);
651 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REQUEST
)) {
652 ret
= PE_SRC_Negotiate_Capability
;
655 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
656 ret
= PE_SRC_Send_Soft_Reset
;
659 if (ms
>= tSenderResponse
) {
660 ret
= PE_SRC_Hard_Reset
;
668 policy_state
usbpd_policy_src_get_sink_cap(struct policy_data
*policy
)
670 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
672 int ret
= PE_SRC_Get_Sink_Cap
;
675 /**********************************************
677 Send Get_Sink_Cap message
680 **********************************************/
682 /* 1) PD State Inform for AP */
683 dev_info(pd_data
->dev
, "%s\n", __func__
);
685 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
687 /* 2) Send Message */
688 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
689 USBPD_Get_Sink_Cap
, data_role
, USBPD_SOURCE
);
691 /* 3) Wait Message */
692 usbpd_timer1_start(pd_data
);
694 if (policy
->plug_valid
== 0)
696 ms
= usbpd_check_time1(pd_data
);
697 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_SNK_CAP
)) {
698 dev_info(pd_data
->dev
, "got SinkCap.\n");
702 if (ms
>= tSenderResponse
) {
711 policy_state
usbpd_policy_src_wait_new_capabilities(struct policy_data
*policy
)
713 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
715 /**********************************************
717 Wait for new Source Capabilities
718 **********************************************/
720 /* 1) PD State Inform for AP */
721 dev_info(pd_data
->dev
, "%s\n", __func__
);
723 return PE_SRC_Send_Capabilities
;
726 policy_state
usbpd_policy_src_send_soft_reset(struct policy_data
*policy
)
728 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
729 int ret
= PE_SRC_Send_Soft_Reset
;
733 /**********************************************
736 Send Soft Reset message
737 Initialize and run SenderResponseTimer
738 **********************************************/
740 /* 1) PD State Inform for AP */
741 dev_info(pd_data
->dev
, "%s\n", __func__
);
743 /* 2) USB PD Protocol Initialization */
744 usbpd_init_protocol(pd_data
);
746 /* 3) Read Data Role */
747 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
749 /* 4) Self SoftReset */
750 pd_data
->phy_ops
.soft_reset(pd_data
);
752 /* 5) Send Message */
753 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Soft_Reset
,
754 data_role
, USBPD_SOURCE
);
757 usbpd_timer1_start(pd_data
);
759 if (policy
->plug_valid
== 0) {
760 ret
= PE_SRC_Send_Soft_Reset
;
763 ms
= usbpd_check_time1(pd_data
);
764 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
765 ret
= PE_SRC_Send_Capabilities
;
768 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
769 ret
= PE_SRC_Hard_Reset
;
772 if (ms
>= tSenderResponse
) {
773 ret
= PE_SRC_Hard_Reset
;
781 policy_state
usbpd_policy_src_soft_reset(struct policy_data
*policy
)
783 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
784 int ret
= PE_SRC_Soft_Reset
;
787 /**********************************************
791 **********************************************/
793 /* 1) PD State Inform for AP */
794 dev_info(pd_data
->dev
, "%s\n", __func__
);
796 /* 2) USB PD Protocol Initialization */
797 usbpd_init_protocol(pd_data
);
799 /* 3) Read Data Role */
800 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
802 /* 4) Self SoftReset */
803 pd_data
->phy_ops
.soft_reset(pd_data
);
805 /* 5) Send Message */
806 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Accept
, data_role
, USBPD_SOURCE
);
809 usbpd_timer1_start(pd_data
);
811 if (policy
->plug_valid
== 0) {
812 ret
= PE_SRC_Soft_Reset
;
815 ms
= usbpd_check_time1(pd_data
);
816 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
817 ret
= PE_SRC_Send_Capabilities
;
821 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
822 ret
= PE_SRC_Hard_Reset
;
834 policy_state
usbpd_policy_snk_startup(struct policy_data
*policy
)
836 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
838 /**********************************************
841 **********************************************/
843 /* 1) PD State Inform for AP */
844 dev_info(pd_data
->dev
, "%s\n", __func__
);
846 /* 2) PD Protocol Initialization */
847 usbpd_init_protocol(pd_data
);
849 /* 3) Configuration Channel On */
850 //pd_data->phy_ops.set_cc_control(pd_data, USBPD_CC_ON);
851 //Move to PE_SNK_Wait_for_Capabilities
853 return PE_SNK_Discovery
;
856 policy_state
usbpd_policy_snk_discovery(struct policy_data
*policy
)
858 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
863 /**********************************************
866 **********************************************/
868 /* TODO: wait vbus */
869 /* if coming from HardReset
870 && NoResponseTimer timeout
871 && HardResetCounter <= nHardResetCount,
872 return(PE_SNK_Hard_Reset) */
874 /* 1) PD State Inform for AP */
875 dev_info(pd_data
->dev
, "%s\n", __func__
);
878 usbpd_timer1_start(pd_data
);
880 /* 3) Wait Message or State */
882 if (policy
->plug_valid
== 0) {
883 ret
= PE_SNK_Discovery
;
886 ms
= usbpd_check_time1(pd_data
);
888 vbus_check
= pd_data
->phy_ops
.vbus_on_check(pd_data
);
889 if (vbus_check
< 0 || vbus_check
> 0) {
890 ret
= PE_SNK_Wait_for_Capabilities
;
895 if (ms
>= tNoResponse
) {
896 /* HardReset Count Check */
897 if (pd_data
->counter
.hard_reset_counter
<= USBPD_nHardResetCount
) {
898 ret
= PE_SNK_Hard_Reset
;
901 ret
= Error_Recovery
;
910 policy_state
usbpd_policy_snk_wait_for_capabilities(struct policy_data
*policy
)
912 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
913 int ret
= PE_SNK_Wait_for_Capabilities
;
916 /**********************************************
918 Initialize and run SinkWaitCapTimer
919 **********************************************/
921 /* 1) PD State Inform for AP */
922 dev_info(pd_data
->dev
, "%s\n", __func__
);
924 /* Configuration Channel On */
925 pd_data
->phy_ops
.set_cc_control(pd_data
, USBPD_CC_ON
);
928 usbpd_timer1_start(pd_data
);
930 /* 4) Wait Message or State */
932 if (policy
->plug_valid
== 0) {
933 ret
= PE_SNK_Wait_for_Capabilities
;
936 ms
= usbpd_check_time1(pd_data
);
937 /* Rx Source Capabilities */
938 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_SRC_CAP
)) {
939 ret
= PE_SNK_Evaluate_Capability
;
943 #if !defined(CONFIG_SEC_FACTORY)
945 if (ms
>= tTypeCSinkWaitCap
) {
946 /* HardReset Count Check */
947 if (pd_data
->counter
.hard_reset_counter
<= USBPD_nHardResetCount
) {
948 ret
= PE_SNK_Hard_Reset
;
951 ret
= Error_Recovery
;
961 policy_state
usbpd_policy_snk_evaluate_capability(struct policy_data
*policy
)
963 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
964 int sink_request_obj_num
= 0;
965 int ret
= PE_SNK_Evaluate_Capability
;
967 /**********************************************
969 Reset HardResetCounter to zero.
970 Ask Device Policy Manager to evaluate the options based on supplied
971 capabilities, any Power Reserve that it needs, and respond indicating
972 the selected capability and, optionally, a Capability Mismatch
973 **********************************************/
975 /* 1) PD State Inform to AP */
976 dev_info(pd_data
->dev
, "%s\n", __func__
);
979 #if defined(CONFIG_IFCONN_NOTIFIER)
980 if (pd_noti
.sink_status
.selected_pdo_num
== 0) {
981 pd_noti
.sink_status
.selected_pdo_num
= 1;
982 if (policy
->sink_cap_received
) {
983 policy
->send_sink_cap
= 1;
984 policy
->sink_cap_received
= 0;
988 /* 5) Select Object Position */
989 sink_request_obj_num
= usbpd_manager_evaluate_capability(pd_data
);
992 if (sink_request_obj_num
> 0)
993 ret
= PE_SNK_Select_Capability
;
995 ret
= PE_SNK_Hard_Reset
;
1000 policy_state
usbpd_policy_snk_select_capability(struct policy_data
*policy
)
1002 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1003 int ret
= PE_SNK_Select_Capability
;
1007 /**********************************************
1009 Send Request based on Device Policy Manager response:
1010 - Request from present capabilities
1011 - Optionally Indicate that other capabilities would be preferred (Capability Mismatch)
1012 Initialize and run SenderResponseTimer
1013 **********************************************/
1015 /* 1) PD State Inform to AP */
1016 //dev_info(pd_data->dev, "%s\n", __func__);
1018 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1020 /* 2) Message Header Setting */
1021 policy
->tx_msg_header
.msg_type
= USBPD_Request
;
1022 policy
->tx_msg_header
.port_data_role
= data_role
;
1023 policy
->tx_msg_header
.port_power_role
= USBPD_SINK
;
1024 policy
->tx_msg_header
.num_data_objs
= 1; /* Initial Select PDO = 1 */
1027 policy
->tx_data_obj
[0] = usbpd_manager_select_capability(pd_data
);
1029 /* 4) Send Message*/
1030 usbpd_send_msg(pd_data
, &policy
->tx_msg_header
, policy
->tx_data_obj
);
1033 usbpd_timer1_start(pd_data
);
1035 /* 6) Wait Message or State */
1037 if (policy
->plug_valid
== 0) {
1038 ret
= PE_SNK_Select_Capability
;
1041 ms
= usbpd_check_time1(pd_data
);
1042 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GET_SNK_CAP
)) {
1043 ret
= PE_SNK_Send_Soft_Reset
;
1047 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
1048 ret
= PE_SNK_Transition_Sink
;
1052 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_PSRDY
)) {
1057 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
| MSG_WAIT
)) {
1058 /* 1st Power Negotiation Check */
1059 if (pd_noti
.sink_status
.selected_pdo_num
== 0)
1060 ret
= PE_SNK_Wait_for_Capabilities
;
1067 /* TimeOver Check */
1068 if (ms
>= tSenderResponse
) {
1069 ret
= PE_SNK_Hard_Reset
;
1077 uint32_t RX_PS_READY_Message_ID
;
1079 policy_state
usbpd_policy_snk_transition_sink(struct policy_data
*policy
)
1081 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1082 int ret
= PE_SNK_Transition_Sink
;
1085 /**********************************************
1087 Initialize and run PSTransitionTimer
1088 **********************************************/
1090 /* 1) PD State Inform to AP */
1091 dev_info(pd_data
->dev
, "%s\n", __func__
);
1093 /* 2) Policy Engine State Setting */
1094 policy
->state
= PE_SNK_Transition_Sink
;
1096 /* 3) Start Timer */
1097 usbpd_timer1_start(pd_data
);
1099 /* 4) Wait Message or State */
1101 if (policy
->plug_valid
== 0) {
1102 ret
= PE_SNK_Transition_Sink
;
1105 ms
= usbpd_check_time1(pd_data
);
1106 /* PD Certification(Ellisys) : TD.PD.SNK.E10 GetSinkCap in place of PS_RDY */
1107 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GET_SNK_CAP
)) {
1108 ret
= PE_SNK_Hard_Reset
;
1111 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_PSRDY
)) {
1112 /* Device Information */
1113 dev_info(pd_data
->dev
, "got PS_READY.\n");
1115 #if defined(CONFIG_IFCONN_NOTIFIER)
1116 pd_noti
.sink_status
.current_pdo_num
= pd_noti
.sink_status
.selected_pdo_num
;
1118 /* 2) Notify Plug Attach */
1119 usbpd_manager_plug_attach(pd_data
->dev
);
1125 /* TimeOver Check */
1126 if (ms
>= tPSTransition
) {
1127 ret
= PE_SNK_Hard_Reset
;
1135 policy_state
usbpd_policy_snk_ready(struct policy_data
*policy
)
1137 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1140 /**********************************************
1142 Initialize and run SinkActivityTimer2
1143 Initialize and run SinkRequestTimer3 (on receiving Wait)
1144 Initialize and run DiscoverIdentityTimer5
1145 **********************************************/
1147 /* 1) PD State Inform to AP */
1148 dev_info(pd_data
->dev
, "%s\n", __func__
);
1150 if (pd_data
->pd_support
== 0) {
1151 pd_data
->pd_support
= 1;
1152 pd_data
->phy_ops
.set_pwr_opmode(pd_data
, TYPEC_PWR_MODE_PD
);
1155 /* 3) Message Check */
1156 CHECK_MSG(pd_data
, MSG_GET_SNK_CAP
, PE_SNK_Give_Sink_Cap
);
1157 CHECK_MSG(pd_data
, MSG_PR_SWAP
, PE_PRS_SNK_SRC_Evaluate_Swap
);
1158 CHECK_MSG(pd_data
, MSG_DR_SWAP
, PE_DRS_Evaluate_Port
);
1159 CHECK_MSG(pd_data
, MSG_VCONN_SWAP
, PE_VCS_Evaluate_Swap
);
1160 CHECK_MSG(pd_data
, MSG_GET_SRC_CAP
, PE_DR_SNK_Give_Source_Cap
);
1161 CHECK_MSG(pd_data
, MSG_BIST
, PE_BIST_Receive_Mode
);
1162 CHECK_MSG(pd_data
, MSG_SRC_CAP
, PE_SNK_Evaluate_Capability
);
1165 CHECK_MSG(pd_data
, VDM_DISCOVER_IDENTITY
, PE_UFP_VDM_Get_Identity
);
1166 CHECK_MSG(pd_data
, VDM_DISCOVER_SVID
, PE_UFP_VDM_Get_SVIDs
);
1167 CHECK_MSG(pd_data
, VDM_DISCOVER_MODE
, PE_UFP_VDM_Get_Modes
);
1168 CHECK_MSG(pd_data
, VDM_ENTER_MODE
, PE_UFP_VDM_Evaluate_Mode_Entry
);
1169 CHECK_MSG(pd_data
, VDM_ATTENTION
, PE_DFP_VDM_Attention_Request
);
1170 CHECK_MSG(pd_data
, VDM_DP_STATUS_UPDATE
, PE_UFP_VDM_Evaluate_Status
);
1171 CHECK_MSG(pd_data
, VDM_DP_CONFIGURE
, PE_UFP_VDM_Evaluate_Configure
);
1172 CHECK_MSG(pd_data
, UVDM_MSG
, PE_DFP_UVDM_Receive_Message
);
1175 /* 5) Command Check from AP */
1176 CHECK_CMD(pd_data
, MANAGER_REQ_NEW_POWER_SRC
, PE_SNK_Select_Capability
);
1177 CHECK_CMD(pd_data
, MANAGER_REQ_PR_SWAP
, PE_PRS_SNK_SRC_Send_Swap
);
1178 CHECK_CMD(pd_data
, MANAGER_REQ_DR_SWAP
, PE_DRS_Evaluate_Send_Port
);
1179 CHECK_CMD(pd_data
, MANAGER_REQ_VCONN_SWAP
, PE_VCS_Send_Swap
);
1180 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DISCOVER_IDENTITY
, PE_DFP_VDM_Identity_Request
);
1181 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DISCOVER_SVID
, PE_DFP_VDM_SVIDs_Request
);
1182 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DISCOVER_MODE
, PE_DFP_VDM_Modes_Request
);
1183 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_ATTENTION
, PE_UFP_VDM_Attention_Request
);
1184 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_ENTER_MODE
, PE_DFP_VDM_Mode_Entry_Request
);
1185 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_STATUS_UPDATE
, PE_DFP_VDM_Status_Update
);
1186 CHECK_CMD(pd_data
, MANAGER_REQ_VDM_DisplayPort_Configure
, PE_DFP_VDM_DisplayPort_Configure
);
1187 CHECK_CMD(pd_data
, MANAGER_REQ_UVDM_SEND_MESSAGE
, PE_DFP_UVDM_Send_Message
);
1189 /* 6) Data Role Check */
1190 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1193 if (data_role
== USBPD_DFP
)
1194 usbpd_manager_vdm_request_enabled(pd_data
);
1197 return PE_SNK_Ready
;
1200 policy_state
usbpd_policy_snk_hard_reset(struct policy_data
*policy
)
1202 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1204 /**********************************************
1206 Generate Hard Reset signalling.
1207 Increment HardResetCounter.
1208 **********************************************/
1210 /* 1) PD State Inform to AP */
1211 dev_info(pd_data
->dev
, "%s\n", __func__
);
1213 pd_data
->phy_ops
.hard_reset(pd_data
);
1214 pd_data
->phy_ops
.set_cc_control(pd_data
, USBPD_CC_OFF
);
1215 /* increase hard reset counter */
1216 pd_data
->counter
.hard_reset_counter
++;
1218 return PE_SNK_Transition_to_default
;
1221 policy_state
usbpd_policy_snk_transition_to_default(struct policy_data
*policy
)
1223 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1224 int ret
= PE_SNK_Startup
;
1227 /**********************************************
1228 Hard reset signalling received
1231 Request Device Policy Manager to request power sink transition to default
1233 If Type-C set Port Data Role to UFP and turn off VCONN
1234 **********************************************/
1236 /* 1) PD State Inform to AP */
1237 dev_info(pd_data
->dev
, "%s\n", __func__
);
1239 /* 2) Driver Reset */
1240 pd_data
->phy_ops
.driver_reset(pd_data
);
1243 usbpd_manager_turn_off_vconn(pd_data
);
1246 usbpd_timer1_start(pd_data
);
1248 if (policy
->plug_valid
== 0) {
1249 ret
= PE_SNK_Transition_to_default
;
1252 ms
= usbpd_check_time1(pd_data
);
1260 policy_state
usbpd_policy_snk_give_sink_cap(struct policy_data
*policy
)
1262 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1263 int ret
= PE_SNK_Give_Sink_Cap
;
1266 /**********************************************
1267 Get Sink Cap Message received
1270 Get present sink capabilities from Device Policy Manager
1271 Send Capabilities message (based on Device Policy Manager response)
1272 **********************************************/
1274 /* 1) PD State Inform to AP */
1275 dev_info(pd_data
->dev
, "%s\n", __func__
);
1277 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1279 /* 2) TODO JETSEO ????*/
1280 #if defined(CONFIG_IFCONN_NOTIFIER)
1281 pd_noti
.sink_status
.selected_pdo_num
= 0;
1284 /* 3) Sink Cap Message Setting */
1285 policy
->tx_msg_header
.word
= pd_data
->sink_msg_header
.word
;
1286 policy
->tx_msg_header
.port_data_role
= data_role
;
1287 policy
->tx_data_obj
[0].object
= pd_data
->sink_data_obj
[0].object
;
1289 policy
->tx_data_obj
[1].object
= pd_data
->sink_data_obj
[1].object
;
1291 policy
->sink_cap_received
= 1;
1293 /* 4) Send Message */
1294 usbpd_send_msg(pd_data
, &policy
->tx_msg_header
, policy
->tx_data_obj
);
1296 /* 5) Start Timer */
1297 usbpd_timer1_start(pd_data
);
1299 /* 6) Wait Message or State */
1301 if (policy
->plug_valid
== 0) {
1302 ret
= PE_SNK_Give_Sink_Cap
;
1305 ms
= usbpd_check_time1(pd_data
);
1306 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
1307 dev_info(pd_data
->dev
, "got snk_give_sink_cap MSG_GOODCRC.\n");
1312 /* TimeOver Check */
1314 dev_info(pd_data
->dev
, "got snk_give_sink_cap Timer1_overflag.\n");
1315 ret
= PE_SNK_Send_Soft_Reset
;
1323 policy_state
usbpd_policy_snk_get_source_cap(struct policy_data
*policy
)
1325 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1326 int ret
= PE_SNK_Get_Source_Cap
;
1330 /**********************************************
1332 Send Get_Source_Cap message
1333 **********************************************/
1335 /* 1) PD State Inform to AP */
1336 dev_info(pd_data
->dev
, "%s\n", __func__
);
1338 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1340 /* 2) Send Message*/
1341 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1342 USBPD_Get_Source_Cap
, data_role
, USBPD_SINK
);
1344 /* 3) Start Timer */
1345 usbpd_timer1_start(pd_data
);
1347 /* 4) Wait Message or State */
1349 if (policy
->plug_valid
== 0) {
1350 ret
= PE_SNK_Get_Source_Cap
;
1353 ms
= usbpd_check_time1(pd_data
);
1354 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
1359 /* TimeOver Check */
1361 ret
= PE_SNK_Get_Source_Cap
;
1369 policy_state
usbpd_policy_snk_send_soft_reset(struct policy_data
*policy
)
1371 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1372 int ret
= PE_SNK_Send_Soft_Reset
;
1375 /**********************************************
1377 Reset Protocol Layer
1378 Send Soft Reset message
1379 Initialize and run SenderResponseTimer
1380 **********************************************/
1382 /* 1) PD State Inform for AP */
1383 dev_info(pd_data
->dev
, "%s\n", __func__
);
1385 /* 2) USB PD Protocol Initialization */
1386 usbpd_init_protocol(pd_data
);
1388 /* 3) Read Data Role */
1389 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1391 /* 4) Self SoftReset */
1392 pd_data
->phy_ops
.soft_reset(pd_data
);
1394 /* 5) Send Message */
1395 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Soft_Reset
,
1396 data_role
, USBPD_SINK
);
1398 /* 6) Start Timer */
1399 usbpd_timer1_start(pd_data
);
1401 /* 7) Wait Message or State */
1403 if (policy
->plug_valid
== 0) {
1404 ret
= PE_SNK_Send_Soft_Reset
;
1407 ms
= usbpd_check_time1(pd_data
);
1408 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
1409 ret
= PE_SNK_Wait_for_Capabilities
;
1413 /* TimeOver Check */
1414 if (ms
>= tSenderResponse
) {
1415 ret
= PE_SNK_Hard_Reset
;
1423 policy_state
usbpd_policy_snk_soft_reset(struct policy_data
*policy
)
1425 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1427 int ret
= PE_SNK_Soft_Reset
;
1430 /**********************************************
1431 Soft Reset message received
1434 Reset Protocol Layer
1436 **********************************************/
1438 /* 1) PD State Inform for AP */
1439 dev_info(pd_data
->dev
, "%s\n", __func__
);
1441 /* 2) USB PD Protocol Initialization */
1442 usbpd_init_protocol(pd_data
);
1444 /* 3) Read Data Role */
1445 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1447 /* 4) Send Message */
1448 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Accept
,
1449 data_role
, USBPD_SINK
);
1451 /* 5) Start Timer */
1452 usbpd_timer1_start(pd_data
);
1454 /* 6) Wait Message or State */
1456 if (policy
->plug_valid
== 0) {
1457 ret
= PE_SNK_Soft_Reset
;
1460 ms
= usbpd_check_time1(pd_data
);
1461 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
1462 ret
= PE_SNK_Wait_for_Capabilities
;
1466 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
1467 ret
= PE_SNK_Hard_Reset
;
1480 policy_state
usbpd_policy_drs_evaluate_port(struct policy_data
*policy
)
1482 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1486 /**********************************************
1487 **********************************************/
1489 /* 1) PD State Inform for AP */
1490 dev_info(pd_data
->dev
, "%s\n", __func__
);
1492 if (policy
->modal_operation
) {
1493 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1495 if (power_role
== USBPD_SOURCE
)
1496 return PE_SRC_Hard_Reset
;
1498 return PE_SNK_Hard_Reset
;
1501 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1503 if (data_role
== USBPD_DFP
)
1504 return PE_DRS_DFP_UFP_Evaluate_DR_Swap
;
1506 return PE_DRS_UFP_DFP_Evaluate_DR_Swap
;
1509 policy_state
usbpd_policy_drs_evaluate_send_port(struct policy_data
*policy
)
1511 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1515 /**********************************************
1516 **********************************************/
1518 /* 1) PD State Inform for AP */
1519 dev_info(pd_data
->dev
, "%s\n", __func__
);
1521 if (policy
->modal_operation
) {
1522 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1524 if (power_role
== USBPD_SOURCE
)
1525 return PE_SRC_Hard_Reset
;
1527 return PE_SNK_Hard_Reset
;
1530 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1532 if (data_role
== USBPD_DFP
)
1533 return PE_DRS_DFP_UFP_Send_DR_Swap
;
1535 return PE_DRS_UFP_DFP_Send_DR_Swap
;
1538 policy_state
usbpd_policy_drs_dfp_ufp_evaluate_dr_swap(struct policy_data
*policy
)
1540 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1543 /**********************************************
1544 DR_Swap message received & not in Modal Operation
1547 Get evaluation of Data Role Swap
1548 request from Device Policy Manager
1549 **********************************************/
1551 /* 1) PD State Inform for AP */
1552 dev_info(pd_data
->dev
, "%s\n", __func__
);
1554 drs_ok
= usbpd_manager_data_role_swap(pd_data
);
1557 return PE_DRS_DFP_UFP_Accept_DR_Swap
;
1559 return PE_DRS_DFP_UFP_Reject_DR_Swap
;
1562 policy_state
usbpd_policy_drs_dfp_ufp_accept_dr_swap(struct policy_data
*policy
)
1564 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1567 /**********************************************
1570 **********************************************/
1572 dev_info(pd_data
->dev
, "%s\n", __func__
);
1574 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1576 mutex_lock(&pd_data
->accept_mutex
);
1577 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1578 USBPD_Accept
, USBPD_DFP
, power_role
);
1579 pd_data
->phy_ops
.set_data_role(pd_data
, USBPD_UFP
);
1580 mutex_unlock(&pd_data
->accept_mutex
);
1582 return PE_DRS_DFP_UFP_Change_to_UFP
;
1585 policy_state
usbpd_policy_drs_dfp_ufp_change_to_ufp(struct policy_data
*policy
)
1587 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1590 /**********************************************
1592 Request Device Policy Manager to
1594 **********************************************/
1596 dev_info(pd_data
->dev
, "%s\n", __func__
);
1598 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1600 if (power_role
== USBPD_SOURCE
)
1601 return PE_SRC_Ready
;
1603 return PE_SNK_Ready
;
1606 policy_state
usbpd_policy_drs_dfp_ufp_send_dr_swap(struct policy_data
*policy
)
1608 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1612 /**********************************************
1614 Send Swap DR message
1615 Initialize and run SenderResponseTimer
1616 **********************************************/
1618 dev_info(pd_data
->dev
, "%s\n", __func__
);
1619 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1621 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1622 USBPD_DR_Swap
, USBPD_DFP
, power_role
)) {
1623 usbpd_timer1_start(pd_data
);
1625 if (policy
->plug_valid
== 0) {
1626 ret
= PE_DRS_DFP_UFP_Send_DR_Swap
;
1629 ms
= usbpd_check_time1(pd_data
);
1630 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
1631 dev_info(pd_data
->dev
, "%s, got Accept\n", __func__
);
1632 ret
= PE_DRS_DFP_UFP_Change_to_UFP
;
1633 pd_data
->phy_ops
.set_data_role(pd_data
, USBPD_UFP
);
1636 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
)) {
1637 dev_info(pd_data
->dev
, "%s, got Reject\n", __func__
);
1640 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_WAIT
)) {
1641 dev_info(pd_data
->dev
, "%s, got Wait\n", __func__
);
1644 if (ms
>= tSenderResponse
)
1651 if (power_role
== USBPD_SOURCE
)
1652 return PE_SRC_Ready
;
1654 return PE_SNK_Ready
;
1657 policy_state
usbpd_policy_drs_dfp_ufp_reject_dr_swap(struct policy_data
*policy
)
1659 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1662 /**********************************************
1664 Send Reject or Wait message as appropriate
1665 **********************************************/
1667 dev_info(pd_data
->dev
, "%s\n", __func__
);
1668 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1670 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1671 USBPD_Reject
, USBPD_DFP
, power_role
)) {
1672 if (power_role
== USBPD_SOURCE
)
1673 return PE_SRC_Ready
;
1675 return PE_SNK_Ready
;
1678 return PE_DRS_DFP_UFP_Reject_DR_Swap
;
1681 policy_state
usbpd_policy_drs_ufp_dfp_evaluate_dr_swap(struct policy_data
*policy
)
1683 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1686 /**********************************************
1688 Get evaluation of Data Role Swap
1689 request from Device Policy Manager
1690 **********************************************/
1692 dev_info(pd_data
->dev
, "%s\n", __func__
);
1694 drs_ok
= usbpd_manager_data_role_swap(pd_data
);
1697 return PE_DRS_UFP_DFP_Accept_DR_Swap
;
1699 return PE_DRS_UFP_DFP_Reject_DR_Swap
;
1702 policy_state
usbpd_policy_drs_ufp_dfp_accept_dr_swap(struct policy_data
*policy
)
1704 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1707 /**********************************************
1710 **********************************************/
1712 dev_info(pd_data
->dev
, "%s\n", __func__
);
1713 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1715 mutex_lock(&pd_data
->accept_mutex
);
1716 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1717 USBPD_Accept
, USBPD_UFP
, power_role
);
1718 mutex_unlock(&pd_data
->accept_mutex
);
1719 return PE_DRS_UFP_DFP_Change_to_DFP
;
1722 policy_state
usbpd_policy_drs_ufp_dfp_change_to_dfp(struct policy_data
*policy
)
1724 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1727 /**********************************************
1729 Request Device Policy Manager to change port to DFP
1730 **********************************************/
1732 dev_info(pd_data
->dev
, "%s\n", __func__
);
1734 pd_data
->phy_ops
.set_data_role(pd_data
, USBPD_DFP
);
1735 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1737 if (power_role
== USBPD_SOURCE
)
1738 return PE_SRC_Ready
;
1740 return PE_SNK_Ready
;
1743 policy_state
usbpd_policy_drs_ufp_dfp_send_dr_swap(struct policy_data
*policy
)
1745 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1750 /**********************************************
1752 Send Swap DR message
1753 Initialize and run SenderResponseTimer
1754 **********************************************/
1756 dev_info(pd_data
->dev
, "%s\n", __func__
);
1757 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1759 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1760 USBPD_DR_Swap
, USBPD_UFP
, power_role
)) {
1761 usbpd_timer1_start(pd_data
);
1763 if (policy
->plug_valid
== 0) {
1764 ret
= PE_DRS_UFP_DFP_Send_DR_Swap
;
1767 ms
= usbpd_check_time1(pd_data
);
1768 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
1769 dev_info(pd_data
->dev
, "%s, got Accept\n", __func__
);
1770 ret
= PE_DRS_UFP_DFP_Change_to_DFP
;
1773 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
)) {
1774 dev_info(pd_data
->dev
, "%s, got Reject\n", __func__
);
1777 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_WAIT
)) {
1778 dev_info(pd_data
->dev
, "%s, got Wait\n", __func__
);
1781 if (ms
> tSenderResponse
)
1788 if (power_role
== USBPD_SOURCE
)
1789 return PE_SRC_Ready
;
1791 return PE_SNK_Ready
;
1794 policy_state
usbpd_policy_drs_ufp_dfp_reject_dr_swap(struct policy_data
*policy
)
1796 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1800 /**********************************************
1802 Send Reject or Wait message as appropriate
1803 **********************************************/
1805 dev_info(pd_data
->dev
, "%s\n", __func__
);
1807 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1808 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
1810 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1811 USBPD_Reject
, data_role
, USBPD_SINK
)) {
1812 if (power_role
== USBPD_SOURCE
)
1813 return PE_SRC_Ready
;
1815 return PE_SNK_Ready
;
1818 return PE_DRS_UFP_DFP_Reject_DR_Swap
;
1821 policy_state
usbpd_policy_prs_src_snk_reject_pr_swap(struct policy_data
*policy
)
1823 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1826 /**********************************************
1828 Send Reject or Wait message as appropriate
1829 **********************************************/
1831 /* 1) PD State Inform for AP */
1832 dev_info(pd_data
->dev
, "%s\n", __func__
);
1834 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1836 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1837 USBPD_Reject
, data_role
, USBPD_SOURCE
))
1838 return PE_SRC_Ready
;
1840 return PE_PRS_SRC_SNK_Reject_PR_Swap
;
1843 policy_state
usbpd_policy_prs_src_snk_evaluate_swap(struct policy_data
*policy
)
1845 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1848 /**********************************************
1850 Get evaluation of swap request from Device Policy Manager
1851 **********************************************/
1853 /* 1) PD State Inform for AP */
1854 dev_info(pd_data
->dev
, "%s\n", __func__
);
1856 /* 2) DPM Check to support roleswap */
1857 prs_ok
= usbpd_manager_power_role_swap(pd_data
);
1861 return PE_PRS_SRC_SNK_Accept_Swap
;
1863 return PE_PRS_SRC_SNK_Reject_PR_Swap
;
1866 policy_state
usbpd_policy_prs_src_snk_send_swap(struct policy_data
*policy
)
1868 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1870 int ret
= PE_SRC_Ready
;
1873 /**********************************************
1875 Send PR_Swap message
1876 Initialize and run SenderResponseTimer
1877 **********************************************/
1879 /* 1) PD State Inform for AP */
1880 dev_info(pd_data
->dev
, "%s\n", __func__
);
1882 /* 2) Read Data Role */
1883 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1885 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1886 USBPD_PR_Swap
, data_role
, USBPD_SOURCE
);
1888 /* 3) Start Timer */
1889 usbpd_timer1_start(pd_data
);
1892 if (policy
->plug_valid
== 0) {
1893 ret
= PE_PRS_SRC_SNK_Send_Swap
;
1896 ms
= usbpd_check_time1(pd_data
);
1897 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
1898 ret
= PE_PRS_SRC_SNK_Transition_off
;
1902 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
)) {
1907 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_WAIT
)) {
1912 /* TimeOver Check */
1913 if (ms
>= tSenderResponse
+ 5) {
1923 policy_state
usbpd_policy_prs_src_snk_accept_swap(struct policy_data
*policy
)
1925 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1928 /**********************************************
1931 **********************************************/
1933 /* 1) PD State Inform for AP */
1934 dev_info(pd_data
->dev
, "%s\n", __func__
);
1935 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
1937 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
1938 USBPD_Accept
, data_role
, USBPD_SOURCE
);
1940 return PE_PRS_SRC_SNK_Transition_off
;
1944 policy_state
usbpd_policy_prs_src_snk_transition_to_off(struct policy_data
*policy
)
1946 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
1947 struct usbpd_manager_data
*manager
= &pd_data
->manager
;
1948 int ret
= PE_PRS_SRC_SNK_Assert_Rd
;
1951 /**********************************************
1953 Tell Device Policy Manager to turn off power supply
1954 **********************************************/
1956 /* 1) PD State Inform for AP */
1957 dev_info(pd_data
->dev
, "%s\n", __func__
);
1960 usbpd_timer1_start(pd_data
);
1962 if (policy
->plug_valid
== 0) {
1963 ret
= PE_PRS_SRC_SNK_Transition_off
;
1966 ms
= usbpd_check_time1(pd_data
);
1967 if (ms
>= tSrcTransition
)
1971 if (ret
== PE_PRS_SRC_SNK_Transition_off
)
1974 pd_data
->phy_ops
.pr_swap(pd_data
, USBPD_SOURCE_OFF
);
1977 pd_data
->phy_ops
.set_otg_control(pd_data
, 0);
1979 pr_info("%s, %d\n", __func__
, manager
->acc_type
);
1981 usbpd_timer1_start(pd_data
);
1983 if (policy
->plug_valid
== 0) {
1984 ret
= PE_PRS_SRC_SNK_Transition_off
;
1987 ms
= usbpd_check_time1(pd_data
);
1992 /* TODO: svid_0 == 0 confition check?
1993 * based on 004 code 600ms no condition vs here 150ms w/ condition */
1994 /* skip delay when GEARVR is attached */
1995 if (manager
->acc_type
!= CCIC_DOCK_HMT
|| manager
->SVID_0
== 0)
2002 policy_state
usbpd_policy_prs_src_snk_assert_rd(struct policy_data
*policy
)
2004 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2006 /**********************************************
2008 Request DPM to assert Rd
2009 **********************************************/
2011 /* 1) PD State Inform for AP */
2012 dev_info(pd_data
->dev
, "%s\n", __func__
);
2014 /* 2) Asserted Rd */
2015 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_SINK
);
2017 return PE_PRS_SRC_SNK_Wait_Source_on
;
2020 policy_state
usbpd_policy_prs_src_snk_wait_source_on(struct policy_data
*policy
)
2022 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2026 /**********************************************
2029 Initialize and run PSSourceOnTimer
2030 **********************************************/
2032 /* 1) PD State Inform for AP */
2033 dev_info(pd_data
->dev
, "%s\n", __func__
);
2035 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
2037 /* 2) Send Message */
2038 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2039 USBPD_PS_RDY
, data_role
, USBPD_SINK
);
2040 usbpd_timer1_start(pd_data
);
2043 if (policy
->plug_valid
== 0) {
2044 ret
= PE_PRS_SRC_SNK_Wait_Source_on
;
2047 ms
= usbpd_check_time1(pd_data
);
2048 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_PSRDY
)) {
2049 dev_info(pd_data
->dev
, "got PSRDY.\n");
2050 pd_data
->counter
.swap_hard_reset_counter
= 0;
2051 pd_data
->phy_ops
.set_cc_control(pd_data
, USBPD_CC_OFF
);
2052 /* Self SoftReset for Message ID Clear */
2053 pd_data
->phy_ops
.soft_reset(pd_data
);
2055 pd_data
->phy_ops
.pr_swap(pd_data
, USBPD_PR_DONE
);
2056 ret
= PE_SNK_Startup
;
2059 if (ms
>= tPSSourceOn
) {
2060 ret
= PE_SNK_Hard_Reset
;
2061 if (pd_data
->counter
.hard_reset_counter
> USBPD_nHardResetCount
)
2062 ret
= Error_Recovery
;
2067 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_DRP
);
2072 policy_state
usbpd_policy_prs_snk_src_reject_swap(struct policy_data
*policy
)
2074 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2076 /**********************************************
2078 Send Reject or Wait message as appropriate
2079 **********************************************/
2081 dev_info(pd_data
->dev
, "%s\n", __func__
);
2083 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2084 USBPD_Reject
, USBPD_UFP
, USBPD_SINK
))
2085 return PE_SNK_Ready
;
2087 return PE_PRS_SNK_SRC_Reject_Swap
;
2090 policy_state
usbpd_policy_prs_snk_src_evaluate_swap(struct policy_data
*policy
)
2092 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2094 int ret
= PE_PRS_SNK_SRC_Evaluate_Swap
;
2096 /**********************************************
2098 Get evaluation of swap request from Device Policy Manager
2099 **********************************************/
2101 /* 1) PD State Inform to AP */
2102 dev_info(pd_data
->dev
, "%s\n", __func__
);
2104 /* 2) Power Role Swap Check */
2105 prs_ok
= usbpd_manager_power_role_swap(pd_data
);
2108 ret
= PE_PRS_SNK_SRC_Accept_Swap
;
2110 ret
= PE_PRS_SNK_SRC_Reject_Swap
;
2115 policy_state
usbpd_policy_prs_snk_src_send_swap(struct policy_data
*policy
)
2117 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2119 int ret
= PE_SNK_Ready
;
2122 /**********************************************
2124 Send PR_Swap message
2125 Initialize and run SenderResponseTimer
2126 **********************************************/
2128 /* 1) PD State Inform to AP */
2129 dev_info(pd_data
->dev
, "%s\n", __func__
);
2131 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
2133 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2134 USBPD_PR_Swap
, data_role
, USBPD_SINK
);
2136 usbpd_timer1_start(pd_data
);
2139 if (policy
->plug_valid
== 0) {
2140 ret
= PE_PRS_SNK_SRC_Send_Swap
;
2143 ms
= usbpd_check_time1(pd_data
);
2144 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ACCEPT
)) {
2145 ret
= PE_PRS_SNK_SRC_Transition_off
;
2146 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_SINK
);
2150 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
)) {
2155 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_WAIT
)) {
2160 /* TimeOver Check */
2161 if (ms
>= tSenderResponse
) {
2171 policy_state
usbpd_policy_prs_snk_src_accept_swap(struct policy_data
*policy
)
2173 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2176 /**********************************************
2179 **********************************************/
2181 /* 1) PD State Inform to AP */
2182 dev_info(pd_data
->dev
, "%s\n", __func__
);
2184 /* Send Accept Message */
2185 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
2187 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Accept
,
2188 data_role
, USBPD_SINK
);
2190 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_SINK
);
2192 return PE_PRS_SNK_SRC_Transition_off
;
2195 policy_state
usbpd_policy_prs_snk_src_transition_to_off(struct policy_data
*policy
)
2197 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2200 /**********************************************
2202 Initialize and run PSSourceOffTimer
2203 Tell Device Policy Manager to turn off Power Sink.
2204 **********************************************/
2206 /* 1) PD State Inform to AP */
2207 dev_info(pd_data
->dev
, "%s\n", __func__
);
2209 pd_data
->phy_ops
.pr_swap(pd_data
, USBPD_SINK_OFF
);
2211 /* Start Timer 750ms */
2212 usbpd_timer1_start(pd_data
);
2215 if (policy
->plug_valid
== 0) {
2216 ret
= PE_PRS_SNK_SRC_Transition_off
;
2217 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_DRP
);
2220 ms
= usbpd_check_time1(pd_data
);
2221 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_PSRDY
)) {
2222 dev_info(pd_data
->dev
, "got PSRDY.\n");
2223 ret
= PE_PRS_SNK_SRC_Assert_Rp
;
2226 if (ms
>= tPSSourceOff
) {
2227 ret
= PE_SRC_Hard_Reset
;
2228 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_DRP
);
2229 if (pd_data
->counter
.hard_reset_counter
> USBPD_nHardResetCount
)
2230 ret
= Error_Recovery
;
2238 policy_state
usbpd_policy_prs_snk_src_assert_rp(struct policy_data
*policy
)
2240 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2242 /**********************************************
2244 Request DPM to assert Rp
2245 **********************************************/
2247 dev_info(pd_data
->dev
, "%s\n", __func__
);
2249 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_SOURCE
);
2251 return PE_PRS_SNK_SRC_Source_on
;
2254 policy_state
usbpd_policy_prs_snk_src_source_on(struct policy_data
*policy
)
2256 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2261 /**********************************************
2263 Tell Device Policy Manager to turn on Source
2264 Initialize and run SourceActivityTimer (see Section 8.3.3.6.1.2)1
2265 **********************************************/
2267 /* 1) PD State Inform to AP */
2268 dev_info(pd_data
->dev
, "%s\n", __func__
);
2270 /* 2) Read Data Role */
2271 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
2273 pd_data
->phy_ops
.pr_swap(pd_data
, USBPD_SOURCE_ON
);
2276 pd_data
->phy_ops
.set_otg_control(pd_data
, 1);
2279 usbpd_timer1_start(pd_data
);
2281 if (policy
->plug_valid
== 0) {
2282 ret
= PE_PRS_SNK_SRC_Source_on
;
2285 ms
= usbpd_check_time1(pd_data
);
2290 if (ret
== PE_PRS_SNK_SRC_Source_on
)
2293 /* 5) send PS_RDY */
2294 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2295 USBPD_PS_RDY
, data_role
, USBPD_SOURCE
)) {
2296 pd_data
->phy_ops
.set_power_role(pd_data
, USBPD_DRP
);
2297 usbpd_timer1_start(pd_data
);
2299 if (policy
->plug_valid
== 0) {
2300 ret
= PE_PRS_SNK_SRC_Source_on
;
2303 ms
= usbpd_check_time1(pd_data
);
2304 if (ms
>= tSwapSourceStart
)
2308 if (ret
== PE_PRS_SNK_SRC_Source_on
)
2310 /* TODO: 4) check GoodCRC : may need to be added for certification */
2312 /* Self SoftReset for Message ID Clear */
2313 pd_data
->phy_ops
.soft_reset(pd_data
);
2315 pd_data
->phy_ops
.pr_swap(pd_data
, USBPD_PR_DONE
);
2317 return PE_SRC_Startup
;
2320 return PE_PRS_SNK_SRC_Source_on
;
2323 policy_state
usbpd_policy_vcs_evaluate_swap(struct policy_data
*policy
)
2325 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2328 /**********************************************
2330 Get evaluation of VCONN swap
2331 request from Device Policy Manager
2332 **********************************************/
2334 /* 1) PD State Inform to AP */
2335 dev_info(pd_data
->dev
, "%s\n", __func__
);
2337 /* 2) Request from DPM */
2338 vcs_ok
= usbpd_manager_vconn_source_swap(pd_data
);
2341 return PE_VCS_Accept_Swap
;
2343 return PE_VCS_Reject_VCONN_Swap
;
2346 policy_state
usbpd_policy_vcs_accept_swap(struct policy_data
*policy
)
2348 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2349 int vconn_source
= 0;
2353 /**********************************************
2356 **********************************************/
2358 pd_data
->phy_ops
.get_vconn_source(pd_data
, &vconn_source
);
2359 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2360 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
2362 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2363 USBPD_Accept
, data_role
, power_role
)) {
2365 return PE_VCS_Wait_for_VCONN
;
2367 return PE_VCS_Turn_On_VCONN
;
2370 return PE_VCS_Accept_Swap
;
2373 policy_state
usbpd_policy_vcs_send_swap(struct policy_data
*policy
)
2375 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2376 int vconn_source
= 0;
2378 int ret
= PE_VCS_Send_Swap
;
2381 /**********************************************
2383 Send VCONN_Swap message
2384 Initialize and run SenderResponseTimer
2385 **********************************************/
2388 /* 1) PD State Inform for AP */
2389 dev_info(pd_data
->dev
, "%s\n", __func__
);
2391 /* 2) Get Vconn Source */
2392 pd_data
->phy_ops
.get_vconn_source(pd_data
, &vconn_source
);
2394 /* 3) Get Power Role */
2395 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2397 /* 4) Send Vconn Swap */
2398 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_VCONN_Swap
, USBPD_DFP
, power_role
);
2400 /* 5) Start Timer */
2401 usbpd_timer1_start(pd_data
);
2403 /* 6) Wait Message or State */
2405 if (policy
->plug_valid
== 0) {
2406 ret
= PE_VCS_Send_Swap
;
2409 ms
= usbpd_check_time1(pd_data
);
2410 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
2412 ret
= PE_VCS_Wait_for_VCONN
;
2414 ret
= PE_VCS_Turn_On_VCONN
;
2417 /* TimeOver Check */
2419 if (power_role
== USBPD_SINK
)
2420 ret
= PE_SNK_Hard_Reset
;
2422 ret
= PE_SRC_Hard_Reset
;
2430 policy_state
usbpd_policy_vcs_wait_for_vconn(struct policy_data
*policy
)
2432 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2433 int ret
= PE_VCS_Wait_for_VCONN
;
2435 /**********************************************
2438 **********************************************/
2440 dev_info(pd_data
->dev
, "%s\n", __func__
);
2442 /* 5) Start Timer */
2443 usbpd_timer1_start(pd_data
);
2445 /* 6) Wait Message or State */
2447 if (policy
->plug_valid
== 0) {
2448 ret
= PE_VCS_Wait_for_VCONN
;
2451 ms
= usbpd_check_time1(pd_data
);
2452 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_PSRDY
)) {
2453 pd_data
->counter
.swap_hard_reset_counter
= 0;
2454 ret
= PE_VCS_Turn_Off_VCONN
;
2457 /* TimeOver Check */
2458 if (ms
>= tVCONNSourceOn
) {
2459 if (pd_data
->counter
.swap_hard_reset_counter
> USBPD_nHardResetCount
)
2460 ret
= Error_Recovery
;
2462 ret
= PE_SNK_Hard_Reset
;
2470 policy_state
usbpd_policy_vcs_turn_off_vconn(struct policy_data
*policy
)
2472 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2475 /**********************************************
2477 Tell Device Policy Manager to turn off VCONN
2478 **********************************************/
2480 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2482 dev_info(pd_data
->dev
, "%s\n", __func__
);
2484 pd_data
->phy_ops
.set_vconn_source(pd_data
, USBPD_VCONN_OFF
);
2486 if (power_role
== USBPD_SOURCE
)
2487 return PE_SRC_Ready
;
2489 return PE_SNK_Ready
;
2492 policy_state
usbpd_policy_vcs_turn_on_vconn(struct policy_data
*policy
)
2494 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2496 /**********************************************
2498 Tell Device Policy Manager to turn on VCONN
2499 **********************************************/
2501 dev_info(pd_data
->dev
, "%s\n", __func__
);
2503 pd_data
->phy_ops
.set_vconn_source(pd_data
, USBPD_VCONN_ON
);
2505 return PE_VCS_Send_PS_RDY
;
2508 policy_state
usbpd_policy_vcs_send_ps_rdy(struct policy_data
*policy
)
2510 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2514 /**********************************************
2517 **********************************************/
2519 dev_info(pd_data
->dev
, "%s\n", __func__
);
2521 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2522 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
2526 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2527 USBPD_PS_RDY
, data_role
, data_role
)) {
2528 if (power_role
== USBPD_SOURCE
)
2529 return PE_SRC_Ready
;
2531 return PE_SNK_Ready
;
2534 return PE_VCS_Send_PS_RDY
;
2537 policy_state
usbpd_policy_vcs_reject_vconn_swap(struct policy_data
*policy
)
2539 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2542 /**********************************************
2544 Send Reject or Wait message as appropriate
2545 **********************************************/
2547 dev_info(pd_data
->dev
, "%s\n", __func__
);
2549 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2551 if (usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
2552 USBPD_Reject
, USBPD_DFP
, power_role
)) {
2553 if (power_role
== USBPD_SOURCE
)
2554 return PE_SRC_Ready
;
2556 return PE_SNK_Ready
;
2559 return PE_VCS_Reject_VCONN_Swap
;
2562 policy_state
usbpd_policy_ufp_vdm_get_identity(struct policy_data
*policy
)
2565 /**********************************************
2567 Request Identity information from DPM
2568 **********************************************/
2570 return PE_UFP_VDM_Send_Identity
;
2573 policy_state
usbpd_policy_ufp_vdm_send_identity(struct policy_data
*policy
)
2575 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2578 /**********************************************
2580 Send Discover Identity ACK
2581 **********************************************/
2583 dev_info(pd_data
->dev
, "%s\n", __func__
);
2585 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2587 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2588 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2589 policy
->tx_msg_header
.port_power_role
= power_role
;
2590 policy
->tx_msg_header
.num_data_objs
= 4;
2592 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2593 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2594 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2595 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2596 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
2597 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_Identity
;
2599 policy
->tx_data_obj
[1].object
= 0xD10004E8;
2600 policy
->tx_data_obj
[2].object
= 0x0;
2601 policy
->tx_data_obj
[3].object
= 0x68600000;
2603 /* TODO: data object should be prepared from device manager */
2605 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2606 policy
->tx_data_obj
)) {
2607 if (power_role
== USBPD_SINK
)
2608 return PE_SNK_Ready
;
2610 return PE_SRC_Ready
;
2612 return PE_UFP_VDM_Send_Identity
;
2615 policy_state
usbpd_policy_ufp_vdm_get_identity_nak(struct policy_data
*policy
)
2617 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2620 /**********************************************
2621 Actions on entry: NAK
2622 Send Discover Identity NAK/BUSY Command
2623 response as requested
2624 **********************************************/
2626 dev_info(pd_data
->dev
, "%s\n", __func__
);
2628 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2630 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2631 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2632 policy
->tx_msg_header
.port_power_role
= power_role
;
2633 policy
->tx_msg_header
.num_data_objs
= 1;
2635 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2636 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2637 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2638 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2639 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
2640 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_Identity
;
2642 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2643 policy
->tx_data_obj
)) {
2644 if (power_role
== USBPD_SINK
)
2645 return PE_SNK_Ready
;
2647 return PE_SRC_Ready
;
2649 return PE_UFP_VDM_Get_Identity_NAK
;
2652 policy_state
usbpd_policy_ufp_vdm_get_svids(struct policy_data
*policy
)
2654 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2656 /**********************************************
2658 Request SVIDs information from DPM
2659 **********************************************/
2661 if (usbpd_manager_get_svids(pd_data
) == 0)
2662 return PE_UFP_VDM_Send_SVIDs
;
2664 return PE_UFP_VDM_Get_SVIDs_NAK
;
2668 policy_state
usbpd_policy_ufp_vdm_send_svids(struct policy_data
*policy
)
2670 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2673 /**********************************************
2675 Send Discover SVIDs ACK
2676 **********************************************/
2678 dev_info(pd_data
->dev
, "%s\n", __func__
);
2680 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2682 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2683 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2684 policy
->tx_msg_header
.port_power_role
= power_role
;
2685 policy
->tx_msg_header
.num_data_objs
= 2;
2687 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2688 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2689 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2690 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2691 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
2692 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_SVIDs
;
2694 policy
->tx_data_obj
[1].vdm_svid
.svid_0
= PD_SID
;
2695 policy
->tx_data_obj
[1].vdm_svid
.svid_1
= 0xFF01;
2697 /* TODO: data object should be prepared from device manager */
2699 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2700 policy
->tx_data_obj
)) {
2701 if (power_role
== USBPD_SINK
)
2702 return PE_SNK_Ready
;
2704 return PE_SRC_Ready
;
2707 return PE_UFP_VDM_Send_SVIDs
;
2710 policy_state
usbpd_policy_ufp_vdm_get_svids_nak(struct policy_data
*policy
)
2712 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2715 /**********************************************
2717 Send Discover SVIDs NAK/BUSY Command
2718 response as requested
2719 **********************************************/
2721 dev_info(pd_data
->dev
, "%s\n", __func__
);
2723 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2725 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2726 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2727 policy
->tx_msg_header
.port_power_role
= power_role
;
2728 policy
->tx_msg_header
.num_data_objs
= 1;
2730 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2731 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2732 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2733 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2734 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
2735 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_SVIDs
;
2737 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2738 policy
->tx_data_obj
)) {
2739 if (power_role
== USBPD_SINK
)
2740 return PE_SNK_Ready
;
2742 return PE_SRC_Ready
;
2744 return PE_UFP_VDM_Get_SVIDs_NAK
;
2747 policy_state
usbpd_policy_ufp_vdm_get_modes(struct policy_data
*policy
)
2749 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2751 /**********************************************
2753 Request Modes information from DPM
2754 **********************************************/
2756 if (usbpd_manager_get_modes(pd_data
) == 0)
2757 return PE_UFP_VDM_Send_Modes
;
2759 return PE_UFP_VDM_Get_Modes_NAK
;
2762 policy_state
usbpd_policy_ufp_vdm_send_modes(struct policy_data
*policy
)
2764 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2767 /**********************************************
2769 Send Discover Modes ACK
2770 **********************************************/
2772 dev_info(pd_data
->dev
, "%s\n", __func__
);
2774 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2776 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2777 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2778 policy
->tx_msg_header
.port_power_role
= power_role
;
2779 policy
->tx_msg_header
.num_data_objs
= 2;
2781 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2782 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2783 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2784 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2785 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
2786 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_Modes
;
2788 /* TODO: data object should be prepared from device manager */
2790 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2791 policy
->tx_data_obj
)) {
2792 if (power_role
== USBPD_SINK
)
2793 return PE_SNK_Ready
;
2795 return PE_SRC_Ready
;
2797 return PE_UFP_VDM_Send_Modes
;
2800 policy_state
usbpd_policy_ufp_vdm_get_modes_nak(struct policy_data
*policy
)
2802 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2805 /**********************************************
2807 Send Discover Modes NAK/BUSY Command
2808 response as requested
2809 **********************************************/
2811 dev_info(pd_data
->dev
, "%s\n", __func__
);
2813 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2815 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2816 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2817 policy
->tx_msg_header
.port_power_role
= power_role
;
2818 policy
->tx_msg_header
.num_data_objs
= 1;
2820 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2821 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2822 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2823 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2824 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
2825 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_Modes
;
2827 /* TODO: data object should be prepared from device manager */
2829 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2830 policy
->tx_data_obj
)) {
2831 if (power_role
== USBPD_SINK
)
2832 return PE_SNK_Ready
;
2834 return PE_SRC_Ready
;
2836 return PE_UFP_VDM_Get_Modes_NAK
;
2839 policy_state
usbpd_policy_ufp_vdm_evaluate_mode_entry(struct policy_data
*policy
)
2841 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2843 /**********************************************
2845 Request DPM to evaluate request to enter a Mode
2846 **********************************************/
2848 dev_info(pd_data
->dev
, "%s\n", __func__
);
2850 /* Certification: Ellisys: TD.PD.VDMU.E15.Applicability */
2851 if (usbpd_manager_get_svids(pd_data
) == 0)
2852 return PE_UFP_VDM_Mode_Entry_ACK
;
2854 return PE_UFP_VDM_Mode_Entry_NAK
;
2857 check DPM evaluate request to enter a mode
2860 if (usbpd_manager_enter_mode(pd_data, mode_pos,
2862 return PE_UFP_VDM_Mode_Entry_ACK;
2864 return PE_UFP_VDM_Mode_Entry_NAK;
2866 return PE_UFP_VDM_Evaluate_Mode_Entry
;
2869 policy_state
usbpd_policy_ufp_vdm_mode_entry_ack(struct policy_data
*policy
)
2871 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2874 /**********************************************
2876 Send Enter Mode ACK Command
2877 **********************************************/
2879 dev_info(pd_data
->dev
, "%s\n", __func__
);
2881 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2883 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2884 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2885 policy
->tx_msg_header
.port_power_role
= power_role
;
2886 policy
->tx_msg_header
.num_data_objs
= 1;
2888 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2889 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2890 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2891 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2892 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
2893 policy
->tx_data_obj
[0].structured_vdm
.command
= Enter_Mode
;
2895 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2896 policy
->tx_data_obj
)) {
2897 /* TODO: may need to wait a while(5ms) and send status_update */
2898 if (power_role
== USBPD_SINK
)
2899 return PE_SNK_Ready
;
2901 return PE_SRC_Ready
;
2903 return PE_UFP_VDM_Mode_Entry_ACK
;
2906 policy_state
usbpd_policy_ufp_vdm_mode_entry_nak(struct policy_data
*policy
)
2908 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2911 /**********************************************
2913 Send Enter Mode NAK Command response as requested
2914 **********************************************/
2916 dev_info(pd_data
->dev
, "%s\n", __func__
);
2918 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2920 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2921 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2922 policy
->tx_msg_header
.port_power_role
= power_role
;
2923 policy
->tx_msg_header
.num_data_objs
= 1;
2925 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2926 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2927 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2928 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2929 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
2930 policy
->tx_data_obj
[0].structured_vdm
.command
= Enter_Mode
;
2932 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2933 policy
->tx_data_obj
)) {
2934 if (power_role
== USBPD_SINK
)
2935 return PE_SNK_Ready
;
2937 return PE_SRC_Ready
;
2939 return PE_UFP_VDM_Mode_Entry_NAK
;
2942 policy_state
usbpd_policy_ufp_vdm_mode_exit(struct policy_data
*policy
)
2944 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2946 /**********************************************
2948 Request DPM to evaluate request to exit the requested Mode
2949 **********************************************/
2951 dev_info(pd_data
->dev
, "%s\n", __func__
);
2953 if (pd_data
->phy_ops
.get_status(pd_data
, VDM_EXIT_MODE
)) {
2954 if (policy
->rx_data_obj
[0].structured_vdm
.command
2958 /* get mode to exit */
2959 mode_pos
= policy
->rx_data_obj
[0].structured_vdm
.obj_pos
;
2960 if (usbpd_manager_exit_mode(pd_data
, mode_pos
) == 0)
2961 return PE_UFP_VDM_Mode_Exit_ACK
;
2963 return PE_UFP_VDM_Mode_Exit_NAK
;
2966 return PE_UFP_VDM_Mode_Exit
;
2970 policy_state
usbpd_policy_ufp_vdm_mode_exit_ack(struct policy_data
*policy
)
2972 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
2975 /**********************************************
2977 Send Exit Mode ACK Command
2978 **********************************************/
2980 dev_info(pd_data
->dev
, "%s\n", __func__
);
2982 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
2984 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
2985 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
2986 policy
->tx_msg_header
.port_power_role
= power_role
;
2987 policy
->tx_msg_header
.num_data_objs
= 1;
2989 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
2990 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
2991 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
2992 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
2993 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
2994 policy
->tx_data_obj
[0].structured_vdm
.command
= Exit_Mode
;
2996 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
2997 policy
->tx_data_obj
)) {
2998 if (power_role
== USBPD_SINK
)
2999 return PE_SNK_Ready
;
3001 return PE_SRC_Ready
;
3003 return PE_UFP_VDM_Mode_Exit_NAK
;
3006 policy_state
usbpd_policy_ufp_vdm_mode_exit_nak(struct policy_data
*policy
)
3008 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3011 /**********************************************
3013 Send Exit Mode NAK Command
3014 **********************************************/
3016 dev_info(pd_data
->dev
, "%s\n", __func__
);
3018 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3020 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3021 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
3022 policy
->tx_msg_header
.port_power_role
= power_role
;
3023 policy
->tx_msg_header
.num_data_objs
= 1;
3025 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3026 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3027 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3028 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3029 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
3030 policy
->tx_data_obj
[0].structured_vdm
.command
= Exit_Mode
;
3032 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3033 policy
->tx_data_obj
)) {
3034 if (power_role
== USBPD_SINK
)
3035 return PE_SNK_Ready
;
3037 return PE_SRC_Ready
;
3039 return PE_UFP_VDM_Mode_Exit_NAK
;
3042 policy_state
usbpd_policy_ufp_vdm_attention_request(struct policy_data
*policy
)
3044 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3047 /**********************************************
3049 Send Attention Command request
3050 **********************************************/
3052 dev_info(pd_data
->dev
, "%s\n", __func__
);
3054 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3056 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3057 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
3058 policy
->tx_msg_header
.port_power_role
= power_role
;
3059 /* policy->tx_msg_header.num_data_objs = 1; number of objects*/
3061 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3062 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3063 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3064 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 0;
3065 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3066 policy
->tx_data_obj
[0].structured_vdm
.command
= Attention
;
3068 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3069 policy
->tx_data_obj
)) {
3070 if (power_role
== USBPD_SINK
)
3071 return PE_SNK_Ready
;
3073 return PE_SRC_Ready
;
3075 return PE_UFP_VDM_Attention_Request
;
3079 policy_state
usbpd_policy_ufp_vdm_evaluate_status(struct policy_data
*policy
)
3081 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3084 /**********************************************
3085 **********************************************/
3087 dev_info(pd_data
->dev
, "%s\n", __func__
);
3089 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3091 if (power_role
== USBPD_SINK
)
3092 return PE_SNK_Ready
;
3094 return PE_SRC_Ready
;
3097 check DPM evaluate request to inform status
3100 if (usbpd_manager_enter_mode(pd_data, mode_pos,
3102 return PE_UFP_VDM_Mode_Entry_ACK;
3104 return PE_UFP_VDM_Mode_Entry_NAK;
3108 policy_state
usbpd_policy_ufp_vdm_status_ack(struct policy_data
*policy
)
3110 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3113 /**********************************************
3114 **********************************************/
3116 dev_info(pd_data
->dev
, "%s\n", __func__
);
3118 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3120 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3121 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
3122 policy
->tx_msg_header
.port_power_role
= power_role
;
3123 policy
->tx_msg_header
.num_data_objs
= 1;
3125 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3126 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3127 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3128 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3129 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
3130 policy
->tx_data_obj
[0].structured_vdm
.command
= DisplayPort_Status_Update
;
3132 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3133 policy
->tx_data_obj
)) {
3134 if (power_role
== USBPD_SINK
)
3135 return PE_SNK_Ready
;
3137 return PE_SRC_Ready
;
3139 return PE_UFP_VDM_Status_ACK
;
3142 policy_state
usbpd_policy_ufp_vdm_status_nak(struct policy_data
*policy
)
3144 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3147 /**********************************************
3148 **********************************************/
3150 dev_info(pd_data
->dev
, "%s\n", __func__
);
3152 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3154 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3155 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
3156 policy
->tx_msg_header
.port_power_role
= power_role
;
3157 policy
->tx_msg_header
.num_data_objs
= 1;
3159 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3160 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3161 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3162 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3163 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
3164 policy
->tx_data_obj
[0].structured_vdm
.command
= DisplayPort_Status_Update
;
3166 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3167 policy
->tx_data_obj
)) {
3168 if (power_role
== USBPD_SINK
)
3169 return PE_SNK_Ready
;
3171 return PE_SRC_Ready
;
3173 return PE_UFP_VDM_Status_NAK
;
3176 policy_state
usbpd_policy_ufp_vdm_evaluate_configure(struct policy_data
*policy
)
3178 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3181 /**********************************************
3182 **********************************************/
3184 dev_info(pd_data
->dev
, "%s\n", __func__
);
3186 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3188 if (power_role
== USBPD_SINK
)
3189 return PE_SNK_Ready
;
3191 return PE_SRC_Ready
;
3194 check DPM evaluate request to inform status
3197 if (usbpd_manager_enter_mode(pd_data, mode_pos,
3199 return PE_UFP_VDM_Mode_Entry_ACK;
3201 return PE_UFP_VDM_Mode_Entry_NAK;
3205 policy_state
usbpd_policy_ufp_vdm_configure_ack(struct policy_data
*policy
)
3207 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3210 /**********************************************
3211 **********************************************/
3213 dev_info(pd_data
->dev
, "%s\n", __func__
);
3215 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3217 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3218 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
3219 policy
->tx_msg_header
.port_power_role
= power_role
;
3220 policy
->tx_msg_header
.num_data_objs
= 1;
3222 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3223 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3224 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3225 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3226 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_ACK
;
3227 policy
->tx_data_obj
[0].structured_vdm
.command
= DisplayPort_Configure
;
3229 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3230 policy
->tx_data_obj
)) {
3231 if (power_role
== USBPD_SINK
)
3232 return PE_SNK_Ready
;
3234 return PE_SRC_Ready
;
3236 return PE_UFP_VDM_Configure_ACK
;
3239 policy_state
usbpd_policy_ufp_vdm_configure_nak(struct policy_data
*policy
)
3241 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3244 /**********************************************
3245 **********************************************/
3247 dev_info(pd_data
->dev
, "%s\n", __func__
);
3249 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3251 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3252 policy
->tx_msg_header
.port_data_role
= USBPD_UFP
;
3253 policy
->tx_msg_header
.port_power_role
= power_role
;
3254 policy
->tx_msg_header
.num_data_objs
= 1;
3256 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3257 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3258 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3259 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3260 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Responder_NAK
;
3261 policy
->tx_data_obj
[0].structured_vdm
.command
= DisplayPort_Configure
;
3263 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3264 policy
->tx_data_obj
)) {
3265 if (power_role
== USBPD_SINK
)
3266 return PE_SNK_Ready
;
3268 return PE_SRC_Ready
;
3270 return PE_UFP_VDM_Configure_NAK
;
3275 policy_state
usbpd_policy_dfp_vdm_identity_request(struct policy_data
*policy
)
3277 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3280 /**********************************************
3282 Send Discover Identity request
3283 Start VDMResponseTimer
3284 **********************************************/
3286 dev_info(pd_data
->dev
, "%s\n", __func__
);
3288 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3290 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3291 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3292 policy
->tx_msg_header
.port_power_role
= power_role
;
3293 policy
->tx_msg_header
.num_data_objs
= 1;
3295 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3296 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3297 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3298 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3299 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3300 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_Identity
;
3302 pd_data
->counter
.discover_identity_counter
++;
3303 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3304 policy
->tx_data_obj
)) {
3305 pd_data
->policy
.state
= PE_DFP_VDM_Identity_Request
;
3306 if (usbpd_wait_msg(pd_data
, VDM_DISCOVER_IDENTITY
,
3307 tVDMSenderResponse
)) {
3308 pd_data
->counter
.discover_identity_counter
= 0;
3310 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3312 return PE_DFP_VDM_Identity_ACKed
;
3313 else if (policy
->rx_data_obj
[0].structured_vdm
.command_type
== Responder_NAK
3314 || policy
->rx_data_obj
[0].structured_vdm
.command_type
== Responder_BUSY
)
3315 return PE_DFP_VDM_Identity_NAKed
;
3319 if (pd_data
->counter
.swap_hard_reset_counter
> USBPD_nHardResetCount
)
3320 return Error_Recovery
;
3322 return PE_SRC_Hard_Reset
;
3325 static policy_state
usbpd_policy_dfp_vdm_response(struct policy_data
*policy
,
3326 usbpd_manager_event_type event
)
3328 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3331 /**********************************************
3332 **********************************************/
3334 usbpd_manager_inform_event(pd_data
, event
);
3336 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3338 if (power_role
== USBPD_SINK
)
3339 return PE_SNK_Ready
;
3341 return PE_SRC_Ready
;
3344 policy_state
usbpd_policy_dfp_vdm_identity_acked(struct policy_data
*policy
)
3346 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3348 /**********************************************
3350 Inform DPM of identity
3351 **********************************************/
3353 dev_info(pd_data
->dev
, "%s\n", __func__
);
3355 return usbpd_policy_dfp_vdm_response(policy
,
3356 MANAGER_DISCOVER_IDENTITY_ACKED
);
3359 policy_state
usbpd_policy_dfp_vdm_identity_naked(struct policy_data
*policy
)
3361 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3363 /**********************************************
3365 Inform DPM of result
3366 **********************************************/
3368 dev_info(pd_data
->dev
, "%s\n", __func__
);
3370 return usbpd_policy_dfp_vdm_response(policy
,
3371 MANAGER_DISCOVER_IDENTITY_NAKED
);
3374 policy_state
usbpd_policy_dfp_vdm_svids_request(struct policy_data
*policy
)
3376 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3379 /**********************************************
3381 Send Discover SVIDs request
3382 Start VDMResponseTimer
3383 **********************************************/
3385 dev_info(pd_data
->dev
, "%s\n", __func__
);
3387 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3389 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3390 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3391 policy
->tx_msg_header
.port_power_role
= power_role
;
3392 policy
->tx_msg_header
.num_data_objs
= 1;
3394 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3395 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3396 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3397 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3398 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3399 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_SVIDs
;
3401 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3402 policy
->tx_data_obj
)) {
3403 pd_data
->policy
.state
= PE_DFP_VDM_SVIDs_Request
;
3404 if (usbpd_wait_msg(pd_data
, VDM_DISCOVER_SVID
,
3405 tVDMSenderResponse
)) {
3406 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3408 return PE_DFP_VDM_SVIDs_ACKed
;
3411 return PE_DFP_VDM_SVIDs_NAKed
;
3414 policy_state
usbpd_policy_dfp_vdm_svids_acked(struct policy_data
*policy
)
3416 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3418 /**********************************************
3421 **********************************************/
3423 dev_info(pd_data
->dev
, "%s\n", __func__
);
3425 return usbpd_policy_dfp_vdm_response(policy
,
3426 MANAGER_DISCOVER_SVID_ACKED
);
3429 policy_state
usbpd_policy_dfp_vdm_svids_naked(struct policy_data
*policy
)
3431 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3433 /**********************************************
3435 Inform DPM of result
3436 **********************************************/
3438 dev_info(pd_data
->dev
, "%s\n", __func__
);
3440 return usbpd_policy_dfp_vdm_response(policy
,
3441 MANAGER_DISCOVER_SVID_NAKED
);
3444 policy_state
usbpd_policy_dfp_vdm_modes_request(struct policy_data
*policy
)
3446 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3447 struct usbpd_manager_data
*manager
= &pd_data
->manager
;
3450 /**********************************************
3452 Send Discover Modes request
3453 Start VDMResponseTimer
3454 **********************************************/
3456 dev_info(pd_data
->dev
, "%s\n", __func__
);
3458 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3460 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3461 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3462 policy
->tx_msg_header
.port_power_role
= power_role
;
3463 policy
->tx_msg_header
.num_data_objs
= 1;
3465 policy
->tx_data_obj
[0].structured_vdm
.svid
= manager
->SVID_0
;
3466 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3467 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3468 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;
3469 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3470 policy
->tx_data_obj
[0].structured_vdm
.command
= Discover_Modes
;
3472 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3473 policy
->tx_data_obj
)) {
3474 pd_data
->policy
.state
= PE_DFP_VDM_Modes_Request
;
3475 if (usbpd_wait_msg(pd_data
, VDM_DISCOVER_MODE
,
3476 tVDMSenderResponse
)) {
3477 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3479 return PE_DFP_VDM_Modes_ACKed
;
3482 return PE_DFP_VDM_Modes_NAKed
;
3485 policy_state
usbpd_policy_dfp_vdm_modes_acked(struct policy_data
*policy
)
3487 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3489 /**********************************************
3492 **********************************************/
3494 dev_info(pd_data
->dev
, "%s\n", __func__
);
3496 return usbpd_policy_dfp_vdm_response(policy
,
3497 MANAGER_DISCOVER_MODE_ACKED
);
3500 policy_state
usbpd_policy_dfp_vdm_modes_naked(struct policy_data
*policy
)
3502 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3504 /**********************************************
3506 Inform DPM of result
3507 **********************************************/
3509 dev_info(pd_data
->dev
, "%s\n", __func__
);
3511 return usbpd_policy_dfp_vdm_response(policy
,
3512 MANAGER_DISCOVER_MODE_NAKED
);
3515 policy_state
usbpd_policy_dfp_vdm_entry_request(struct policy_data
*policy
)
3517 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3518 struct usbpd_manager_data
*manager
= &pd_data
->manager
;
3521 /**********************************************
3523 Send Mode Entry request
3524 Start VDMModeEntryTimer
3525 **********************************************/
3527 dev_info(pd_data
->dev
, "%s\n", __func__
);
3529 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3531 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3532 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3533 policy
->tx_msg_header
.port_power_role
= power_role
;
3534 policy
->tx_msg_header
.num_data_objs
= 1;
3536 policy
->tx_data_obj
[0].object
= 0;
3537 policy
->tx_data_obj
[0].structured_vdm
.svid
= manager
->SVID_0
;
3538 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3539 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3540 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;/* Todo select which_mode */
3541 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3542 policy
->tx_data_obj
[0].structured_vdm
.command
= Enter_Mode
;
3544 /* TODO: obj_pos , vdo should be set by device manager */
3546 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3547 policy
->tx_data_obj
)) {
3548 pd_data
->policy
.state
= PE_DFP_VDM_Mode_Entry_Request
;
3549 if (usbpd_wait_msg(pd_data
, VDM_ENTER_MODE
,
3550 tVDMWaitModeEntry
)) {
3551 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3553 return PE_DFP_VDM_Mode_Entry_ACKed
;
3556 return PE_DFP_VDM_Mode_Entry_NAKed
;
3559 policy_state
usbpd_policy_dfp_vdm_entry_acked(struct policy_data
*policy
)
3561 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3563 /**********************************************
3565 Request DPM to enter the mode
3566 **********************************************/
3568 dev_info(pd_data
->dev
, "%s\n", __func__
);
3570 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_ENTER_MODE_ACKED
);
3573 policy_state
usbpd_policy_dfp_vdm_entry_naked(struct policy_data
*policy
)
3575 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3577 /**********************************************
3579 Inform DPM of reason for failure
3580 **********************************************/
3582 dev_info(pd_data
->dev
, "%s\n", __func__
);
3584 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_ENTER_MODE_NAKED
);
3587 policy_state
usbpd_policy_dfp_vdm_exit_request(struct policy_data
*policy
)
3589 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3592 /**********************************************
3594 Send Exit Mode request
3595 Start VDMModeExitTimer
3596 **********************************************/
3598 dev_info(pd_data
->dev
, "%s\n", __func__
);
3600 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3602 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3603 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3604 policy
->tx_msg_header
.port_power_role
= power_role
;
3605 policy
->tx_msg_header
.num_data_objs
= 1;
3607 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID
;
3608 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3609 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3610 /* policy->tx_data_obj[0].structured_vdm.obj_pos = which_mode; */
3611 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3612 policy
->tx_data_obj
[0].structured_vdm
.command
= Exit_Mode
;
3614 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3615 policy
->tx_data_obj
)) {
3616 pd_data
->policy
.state
= PE_DFP_VDM_Mode_Exit_Request
;
3617 if (usbpd_wait_msg(pd_data
, VDM_EXIT_MODE
,
3618 tVDMWaitModeExit
)) {
3619 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3621 return PE_DFP_VDM_Mode_Exit_ACKed
;
3624 return PE_DFP_VDM_Mode_Exit_NAKed
;
3627 policy_state
usbpd_policy_dfp_vdm_exit_acked(struct policy_data
*policy
)
3629 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3631 /**********************************************
3634 **********************************************/
3636 dev_info(pd_data
->dev
, "%s\n", __func__
);
3638 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_EXIT_MODE_ACKED
);
3641 policy_state
usbpd_policy_dfp_vdm_exit_naked(struct policy_data
*policy
)
3643 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3645 /**********************************************
3648 **********************************************/
3650 dev_info(pd_data
->dev
, "%s\n", __func__
);
3652 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_EXIT_MODE_NAKED
);
3655 policy_state
usbpd_policy_dfp_vdm_attention_request(struct policy_data
*policy
)
3657 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3659 /**********************************************
3661 Inform Device Policy Manager of Attention Command request
3662 **********************************************/
3664 dev_info(pd_data
->dev
, "%s\n", __func__
);
3666 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_ATTENTION_REQUEST
);
3669 policy_state
usbpd_policy_dfp_vdm_status_update(struct policy_data
*policy
)
3671 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3674 /**********************************************
3675 **********************************************/
3677 dev_info(pd_data
->dev
, "%s\n", __func__
);
3679 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3680 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, CHECK_MSG_PASS
);
3683 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3684 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3685 policy
->tx_msg_header
.port_power_role
= power_role
;
3686 policy
->tx_msg_header
.num_data_objs
= 2;
3688 policy
->tx_data_obj
[0].object
= 0;
3689 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID_1
;
3690 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3691 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3692 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;/* Todo select which_mode */
3693 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3694 policy
->tx_data_obj
[0].structured_vdm
.command
= DisplayPort_Status_Update
;
3696 /* second object for vdo */
3697 policy
->tx_data_obj
[1].object
= 0;
3698 policy
->tx_data_obj
[1].displayport_status
.port_connected
= 1;
3700 /* TODO: obj_pos , vdo should be set by device manager */
3702 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3703 policy
->tx_data_obj
)) {
3704 pd_data
->policy
.state
= PE_DFP_VDM_Status_Update
;
3705 if (usbpd_wait_msg(pd_data
, MSG_PASS
,
3706 tVDMWaitModeEntry
)) {
3707 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, NONE_CHECK_MSG_PASS
);
3708 pr_info("%s : command(%d), command_type(%d), obj_pos(%d), version(%d), vdm_type(%d)\n",
3709 __func__
, policy
->rx_data_obj
[0].structured_vdm
.command
,
3710 policy
->rx_data_obj
[0].structured_vdm
.command_type
,
3711 policy
->rx_data_obj
[0].structured_vdm
.obj_pos
,
3712 policy
->rx_data_obj
[0].structured_vdm
.version
,
3713 policy
->rx_data_obj
[0].structured_vdm
.vdm_type
);
3715 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3717 return PE_DFP_VDM_Status_Update_ACKed
;
3720 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, NONE_CHECK_MSG_PASS
);
3722 return PE_DFP_VDM_Status_Update_NAKed
;
3725 policy_state
usbpd_policy_dfp_vdm_status_update_acked(struct policy_data
*policy
)
3727 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3729 /**********************************************
3730 **********************************************/
3732 dev_info(pd_data
->dev
, "%s\n", __func__
);
3734 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_STATUS_UPDATE_ACKED
);
3737 policy_state
usbpd_policy_dfp_vdm_status_update_naked(struct policy_data
*policy
)
3739 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3741 /**********************************************
3742 **********************************************/
3744 dev_info(pd_data
->dev
, "%s\n", __func__
);
3746 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_STATUS_UPDATE_NAKED
);
3749 policy_state
usbpd_policy_dfp_vdm_displayport_configure(struct policy_data
*policy
)
3751 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3754 /**********************************************
3755 **********************************************/
3757 dev_info(pd_data
->dev
, "%s\n", __func__
);
3759 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3760 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, CHECK_MSG_PASS
);
3762 policy
->tx_msg_header
.msg_type
= USBPD_Vendor_Defined
;
3763 policy
->tx_msg_header
.port_data_role
= USBPD_DFP
;
3764 policy
->tx_msg_header
.port_power_role
= power_role
;
3765 policy
->tx_msg_header
.num_data_objs
= 2;
3767 policy
->tx_data_obj
[0].structured_vdm
.svid
= PD_SID_1
;
3768 policy
->tx_data_obj
[0].structured_vdm
.vdm_type
= Structured_VDM
;
3769 policy
->tx_data_obj
[0].structured_vdm
.version
= 0;
3770 policy
->tx_data_obj
[0].structured_vdm
.obj_pos
= 1;/* Todo select which_mode */
3771 policy
->tx_data_obj
[0].structured_vdm
.command_type
= Initiator
;
3772 policy
->tx_data_obj
[0].structured_vdm
.command
= DisplayPort_Configure
;
3774 /* second object for vdo */
3775 policy
->tx_data_obj
[1].object
= 0;
3776 policy
->tx_data_obj
[1].displayport_configurations
.select_configuration
= USB_U_AS_UFP_D
;
3777 policy
->tx_data_obj
[1].displayport_configurations
.displayport_protocol
= DP_V_1_3
;
3778 policy
->tx_data_obj
[1].displayport_configurations
.ufp_u_pin_assignment
= PIN_ASSIGNMENT_D
;
3780 /* TODO: obj_pos , vdo should be set by device manager */
3781 if (usbpd_send_msg(pd_data
, &policy
->tx_msg_header
,
3782 policy
->tx_data_obj
)) {
3783 pd_data
->policy
.state
= PE_DFP_VDM_DisplayPort_Configure
;
3784 if (usbpd_wait_msg(pd_data
, MSG_PASS
,
3785 tVDMWaitModeEntry
)) {
3786 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, NONE_CHECK_MSG_PASS
);
3787 if (policy
->rx_data_obj
[0].structured_vdm
.command_type
3789 return PE_DFP_VDM_DisplayPort_Configure_ACKed
;
3792 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, NONE_CHECK_MSG_PASS
);
3794 return PE_DFP_VDM_DisplayPort_Configure_NAKed
;
3797 policy_state
usbpd_policy_dfp_vdm_displayport_configure_acked(struct policy_data
*policy
)
3799 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3801 /**********************************************
3802 **********************************************/
3804 dev_info(pd_data
->dev
, "%s\n", __func__
);
3806 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_DisplayPort_Configure_ACKED
);
3809 policy_state
usbpd_policy_dfp_vdm_displayport_configure_naked(struct policy_data
*policy
)
3811 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3813 /**********************************************
3814 **********************************************/
3816 dev_info(pd_data
->dev
, "%s\n", __func__
);
3818 return usbpd_policy_dfp_vdm_response(policy
, MANAGER_DisplayPort_Configure_NACKED
);
3821 policy_state
usbpd_policy_dfp_uvdm_send_message(struct policy_data
*policy
)
3823 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3824 struct usbpd_manager_data
*manager
= &pd_data
->manager
;
3827 /**********************************************
3828 **********************************************/
3830 dev_info(pd_data
->dev
, "%s\n", __func__
);
3832 pd_data
->phy_ops
.set_check_msg_pass(pd_data
, CHECK_MSG_PASS
);
3834 usbpd_send_msg(pd_data
, &manager
->uvdm_msg_header
, manager
->uvdm_data_obj
);
3836 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3838 if (power_role
== USBPD_SOURCE
)
3839 return PE_SRC_Ready
;
3841 return PE_SNK_Ready
;
3844 policy_state
usbpd_policy_dfp_uvdm_receive_message(struct policy_data
*policy
)
3846 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3849 /**********************************************
3850 **********************************************/
3852 dev_info(pd_data
->dev
, "%s\n", __func__
);
3854 usbpd_manager_inform_event(pd_data
, MANAGER_UVDM_RECEIVE_MESSAGE
);
3856 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
3858 if (power_role
== USBPD_SOURCE
)
3859 return PE_SRC_Ready
;
3861 return PE_SNK_Ready
;
3864 policy_state
usbpd_policy_dr_src_get_source_cap(struct policy_data
*policy
)
3866 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3867 int ret
= PE_DR_SRC_Get_Source_Cap
;
3871 /**********************************************
3872 get source capabilities request from Device Policy Manager
3875 Send Get_Source_Cap message
3876 Initialize and run SenderResponseTimer
3877 **********************************************/
3879 /* 1) PD State Inform to AP */
3880 dev_info(pd_data
->dev
, "%s\n", __func__
);
3882 /* 2) Read Data Role */
3883 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
3885 /* 3) Send Message */
3886 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
, USBPD_Get_Source_Cap
, data_role
, USBPD_SOURCE
);
3888 /* 4) Start Timer */
3889 usbpd_timer1_start(pd_data
);
3891 /* 5) Wait Message or State */
3893 if (policy
->plug_valid
== 0) {
3894 ret
= PE_DR_SRC_Get_Source_Cap
;
3897 ms
= usbpd_check_time1(pd_data
);
3898 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
3899 ret
= PE_SRC_Send_Soft_Reset
;
3903 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_SRC_CAP
)) {
3908 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
)) {
3913 /* TimeOver Check */
3914 if (ms
>= tSenderResponse
) {
3920 /**********************************************
3922 Pass source capabilities/outcome to Device Policy Manager
3924 Source capabilities message received
3925 | SenderResponseTimer Timeout | Reject message received
3926 **********************************************/
3931 policy_state
usbpd_policy_dr_src_give_sink_cap(struct policy_data
*policy
)
3933 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3935 int ret
= PE_DR_SRC_Give_Sink_Cap
;
3938 /**********************************************
3940 Get present sink capabilities from Device Policy Manager
3941 Send Capabilities message (based on Device Policy Manager response)
3942 **********************************************/
3944 /* 1) PD State Inform to AP */
3945 dev_info(pd_data
->dev
, "%s\n", __func__
);
3947 /* 2) Read Data Role */
3948 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
3950 /* 3) Sink Cap Message Setting */
3951 policy
->tx_msg_header
.word
= pd_data
->sink_msg_header
.word
;
3952 policy
->tx_msg_header
.port_data_role
= data_role
;
3953 policy
->tx_data_obj
[0].object
= pd_data
->sink_data_obj
[0].object
;
3954 policy
->tx_data_obj
[1].object
= pd_data
->sink_data_obj
[1].object
;
3956 /* 4) Send Message */
3957 usbpd_send_msg(pd_data
, &policy
->tx_msg_header
, policy
->tx_data_obj
);
3959 /* 5) Start Timer */
3960 usbpd_timer1_start(pd_data
);
3962 /* 6) Wait Message or State */
3964 if (policy
->plug_valid
== 0) {
3965 ret
= PE_DR_SRC_Give_Sink_Cap
;
3968 ms
= usbpd_check_time1(pd_data
);
3969 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
3970 dev_info(pd_data
->dev
, "got dr_src_give_sink_cap MSG_GOODCRC.\n");
3976 ret
= PE_SRC_Send_Soft_Reset
;
3977 dev_info(pd_data
->dev
, "got dr_src_give_sink_cap Timer1_overflag.\n");
3982 /* 8) Sink Capabilities message sent */
3986 policy_state
usbpd_policy_dr_snk_get_sink_cap(struct policy_data
*policy
)
3988 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
3989 int ret
= PE_DR_SNK_Get_Sink_Cap
;
3993 /**********************************************
3994 get sink capabilities request from Device Policy Manager
3997 Send Get_Sink_Cap message
4000 **********************************************/
4002 /* 1) PD State Inform to AP */
4003 dev_info(pd_data
->dev
, "%s\n", __func__
);
4005 /* 2) Read Data Role */
4006 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
4008 /* 3) Send Message */
4009 usbpd_send_ctrl_msg(pd_data
, &policy
->tx_msg_header
,
4010 USBPD_Get_Sink_Cap
, data_role
, USBPD_SINK
);
4012 /* 4) Start Timer */
4013 usbpd_timer1_start(pd_data
);
4015 /* 5) Wait Message or State */
4017 if (policy
->plug_valid
== 0) {
4018 ret
= PE_DR_SNK_Get_Sink_Cap
;
4021 ms
= usbpd_check_time1(pd_data
);
4022 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_ERROR
)) {
4023 ret
= PE_SNK_Send_Soft_Reset
;
4027 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_SNK_CAP
)) {
4032 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_REJECT
)) {
4037 /* TimeOver Check */
4038 if (ms
>= tSenderResponse
) {
4044 /**********************************************
4046 Pass sink capabilities/outcome to
4047 Device Policy Manager
4049 Sink capabilities message received
4050 | SenderResponseTimer Timeout | Reject message received
4051 **********************************************/
4056 policy_state
usbpd_policy_dr_snk_give_source_cap(struct policy_data
*policy
)
4058 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
4059 int ret
= PE_DR_SNK_Give_Source_Cap
;
4062 /**********************************************
4064 Request source capabilities from
4065 Device Policy Manager
4066 Send Capabilities message
4067 **********************************************/
4069 /* 1) PD State Inform to AP */
4070 dev_info(pd_data
->dev
, "%s\n", __func__
);
4072 if (!pd_data
->id_matched
)
4073 return PE_SNK_Ready
;
4076 /* 2) Message ID Check and Ignored */
4077 if (pd_data
->phy_ops
.compare_message_id(pd_data
) != 0) {
4078 dev_info(pd_data
->dev
, "After compare_message_id not Match move to PE_SNK_Ready.\n");
4079 return PE_SNK_Ready
;
4081 dev_info(pd_data
->dev
, "After compare_message_id Match move to PE_SNK_Ready.\n");
4085 /* 3) Read Data Role */
4086 pd_data
->phy_ops
.get_data_role(pd_data
, &data_role
);
4088 /* 4) Message Setting */
4089 policy
->tx_msg_header
.msg_type
= USBPD_Source_Capabilities
;
4090 policy
->tx_msg_header
.port_data_role
= data_role
;
4091 policy
->tx_msg_header
.port_power_role
= USBPD_SINK
;
4092 policy
->tx_msg_header
.num_data_objs
= 1;
4094 policy
->tx_data_obj
[0].power_data_obj
.max_current
= 1500 / 10;
4095 policy
->tx_data_obj
[0].power_data_obj
.voltage
= 5000 / 50;
4096 policy
->tx_data_obj
[0].power_data_obj
.peak_current
= 0;
4097 policy
->tx_data_obj
[0].power_data_obj
.rsvd
= 0;
4098 policy
->tx_data_obj
[0].power_data_obj
.data_role_swap
= 1;
4099 policy
->tx_data_obj
[0].power_data_obj
.usb_comm_capable
= 1;
4100 policy
->tx_data_obj
[0].power_data_obj
.externally_powered
= 0;
4101 policy
->tx_data_obj
[0].power_data_obj
.usb_suspend_support
= 1;
4102 policy
->tx_data_obj
[0].power_data_obj
.dual_role_power
= 1;
4103 policy
->tx_data_obj
[0].power_data_obj
.supply
= 0;
4105 /* 5) Send Message */
4106 usbpd_send_msg(pd_data
, &policy
->tx_msg_header
, policy
->tx_data_obj
);
4108 /* 6) Start Timer */
4109 usbpd_timer1_start(pd_data
);
4111 /* 7) Wait Message or State */
4113 if (policy
->plug_valid
== 0)
4115 ms
= usbpd_check_time1(pd_data
);
4116 if (pd_data
->phy_ops
.get_status(pd_data
, MSG_GOODCRC
)) {
4122 ret
= PE_SNK_Send_Soft_Reset
;
4130 policy_state
usbpd_policy_bist_receive_mode(struct policy_data
*policy
)
4133 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
4134 int ret
= PE_BIST_Receive_Mode
;
4136 /**********************************************
4138 Tell Protocol Layer to go to BIST
4140 **********************************************/
4142 /* 1) PD State Inform to AP */
4143 dev_info(pd_data
->dev
, "%s\n", __func__
);
4145 /* 2) Interrupt Status All Mask */
4147 /**********************************************
4149 Goto bist frame received state
4150 or Hard Reset signaling received
4151 **********************************************/
4152 ret
= PE_BIST_Frame_Received
;
4158 policy_state
usbpd_policy_bist_frame_received(struct policy_data
*policy
)
4161 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
4162 int ret
= PE_BIST_Frame_Received
;
4164 /**********************************************
4167 **********************************************/
4169 /* 1) PD State Inform to AP */
4170 dev_info(pd_data
->dev
, "%s\n", __func__
);
4172 /**********************************************
4175 or Hard Reset signaling received
4176 **********************************************/
4182 policy_state
usbpd_error_recovery(struct policy_data
*policy
)
4184 struct usbpd_data
*pd_data
= policy_to_usbpd(policy
);
4186 /**********************************************
4187 **********************************************/
4189 dev_err(pd_data
->dev
, "%s\n", __func__
);
4191 return Error_Recovery
;
4194 void usbpd_policy_work(struct work_struct
*work
)
4196 struct usbpd_data
*pd_data
= container_of(work
, struct usbpd_data
,
4198 struct policy_data
*policy
= &pd_data
->policy
;
4200 policy_state next_state
= policy
->state
;
4201 policy_state saved_state
;
4204 if (!policy
->plug_valid
) {
4205 pr_info("%s : usbpd cable is empty\n", __func__
);
4209 if (policy
->rx_hardreset
|| policy
->rx_softreset
4212 next_state
= 0; /* default */
4214 saved_state
= next_state
;
4215 switch (next_state
) {
4216 case PE_SRC_Startup
:
4217 next_state
= usbpd_policy_src_startup(policy
);
4218 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4220 case PE_SRC_Discovery
:
4221 next_state
= usbpd_policy_src_discovery(policy
);
4223 case PE_SRC_Send_Capabilities
:
4224 next_state
= usbpd_policy_src_send_capabilities(policy
);
4226 case PE_SRC_Negotiate_Capability
:
4227 next_state
= usbpd_policy_src_negotiate_capability(policy
);
4229 case PE_SRC_Transition_Supply
:
4230 next_state
= usbpd_policy_src_transition_supply(policy
);
4233 next_state
= usbpd_policy_src_ready(policy
);
4234 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4236 case PE_SRC_Disabled
:
4237 next_state
= usbpd_policy_src_disabled(policy
);
4238 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4240 case PE_SRC_Capability_Response
:
4241 next_state
= usbpd_policy_src_capability_response(policy
);
4243 case PE_SRC_Hard_Reset
:
4244 next_state
= usbpd_policy_src_hard_reset(policy
);
4245 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4247 case PE_SRC_Hard_Reset_Received
:
4248 next_state
= usbpd_policy_src_hard_reset_received(policy
);
4249 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4251 case PE_SRC_Transition_to_default
:
4252 next_state
= usbpd_policy_src_transition_to_default(policy
);
4254 case PE_SRC_Give_Source_Cap
:
4255 next_state
= usbpd_policy_src_give_source_cap(policy
);
4257 case PE_SRC_Get_Sink_Cap
:
4258 next_state
= usbpd_policy_src_get_sink_cap(policy
);
4260 case PE_SRC_Wait_New_Capabilities
:
4261 next_state
= usbpd_policy_src_wait_new_capabilities(policy
);
4263 case PE_SRC_Send_Soft_Reset
:
4264 next_state
= usbpd_policy_src_send_soft_reset(policy
);
4266 case PE_SRC_Soft_Reset
:
4267 next_state
= usbpd_policy_src_soft_reset(policy
);
4268 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4271 case PE_SNK_Startup
:
4272 next_state
= usbpd_policy_snk_startup(policy
);
4273 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4275 case PE_SNK_Discovery
:
4276 next_state
= usbpd_policy_snk_discovery(policy
);
4278 case PE_SNK_Wait_for_Capabilities
:
4279 next_state
= usbpd_policy_snk_wait_for_capabilities(policy
);
4281 case PE_SNK_Evaluate_Capability
:
4282 next_state
= usbpd_policy_snk_evaluate_capability(policy
);
4284 case PE_SNK_Select_Capability
:
4285 next_state
= usbpd_policy_snk_select_capability(policy
);
4287 case PE_SNK_Transition_Sink
:
4288 next_state
= usbpd_policy_snk_transition_sink(policy
);
4291 next_state
= usbpd_policy_snk_ready(policy
);
4292 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4294 case PE_SNK_Hard_Reset
:
4295 next_state
= usbpd_policy_snk_hard_reset(policy
);
4296 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4298 case PE_SNK_Transition_to_default
:
4299 next_state
= usbpd_policy_snk_transition_to_default(policy
);
4300 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4302 case PE_SNK_Give_Sink_Cap
:
4303 next_state
= usbpd_policy_snk_give_sink_cap(policy
);
4305 case PE_SNK_Get_Source_Cap
:
4306 next_state
= usbpd_policy_snk_get_source_cap(policy
);
4308 case PE_SNK_Send_Soft_Reset
:
4309 next_state
= usbpd_policy_snk_send_soft_reset(policy
);
4310 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4312 case PE_SNK_Soft_Reset
:
4313 next_state
= usbpd_policy_snk_soft_reset(policy
);
4314 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4316 case PE_DRS_Evaluate_Port
:
4317 next_state
= usbpd_policy_drs_evaluate_port(policy
);
4319 case PE_DRS_Evaluate_Send_Port
:
4320 next_state
= usbpd_policy_drs_evaluate_send_port(policy
);
4322 case PE_DRS_DFP_UFP_Evaluate_DR_Swap
:
4323 next_state
= usbpd_policy_drs_dfp_ufp_evaluate_dr_swap(policy
);
4325 case PE_DRS_DFP_UFP_Accept_DR_Swap
:
4326 next_state
= usbpd_policy_drs_dfp_ufp_accept_dr_swap(policy
);
4327 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4329 case PE_DRS_DFP_UFP_Change_to_UFP
:
4330 next_state
= usbpd_policy_drs_dfp_ufp_change_to_ufp(policy
);
4332 case PE_DRS_DFP_UFP_Send_DR_Swap
:
4333 next_state
= usbpd_policy_drs_dfp_ufp_send_dr_swap(policy
);
4334 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4336 case PE_DRS_DFP_UFP_Reject_DR_Swap
:
4337 next_state
= usbpd_policy_drs_dfp_ufp_reject_dr_swap(policy
);
4339 case PE_DRS_UFP_DFP_Evaluate_DR_Swap
:
4340 next_state
= usbpd_policy_drs_ufp_dfp_evaluate_dr_swap(policy
);
4342 case PE_DRS_UFP_DFP_Accept_DR_Swap
:
4343 next_state
= usbpd_policy_drs_ufp_dfp_accept_dr_swap(policy
);
4344 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4346 case PE_DRS_UFP_DFP_Change_to_DFP
:
4347 next_state
= usbpd_policy_drs_ufp_dfp_change_to_dfp(policy
);
4349 case PE_DRS_UFP_DFP_Send_DR_Swap
:
4350 next_state
= usbpd_policy_drs_ufp_dfp_send_dr_swap(policy
);
4351 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4353 case PE_DRS_UFP_DFP_Reject_DR_Swap
:
4354 next_state
= usbpd_policy_drs_ufp_dfp_reject_dr_swap(policy
);
4357 case PE_PRS_SRC_SNK_Reject_PR_Swap
:
4358 next_state
= usbpd_policy_prs_src_snk_reject_pr_swap(policy
);
4360 case PE_PRS_SRC_SNK_Evaluate_Swap
:
4361 next_state
= usbpd_policy_prs_src_snk_evaluate_swap(policy
);
4363 case PE_PRS_SRC_SNK_Send_Swap
:
4364 next_state
= usbpd_policy_prs_src_snk_send_swap(policy
);
4365 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4367 case PE_PRS_SRC_SNK_Accept_Swap
:
4368 next_state
= usbpd_policy_prs_src_snk_accept_swap(policy
);
4369 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4371 case PE_PRS_SRC_SNK_Transition_off
:
4372 next_state
= usbpd_policy_prs_src_snk_transition_to_off(policy
);
4374 case PE_PRS_SRC_SNK_Assert_Rd
:
4375 next_state
= usbpd_policy_prs_src_snk_assert_rd(policy
);
4377 case PE_PRS_SRC_SNK_Wait_Source_on
:
4378 next_state
= usbpd_policy_prs_src_snk_wait_source_on(policy
);
4380 case PE_PRS_SNK_SRC_Reject_Swap
:
4381 next_state
= usbpd_policy_prs_snk_src_reject_swap(policy
);
4383 case PE_PRS_SNK_SRC_Evaluate_Swap
:
4384 next_state
= usbpd_policy_prs_snk_src_evaluate_swap(policy
);
4386 case PE_PRS_SNK_SRC_Send_Swap
:
4387 next_state
= usbpd_policy_prs_snk_src_send_swap(policy
);
4388 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4390 case PE_PRS_SNK_SRC_Accept_Swap
:
4391 next_state
= usbpd_policy_prs_snk_src_accept_swap(policy
);
4392 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4394 case PE_PRS_SNK_SRC_Transition_off
:
4395 next_state
= usbpd_policy_prs_snk_src_transition_to_off(policy
);
4397 case PE_PRS_SNK_SRC_Assert_Rp
:
4398 next_state
= usbpd_policy_prs_snk_src_assert_rp(policy
);
4400 case PE_PRS_SNK_SRC_Source_on
:
4401 next_state
= usbpd_policy_prs_snk_src_source_on(policy
);
4403 case PE_VCS_Evaluate_Swap
:
4404 next_state
= usbpd_policy_vcs_evaluate_swap(policy
);
4406 case PE_VCS_Accept_Swap
:
4407 next_state
= usbpd_policy_vcs_accept_swap(policy
);
4409 case PE_VCS_Wait_for_VCONN
:
4410 next_state
= usbpd_policy_vcs_wait_for_vconn(policy
);
4412 case PE_VCS_Turn_Off_VCONN
:
4413 next_state
= usbpd_policy_vcs_turn_off_vconn(policy
);
4415 case PE_VCS_Turn_On_VCONN
:
4416 next_state
= usbpd_policy_vcs_turn_on_vconn(policy
);
4418 case PE_VCS_Send_PS_RDY
:
4419 next_state
= usbpd_policy_vcs_send_ps_rdy(policy
);
4421 case PE_VCS_Send_Swap
:
4422 next_state
= usbpd_policy_vcs_send_swap(policy
);
4424 case PE_VCS_Reject_VCONN_Swap
:
4425 next_state
= usbpd_policy_vcs_reject_vconn_swap(policy
);
4428 case PE_UFP_VDM_Get_Identity
:
4429 next_state
= usbpd_policy_ufp_vdm_get_identity(policy
);
4431 case PE_UFP_VDM_Send_Identity
:
4432 next_state
= usbpd_policy_ufp_vdm_send_identity(policy
);
4434 case PE_UFP_VDM_Get_Identity_NAK
:
4435 next_state
= usbpd_policy_ufp_vdm_get_identity_nak(policy
);
4437 case PE_UFP_VDM_Get_SVIDs
:
4438 next_state
= usbpd_policy_ufp_vdm_get_svids(policy
);
4440 case PE_UFP_VDM_Send_SVIDs
:
4441 next_state
= usbpd_policy_ufp_vdm_send_svids(policy
);
4443 case PE_UFP_VDM_Get_SVIDs_NAK
:
4444 next_state
= usbpd_policy_ufp_vdm_get_svids_nak(policy
);
4446 case PE_UFP_VDM_Get_Modes
:
4447 next_state
= usbpd_policy_ufp_vdm_get_modes(policy
);
4449 case PE_UFP_VDM_Send_Modes
:
4450 next_state
= usbpd_policy_ufp_vdm_send_modes(policy
);
4452 case PE_UFP_VDM_Get_Modes_NAK
:
4453 next_state
= usbpd_policy_ufp_vdm_get_modes_nak(policy
);
4455 case PE_UFP_VDM_Evaluate_Mode_Entry
:
4456 next_state
= usbpd_policy_ufp_vdm_evaluate_mode_entry(policy
);
4458 case PE_UFP_VDM_Mode_Entry_ACK
:
4459 next_state
= usbpd_policy_ufp_vdm_mode_entry_ack(policy
);
4461 case PE_UFP_VDM_Mode_Entry_NAK
:
4462 next_state
= usbpd_policy_ufp_vdm_mode_entry_nak(policy
);
4464 case PE_UFP_VDM_Mode_Exit
:
4465 next_state
= usbpd_policy_ufp_vdm_mode_exit(policy
);
4467 case PE_UFP_VDM_Mode_Exit_ACK
:
4468 next_state
= usbpd_policy_ufp_vdm_mode_exit_ack(policy
);
4470 case PE_UFP_VDM_Mode_Exit_NAK
:
4471 next_state
= usbpd_policy_ufp_vdm_mode_exit_nak(policy
);
4473 case PE_UFP_VDM_Attention_Request
:
4474 next_state
= usbpd_policy_ufp_vdm_attention_request(policy
);
4476 case PE_UFP_VDM_Evaluate_Status
:
4477 next_state
= usbpd_policy_ufp_vdm_evaluate_status(policy
);
4479 case PE_UFP_VDM_Status_ACK
:
4480 next_state
= usbpd_policy_ufp_vdm_status_ack(policy
);
4482 case PE_UFP_VDM_Status_NAK
:
4483 next_state
= usbpd_policy_ufp_vdm_status_nak(policy
);
4485 case PE_UFP_VDM_Evaluate_Configure
:
4486 next_state
= usbpd_policy_ufp_vdm_evaluate_configure(policy
);
4488 case PE_UFP_VDM_Configure_ACK
:
4489 next_state
= usbpd_policy_ufp_vdm_configure_ack(policy
);
4491 case PE_UFP_VDM_Configure_NAK
:
4492 next_state
= usbpd_policy_ufp_vdm_configure_nak(policy
);
4494 case PE_DFP_VDM_Identity_Request
:
4495 next_state
= usbpd_policy_dfp_vdm_identity_request(policy
);
4497 case PE_DFP_VDM_Identity_ACKed
:
4498 next_state
= usbpd_policy_dfp_vdm_identity_acked(policy
);
4500 case PE_DFP_VDM_Identity_NAKed
:
4501 next_state
= usbpd_policy_dfp_vdm_identity_naked(policy
);
4503 case PE_DFP_VDM_SVIDs_Request
:
4504 next_state
= usbpd_policy_dfp_vdm_svids_request(policy
);
4506 case PE_DFP_VDM_SVIDs_ACKed
:
4507 next_state
= usbpd_policy_dfp_vdm_svids_acked(policy
);
4509 case PE_DFP_VDM_SVIDs_NAKed
:
4510 next_state
= usbpd_policy_dfp_vdm_svids_naked(policy
);
4512 case PE_DFP_VDM_Modes_Request
:
4513 next_state
= usbpd_policy_dfp_vdm_modes_request(policy
);
4515 case PE_DFP_VDM_Modes_ACKed
:
4516 next_state
= usbpd_policy_dfp_vdm_modes_acked(policy
);
4518 case PE_DFP_VDM_Modes_NAKed
:
4519 next_state
= usbpd_policy_dfp_vdm_modes_naked(policy
);
4521 case PE_DFP_VDM_Mode_Entry_Request
:
4522 next_state
= usbpd_policy_dfp_vdm_entry_request(policy
);
4524 case PE_DFP_VDM_Mode_Entry_ACKed
:
4525 next_state
= usbpd_policy_dfp_vdm_entry_acked(policy
);
4527 case PE_DFP_VDM_Mode_Entry_NAKed
:
4528 next_state
= usbpd_policy_dfp_vdm_entry_naked(policy
);
4530 case PE_DFP_VDM_Mode_Exit_Request
:
4531 next_state
= usbpd_policy_dfp_vdm_exit_request(policy
);
4533 case PE_DFP_VDM_Mode_Exit_ACKed
:
4534 next_state
= usbpd_policy_dfp_vdm_exit_acked(policy
);
4536 case PE_DFP_VDM_Mode_Exit_NAKed
:
4537 next_state
= usbpd_policy_dfp_vdm_exit_naked(policy
);
4539 case PE_DFP_VDM_Attention_Request
:
4540 next_state
= usbpd_policy_dfp_vdm_attention_request(policy
);
4542 case PE_DFP_VDM_Status_Update
:
4543 next_state
= usbpd_policy_dfp_vdm_status_update(policy
);
4545 case PE_DFP_VDM_Status_Update_ACKed
:
4546 next_state
= usbpd_policy_dfp_vdm_status_update_acked(policy
);
4548 case PE_DFP_VDM_Status_Update_NAKed
:
4549 next_state
= usbpd_policy_dfp_vdm_status_update_naked(policy
);
4551 case PE_DFP_VDM_DisplayPort_Configure
:
4552 next_state
= usbpd_policy_dfp_vdm_displayport_configure(policy
);
4554 case PE_DFP_VDM_DisplayPort_Configure_ACKed
:
4555 next_state
= usbpd_policy_dfp_vdm_displayport_configure_acked(policy
);
4557 case PE_DFP_VDM_DisplayPort_Configure_NAKed
:
4558 next_state
= usbpd_policy_dfp_vdm_displayport_configure_naked(policy
);
4560 case PE_DFP_UVDM_Send_Message
:
4561 next_state
= usbpd_policy_dfp_uvdm_send_message(policy
);
4563 case PE_DFP_UVDM_Receive_Message
:
4564 next_state
= usbpd_policy_dfp_uvdm_receive_message(policy
);
4566 case PE_DR_SRC_Get_Source_Cap
:
4567 next_state
= usbpd_policy_dr_src_get_source_cap(policy
);
4569 case PE_DR_SRC_Give_Sink_Cap
:
4570 next_state
= usbpd_policy_dr_src_give_sink_cap(policy
);
4572 case PE_DR_SNK_Get_Sink_Cap
:
4573 next_state
= usbpd_policy_dr_snk_get_sink_cap(policy
);
4575 case PE_DR_SNK_Give_Source_Cap
:
4576 next_state
= usbpd_policy_dr_snk_give_source_cap(policy
);
4579 case PE_BIST_Receive_Mode
:
4580 next_state
= usbpd_policy_bist_receive_mode(policy
);
4582 case PE_BIST_Frame_Received
:
4583 next_state
= usbpd_policy_bist_frame_received(policy
);
4586 case Error_Recovery
:
4587 next_state
= usbpd_error_recovery(policy
);
4588 store_usblog_notify(NOTIFY_FUNCSTATE
, (void *)&next_state
, NULL
);
4592 pd_data
->phy_ops
.get_power_role(pd_data
, &power_role
);
4593 pr_info("%s, %d\n", __func__
, power_role
);
4595 if (power_role
== USBPD_SINK
) {
4596 pr_info("%s, SINK\n", __func__
);
4597 if (policy
->rx_hardreset
) {
4598 policy
->rx_hardreset
= 0;
4599 next_state
= PE_SNK_Transition_to_default
;
4600 } else if (policy
->rx_softreset
) {
4601 policy
->rx_softreset
= 0;
4602 next_state
= PE_SNK_Soft_Reset
;
4603 } else if (policy
->plug
) {
4605 next_state
= PE_SNK_Startup
;
4607 next_state
= PE_SNK_Startup
;
4610 pr_info("%s, SOURCE\n", __func__
);
4611 if (policy
->rx_hardreset
) {
4612 policy
->rx_hardreset
= 0;
4613 next_state
= PE_SRC_Hard_Reset_Received
;
4614 } else if (policy
->rx_softreset
) {
4615 policy
->rx_softreset
= 0;
4616 next_state
= PE_SRC_Soft_Reset
;
4617 } else if (policy
->plug
) {
4619 next_state
= PE_SRC_Startup
;
4621 next_state
= PE_SRC_Startup
;
4627 dev_info(pd_data
->dev
, "%s saved state %x next_state %x \n", __func__
, saved_state
, next_state
);
4628 } while (saved_state
!= next_state
);
4630 policy
->state
= next_state
;
4631 dev_info(pd_data
->dev
, "%s Finished\n", __func__
);
4634 void usbpd_init_policy(struct usbpd_data
*pd_data
)
4637 struct policy_data
*policy
= &pd_data
->policy
;
4640 policy
->rx_hardreset
= 0;
4641 policy
->rx_softreset
= 0;
4643 policy
->rx_msg_header
.word
= 0;
4644 policy
->tx_msg_header
.word
= 0;
4645 policy
->modal_operation
= 0;
4646 policy
->sink_cap_received
= 0;
4647 policy
->send_sink_cap
= 0;
4648 policy
->txhardresetflag
= 0;
4649 policy
->pd_support
= 0;
4650 for (i
= 0; i
< USBPD_MAX_COUNT_MSG_OBJECT
; i
++) {
4651 policy
->rx_data_obj
[i
].object
= 0;
4652 policy
->tx_data_obj
[i
].object
= 0;
4656 void usbpd_kick_policy_work(struct device
*dev
)
4658 struct usbpd_data
*pd_data
= dev_get_drvdata(dev
);
4660 if (pd_data
->policy_wqueue
)
4661 queue_work(pd_data
->policy_wqueue
, &pd_data
->worker
);
4663 schedule_work(&pd_data
->worker
);
4666 void usbpd_cancel_policy_work(struct device
*dev
)
4668 struct usbpd_data
*pd_data
= dev_get_drvdata(dev
);
4670 if (pd_data
->policy_wqueue
)
4671 flush_workqueue(pd_data
->policy_wqueue
);