1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright 2015-2017 Google, Inc
4 *
5 * USB Power Delivery protocol stack.
6 */
7
8 #include <linux/completion.h>
9 #include <linux/debugfs.h>
10 #include <linux/device.h>
11 #include <linux/hrtimer.h>
12 #include <linux/jiffies.h>
13 #include <linux/kernel.h>
14 #include <linux/kthread.h>
15 #include <linux/math64.h>
16 #include <linux/minmax.h>
17 #include <linux/module.h>
18 #include <linux/mutex.h>
19 #include <linux/power_supply.h>
20 #include <linux/proc_fs.h>
21 #include <linux/property.h>
22 #include <linux/sched/clock.h>
23 #include <linux/seq_file.h>
24 #include <linux/slab.h>
25 #include <linux/spinlock.h>
26 #include <linux/string_choices.h>
27 #include <linux/usb.h>
28 #include <linux/usb/pd.h>
29 #include <linux/usb/pd_ado.h>
30 #include <linux/usb/pd_bdo.h>
31 #include <linux/usb/pd_ext_sdb.h>
32 #include <linux/usb/pd_vdo.h>
33 #include <linux/usb/role.h>
34 #include <linux/usb/tcpm.h>
35 #include <linux/usb/typec_altmode.h>
36
37 #include <uapi/linux/sched/types.h>
38
39 #define FOREACH_STATE(S) \
40 S(INVALID_STATE), \
41 S(TOGGLING), \
42 S(CHECK_CONTAMINANT), \
43 S(SRC_UNATTACHED), \
44 S(SRC_ATTACH_WAIT), \
45 S(SRC_ATTACHED), \
46 S(SRC_STARTUP), \
47 S(SRC_SEND_CAPABILITIES), \
48 S(SRC_SEND_CAPABILITIES_TIMEOUT), \
49 S(SRC_NEGOTIATE_CAPABILITIES), \
50 S(SRC_TRANSITION_SUPPLY), \
51 S(SRC_READY), \
52 S(SRC_WAIT_NEW_CAPABILITIES), \
53 \
54 S(SNK_UNATTACHED), \
55 S(SNK_ATTACH_WAIT), \
56 S(SNK_DEBOUNCED), \
57 S(SNK_ATTACHED), \
58 S(SNK_STARTUP), \
59 S(SNK_DISCOVERY), \
60 S(SNK_DISCOVERY_DEBOUNCE), \
61 S(SNK_DISCOVERY_DEBOUNCE_DONE), \
62 S(SNK_WAIT_CAPABILITIES), \
63 S(SNK_WAIT_CAPABILITIES_TIMEOUT), \
64 S(SNK_NEGOTIATE_CAPABILITIES), \
65 S(SNK_NEGOTIATE_PPS_CAPABILITIES), \
66 S(SNK_NEGOTIATE_SPR_AVS_CAPABILITIES), \
67 S(SNK_TRANSITION_SINK), \
68 S(SNK_TRANSITION_SINK_VBUS), \
69 S(SNK_READY), \
70 \
71 S(ACC_UNATTACHED), \
72 S(DEBUG_ACC_ATTACHED), \
73 S(DEBUG_ACC_DEBOUNCE), \
74 S(AUDIO_ACC_ATTACHED), \
75 S(AUDIO_ACC_DEBOUNCE), \
76 \
77 S(HARD_RESET_SEND), \
78 S(HARD_RESET_START), \
79 S(SRC_HARD_RESET_VBUS_OFF), \
80 S(SRC_HARD_RESET_VBUS_ON), \
81 S(SNK_HARD_RESET_SINK_OFF), \
82 S(SNK_HARD_RESET_WAIT_VBUS), \
83 S(SNK_HARD_RESET_SINK_ON), \
84 \
85 S(SOFT_RESET), \
86 S(SRC_SOFT_RESET_WAIT_SNK_TX), \
87 S(SNK_SOFT_RESET), \
88 S(SOFT_RESET_SEND), \
89 \
90 S(DR_SWAP_ACCEPT), \
91 S(DR_SWAP_SEND), \
92 S(DR_SWAP_SEND_TIMEOUT), \
93 S(DR_SWAP_CANCEL), \
94 S(DR_SWAP_CHANGE_DR), \
95 \
96 S(PR_SWAP_ACCEPT), \
97 S(PR_SWAP_SEND), \
98 S(PR_SWAP_SEND_TIMEOUT), \
99 S(PR_SWAP_CANCEL), \
100 S(PR_SWAP_START), \
101 S(PR_SWAP_SRC_SNK_TRANSITION_OFF), \
102 S(PR_SWAP_SRC_SNK_SOURCE_OFF), \
103 S(PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED), \
104 S(PR_SWAP_SRC_SNK_SINK_ON), \
105 S(PR_SWAP_SNK_SRC_SINK_OFF), \
106 S(PR_SWAP_SNK_SRC_SOURCE_ON), \
107 S(PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP), \
108 \
109 S(VCONN_SWAP_ACCEPT), \
110 S(VCONN_SWAP_SEND), \
111 S(VCONN_SWAP_SEND_TIMEOUT), \
112 S(VCONN_SWAP_CANCEL), \
113 S(VCONN_SWAP_START), \
114 S(VCONN_SWAP_WAIT_FOR_VCONN), \
115 S(VCONN_SWAP_TURN_ON_VCONN), \
116 S(VCONN_SWAP_TURN_OFF_VCONN), \
117 S(VCONN_SWAP_SEND_SOFT_RESET), \
118 \
119 S(FR_SWAP_SEND), \
120 S(FR_SWAP_SEND_TIMEOUT), \
121 S(FR_SWAP_SNK_SRC_TRANSITION_TO_OFF), \
122 S(FR_SWAP_SNK_SRC_NEW_SINK_READY), \
123 S(FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED), \
124 S(FR_SWAP_CANCEL), \
125 \
126 S(SNK_TRY), \
127 S(SNK_TRY_WAIT), \
128 S(SNK_TRY_WAIT_DEBOUNCE), \
129 S(SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS), \
130 S(SRC_TRYWAIT), \
131 S(SRC_TRYWAIT_DEBOUNCE), \
132 S(SRC_TRYWAIT_UNATTACHED), \
133 \
134 S(SRC_TRY), \
135 S(SRC_TRY_WAIT), \
136 S(SRC_TRY_DEBOUNCE), \
137 S(SNK_TRYWAIT), \
138 S(SNK_TRYWAIT_DEBOUNCE), \
139 S(SNK_TRYWAIT_VBUS), \
140 S(BIST_RX), \
141 \
142 S(GET_STATUS_SEND), \
143 S(GET_STATUS_SEND_TIMEOUT), \
144 S(GET_PPS_STATUS_SEND), \
145 S(GET_PPS_STATUS_SEND_TIMEOUT), \
146 \
147 S(GET_SINK_CAP), \
148 S(GET_SINK_CAP_TIMEOUT), \
149 \
150 S(ERROR_RECOVERY), \
151 S(PORT_RESET), \
152 S(PORT_RESET_WAIT_OFF), \
153 \
154 S(AMS_START), \
155 S(CHUNK_NOT_SUPP), \
156 \
157 S(SRC_VDM_IDENTITY_REQUEST)
158
159 #define FOREACH_AMS(S) \
160 S(NONE_AMS), \
161 S(POWER_NEGOTIATION), \
162 S(GOTOMIN), \
163 S(SOFT_RESET_AMS), \
164 S(HARD_RESET), \
165 S(CABLE_RESET), \
166 S(GET_SOURCE_CAPABILITIES), \
167 S(GET_SINK_CAPABILITIES), \
168 S(POWER_ROLE_SWAP), \
169 S(FAST_ROLE_SWAP), \
170 S(DATA_ROLE_SWAP), \
171 S(VCONN_SWAP), \
172 S(SOURCE_ALERT), \
173 S(GETTING_SOURCE_EXTENDED_CAPABILITIES),\
174 S(GETTING_SOURCE_SINK_STATUS), \
175 S(GETTING_BATTERY_CAPABILITIES), \
176 S(GETTING_BATTERY_STATUS), \
177 S(GETTING_MANUFACTURER_INFORMATION), \
178 S(SECURITY), \
179 S(FIRMWARE_UPDATE), \
180 S(DISCOVER_IDENTITY), \
181 S(SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY), \
182 S(DISCOVER_SVIDS), \
183 S(DISCOVER_MODES), \
184 S(DFP_TO_UFP_ENTER_MODE), \
185 S(DFP_TO_UFP_EXIT_MODE), \
186 S(DFP_TO_CABLE_PLUG_ENTER_MODE), \
187 S(DFP_TO_CABLE_PLUG_EXIT_MODE), \
188 S(ATTENTION), \
189 S(BIST), \
190 S(UNSTRUCTURED_VDMS), \
191 S(STRUCTURED_VDMS), \
192 S(COUNTRY_INFO), \
193 S(COUNTRY_CODES), \
194 S(REVISION_INFORMATION), \
195 S(GETTING_SINK_EXTENDED_CAPABILITIES)
196
197 #define GENERATE_ENUM(e) e
198 #define GENERATE_STRING(s) #s
199
200 enum tcpm_state {
201 FOREACH_STATE(GENERATE_ENUM)
202 };
203
204 static const char * const tcpm_states[] = {
205 FOREACH_STATE(GENERATE_STRING)
206 };
207
208 enum tcpm_ams {
209 FOREACH_AMS(GENERATE_ENUM)
210 };
211
212 static const char * const tcpm_ams_str[] = {
213 FOREACH_AMS(GENERATE_STRING)
214 };
215
216 #define FOREACH_VDM_DISCOVERY(S) \
217 S(VDM_DISCOVERY_UNKNOWN), \
218 S(VDM_DISCOVERY_PARTNER_IDENT), \
219 S(VDM_DISCOVERY_CABLE_IDENT), \
220 S(VDM_DISCOVERY_PARTNER_SVIDS), \
221 S(VDM_DISCOVERY_PARTNER_MODES), \
222 S(VDM_DISCOVERY_CABLE_SVIDS), \
223 S(VDM_DISCOVERY_CABLE_MODES), \
224 S(VDM_DISCOVERY_COMPLETE)
225
226 enum vdm_discovery_states {
227 FOREACH_VDM_DISCOVERY(GENERATE_ENUM)
228 };
229
230 static const char * const vdm_discovery_state_strings[] = {
231 FOREACH_VDM_DISCOVERY(GENERATE_STRING)
232 };
233
234 enum vdm_states {
235 VDM_STATE_ERR_BUSY = -3,
236 VDM_STATE_ERR_SEND = -2,
237 VDM_STATE_ERR_TMOUT = -1,
238 VDM_STATE_DONE = 0,
239 /* Anything >0 represents an active state */
240 VDM_STATE_READY = 1,
241 VDM_STATE_BUSY = 2,
242 VDM_STATE_WAIT_RSP_BUSY = 3,
243 VDM_STATE_SEND_MESSAGE = 4,
244 };
245
246 enum pd_msg_request {
247 PD_MSG_NONE = 0,
248 PD_MSG_CTRL_REJECT,
249 PD_MSG_CTRL_WAIT,
250 PD_MSG_CTRL_NOT_SUPP,
251 PD_MSG_DATA_SINK_CAP,
252 PD_MSG_DATA_SOURCE_CAP,
253 PD_MSG_DATA_REV,
254 PD_MSG_EXT_SINK_CAP_EXT,
255 PD_MSG_DATA_BATT_STATUS,
256 PD_MSG_EXT_BATT_CAP,
257 };
258
259 enum adev_actions {
260 ADEV_NONE = 0,
261 ADEV_NOTIFY_USB_AND_QUEUE_VDM,
262 ADEV_QUEUE_VDM,
263 ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL,
264 ADEV_ATTENTION,
265 };
266
267 /*
268 * Initial current capability of the new source when vSafe5V is applied during PD3.0 Fast Role Swap.
269 * Based on "Table 6-14 Fixed Supply PDO - Sink" of "USB Power Delivery Specification Revision 3.0,
270 * Version 1.2"
271 */
272 enum frs_typec_current {
273 FRS_NOT_SUPPORTED,
274 FRS_DEFAULT_POWER,
275 FRS_5V_1P5A,
276 FRS_5V_3A,
277 };
278
279 /* Events from low level driver */
280
281 #define TCPM_CC_EVENT BIT(0)
282 #define TCPM_VBUS_EVENT BIT(1)
283 #define TCPM_RESET_EVENT BIT(2)
284 #define TCPM_FRS_EVENT BIT(3)
285 #define TCPM_SOURCING_VBUS BIT(4)
286 #define TCPM_PORT_CLEAN BIT(5)
287 #define TCPM_PORT_ERROR BIT(6)
288
289 #define LOG_BUFFER_ENTRIES 1024
290 #define LOG_BUFFER_ENTRY_SIZE 128
291
292 /* Alternate mode support */
293
294 #define SVID_DISCOVERY_MAX 16
295 #define ALTMODE_DISCOVERY_MAX (SVID_DISCOVERY_MAX * MODE_DISCOVERY_MAX)
296
297 #define GET_SINK_CAP_RETRY_MS 100
298 #define SEND_DISCOVERY_VDM_RETRY_MS 100
299
300 struct pd_mode_data {
301 int svid_index; /* current SVID index */
302 int nsvids;
303 u16 svids[SVID_DISCOVERY_MAX];
304 int altmodes; /* number of alternate modes */
305 struct typec_altmode_desc altmode_desc[ALTMODE_DISCOVERY_MAX];
306 };
307
308 /*
309 * @min_volt: Actual min voltage at the local port
310 * @req_min_volt: Requested min voltage to the port partner
311 * @max_volt: Actual max voltage at the local port
312 * @req_max_volt: Requested max voltage to the port partner
313 * @max_curr: Actual max current at the local port
314 * @req_max_curr: Requested max current of the port partner
315 * @req_out_volt: Requested output voltage to the port partner
316 * @req_op_curr: Requested operating current to the port partner
317 * @supported: Parter has at least one APDO hence supports PPS
318 * @active: PPS mode is active
319 */
320 struct pd_pps_data {
321 u32 min_volt;
322 u32 req_min_volt;
323 u32 max_volt;
324 u32 req_max_volt;
325 u32 max_curr;
326 u32 req_max_curr;
327 u32 req_out_volt;
328 u32 req_op_curr;
329 bool supported;
330 bool active;
331 };
332
333 enum spr_avs_status {
334 SPR_AVS_UNKNOWN,
335 SPR_AVS_NOT_SUPPORTED,
336 SPR_AVS_SUPPORTED
337 };
338
339 static const char * const spr_avs_status_strings[] = {
340 [SPR_AVS_UNKNOWN] = "Unknown",
341 [SPR_AVS_SUPPORTED] = "Supported",
342 [SPR_AVS_NOT_SUPPORTED] = "Not Supported",
343 };
344
345 /*
346 * Standard Power Range Adjustable Voltage Supply (SPR - AVS) data
347 * @max_current_ma_9v_to_15v: Max current for 9V to 15V range derived from
348 * source cap & sink cap
349 * @max_current_ma_15v_to_20v: Max current for 15V to 20V range derived from
350 * source cap & sink cap
351 * @req_op_curr_ma: Requested operating current to the port partner acting as source
352 * @req_out_volt_mv: Requested output voltage to the port partner acting as source
353 * @max_out_volt_mv: Max SPR voltage supported by the port and the port partner
354 * @max_current_ma; MAX SPR current supported by the port and the port partner
355 * @port_partner_src_status: SPR AVS status of port partner acting as source
356 * @port_partner_src_pdo_index: PDO index of SPR AVS cap of the port partner
357 * acting as source. Valid only when
358 * port_partner_src_status is SPR_AVS_SUPPORTED.
359 * @port_snk_status: SPR AVS status of the local port acting as sink.
360 * @port_snk_pdo_index: PDO index of SPR AVS cap of local port acting as sink
361 * @active: True when the local port acting as the sink has negotiated SPR AVS
362 * with the partner acting as source.
363 */
364 struct pd_spr_avs_data {
365 u32 max_current_ma_9v_to_15v;
366 u32 max_current_ma_15v_to_20v;
367 u32 req_op_curr_ma;
368 u32 req_out_volt_mv;
369 u32 max_out_volt_mv;
370 u32 max_current_ma;
371 enum spr_avs_status port_partner_src_status;
372 unsigned int port_partner_src_pdo_index;
373 enum spr_avs_status port_snk_status;
374 unsigned int port_snk_pdo_index;
375 bool active;
376 };
377
378 struct pd_data {
379 struct usb_power_delivery *pd;
380 struct usb_power_delivery_capabilities *source_cap;
381 struct usb_power_delivery_capabilities_desc source_desc;
382 struct usb_power_delivery_capabilities *sink_cap;
383 struct usb_power_delivery_capabilities_desc sink_desc;
384 unsigned int operating_snk_mw;
385 };
386
387 #define PD_CAP_REV10 0x1
388 #define PD_CAP_REV20 0x2
389 #define PD_CAP_REV30 0x3
390
391 struct pd_revision_info {
392 u8 rev_major;
393 u8 rev_minor;
394 u8 ver_major;
395 u8 ver_minor;
396 };
397
398 /*
399 * @sink_wait_cap_time: Deadline (in ms) for tTypeCSinkWaitCap timer
400 * @ps_src_wait_off_time: Deadline (in ms) for tPSSourceOff timer
401 * @cc_debounce_time: Deadline (in ms) for tCCDebounce timer
402 */
403 struct pd_timings {
404 u32 sink_wait_cap_time;
405 u32 ps_src_off_time;
406 u32 cc_debounce_time;
407 u32 snk_bc12_cmpletion_time;
408 };
409
410 /* Convert microwatt to watt */
411 #define UW_TO_W(pow) (div_u64((pow), 1000000))
412
413 /*
414 * As per USB PD Spec Rev 3.18 (Sec. 6.5.13.11), the number of fixed batteries
415 * that a port can be queried is restricted to 4.
416 */
417 #define MAX_NUM_FIXED_BATT 4
418
419 #define BATTERY_PROPERTY_UNKNOWN 0xffff
420
421 /*
422 * struct pd_identifier - Contains info about PD identifiers
423 * @vid: Vendor ID (assigned by USB-IF)
424 * @pid: Product ID (assigned by manufacturer)
425 * @xid: Value assigned by USB-IF for product
426 */
427 struct pd_identifier {
428 u16 vid;
429 u16 pid;
430 u32 xid;
431 };
432
433 /*
434 * struct sink_caps_ext_data - Sink extended capability data
435 * @load_step: Indicates the load step slew rate. Value of 0 indicates 150mA/us
436 * & 1 indicates 500 mA/us
437 * @load_char: Snk overload characteristics
438 * @compliance: Types of sources the sink has been tested & certified on
439 * @modes: Charging caps & power sources supported
440 * @spr_min_pdp: Sink Minimum PDP for SPR mode (in Watts)
441 * @spr_op_pdp: Sink Operational PDP for SPR mode (in Watts)
442 * @spr_max_pdp: Sink Maximum PDP for SPR mode (in Watts)
443 */
444 struct sink_caps_ext_data {
445 u8 load_step;
446 u16 load_char;
447 u8 compliance;
448 u8 modes;
449 u8 spr_min_pdp;
450 u8 spr_op_pdp;
451 u8 spr_max_pdp;
452 };
453
454 enum aug_req_type {
455 PD_PPS,
456 PD_SPR_AVS,
457 };
458
459 struct tcpm_port {
460 struct device *dev;
461
462 struct mutex lock; /* tcpm state machine lock */
463 struct kthread_worker *wq;
464
465 struct typec_capability typec_caps;
466 struct typec_port *typec_port;
467
468 struct tcpc_dev *tcpc;
469 struct usb_role_switch *role_sw;
470
471 enum typec_role vconn_role;
472 enum typec_role pwr_role;
473 enum typec_data_role data_role;
474 enum typec_pwr_opmode pwr_opmode;
475
476 struct usb_pd_identity partner_ident;
477 struct typec_partner_desc partner_desc;
478 struct typec_partner *partner;
479
480 struct usb_pd_identity cable_ident;
481 struct typec_cable_desc cable_desc;
482 struct typec_cable *cable;
483 struct typec_plug_desc plug_prime_desc;
484 struct typec_plug *plug_prime;
485
486 enum typec_cc_status cc_req;
487 enum typec_cc_status src_rp; /* work only if pd_supported == false */
488
489 enum typec_cc_status cc1;
490 enum typec_cc_status cc2;
491 enum typec_cc_polarity polarity;
492
493 bool attached;
494 bool connected;
495 bool registered;
496 bool pd_supported;
497 enum typec_port_type port_type;
498
499 /*
500 * Set to true when vbus is greater than VSAFE5V min.
501 * Set to false when vbus falls below vSinkDisconnect max threshold.
502 */
503 bool vbus_present;
504
505 /*
506 * Set to true when vbus is less than VSAFE0V max.
507 * Set to false when vbus is greater than VSAFE0V max.
508 */
509 bool vbus_vsafe0v;
510
511 bool vbus_never_low;
512 bool vbus_source;
513 bool vbus_charge;
514
515 bool op_vsafe5v;
516
517 int try_role;
518 int try_snk_count;
519 int try_src_count;
520
521 enum pd_msg_request queued_message;
522
523 enum tcpm_state enter_state;
524 enum tcpm_state prev_state;
525 enum tcpm_state state;
526 enum tcpm_state delayed_state;
527 ktime_t delayed_runtime;
528 unsigned long delay_ms;
529
530 spinlock_t pd_event_lock;
531 u32 pd_events;
532
533 struct kthread_work event_work;
534 struct hrtimer state_machine_timer;
535 struct kthread_work state_machine;
536 struct hrtimer vdm_state_machine_timer;
537 struct kthread_work vdm_state_machine;
538 struct hrtimer enable_frs_timer;
539 struct kthread_work enable_frs;
540 struct hrtimer vdm_discovery_timer;
541 struct kthread_work vdm_discovery_work;
542 bool state_machine_running;
543 /* Set to true when VDM State Machine has following actions. */
544 bool vdm_sm_running;
545
546 struct completion tx_complete;
547 enum tcpm_transmit_status tx_status;
548
549 struct mutex swap_lock; /* swap command lock */
550 bool swap_pending;
551 bool non_pd_role_swap;
552 struct completion swap_complete;
553 int swap_status;
554
555 unsigned int negotiated_rev;
556 unsigned int message_id;
557 unsigned int caps_count;
558 unsigned int hard_reset_count;
559 bool pd_capable;
560 bool explicit_contract;
561 unsigned int rx_msgid;
562
563 /* USB PD objects */
564 struct usb_power_delivery **pds;
565 struct pd_data **pd_list;
566 struct usb_power_delivery_capabilities *port_source_caps;
567 struct usb_power_delivery_capabilities *port_sink_caps;
568 struct usb_power_delivery *partner_pd;
569 struct usb_power_delivery_capabilities *partner_source_caps;
570 struct usb_power_delivery_capabilities *partner_sink_caps;
571 struct usb_power_delivery *selected_pd;
572
573 /* Partner capabilities/requests */
574 u32 sink_request;
575 u32 source_caps[PDO_MAX_OBJECTS];
576 unsigned int nr_source_caps;
577 u32 sink_caps[PDO_MAX_OBJECTS];
578 unsigned int nr_sink_caps;
579
580 /* Local capabilities */
581 unsigned int pd_count;
582 u32 src_pdo[PDO_MAX_OBJECTS];
583 unsigned int nr_src_pdo;
584 u32 snk_pdo[PDO_MAX_OBJECTS];
585 unsigned int nr_snk_pdo;
586 u32 snk_vdo_v1[VDO_MAX_OBJECTS];
587 unsigned int nr_snk_vdo_v1;
588 u32 snk_vdo[VDO_MAX_OBJECTS];
589 unsigned int nr_snk_vdo;
590
591 unsigned int operating_snk_mw;
592 bool update_sink_caps;
593
594 /* Requested current / voltage to the port partner */
595 u32 req_current_limit;
596 u32 req_supply_voltage;
597 /* Actual current / voltage limit of the local port */
598 u32 current_limit;
599 u32 supply_voltage;
600
601 /* Used to export TA voltage and current */
602 struct power_supply *psy;
603 struct power_supply_desc psy_desc;
604 enum power_supply_usb_type usb_type;
605
606 u32 bist_request;
607
608 /* VDM Discovery State to determine message sent */
609 enum vdm_discovery_states vdm_discovery_state;
610
611 /* PD state for Vendor Defined Messages */
612 enum vdm_states vdm_state;
613 u32 vdm_retries;
614 /* next Vendor Defined Message to send */
615 u32 vdo_data[VDO_MAX_SIZE];
616 u8 vdo_count;
617 /* VDO to retry if UFP responder replied busy */
618 u32 vdo_retry;
619
620 /* PPS */
621 struct pd_pps_data pps_data;
622
623 /* SPR AVS */
624 struct pd_spr_avs_data spr_avs_data;
625
626 /* Augmented supply request - PPS; SPR_AVS */
627 struct completion aug_supply_req_complete;
628 bool aug_supply_req_pending;
629 int aug_supply_req_status;
630
631 /* Alternate mode data */
632 struct pd_mode_data mode_data;
633 struct pd_mode_data mode_data_prime;
634 struct typec_altmode *partner_altmode[ALTMODE_DISCOVERY_MAX];
635 struct typec_altmode *plug_prime_altmode[ALTMODE_DISCOVERY_MAX];
636 struct typec_altmode *port_altmode[ALTMODE_DISCOVERY_MAX];
637
638 /* Deadline in jiffies to exit src_try_wait state */
639 unsigned long max_wait;
640
641 /* port belongs to a self powered device */
642 bool self_powered;
643
644 /* Sink FRS */
645 enum frs_typec_current new_source_frs_current;
646
647 /* Sink caps have been queried */
648 bool sink_cap_done;
649
650 /* Collision Avoidance and Atomic Message Sequence */
651 enum tcpm_state upcoming_state;
652 enum tcpm_ams ams;
653 enum tcpm_ams next_ams;
654 bool in_ams;
655
656 /* Auto vbus discharge status */
657 bool auto_vbus_discharge_enabled;
658
659 /*
660 * When set, port requests PD_P_SNK_STDBY_MW upon entering SNK_DISCOVERY and
661 * the actual current limit after RX of PD_CTRL_PSRDY for PD link,
662 * SNK_READY for non-pd link.
663 */
664 bool slow_charger_loop;
665
666 /*
667 * When true indicates that the lower level drivers indicate potential presence
668 * of contaminant in the connector pins based on the tcpm state machine
669 * transitions.
670 */
671 bool potential_contaminant;
672
673 /* SOP* Related Fields */
674 /*
675 * tx_sop_type determines which SOP* a message is being sent on.
676 * For messages that are queued and not sent immediately such as in
677 * tcpm_queue_message or messages that send after state changes,
678 * the tx_sop_type is set accordingly.
679 */
680 enum tcpm_transmit_type tx_sop_type;
681 /*
682 * Prior to discovering the port partner's Specification Revision, the
683 * Vconn source and cable plug will use the lower of their two revisions.
684 *
685 * When the port partner's Specification Revision is discovered, the following
686 * rules are put in place.
687 * 1. If the cable revision (1) is lower than the revision negotiated
688 * between the port and partner (2), the port and partner will communicate
689 * on revision (2), but the port and cable will communicate on revision (1).
690 * 2. If the cable revision (1) is higher than the revision negotiated
691 * between the port and partner (2), the port and partner will communicate
692 * on revision (2), and the port and cable will communicate on revision (2)
693 * as well.
694 */
695 unsigned int negotiated_rev_prime;
696 /*
697 * Each SOP* type must maintain their own tx and rx message IDs
698 */
699 unsigned int message_id_prime;
700 unsigned int rx_msgid_prime;
701
702 /* Timer deadline values configured at runtime */
703 struct pd_timings timings;
704
705 /* Indicates maximum (revision, version) supported */
706 struct pd_revision_info pd_rev;
707
708 struct pd_identifier pd_ident;
709 struct sink_caps_ext_data sink_caps_ext;
710 struct power_supply **fixed_batt;
711 u32 fixed_batt_cnt;
712 u32 batt_request_id;
713 #ifdef CONFIG_DEBUG_FS
714 struct dentry *dentry;
715 struct mutex logbuffer_lock; /* log buffer access lock */
716 int logbuffer_head;
717 int logbuffer_tail;
718 u8 *logbuffer[LOG_BUFFER_ENTRIES];
719 #endif
720 };
721
722 struct pd_rx_event {
723 struct kthread_work work;
724 struct tcpm_port *port;
725 struct pd_message msg;
726 enum tcpm_transmit_type rx_sop_type;
727 };
728
729 struct altmode_vdm_event {
730 struct kthread_work work;
731 struct tcpm_port *port;
732 u32 header;
733 int cnt;
734 enum tcpm_transmit_type tx_sop_type;
735 u32 data[] __counted_by(cnt);
736 };
737
738 static const char * const pd_rev[] = {
739 [PD_REV10] = "rev1",
740 [PD_REV20] = "rev2",
741 [PD_REV30] = "rev3",
742 };
743
744 #define tcpm_cc_is_sink(cc) \
745 ((cc) == TYPEC_CC_RP_DEF || (cc) == TYPEC_CC_RP_1_5 || \
746 (cc) == TYPEC_CC_RP_3_0)
747
748 /* As long as cc is pulled up, we can consider it as sink. */
749 #define tcpm_port_is_sink(port) \
750 (tcpm_cc_is_sink((port)->cc1) || tcpm_cc_is_sink((port)->cc2))
751
752 #define tcpm_cc_is_source(cc) ((cc) == TYPEC_CC_RD)
753 #define tcpm_cc_is_audio(cc) ((cc) == TYPEC_CC_RA)
754 #define tcpm_cc_is_open(cc) ((cc) == TYPEC_CC_OPEN)
755
756 #define tcpm_port_is_source(port) \
757 ((tcpm_cc_is_source((port)->cc1) && \
758 !tcpm_cc_is_source((port)->cc2)) || \
759 (tcpm_cc_is_source((port)->cc2) && \
760 !tcpm_cc_is_source((port)->cc1)))
761
762 #define tcpm_port_is_debug_source(port) \
763 (tcpm_cc_is_source((port)->cc1) && tcpm_cc_is_source((port)->cc2))
764
765 #define tcpm_port_is_debug_sink(port) \
766 (tcpm_cc_is_sink((port)->cc1) && tcpm_cc_is_sink((port)->cc2))
767
768 #define tcpm_port_is_debug(port) \
769 (tcpm_port_is_debug_source(port) || tcpm_port_is_debug_sink(port))
770
771 #define tcpm_port_is_audio(port) \
772 (tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_audio((port)->cc2))
773
774 #define tcpm_port_is_audio_detached(port) \
775 ((tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_open((port)->cc2)) || \
776 (tcpm_cc_is_audio((port)->cc2) && tcpm_cc_is_open((port)->cc1)))
777
778 #define tcpm_try_snk(port) \
779 ((port)->try_snk_count == 0 && (port)->try_role == TYPEC_SINK && \
780 (port)->port_type == TYPEC_PORT_DRP)
781
782 #define tcpm_try_src(port) \
783 ((port)->try_src_count == 0 && (port)->try_role == TYPEC_SOURCE && \
784 (port)->port_type == TYPEC_PORT_DRP)
785
786 #define tcpm_data_role_for_source(port) \
787 ((port)->typec_caps.data == TYPEC_PORT_UFP ? \
788 TYPEC_DEVICE : TYPEC_HOST)
789
790 #define tcpm_data_role_for_sink(port) \
791 ((port)->typec_caps.data == TYPEC_PORT_DFP ? \
792 TYPEC_HOST : TYPEC_DEVICE)
793
794 #define tcpm_sink_tx_ok(port) \
795 (tcpm_port_is_sink(port) && \
796 ((port)->cc1 == TYPEC_CC_RP_3_0 || (port)->cc2 == TYPEC_CC_RP_3_0))
797
798 #define tcpm_wait_for_discharge(port) \
799 (((port)->auto_vbus_discharge_enabled && !(port)->vbus_vsafe0v) ? PD_T_SAFE_0V : 0)
800
801 #define tcpm_can_send_vdm(state) \
802 ((state == SRC_READY || state == SNK_READY || state == SRC_VDM_IDENTITY_REQUEST))
803
tcpm_default_state(struct tcpm_port * port)804 static enum tcpm_state tcpm_default_state(struct tcpm_port *port)
805 {
806 if (port->port_type == TYPEC_PORT_DRP) {
807 if (port->try_role == TYPEC_SINK)
808 return SNK_UNATTACHED;
809 else if (port->try_role == TYPEC_SOURCE)
810 return SRC_UNATTACHED;
811 /* Fall through to return SRC_UNATTACHED */
812 } else if (port->port_type == TYPEC_PORT_SNK) {
813 return SNK_UNATTACHED;
814 }
815 return SRC_UNATTACHED;
816 }
817
tcpm_port_is_disconnected(struct tcpm_port * port)818 static bool tcpm_port_is_disconnected(struct tcpm_port *port)
819 {
820 return (!port->attached && port->cc1 == TYPEC_CC_OPEN &&
821 port->cc2 == TYPEC_CC_OPEN) ||
822 (port->attached && ((port->polarity == TYPEC_POLARITY_CC1 &&
823 port->cc1 == TYPEC_CC_OPEN) ||
824 (port->polarity == TYPEC_POLARITY_CC2 &&
825 port->cc2 == TYPEC_CC_OPEN)));
826 }
827
828 /*
829 * Logging
830 */
831
832 #ifdef CONFIG_DEBUG_FS
833
tcpm_log_full(struct tcpm_port * port)834 static bool tcpm_log_full(struct tcpm_port *port)
835 {
836 return port->logbuffer_tail ==
837 (port->logbuffer_head + 1) % LOG_BUFFER_ENTRIES;
838 }
839
840 __printf(2, 0)
_tcpm_log(struct tcpm_port * port,const char * fmt,va_list args)841 static void _tcpm_log(struct tcpm_port *port, const char *fmt, va_list args)
842 {
843 char tmpbuffer[LOG_BUFFER_ENTRY_SIZE];
844 u64 ts_nsec = local_clock();
845 unsigned long rem_nsec;
846
847 mutex_lock(&port->logbuffer_lock);
848 if (!port->logbuffer[port->logbuffer_head]) {
849 port->logbuffer[port->logbuffer_head] =
850 kzalloc(LOG_BUFFER_ENTRY_SIZE, GFP_KERNEL);
851 if (!port->logbuffer[port->logbuffer_head]) {
852 mutex_unlock(&port->logbuffer_lock);
853 return;
854 }
855 }
856
857 vsnprintf(tmpbuffer, sizeof(tmpbuffer), fmt, args);
858
859 if (tcpm_log_full(port)) {
860 port->logbuffer_head = max(port->logbuffer_head - 1, 0);
861 strscpy(tmpbuffer, "overflow");
862 }
863
864 if (port->logbuffer_head < 0 ||
865 port->logbuffer_head >= LOG_BUFFER_ENTRIES) {
866 dev_warn(port->dev,
867 "Bad log buffer index %d\n", port->logbuffer_head);
868 goto abort;
869 }
870
871 if (!port->logbuffer[port->logbuffer_head]) {
872 dev_warn(port->dev,
873 "Log buffer index %d is NULL\n", port->logbuffer_head);
874 goto abort;
875 }
876
877 rem_nsec = do_div(ts_nsec, 1000000000);
878 scnprintf(port->logbuffer[port->logbuffer_head],
879 LOG_BUFFER_ENTRY_SIZE, "[%5lu.%06lu] %s",
880 (unsigned long)ts_nsec, rem_nsec / 1000,
881 tmpbuffer);
882 port->logbuffer_head = (port->logbuffer_head + 1) % LOG_BUFFER_ENTRIES;
883
884 abort:
885 mutex_unlock(&port->logbuffer_lock);
886 }
887
888 __printf(2, 3)
tcpm_log(struct tcpm_port * port,const char * fmt,...)889 static void tcpm_log(struct tcpm_port *port, const char *fmt, ...)
890 {
891 va_list args;
892
893 /* Do not log while disconnected and unattached */
894 if (tcpm_port_is_disconnected(port) &&
895 (port->state == SRC_UNATTACHED || port->state == SNK_UNATTACHED ||
896 port->state == TOGGLING || port->state == CHECK_CONTAMINANT))
897 return;
898
899 va_start(args, fmt);
900 _tcpm_log(port, fmt, args);
901 va_end(args);
902 }
903
904 __printf(2, 3)
tcpm_log_force(struct tcpm_port * port,const char * fmt,...)905 static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...)
906 {
907 va_list args;
908
909 va_start(args, fmt);
910 _tcpm_log(port, fmt, args);
911 va_end(args);
912 }
913
tcpm_log_source_caps(struct tcpm_port * port)914 static void tcpm_log_source_caps(struct tcpm_port *port)
915 {
916 int i;
917
918 for (i = 0; i < port->nr_source_caps; i++) {
919 u32 pdo = port->source_caps[i];
920 enum pd_pdo_type type = pdo_type(pdo);
921 char msg[64];
922
923 switch (type) {
924 case PDO_TYPE_FIXED:
925 scnprintf(msg, sizeof(msg),
926 "%u mV, %u mA [%s%s%s%s%s%s]",
927 pdo_fixed_voltage(pdo),
928 pdo_max_current(pdo),
929 (pdo & PDO_FIXED_DUAL_ROLE) ?
930 "R" : "",
931 (pdo & PDO_FIXED_SUSPEND) ?
932 "S" : "",
933 (pdo & PDO_FIXED_HIGHER_CAP) ?
934 "H" : "",
935 (pdo & PDO_FIXED_USB_COMM) ?
936 "U" : "",
937 (pdo & PDO_FIXED_DATA_SWAP) ?
938 "D" : "",
939 (pdo & PDO_FIXED_EXTPOWER) ?
940 "E" : "");
941 break;
942 case PDO_TYPE_VAR:
943 scnprintf(msg, sizeof(msg),
944 "%u-%u mV, %u mA",
945 pdo_min_voltage(pdo),
946 pdo_max_voltage(pdo),
947 pdo_max_current(pdo));
948 break;
949 case PDO_TYPE_BATT:
950 scnprintf(msg, sizeof(msg),
951 "%u-%u mV, %u mW",
952 pdo_min_voltage(pdo),
953 pdo_max_voltage(pdo),
954 pdo_max_power(pdo));
955 break;
956 case PDO_TYPE_APDO:
957 if (pdo_apdo_type(pdo) == APDO_TYPE_PPS)
958 scnprintf(msg, sizeof(msg),
959 "PPS %u-%u mV, %u mA",
960 pdo_pps_apdo_min_voltage(pdo),
961 pdo_pps_apdo_max_voltage(pdo),
962 pdo_pps_apdo_max_current(pdo));
963 else if (pdo_apdo_type(pdo) == APDO_TYPE_EPR_AVS)
964 scnprintf(msg, sizeof(msg),
965 "EPR AVS %u-%u mV %u W peak_current: %u",
966 pdo_epr_avs_apdo_min_voltage_mv(pdo),
967 pdo_epr_avs_apdo_max_voltage_mv(pdo),
968 pdo_epr_avs_apdo_pdp_w(pdo),
969 pdo_epr_avs_apdo_src_peak_current(pdo));
970 else if (pdo_apdo_type(pdo) == APDO_TYPE_SPR_AVS)
971 scnprintf(msg, sizeof(msg),
972 "SPR AVS 9-15 V: %u mA 15-20 V: %u mA peak_current: %u",
973 pdo_spr_avs_apdo_9v_to_15v_max_current_ma(pdo),
974 pdo_spr_avs_apdo_15v_to_20v_max_current_ma(pdo),
975 pdo_spr_avs_apdo_src_peak_current(pdo));
976 else
977 strscpy(msg, "undefined APDO");
978 break;
979 default:
980 strscpy(msg, "undefined");
981 break;
982 }
983 tcpm_log(port, " PDO %d: type %d, %s",
984 i, type, msg);
985 }
986 }
987
tcpm_debug_show(struct seq_file * s,void * v)988 static int tcpm_debug_show(struct seq_file *s, void *v)
989 {
990 struct tcpm_port *port = s->private;
991 int tail;
992
993 mutex_lock(&port->logbuffer_lock);
994 tail = port->logbuffer_tail;
995 while (tail != port->logbuffer_head) {
996 seq_printf(s, "%s\n", port->logbuffer[tail]);
997 tail = (tail + 1) % LOG_BUFFER_ENTRIES;
998 }
999 if (!seq_has_overflowed(s))
1000 port->logbuffer_tail = tail;
1001 mutex_unlock(&port->logbuffer_lock);
1002
1003 return 0;
1004 }
1005 DEFINE_SHOW_ATTRIBUTE(tcpm_debug);
1006
tcpm_debugfs_init(struct tcpm_port * port)1007 static void tcpm_debugfs_init(struct tcpm_port *port)
1008 {
1009 char name[NAME_MAX];
1010
1011 mutex_init(&port->logbuffer_lock);
1012 snprintf(name, NAME_MAX, "tcpm-%s", dev_name(port->dev));
1013 port->dentry = debugfs_create_dir(name, usb_debug_root);
1014 debugfs_create_file("log", S_IFREG | 0444, port->dentry, port,
1015 &tcpm_debug_fops);
1016 }
1017
tcpm_debugfs_exit(struct tcpm_port * port)1018 static void tcpm_debugfs_exit(struct tcpm_port *port)
1019 {
1020 int i;
1021
1022 mutex_lock(&port->logbuffer_lock);
1023 for (i = 0; i < LOG_BUFFER_ENTRIES; i++) {
1024 kfree(port->logbuffer[i]);
1025 port->logbuffer[i] = NULL;
1026 }
1027 mutex_unlock(&port->logbuffer_lock);
1028
1029 debugfs_remove(port->dentry);
1030 }
1031
1032 #else
1033
1034 __printf(2, 3)
tcpm_log(const struct tcpm_port * port,const char * fmt,...)1035 static void tcpm_log(const struct tcpm_port *port, const char *fmt, ...) { }
1036 __printf(2, 3)
tcpm_log_force(struct tcpm_port * port,const char * fmt,...)1037 static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...) { }
tcpm_log_source_caps(struct tcpm_port * port)1038 static void tcpm_log_source_caps(struct tcpm_port *port) { }
tcpm_debugfs_init(const struct tcpm_port * port)1039 static void tcpm_debugfs_init(const struct tcpm_port *port) { }
tcpm_debugfs_exit(const struct tcpm_port * port)1040 static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
1041
1042 #endif
1043
tcpm_set_cc(struct tcpm_port * port,enum typec_cc_status cc)1044 static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
1045 {
1046 tcpm_log(port, "cc:=%d", cc);
1047 port->cc_req = cc;
1048 port->tcpc->set_cc(port->tcpc, cc);
1049 }
1050
tcpm_enable_auto_vbus_discharge(struct tcpm_port * port,bool enable)1051 static int tcpm_enable_auto_vbus_discharge(struct tcpm_port *port, bool enable)
1052 {
1053 int ret = 0;
1054
1055 if (port->tcpc->enable_auto_vbus_discharge) {
1056 ret = port->tcpc->enable_auto_vbus_discharge(port->tcpc, enable);
1057 tcpm_log_force(port, "%s vbus discharge ret:%d",
1058 str_enable_disable(enable), ret);
1059 if (!ret)
1060 port->auto_vbus_discharge_enabled = enable;
1061 }
1062
1063 return ret;
1064 }
1065
tcpm_apply_rc(struct tcpm_port * port)1066 static void tcpm_apply_rc(struct tcpm_port *port)
1067 {
1068 /*
1069 * TCPCI: Move to APPLY_RC state to prevent disconnect during PR_SWAP
1070 * when Vbus auto discharge on disconnect is enabled.
1071 */
1072 if (port->tcpc->enable_auto_vbus_discharge && port->tcpc->apply_rc) {
1073 tcpm_log(port, "Apply_RC");
1074 port->tcpc->apply_rc(port->tcpc, port->cc_req, port->polarity);
1075 tcpm_enable_auto_vbus_discharge(port, false);
1076 }
1077 }
1078
1079 /*
1080 * Determine RP value to set based on maximum current supported
1081 * by a port if configured as source.
1082 * Returns CC value to report to link partner.
1083 */
tcpm_rp_cc(struct tcpm_port * port)1084 static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port)
1085 {
1086 const u32 *src_pdo = port->src_pdo;
1087 int nr_pdo = port->nr_src_pdo;
1088 int i;
1089
1090 if (!port->pd_supported)
1091 return port->src_rp;
1092
1093 /*
1094 * Search for first entry with matching voltage.
1095 * It should report the maximum supported current.
1096 */
1097 for (i = 0; i < nr_pdo; i++) {
1098 const u32 pdo = src_pdo[i];
1099
1100 if (pdo_type(pdo) == PDO_TYPE_FIXED &&
1101 pdo_fixed_voltage(pdo) == 5000) {
1102 unsigned int curr = pdo_max_current(pdo);
1103
1104 if (curr >= 3000)
1105 return TYPEC_CC_RP_3_0;
1106 else if (curr >= 1500)
1107 return TYPEC_CC_RP_1_5;
1108 return TYPEC_CC_RP_DEF;
1109 }
1110 }
1111
1112 return TYPEC_CC_RP_DEF;
1113 }
1114
tcpm_ams_finish(struct tcpm_port * port)1115 static void tcpm_ams_finish(struct tcpm_port *port)
1116 {
1117 tcpm_log(port, "AMS %s finished", tcpm_ams_str[port->ams]);
1118
1119 if (port->pd_capable && port->pwr_role == TYPEC_SOURCE) {
1120 if (port->negotiated_rev >= PD_REV30)
1121 tcpm_set_cc(port, SINK_TX_OK);
1122 else
1123 tcpm_set_cc(port, SINK_TX_NG);
1124 } else if (port->pwr_role == TYPEC_SOURCE) {
1125 tcpm_set_cc(port, tcpm_rp_cc(port));
1126 }
1127
1128 port->in_ams = false;
1129 port->ams = NONE_AMS;
1130 }
1131
tcpm_pd_transmit(struct tcpm_port * port,enum tcpm_transmit_type tx_sop_type,const struct pd_message * msg)1132 static int tcpm_pd_transmit(struct tcpm_port *port,
1133 enum tcpm_transmit_type tx_sop_type,
1134 const struct pd_message *msg)
1135 {
1136 unsigned long time_left;
1137 int ret;
1138 unsigned int negotiated_rev;
1139
1140 switch (tx_sop_type) {
1141 case TCPC_TX_SOP_PRIME:
1142 negotiated_rev = port->negotiated_rev_prime;
1143 break;
1144 case TCPC_TX_SOP:
1145 default:
1146 negotiated_rev = port->negotiated_rev;
1147 break;
1148 }
1149
1150 if (msg)
1151 tcpm_log(port, "PD TX, header: %#x", le16_to_cpu(msg->header));
1152 else
1153 tcpm_log(port, "PD TX, type: %#x", tx_sop_type);
1154
1155 reinit_completion(&port->tx_complete);
1156 ret = port->tcpc->pd_transmit(port->tcpc, tx_sop_type, msg, negotiated_rev);
1157 if (ret < 0)
1158 return ret;
1159
1160 mutex_unlock(&port->lock);
1161 time_left = wait_for_completion_timeout(&port->tx_complete,
1162 msecs_to_jiffies(PD_T_TCPC_TX_TIMEOUT));
1163 mutex_lock(&port->lock);
1164 if (!time_left)
1165 return -ETIMEDOUT;
1166
1167 switch (port->tx_status) {
1168 case TCPC_TX_SUCCESS:
1169 switch (tx_sop_type) {
1170 case TCPC_TX_SOP_PRIME:
1171 port->message_id_prime = (port->message_id_prime + 1) &
1172 PD_HEADER_ID_MASK;
1173 break;
1174 case TCPC_TX_SOP:
1175 default:
1176 port->message_id = (port->message_id + 1) &
1177 PD_HEADER_ID_MASK;
1178 break;
1179 }
1180 /*
1181 * USB PD rev 2.0, 8.3.2.2.1:
1182 * USB PD rev 3.0, 8.3.2.1.3:
1183 * "... Note that every AMS is Interruptible until the first
1184 * Message in the sequence has been successfully sent (GoodCRC
1185 * Message received)."
1186 */
1187 if (port->ams != NONE_AMS)
1188 port->in_ams = true;
1189 break;
1190 case TCPC_TX_DISCARDED:
1191 ret = -EAGAIN;
1192 break;
1193 case TCPC_TX_FAILED:
1194 default:
1195 ret = -EIO;
1196 break;
1197 }
1198
1199 /* Some AMS don't expect responses. Finish them here. */
1200 if (port->ams == ATTENTION || port->ams == SOURCE_ALERT)
1201 tcpm_ams_finish(port);
1202
1203 return ret;
1204 }
1205
tcpm_pd_transmit_complete(struct tcpm_port * port,enum tcpm_transmit_status status)1206 void tcpm_pd_transmit_complete(struct tcpm_port *port,
1207 enum tcpm_transmit_status status)
1208 {
1209 tcpm_log(port, "PD TX complete, status: %u", status);
1210 port->tx_status = status;
1211 complete(&port->tx_complete);
1212 }
1213 EXPORT_SYMBOL_GPL(tcpm_pd_transmit_complete);
1214
tcpm_mux_set(struct tcpm_port * port,int state,enum usb_role usb_role,enum typec_orientation orientation)1215 static int tcpm_mux_set(struct tcpm_port *port, int state,
1216 enum usb_role usb_role,
1217 enum typec_orientation orientation)
1218 {
1219 int ret;
1220
1221 tcpm_log(port, "Requesting mux state %d, usb-role %d, orientation %d",
1222 state, usb_role, orientation);
1223
1224 ret = typec_set_orientation(port->typec_port, orientation);
1225 if (ret)
1226 return ret;
1227
1228 if (port->role_sw) {
1229 ret = usb_role_switch_set_role(port->role_sw, usb_role);
1230 if (ret)
1231 return ret;
1232 }
1233
1234 return typec_set_mode(port->typec_port, state);
1235 }
1236
tcpm_set_polarity(struct tcpm_port * port,enum typec_cc_polarity polarity)1237 static int tcpm_set_polarity(struct tcpm_port *port,
1238 enum typec_cc_polarity polarity)
1239 {
1240 int ret;
1241
1242 tcpm_log(port, "polarity %d", polarity);
1243
1244 ret = port->tcpc->set_polarity(port->tcpc, polarity);
1245 if (ret < 0)
1246 return ret;
1247
1248 port->polarity = polarity;
1249
1250 return 0;
1251 }
1252
tcpm_set_vconn(struct tcpm_port * port,bool enable)1253 static int tcpm_set_vconn(struct tcpm_port *port, bool enable)
1254 {
1255 int ret;
1256
1257 tcpm_log(port, "vconn:=%d", enable);
1258
1259 ret = port->tcpc->set_vconn(port->tcpc, enable);
1260 if (!ret) {
1261 port->vconn_role = enable ? TYPEC_SOURCE : TYPEC_SINK;
1262 typec_set_vconn_role(port->typec_port, port->vconn_role);
1263 }
1264
1265 return ret;
1266 }
1267
tcpm_get_current_limit(struct tcpm_port * port)1268 static u32 tcpm_get_current_limit(struct tcpm_port *port)
1269 {
1270 enum typec_cc_status cc;
1271 u32 limit;
1272
1273 cc = port->polarity ? port->cc2 : port->cc1;
1274 switch (cc) {
1275 case TYPEC_CC_RP_1_5:
1276 limit = 1500;
1277 break;
1278 case TYPEC_CC_RP_3_0:
1279 limit = 3000;
1280 break;
1281 case TYPEC_CC_RP_DEF:
1282 default:
1283 if (port->tcpc->get_current_limit)
1284 limit = port->tcpc->get_current_limit(port->tcpc);
1285 else
1286 limit = 0;
1287 break;
1288 }
1289
1290 return limit;
1291 }
1292
tcpm_set_current_limit(struct tcpm_port * port,u32 max_ma,u32 mv)1293 static int tcpm_set_current_limit(struct tcpm_port *port, u32 max_ma, u32 mv)
1294 {
1295 int ret = -EOPNOTSUPP;
1296
1297 tcpm_log(port, "Setting voltage/current limit %u mV %u mA", mv, max_ma);
1298
1299 port->supply_voltage = mv;
1300 port->current_limit = max_ma;
1301 power_supply_changed(port->psy);
1302
1303 if (port->tcpc->set_current_limit)
1304 ret = port->tcpc->set_current_limit(port->tcpc, max_ma, mv);
1305
1306 return ret;
1307 }
1308
tcpm_set_attached_state(struct tcpm_port * port,bool attached)1309 static int tcpm_set_attached_state(struct tcpm_port *port, bool attached)
1310 {
1311 return port->tcpc->set_roles(port->tcpc, attached, port->pwr_role,
1312 port->data_role);
1313 }
1314
tcpm_set_roles(struct tcpm_port * port,bool attached,int state,enum typec_role role,enum typec_data_role data)1315 static int tcpm_set_roles(struct tcpm_port *port, bool attached, int state,
1316 enum typec_role role, enum typec_data_role data)
1317 {
1318 enum typec_orientation orientation;
1319 enum usb_role usb_role;
1320 int ret;
1321
1322 if (port->polarity == TYPEC_POLARITY_CC1)
1323 orientation = TYPEC_ORIENTATION_NORMAL;
1324 else
1325 orientation = TYPEC_ORIENTATION_REVERSE;
1326
1327 if (port->typec_caps.data == TYPEC_PORT_DRD) {
1328 if (data == TYPEC_HOST)
1329 usb_role = USB_ROLE_HOST;
1330 else
1331 usb_role = USB_ROLE_DEVICE;
1332 } else if (port->typec_caps.data == TYPEC_PORT_DFP) {
1333 if (data == TYPEC_HOST) {
1334 if (role == TYPEC_SOURCE)
1335 usb_role = USB_ROLE_HOST;
1336 else
1337 usb_role = USB_ROLE_NONE;
1338 } else {
1339 return -ENOTSUPP;
1340 }
1341 } else {
1342 if (data == TYPEC_DEVICE) {
1343 if (role == TYPEC_SINK)
1344 usb_role = USB_ROLE_DEVICE;
1345 else
1346 usb_role = USB_ROLE_NONE;
1347 } else {
1348 return -ENOTSUPP;
1349 }
1350 }
1351
1352 ret = tcpm_mux_set(port, state, usb_role, orientation);
1353 if (ret < 0)
1354 return ret;
1355
1356 ret = port->tcpc->set_roles(port->tcpc, attached, role, data);
1357 if (ret < 0)
1358 return ret;
1359
1360 if (port->tcpc->set_orientation) {
1361 ret = port->tcpc->set_orientation(port->tcpc, orientation);
1362 if (ret < 0)
1363 return ret;
1364 }
1365
1366 port->pwr_role = role;
1367 port->data_role = data;
1368 typec_set_data_role(port->typec_port, data);
1369 typec_set_pwr_role(port->typec_port, role);
1370
1371 return 0;
1372 }
1373
tcpm_set_pwr_role(struct tcpm_port * port,enum typec_role role)1374 static int tcpm_set_pwr_role(struct tcpm_port *port, enum typec_role role)
1375 {
1376 int ret;
1377
1378 ret = port->tcpc->set_roles(port->tcpc, true, role,
1379 port->data_role);
1380 if (ret < 0)
1381 return ret;
1382
1383 port->pwr_role = role;
1384 typec_set_pwr_role(port->typec_port, role);
1385
1386 return 0;
1387 }
1388
1389 /*
1390 * Transform the PDO to be compliant to PD rev2.0.
1391 * Return 0 if the PDO type is not defined in PD rev2.0.
1392 * Otherwise, return the converted PDO.
1393 */
tcpm_forge_legacy_pdo(struct tcpm_port * port,u32 pdo,enum typec_role role)1394 static u32 tcpm_forge_legacy_pdo(struct tcpm_port *port, u32 pdo, enum typec_role role)
1395 {
1396 switch (pdo_type(pdo)) {
1397 case PDO_TYPE_FIXED:
1398 if (role == TYPEC_SINK)
1399 return pdo & ~PDO_FIXED_FRS_CURR_MASK;
1400 else
1401 return pdo & ~PDO_FIXED_UNCHUNK_EXT;
1402 case PDO_TYPE_VAR:
1403 case PDO_TYPE_BATT:
1404 return pdo;
1405 case PDO_TYPE_APDO:
1406 default:
1407 return 0;
1408 }
1409 }
1410
tcpm_pd_send_revision(struct tcpm_port * port)1411 static int tcpm_pd_send_revision(struct tcpm_port *port)
1412 {
1413 struct pd_message msg;
1414 u32 rmdo;
1415
1416 memset(&msg, 0, sizeof(msg));
1417 rmdo = RMDO(port->pd_rev.rev_major, port->pd_rev.rev_minor,
1418 port->pd_rev.ver_major, port->pd_rev.ver_minor);
1419 msg.payload[0] = cpu_to_le32(rmdo);
1420 msg.header = PD_HEADER_LE(PD_DATA_REVISION,
1421 port->pwr_role,
1422 port->data_role,
1423 port->negotiated_rev,
1424 port->message_id,
1425 1);
1426 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1427 }
1428
tcpm_pd_send_source_caps(struct tcpm_port * port)1429 static int tcpm_pd_send_source_caps(struct tcpm_port *port)
1430 {
1431 struct pd_message msg;
1432 u32 pdo;
1433 unsigned int i, nr_pdo = 0;
1434
1435 memset(&msg, 0, sizeof(msg));
1436
1437 for (i = 0; i < port->nr_src_pdo; i++) {
1438 if (port->negotiated_rev >= PD_REV30) {
1439 msg.payload[nr_pdo++] = cpu_to_le32(port->src_pdo[i]);
1440 } else {
1441 pdo = tcpm_forge_legacy_pdo(port, port->src_pdo[i], TYPEC_SOURCE);
1442 if (pdo)
1443 msg.payload[nr_pdo++] = cpu_to_le32(pdo);
1444 }
1445 }
1446
1447 if (!nr_pdo) {
1448 /* No source capabilities defined, sink only */
1449 msg.header = PD_HEADER_LE(PD_CTRL_REJECT,
1450 port->pwr_role,
1451 port->data_role,
1452 port->negotiated_rev,
1453 port->message_id, 0);
1454 } else {
1455 msg.header = PD_HEADER_LE(PD_DATA_SOURCE_CAP,
1456 port->pwr_role,
1457 port->data_role,
1458 port->negotiated_rev,
1459 port->message_id,
1460 nr_pdo);
1461 }
1462
1463 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1464 }
1465
tcpm_pd_send_sink_caps(struct tcpm_port * port)1466 static int tcpm_pd_send_sink_caps(struct tcpm_port *port)
1467 {
1468 struct pd_message msg;
1469 u32 pdo;
1470 unsigned int i, nr_pdo = 0;
1471
1472 memset(&msg, 0, sizeof(msg));
1473
1474 for (i = 0; i < port->nr_snk_pdo; i++) {
1475 if (port->negotiated_rev >= PD_REV30) {
1476 msg.payload[nr_pdo++] = cpu_to_le32(port->snk_pdo[i]);
1477 } else {
1478 pdo = tcpm_forge_legacy_pdo(port, port->snk_pdo[i], TYPEC_SINK);
1479 if (pdo)
1480 msg.payload[nr_pdo++] = cpu_to_le32(pdo);
1481 }
1482 }
1483
1484 if (!nr_pdo) {
1485 /* No sink capabilities defined, source only */
1486 msg.header = PD_HEADER_LE(PD_CTRL_REJECT,
1487 port->pwr_role,
1488 port->data_role,
1489 port->negotiated_rev,
1490 port->message_id, 0);
1491 } else {
1492 msg.header = PD_HEADER_LE(PD_DATA_SINK_CAP,
1493 port->pwr_role,
1494 port->data_role,
1495 port->negotiated_rev,
1496 port->message_id,
1497 nr_pdo);
1498 }
1499
1500 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1501 }
1502
tcpm_get_fixed_batt(struct tcpm_port * port)1503 static void tcpm_get_fixed_batt(struct tcpm_port *port)
1504 {
1505 int ret;
1506
1507 if (!port->self_powered || port->fixed_batt_cnt > 0)
1508 return;
1509
1510 ret = power_supply_get_system_batteries(port->dev, &port->fixed_batt);
1511 if (ret < 0)
1512 tcpm_log(port, "Failed to get battery array, ret=%d", ret);
1513 else
1514 port->fixed_batt_cnt = ret;
1515 }
1516
tcpm_pd_send_sink_cap_ext(struct tcpm_port * port)1517 static int tcpm_pd_send_sink_cap_ext(struct tcpm_port *port)
1518 {
1519 u16 operating_snk_watt = port->operating_snk_mw / 1000;
1520 struct sink_caps_ext_data *data = &port->sink_caps_ext;
1521 struct pd_identifier *pd_ident = &port->pd_ident;
1522 struct sink_caps_ext_msg skedb = {0};
1523 struct pd_message msg;
1524 u8 data_obj_cnt;
1525
1526 if (!port->self_powered)
1527 data->spr_op_pdp = operating_snk_watt;
1528
1529 tcpm_get_fixed_batt(port);
1530
1531 /*
1532 * SPR Sink Minimum PDP indicates the minimum power required to operate
1533 * a sink device in its lowest level of functionality without requiring
1534 * power from the battery. We can use the operating_snk_watt value to
1535 * populate it, as operating_snk_watt indicates device's min operating
1536 * power.
1537 */
1538 data->spr_min_pdp = operating_snk_watt;
1539
1540 if (data->spr_op_pdp < data->spr_min_pdp ||
1541 data->spr_max_pdp < data->spr_op_pdp) {
1542 tcpm_log(port,
1543 "Invalid PDP values, Min PDP:%u, Op PDP:%u, Max PDP:%u",
1544 data->spr_min_pdp, data->spr_op_pdp, data->spr_max_pdp);
1545 return -EOPNOTSUPP;
1546 }
1547
1548 memset(&msg, 0, sizeof(msg));
1549 skedb.vid = cpu_to_le16(pd_ident->vid);
1550 skedb.pid = cpu_to_le16(pd_ident->pid);
1551 skedb.xid = cpu_to_le32(pd_ident->xid);
1552 skedb.skedb_ver = SKEDB_VER_1_0;
1553 skedb.load_step = data->load_step;
1554 skedb.load_char = cpu_to_le16(data->load_char);
1555 skedb.compliance = data->compliance;
1556 skedb.batt_info = min(port->fixed_batt_cnt, MAX_NUM_FIXED_BATT);
1557 skedb.modes = data->modes;
1558 skedb.spr_min_pdp = data->spr_min_pdp;
1559 skedb.spr_op_pdp = data->spr_op_pdp;
1560 skedb.spr_max_pdp = data->spr_max_pdp;
1561 memcpy(msg.ext_msg.data, &skedb, sizeof(skedb));
1562 msg.ext_msg.header = PD_EXT_HDR_LE(sizeof(skedb),
1563 0, /* Denotes if request chunk */
1564 0, /* Chunk Number */
1565 1 /* Chunked */);
1566
1567 data_obj_cnt = count_chunked_data_objs(sizeof(skedb));
1568 msg.header = cpu_to_le16(PD_HEADER(PD_EXT_SINK_CAP_EXT,
1569 port->pwr_role,
1570 port->data_role,
1571 port->negotiated_rev,
1572 port->message_id,
1573 data_obj_cnt,
1574 1 /* Denotes if ext header */));
1575
1576 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1577 }
1578
tcpm_charge_to_energy(int charge,int voltage)1579 static u16 tcpm_charge_to_energy(int charge, int voltage)
1580 {
1581 u64 energy = div_u64((u64)charge * voltage, 1000000);
1582
1583 /* Battery telemetry is reported in increments of 0.1Wh */
1584 return (u16)UW_TO_W(energy * 10);
1585 }
1586
tcpm_pd_send_batt_status(struct tcpm_port * port)1587 static int tcpm_pd_send_batt_status(struct tcpm_port *port)
1588 {
1589 u16 present_charge = BATTERY_PROPERTY_UNKNOWN;
1590 bool batt_present = false, invalid_ref = true;
1591 u32 batt_id = port->batt_request_id;
1592 union power_supply_propval val;
1593 struct power_supply *batt;
1594 u8 charging_status = 0;
1595 struct pd_message msg;
1596 int ret, charge_now;
1597 u32 bsdo;
1598
1599 tcpm_get_fixed_batt(port);
1600 memset(&msg, 0, sizeof(msg));
1601
1602 if (batt_id >= port->fixed_batt_cnt || batt_id >= MAX_NUM_FIXED_BATT)
1603 goto send_status;
1604
1605 invalid_ref = false;
1606 batt = port->fixed_batt[batt_id];
1607 ret = power_supply_get_property(batt, POWER_SUPPLY_PROP_PRESENT, &val);
1608 if (ret)
1609 tcpm_log(port,
1610 "Failed to fetch power_supply_prop_present ret %d",
1611 ret);
1612 else
1613 batt_present = val.intval > 0;
1614
1615 ret = power_supply_get_property(batt, POWER_SUPPLY_PROP_CHARGE_NOW,
1616 &val);
1617 if (!ret) {
1618 charge_now = val.intval;
1619 ret = power_supply_get_property(batt,
1620 POWER_SUPPLY_PROP_VOLTAGE_AVG,
1621 &val);
1622 if (!ret)
1623 present_charge = tcpm_charge_to_energy(charge_now,
1624 val.intval);
1625 }
1626
1627 ret = power_supply_get_property(batt, POWER_SUPPLY_PROP_STATUS, &val);
1628 if (!ret) {
1629 switch (val.intval) {
1630 case POWER_SUPPLY_STATUS_CHARGING:
1631 charging_status = BSDO_BATTERY_INFO_CHARGING;
1632 break;
1633 case POWER_SUPPLY_STATUS_DISCHARGING:
1634 charging_status = BSDO_BATTERY_INFO_DISCHARGING;
1635 break;
1636 case POWER_SUPPLY_STATUS_NOT_CHARGING:
1637 case POWER_SUPPLY_STATUS_FULL:
1638 charging_status = BSDO_BATTERY_INFO_IDLE;
1639 break;
1640 default:
1641 charging_status = BSDO_BATTERY_INFO_RSVD;
1642 break;
1643 }
1644 }
1645
1646 send_status:
1647
1648 bsdo = BSDO(present_charge, charging_status, batt_present, invalid_ref);
1649 msg.payload[0] = cpu_to_le32(bsdo);
1650 msg.header = PD_HEADER_LE(PD_DATA_BATT_STATUS,
1651 port->pwr_role,
1652 port->data_role,
1653 port->negotiated_rev,
1654 port->message_id,
1655 1);
1656
1657 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1658 }
1659
tcpm_pd_send_batt_cap(struct tcpm_port * port)1660 static int tcpm_pd_send_batt_cap(struct tcpm_port *port)
1661 {
1662 u16 design_cap = BATTERY_PROPERTY_UNKNOWN;
1663 u16 charge_cap = BATTERY_PROPERTY_UNKNOWN;
1664 u32 batt_id = port->batt_request_id;
1665 union power_supply_propval val;
1666 struct batt_cap_ext_msg bcdb;
1667 struct power_supply *batt;
1668 bool invalid_ref = true;
1669 struct pd_message msg;
1670 u8 data_obj_cnt;
1671 int ret, vol;
1672
1673 tcpm_get_fixed_batt(port);
1674 memset(&msg, 0, sizeof(msg));
1675
1676 if (batt_id >= port->fixed_batt_cnt || batt_id >= MAX_NUM_FIXED_BATT)
1677 goto send_cap;
1678
1679 invalid_ref = false;
1680 batt = port->fixed_batt[batt_id];
1681 ret = power_supply_get_property(batt, POWER_SUPPLY_PROP_VOLTAGE_AVG,
1682 &val);
1683 if (!ret) {
1684 vol = val.intval;
1685 ret = power_supply_get_property(batt,
1686 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
1687 &val);
1688 if (!ret)
1689 design_cap = tcpm_charge_to_energy(val.intval, vol);
1690
1691 ret = power_supply_get_property(batt,
1692 POWER_SUPPLY_PROP_CHARGE_FULL,
1693 &val);
1694 if (!ret)
1695 charge_cap = tcpm_charge_to_energy(val.intval, vol);
1696 }
1697
1698 send_cap:
1699
1700 /*
1701 * As per the USB PD Rev3.1 v1.8 spec, if a battery VID (assigned by the
1702 * USB-IF) does not exist or an invalid battery reference is made by the
1703 * requestor, then set the VID field to 0xffff. If the VID field is
1704 * 0xffff, set the PID field to 0.
1705 */
1706 bcdb.vid = BATTERY_PROPERTY_UNKNOWN;
1707 bcdb.pid = 0;
1708 bcdb.batt_design_cap = cpu_to_le16(design_cap);
1709 bcdb.batt_last_chg_cap = cpu_to_le16(charge_cap);
1710 bcdb.batt_type = invalid_ref ? BATT_CAP_BATT_TYPE_INVALID_REF : 0;
1711 memcpy(msg.ext_msg.data, &bcdb, sizeof(bcdb));
1712 msg.ext_msg.header = PD_EXT_HDR_LE(sizeof(bcdb),
1713 0, /* Denotes if request chunk */
1714 0, /* Chunk number */
1715 1 /* Chunked */);
1716
1717 data_obj_cnt = count_chunked_data_objs(sizeof(bcdb));
1718 msg.header = PD_HEADER_EXT_LE(PD_EXT_BATT_CAP, port->pwr_role,
1719 port->data_role, port->negotiated_rev,
1720 port->message_id, data_obj_cnt);
1721
1722 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1723 }
1724
mod_tcpm_delayed_work(struct tcpm_port * port,unsigned int delay_ms)1725 static void mod_tcpm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1726 {
1727 if (delay_ms) {
1728 hrtimer_start(&port->state_machine_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
1729 } else {
1730 hrtimer_cancel(&port->state_machine_timer);
1731 kthread_queue_work(port->wq, &port->state_machine);
1732 }
1733 }
1734
mod_vdm_delayed_work(struct tcpm_port * port,unsigned int delay_ms)1735 static void mod_vdm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1736 {
1737 if (delay_ms) {
1738 hrtimer_start(&port->vdm_state_machine_timer, ms_to_ktime(delay_ms),
1739 HRTIMER_MODE_REL);
1740 } else {
1741 hrtimer_cancel(&port->vdm_state_machine_timer);
1742 kthread_queue_work(port->wq, &port->vdm_state_machine);
1743 }
1744 }
1745
mod_enable_frs_delayed_work(struct tcpm_port * port,unsigned int delay_ms)1746 static void mod_enable_frs_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1747 {
1748 if (delay_ms) {
1749 hrtimer_start(&port->enable_frs_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
1750 } else {
1751 hrtimer_cancel(&port->enable_frs_timer);
1752 kthread_queue_work(port->wq, &port->enable_frs);
1753 }
1754 }
1755
mod_vdm_discovery_cancel_delayed_work(struct tcpm_port * port)1756 static void mod_vdm_discovery_cancel_delayed_work(struct tcpm_port *port)
1757 {
1758 hrtimer_cancel(&port->vdm_discovery_timer);
1759 kthread_cancel_work_sync(&port->vdm_discovery_work);
1760 }
1761
mod_vdm_discovery_delayed_work(struct tcpm_port * port,unsigned int delay_ms)1762 static void mod_vdm_discovery_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1763 {
1764 if (delay_ms) {
1765 hrtimer_start(&port->vdm_discovery_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
1766 } else {
1767 hrtimer_cancel(&port->vdm_discovery_timer);
1768 kthread_queue_work(port->wq, &port->vdm_discovery_work);
1769 }
1770 }
1771
tcpm_set_state(struct tcpm_port * port,enum tcpm_state state,unsigned int delay_ms)1772 static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
1773 unsigned int delay_ms)
1774 {
1775 if (delay_ms) {
1776 tcpm_log(port, "pending state change %s -> %s @ %u ms [%s %s]",
1777 tcpm_states[port->state], tcpm_states[state], delay_ms,
1778 pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
1779 port->delayed_state = state;
1780 mod_tcpm_delayed_work(port, delay_ms);
1781 port->delayed_runtime = ktime_add(ktime_get(), ms_to_ktime(delay_ms));
1782 port->delay_ms = delay_ms;
1783 } else {
1784 tcpm_log(port, "state change %s -> %s [%s %s]",
1785 tcpm_states[port->state], tcpm_states[state],
1786 pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
1787 port->delayed_state = INVALID_STATE;
1788 port->prev_state = port->state;
1789 port->state = state;
1790 /*
1791 * Don't re-queue the state machine work item if we're currently
1792 * in the state machine and we're immediately changing states.
1793 * tcpm_state_machine_work() will continue running the state
1794 * machine.
1795 */
1796 if (!port->state_machine_running)
1797 mod_tcpm_delayed_work(port, 0);
1798 }
1799 }
1800
tcpm_set_state_cond(struct tcpm_port * port,enum tcpm_state state,unsigned int delay_ms)1801 static void tcpm_set_state_cond(struct tcpm_port *port, enum tcpm_state state,
1802 unsigned int delay_ms)
1803 {
1804 if (port->enter_state == port->state)
1805 tcpm_set_state(port, state, delay_ms);
1806 else
1807 tcpm_log(port,
1808 "skipped %sstate change %s -> %s [%u ms], context state %s [%s %s]",
1809 delay_ms ? "delayed " : "",
1810 tcpm_states[port->state], tcpm_states[state],
1811 delay_ms, tcpm_states[port->enter_state],
1812 pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
1813 }
1814
tcpm_queue_message(struct tcpm_port * port,enum pd_msg_request message)1815 static void tcpm_queue_message(struct tcpm_port *port,
1816 enum pd_msg_request message)
1817 {
1818 port->queued_message = message;
1819 mod_tcpm_delayed_work(port, 0);
1820 }
1821
tcpm_vdm_ams(struct tcpm_port * port)1822 static bool tcpm_vdm_ams(struct tcpm_port *port)
1823 {
1824 switch (port->ams) {
1825 case DISCOVER_IDENTITY:
1826 case SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY:
1827 case DISCOVER_SVIDS:
1828 case DISCOVER_MODES:
1829 case DFP_TO_UFP_ENTER_MODE:
1830 case DFP_TO_UFP_EXIT_MODE:
1831 case DFP_TO_CABLE_PLUG_ENTER_MODE:
1832 case DFP_TO_CABLE_PLUG_EXIT_MODE:
1833 case ATTENTION:
1834 case UNSTRUCTURED_VDMS:
1835 case STRUCTURED_VDMS:
1836 break;
1837 default:
1838 return false;
1839 }
1840
1841 return true;
1842 }
1843
tcpm_ams_interruptible(struct tcpm_port * port)1844 static bool tcpm_ams_interruptible(struct tcpm_port *port)
1845 {
1846 switch (port->ams) {
1847 /* Interruptible AMS */
1848 case NONE_AMS:
1849 case SECURITY:
1850 case FIRMWARE_UPDATE:
1851 case DISCOVER_IDENTITY:
1852 case SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY:
1853 case DISCOVER_SVIDS:
1854 case DISCOVER_MODES:
1855 case DFP_TO_UFP_ENTER_MODE:
1856 case DFP_TO_UFP_EXIT_MODE:
1857 case DFP_TO_CABLE_PLUG_ENTER_MODE:
1858 case DFP_TO_CABLE_PLUG_EXIT_MODE:
1859 case UNSTRUCTURED_VDMS:
1860 case STRUCTURED_VDMS:
1861 case COUNTRY_INFO:
1862 case COUNTRY_CODES:
1863 break;
1864 /* Non-Interruptible AMS */
1865 default:
1866 if (port->in_ams)
1867 return false;
1868 break;
1869 }
1870
1871 return true;
1872 }
1873
tcpm_ams_start(struct tcpm_port * port,enum tcpm_ams ams)1874 static int tcpm_ams_start(struct tcpm_port *port, enum tcpm_ams ams)
1875 {
1876 int ret = 0;
1877
1878 tcpm_log(port, "AMS %s start", tcpm_ams_str[ams]);
1879
1880 if (!tcpm_ams_interruptible(port) &&
1881 !(ams == HARD_RESET || ams == SOFT_RESET_AMS)) {
1882 port->upcoming_state = INVALID_STATE;
1883 tcpm_log(port, "AMS %s not interruptible, aborting",
1884 tcpm_ams_str[port->ams]);
1885 return -EAGAIN;
1886 }
1887
1888 if (port->pwr_role == TYPEC_SOURCE) {
1889 enum typec_cc_status cc_req = port->cc_req;
1890
1891 port->ams = ams;
1892
1893 if (ams == HARD_RESET) {
1894 tcpm_set_cc(port, tcpm_rp_cc(port));
1895 tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
1896 tcpm_set_state(port, HARD_RESET_START, 0);
1897 return ret;
1898 } else if (ams == SOFT_RESET_AMS) {
1899 if (!port->explicit_contract)
1900 tcpm_set_cc(port, tcpm_rp_cc(port));
1901 tcpm_set_state(port, SOFT_RESET_SEND, 0);
1902 return ret;
1903 } else if (tcpm_vdm_ams(port)) {
1904 /* tSinkTx is enforced in vdm_run_state_machine */
1905 if (port->negotiated_rev >= PD_REV30)
1906 tcpm_set_cc(port, SINK_TX_NG);
1907 return ret;
1908 }
1909
1910 if (port->negotiated_rev >= PD_REV30)
1911 tcpm_set_cc(port, SINK_TX_NG);
1912
1913 switch (port->state) {
1914 case SRC_READY:
1915 case SRC_STARTUP:
1916 case SRC_SOFT_RESET_WAIT_SNK_TX:
1917 case SOFT_RESET:
1918 case SOFT_RESET_SEND:
1919 if (port->negotiated_rev >= PD_REV30)
1920 tcpm_set_state(port, AMS_START,
1921 cc_req == SINK_TX_OK ?
1922 PD_T_SINK_TX : 0);
1923 else
1924 tcpm_set_state(port, AMS_START, 0);
1925 break;
1926 default:
1927 if (port->negotiated_rev >= PD_REV30)
1928 tcpm_set_state(port, SRC_READY,
1929 cc_req == SINK_TX_OK ?
1930 PD_T_SINK_TX : 0);
1931 else
1932 tcpm_set_state(port, SRC_READY, 0);
1933 break;
1934 }
1935 } else {
1936 if (port->negotiated_rev >= PD_REV30 &&
1937 !tcpm_sink_tx_ok(port) &&
1938 ams != SOFT_RESET_AMS &&
1939 ams != HARD_RESET) {
1940 port->upcoming_state = INVALID_STATE;
1941 tcpm_log(port, "Sink TX No Go");
1942 return -EAGAIN;
1943 }
1944
1945 port->ams = ams;
1946
1947 if (ams == HARD_RESET) {
1948 tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
1949 tcpm_set_state(port, HARD_RESET_START, 0);
1950 return ret;
1951 } else if (tcpm_vdm_ams(port)) {
1952 return ret;
1953 }
1954
1955 if (port->state == SNK_READY ||
1956 port->state == SNK_SOFT_RESET)
1957 tcpm_set_state(port, AMS_START, 0);
1958 else
1959 tcpm_set_state(port, SNK_READY, 0);
1960 }
1961
1962 return ret;
1963 }
1964
1965 /*
1966 * VDM/VDO handling functions
1967 */
tcpm_queue_vdm(struct tcpm_port * port,const u32 header,const u32 * data,int cnt,enum tcpm_transmit_type tx_sop_type)1968 static void tcpm_queue_vdm(struct tcpm_port *port, const u32 header,
1969 const u32 *data, int cnt, enum tcpm_transmit_type tx_sop_type)
1970 {
1971 u32 vdo_hdr = port->vdo_data[0];
1972
1973 WARN_ON(!mutex_is_locked(&port->lock));
1974
1975 /* If is sending discover_identity, handle received message first */
1976 if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMD(vdo_hdr) == CMD_DISCOVER_IDENT)
1977 mod_vdm_discovery_delayed_work(port, SEND_DISCOVERY_VDM_RETRY_MS);
1978 else
1979 /* Make sure we are not still processing a previous VDM packet */
1980 WARN_ON(port->vdm_state > VDM_STATE_DONE);
1981
1982 port->vdo_count = cnt + 1;
1983 port->vdo_data[0] = header;
1984 memcpy(&port->vdo_data[1], data, sizeof(u32) * cnt);
1985 /* Set ready, vdm state machine will actually send */
1986 port->vdm_retries = 0;
1987 port->vdm_state = VDM_STATE_READY;
1988 port->vdm_sm_running = true;
1989
1990 port->tx_sop_type = tx_sop_type;
1991
1992 mod_vdm_delayed_work(port, 0);
1993 }
1994
tcpm_queue_vdm_work(struct kthread_work * work)1995 static void tcpm_queue_vdm_work(struct kthread_work *work)
1996 {
1997 struct altmode_vdm_event *event = container_of(work,
1998 struct altmode_vdm_event,
1999 work);
2000 struct tcpm_port *port = event->port;
2001
2002 mutex_lock(&port->lock);
2003 if (!tcpm_can_send_vdm(port->state)) {
2004 tcpm_log_force(port, "dropping altmode_vdm_event");
2005 goto port_unlock;
2006 }
2007
2008 tcpm_queue_vdm(port, event->header, event->data, event->cnt, event->tx_sop_type);
2009
2010 port_unlock:
2011 kfree(event);
2012 mutex_unlock(&port->lock);
2013 }
2014
tcpm_queue_vdm_unlocked(struct tcpm_port * port,const u32 header,const u32 * data,int cnt,enum tcpm_transmit_type tx_sop_type)2015 static int tcpm_queue_vdm_unlocked(struct tcpm_port *port, const u32 header,
2016 const u32 *data, int cnt, enum tcpm_transmit_type tx_sop_type)
2017 {
2018 struct altmode_vdm_event *event;
2019 int ret = -ENOMEM;
2020
2021 event = kzalloc_flex(*event, data, cnt);
2022 if (!event)
2023 goto err_event;
2024
2025 kthread_init_work(&event->work, tcpm_queue_vdm_work);
2026 event->cnt = cnt;
2027 event->port = port;
2028 event->header = header;
2029 memcpy(event->data, data, sizeof(u32) * cnt);
2030 event->tx_sop_type = tx_sop_type;
2031
2032 ret = kthread_queue_work(port->wq, &event->work);
2033 if (!ret) {
2034 ret = -EBUSY;
2035 goto err_data;
2036 }
2037
2038 return 0;
2039
2040 err_data:
2041 kfree(event);
2042 err_event:
2043 tcpm_log_force(port, "failed to queue altmode vdm, err:%d", ret);
2044 return ret;
2045 }
2046
svdm_consume_identity(struct tcpm_port * port,const u32 * p,int cnt)2047 static void svdm_consume_identity(struct tcpm_port *port, const u32 *p, int cnt)
2048 {
2049 u32 vdo = p[VDO_INDEX_IDH];
2050 u32 product = p[VDO_INDEX_PRODUCT];
2051
2052 if (cnt <= VDO_INDEX_PRODUCT)
2053 return;
2054
2055 memset(&port->mode_data, 0, sizeof(port->mode_data));
2056
2057 port->partner_ident.id_header = vdo;
2058 port->partner_ident.cert_stat = p[VDO_INDEX_CSTAT];
2059 port->partner_ident.product = product;
2060
2061 if (port->partner)
2062 typec_partner_set_identity(port->partner);
2063
2064 tcpm_log(port, "Identity: %04x:%04x.%04x",
2065 PD_IDH_VID(vdo),
2066 PD_PRODUCT_PID(product), product & 0xffff);
2067 }
2068
svdm_consume_identity_sop_prime(struct tcpm_port * port,const u32 * p,int cnt)2069 static void svdm_consume_identity_sop_prime(struct tcpm_port *port, const u32 *p, int cnt)
2070 {
2071 u32 idh = p[VDO_INDEX_IDH];
2072 u32 product = p[VDO_INDEX_PRODUCT];
2073 int svdm_version;
2074
2075 if (cnt <= VDO_INDEX_CABLE_1)
2076 return;
2077
2078 /*
2079 * Attempt to consume identity only if cable currently is not set
2080 */
2081 if (!IS_ERR_OR_NULL(port->cable))
2082 goto register_plug;
2083
2084 /* Reset cable identity */
2085 memset(&port->cable_ident, 0, sizeof(port->cable_ident));
2086
2087 /* Fill out id header, cert, product, cable VDO 1 */
2088 port->cable_ident.id_header = idh;
2089 port->cable_ident.cert_stat = p[VDO_INDEX_CSTAT];
2090 port->cable_ident.product = product;
2091 port->cable_ident.vdo[0] = p[VDO_INDEX_CABLE_1];
2092
2093 /* Fill out cable desc, infer svdm_version from pd revision */
2094 port->cable_desc.type = (enum typec_plug_type) (VDO_TYPEC_CABLE_TYPE(p[VDO_INDEX_CABLE_1]) +
2095 USB_PLUG_TYPE_A);
2096 port->cable_desc.active = PD_IDH_PTYPE(idh) == IDH_PTYPE_ACABLE ? 1 : 0;
2097 /* Log PD Revision and additional cable VDO from negotiated revision */
2098 switch (port->negotiated_rev_prime) {
2099 case PD_REV30:
2100 port->cable_desc.pd_revision = 0x0300;
2101 if (port->cable_desc.active && cnt > VDO_INDEX_CABLE_2)
2102 port->cable_ident.vdo[1] = p[VDO_INDEX_CABLE_2];
2103 break;
2104 case PD_REV20:
2105 port->cable_desc.pd_revision = 0x0200;
2106 break;
2107 default:
2108 port->cable_desc.pd_revision = 0x0200;
2109 break;
2110 }
2111 port->cable_desc.identity = &port->cable_ident;
2112 /* Register Cable, set identity and svdm_version */
2113 port->cable = typec_register_cable(port->typec_port, &port->cable_desc);
2114 if (IS_ERR_OR_NULL(port->cable))
2115 return;
2116 typec_cable_set_identity(port->cable);
2117 /* Get SVDM version */
2118 svdm_version = PD_VDO_SVDM_VER(p[VDO_INDEX_HDR]);
2119 typec_cable_set_svdm_version(port->cable, svdm_version);
2120
2121 register_plug:
2122 if (IS_ERR_OR_NULL(port->plug_prime)) {
2123 port->plug_prime_desc.index = TYPEC_PLUG_SOP_P;
2124 port->plug_prime = typec_register_plug(port->cable,
2125 &port->plug_prime_desc);
2126 }
2127 }
2128
svdm_consume_svids(struct tcpm_port * port,const u32 * p,int cnt,enum tcpm_transmit_type rx_sop_type)2129 static bool svdm_consume_svids(struct tcpm_port *port, const u32 *p, int cnt,
2130 enum tcpm_transmit_type rx_sop_type)
2131 {
2132 struct pd_mode_data *pmdata = rx_sop_type == TCPC_TX_SOP_PRIME ?
2133 &port->mode_data_prime : &port->mode_data;
2134 int i;
2135
2136 for (i = 1; i < cnt; i++) {
2137 u16 svid;
2138
2139 svid = (p[i] >> 16) & 0xffff;
2140 if (!svid)
2141 return false;
2142
2143 if (pmdata->nsvids >= SVID_DISCOVERY_MAX)
2144 goto abort;
2145
2146 pmdata->svids[pmdata->nsvids++] = svid;
2147 tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
2148
2149 svid = p[i] & 0xffff;
2150 if (!svid)
2151 return false;
2152
2153 if (pmdata->nsvids >= SVID_DISCOVERY_MAX)
2154 goto abort;
2155
2156 pmdata->svids[pmdata->nsvids++] = svid;
2157 tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
2158 }
2159
2160 /*
2161 * PD3.0 Spec 6.4.4.3.2: The SVIDs are returned 2 per VDO (see Table
2162 * 6-43), and can be returned maximum 6 VDOs per response (see Figure
2163 * 6-19). If the Responder supports 12 or more SVID then the Discover
2164 * SVIDs Command Shall be executed multiple times until a Discover
2165 * SVIDs VDO is returned ending either with a SVID value of 0x0000 in
2166 * the last part of the last VDO or with a VDO containing two SVIDs
2167 * with values of 0x0000.
2168 *
2169 * However, some odd dockers support SVIDs less than 12 but without
2170 * 0x0000 in the last VDO, so we need to break the Discover SVIDs
2171 * request and return false here.
2172 */
2173 return cnt == 7;
2174 abort:
2175 tcpm_log(port, "SVID_DISCOVERY_MAX(%d) too low!", SVID_DISCOVERY_MAX);
2176 return false;
2177 }
2178
svdm_consume_modes(struct tcpm_port * port,const u32 * p,int cnt,enum tcpm_transmit_type rx_sop_type)2179 static void svdm_consume_modes(struct tcpm_port *port, const u32 *p, int cnt,
2180 enum tcpm_transmit_type rx_sop_type)
2181 {
2182 struct pd_mode_data *pmdata = &port->mode_data;
2183 struct typec_altmode_desc *paltmode;
2184 int i;
2185
2186 switch (rx_sop_type) {
2187 case TCPC_TX_SOP_PRIME:
2188 pmdata = &port->mode_data_prime;
2189 break;
2190 case TCPC_TX_SOP:
2191 pmdata = &port->mode_data;
2192 break;
2193 default:
2194 return;
2195 }
2196
2197 if (pmdata->svid_index < 0 || pmdata->svid_index >= pmdata->nsvids) {
2198 tcpm_log(port, "Invalid SVID index %d", pmdata->svid_index);
2199 return;
2200 }
2201
2202 for (i = 1; i < cnt; i++) {
2203 if (pmdata->altmodes >= ALTMODE_DISCOVERY_MAX) {
2204 /* Already logged in svdm_consume_svids() */
2205 return;
2206 }
2207 paltmode = &pmdata->altmode_desc[pmdata->altmodes];
2208 memset(paltmode, 0, sizeof(*paltmode));
2209
2210 paltmode->svid = pmdata->svids[pmdata->svid_index];
2211 paltmode->mode = i;
2212 paltmode->vdo = p[i];
2213
2214 tcpm_log(port, " Alternate mode %d: SVID 0x%04x, VDO %d: 0x%08x",
2215 pmdata->altmodes, paltmode->svid,
2216 paltmode->mode, paltmode->vdo);
2217
2218 pmdata->altmodes++;
2219 }
2220 }
2221
tcpm_register_partner_altmodes(struct tcpm_port * port)2222 static void tcpm_register_partner_altmodes(struct tcpm_port *port)
2223 {
2224 struct pd_mode_data *modep = &port->mode_data;
2225 struct typec_altmode *altmode;
2226 int i;
2227
2228 if (!port->partner)
2229 return;
2230
2231 for (i = 0; i < modep->altmodes && i < ALTMODE_DISCOVERY_MAX; i++) {
2232 altmode = typec_partner_register_altmode(port->partner,
2233 &modep->altmode_desc[i]);
2234 if (IS_ERR(altmode)) {
2235 tcpm_log(port, "Failed to register partner SVID 0x%04x",
2236 modep->altmode_desc[i].svid);
2237 altmode = NULL;
2238 }
2239 port->partner_altmode[i] = altmode;
2240 }
2241 }
2242
tcpm_register_plug_altmodes(struct tcpm_port * port)2243 static void tcpm_register_plug_altmodes(struct tcpm_port *port)
2244 {
2245 struct pd_mode_data *modep = &port->mode_data_prime;
2246 struct typec_altmode *altmode;
2247 int i;
2248
2249 typec_plug_set_num_altmodes(port->plug_prime,
2250 min(modep->altmodes, ALTMODE_DISCOVERY_MAX));
2251
2252 for (i = 0; i < modep->altmodes && i < ALTMODE_DISCOVERY_MAX; i++) {
2253 altmode = typec_plug_register_altmode(port->plug_prime,
2254 &modep->altmode_desc[i]);
2255 if (IS_ERR(altmode)) {
2256 tcpm_log(port, "Failed to register plug SVID 0x%04x",
2257 modep->altmode_desc[i].svid);
2258 altmode = NULL;
2259 }
2260 port->plug_prime_altmode[i] = altmode;
2261 }
2262 }
2263
2264 #define supports_modal(port) PD_IDH_MODAL_SUPP((port)->partner_ident.id_header)
2265 #define supports_modal_cable(port) PD_IDH_MODAL_SUPP((port)->cable_ident.id_header)
2266 #define supports_host(port) PD_IDH_HOST_SUPP((port->partner_ident.id_header))
2267
2268 /*
2269 * Helper to determine whether the port is capable of SOP' communication at the
2270 * current point in time.
2271 */
tcpm_can_communicate_sop_prime(struct tcpm_port * port)2272 static bool tcpm_can_communicate_sop_prime(struct tcpm_port *port)
2273 {
2274 /* Check to see if tcpc supports SOP' communication */
2275 if (!port->tcpc->cable_comm_capable || !port->tcpc->cable_comm_capable(port->tcpc))
2276 return false;
2277 /*
2278 * Power Delivery 2.0 Section 6.3.11
2279 * Before communicating with a Cable Plug a Port Should ensure that it
2280 * is the Vconn Source and that the Cable Plugs are powered by
2281 * performing a Vconn swap if necessary. Since it cannot be guaranteed
2282 * that the present Vconn Source is supplying Vconn, the only means to
2283 * ensure that the Cable Plugs are powered is for a Port wishing to
2284 * communicate with a Cable Plug is to become the Vconn Source.
2285 *
2286 * Power Delivery 3.0 Section 6.3.11
2287 * Before communicating with a Cable Plug a Port Shall ensure that it
2288 * is the Vconn source.
2289 */
2290 if (port->vconn_role != TYPEC_SOURCE)
2291 return false;
2292 /*
2293 * Power Delivery 2.0 Section 2.4.4
2294 * When no Contract or an Implicit Contract is in place the Source can
2295 * communicate with a Cable Plug using SOP' packets in order to discover
2296 * its characteristics.
2297 *
2298 * Power Delivery 3.0 Section 2.4.4
2299 * When no Contract or an Implicit Contract is in place only the Source
2300 * port that is supplying Vconn is allowed to send packets to a Cable
2301 * Plug and is allowed to respond to packets from the Cable Plug.
2302 */
2303 if (!port->explicit_contract)
2304 return port->pwr_role == TYPEC_SOURCE;
2305 if (port->negotiated_rev == PD_REV30)
2306 return true;
2307 /*
2308 * Power Delivery 2.0 Section 2.4.4
2309 *
2310 * When an Explicit Contract is in place the DFP (either the Source or
2311 * the Sink) can communicate with the Cable Plug(s) using SOP’/SOP”
2312 * Packets (see Figure 2-3).
2313 */
2314 if (port->negotiated_rev == PD_REV20)
2315 return port->data_role == TYPEC_HOST;
2316 return false;
2317 }
2318
tcpm_attempt_vconn_swap_discovery(struct tcpm_port * port)2319 static bool tcpm_attempt_vconn_swap_discovery(struct tcpm_port *port)
2320 {
2321 if (!port->tcpc->attempt_vconn_swap_discovery)
2322 return false;
2323
2324 /* Port is already source, no need to perform swap */
2325 if (port->vconn_role == TYPEC_SOURCE)
2326 return false;
2327
2328 /*
2329 * Partner needs to support Alternate Modes with modal support. If
2330 * partner is also capable of being a USB Host, it could be a device
2331 * that supports Alternate Modes as the DFP.
2332 */
2333 if (!supports_modal(port) || supports_host(port))
2334 return false;
2335
2336 if ((port->negotiated_rev == PD_REV20 && port->data_role == TYPEC_HOST) ||
2337 port->negotiated_rev == PD_REV30)
2338 return port->tcpc->attempt_vconn_swap_discovery(port->tcpc);
2339
2340 return false;
2341 }
2342
2343
tcpm_cable_vdm_supported(struct tcpm_port * port)2344 static bool tcpm_cable_vdm_supported(struct tcpm_port *port)
2345 {
2346 return !IS_ERR_OR_NULL(port->cable) &&
2347 typec_cable_is_active(port->cable) &&
2348 supports_modal_cable(port) &&
2349 tcpm_can_communicate_sop_prime(port);
2350 }
2351
tcpm_update_vdm_discovery_state(struct tcpm_port * port,enum vdm_discovery_states new_state)2352 static void tcpm_update_vdm_discovery_state(struct tcpm_port *port,
2353 enum vdm_discovery_states new_state)
2354 {
2355 enum vdm_discovery_states old_state = port->vdm_discovery_state;
2356
2357 if (old_state != new_state)
2358 tcpm_log_force(port, "vdm discovery state changed: %s -> %s",
2359 vdm_discovery_state_strings[old_state],
2360 vdm_discovery_state_strings[new_state]);
2361
2362 port->vdm_discovery_state = new_state;
2363 }
2364
tcpm_handle_discover_mode(struct tcpm_port * port,u32 * response,enum tcpm_transmit_type rx_sop_type,enum tcpm_transmit_type * response_tx_sop_type)2365 static int tcpm_handle_discover_mode(struct tcpm_port *port, u32 *response,
2366 enum tcpm_transmit_type rx_sop_type,
2367 enum tcpm_transmit_type *response_tx_sop_type)
2368 {
2369 struct typec_port *typec = port->typec_port;
2370 struct pd_mode_data *modep;
2371
2372 if (rx_sop_type == TCPC_TX_SOP) {
2373 modep = &port->mode_data;
2374 modep->svid_index++;
2375
2376 if (modep->svid_index < modep->nsvids) {
2377 u16 svid = modep->svids[modep->svid_index];
2378 *response_tx_sop_type = TCPC_TX_SOP;
2379 response[0] = VDO(svid, 1,
2380 typec_get_negotiated_svdm_version(typec),
2381 CMD_DISCOVER_MODES);
2382 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_PARTNER_MODES);
2383 return 1;
2384 }
2385
2386 if (tcpm_cable_vdm_supported(port)) {
2387 *response_tx_sop_type = TCPC_TX_SOP_PRIME;
2388 response[0] = VDO(USB_SID_PD, 1,
2389 typec_get_cable_svdm_version(typec),
2390 CMD_DISCOVER_SVID);
2391 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_PARTNER_MODES);
2392 return 1;
2393 }
2394
2395 tcpm_register_partner_altmodes(port);
2396 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
2397 } else if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2398 modep = &port->mode_data_prime;
2399 modep->svid_index++;
2400
2401 if (modep->svid_index < modep->nsvids) {
2402 u16 svid = modep->svids[modep->svid_index];
2403 *response_tx_sop_type = TCPC_TX_SOP_PRIME;
2404 response[0] = VDO(svid, 1,
2405 typec_get_cable_svdm_version(typec),
2406 CMD_DISCOVER_MODES);
2407 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_CABLE_MODES);
2408 return 1;
2409 }
2410
2411 tcpm_register_plug_altmodes(port);
2412 tcpm_register_partner_altmodes(port);
2413 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
2414 }
2415
2416 return 0;
2417 }
2418
tcpm_pd_svdm(struct tcpm_port * port,struct typec_altmode * adev,const u32 * p,int cnt,u32 * response,enum adev_actions * adev_action,enum tcpm_transmit_type rx_sop_type,enum tcpm_transmit_type * response_tx_sop_type)2419 static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
2420 const u32 *p, int cnt, u32 *response,
2421 enum adev_actions *adev_action,
2422 enum tcpm_transmit_type rx_sop_type,
2423 enum tcpm_transmit_type *response_tx_sop_type)
2424 {
2425 struct typec_port *typec = port->typec_port;
2426 struct typec_altmode *pdev, *pdev_prime;
2427 struct pd_mode_data *modep, *modep_prime;
2428 int svdm_version;
2429 int rlen = 0;
2430 int cmd_type;
2431 int cmd;
2432 int i;
2433 int ret;
2434
2435 cmd_type = PD_VDO_CMDT(p[0]);
2436 cmd = PD_VDO_CMD(p[0]);
2437
2438 tcpm_log(port, "Rx VDM cmd 0x%x type %d cmd %d len %d",
2439 p[0], cmd_type, cmd, cnt);
2440
2441 switch (rx_sop_type) {
2442 case TCPC_TX_SOP_PRIME:
2443 modep_prime = &port->mode_data_prime;
2444 pdev_prime = typec_match_altmode(port->plug_prime_altmode,
2445 ALTMODE_DISCOVERY_MAX,
2446 PD_VDO_VID(p[0]),
2447 PD_VDO_OPOS(p[0]));
2448 svdm_version = typec_get_cable_svdm_version(typec);
2449 /*
2450 * Update SVDM version if cable was discovered before port partner.
2451 */
2452 if (!IS_ERR_OR_NULL(port->cable) &&
2453 PD_VDO_SVDM_VER(p[0]) < svdm_version)
2454 typec_cable_set_svdm_version(port->cable, svdm_version);
2455 break;
2456 case TCPC_TX_SOP:
2457 modep = &port->mode_data;
2458 pdev = typec_match_altmode(port->partner_altmode,
2459 ALTMODE_DISCOVERY_MAX,
2460 PD_VDO_VID(p[0]),
2461 PD_VDO_OPOS(p[0]));
2462 svdm_version = typec_get_negotiated_svdm_version(typec);
2463 if (svdm_version < 0)
2464 return 0;
2465 break;
2466 default:
2467 modep = &port->mode_data;
2468 pdev = typec_match_altmode(port->partner_altmode,
2469 ALTMODE_DISCOVERY_MAX,
2470 PD_VDO_VID(p[0]),
2471 PD_VDO_OPOS(p[0]));
2472 svdm_version = typec_get_negotiated_svdm_version(typec);
2473 if (svdm_version < 0)
2474 return 0;
2475 break;
2476 }
2477
2478 switch (cmd_type) {
2479 case CMDT_INIT:
2480 /*
2481 * Only the port or port partner is allowed to initialize SVDM
2482 * commands over SOP'. In case the port partner initializes a
2483 * sequence when it is not allowed to send SOP' messages, drop
2484 * the message should the TCPM port try to process it.
2485 */
2486 if (rx_sop_type == TCPC_TX_SOP_PRIME)
2487 return 0;
2488
2489 switch (cmd) {
2490 case CMD_DISCOVER_IDENT:
2491 if (PD_VDO_VID(p[0]) != USB_SID_PD)
2492 break;
2493
2494 if (IS_ERR_OR_NULL(port->partner))
2495 break;
2496
2497 if (PD_VDO_SVDM_VER(p[0]) < svdm_version) {
2498 typec_partner_set_svdm_version(port->partner,
2499 PD_VDO_SVDM_VER(p[0]));
2500 svdm_version = PD_VDO_SVDM_VER(p[0]);
2501 }
2502
2503 port->ams = DISCOVER_IDENTITY;
2504 /*
2505 * PD2.0 Spec 6.10.3: respond with NAK as DFP (data host)
2506 * PD3.1 Spec 6.4.4.2.5.1: respond with NAK if "invalid field" or
2507 * "wrong configuation" or "Unrecognized"
2508 */
2509 if ((port->data_role == TYPEC_DEVICE || svdm_version >= SVDM_VER_2_0) &&
2510 port->nr_snk_vdo) {
2511 if (svdm_version < SVDM_VER_2_0) {
2512 for (i = 0; i < port->nr_snk_vdo_v1; i++)
2513 response[i + 1] = port->snk_vdo_v1[i];
2514 rlen = port->nr_snk_vdo_v1 + 1;
2515
2516 } else {
2517 for (i = 0; i < port->nr_snk_vdo; i++)
2518 response[i + 1] = port->snk_vdo[i];
2519 rlen = port->nr_snk_vdo + 1;
2520 }
2521 }
2522 break;
2523 case CMD_DISCOVER_SVID:
2524 port->ams = DISCOVER_SVIDS;
2525 break;
2526 case CMD_DISCOVER_MODES:
2527 port->ams = DISCOVER_MODES;
2528 break;
2529 case CMD_ENTER_MODE:
2530 port->ams = DFP_TO_UFP_ENTER_MODE;
2531 break;
2532 case CMD_EXIT_MODE:
2533 port->ams = DFP_TO_UFP_EXIT_MODE;
2534 break;
2535 case CMD_ATTENTION:
2536 /* Attention command does not have response */
2537 *adev_action = ADEV_ATTENTION;
2538 return 0;
2539 default:
2540 break;
2541 }
2542 if (rlen >= 1) {
2543 response[0] = p[0] | VDO_CMDT(CMDT_RSP_ACK);
2544 } else if (rlen == 0) {
2545 response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
2546 rlen = 1;
2547 } else {
2548 response[0] = p[0] | VDO_CMDT(CMDT_RSP_BUSY);
2549 rlen = 1;
2550 }
2551 response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
2552 (VDO_SVDM_VERS(typec_get_negotiated_svdm_version(typec)));
2553 break;
2554 case CMDT_RSP_ACK:
2555 /*
2556 * Silently drop message if we are not connected, but can process
2557 * if SOP' Discover Identity prior to explicit contract.
2558 */
2559 if (IS_ERR_OR_NULL(port->partner) &&
2560 !(rx_sop_type == TCPC_TX_SOP_PRIME && cmd == CMD_DISCOVER_IDENT))
2561 break;
2562
2563 tcpm_ams_finish(port);
2564
2565 switch (cmd) {
2566 /*
2567 * SVDM Command Flow for SOP and SOP':
2568 * SOP Discover Identity
2569 * SOP' Discover Identity
2570 * SOP Discover SVIDs
2571 * Discover Modes
2572 * (Active Cables)
2573 * SOP' Discover SVIDs
2574 * Discover Modes
2575 *
2576 * Perform Discover SOP' if the port can communicate with cable
2577 * plug.
2578 */
2579 case CMD_DISCOVER_IDENT:
2580 switch (rx_sop_type) {
2581 case TCPC_TX_SOP:
2582 if (PD_VDO_SVDM_VER(p[0]) < svdm_version) {
2583 typec_partner_set_svdm_version(port->partner,
2584 PD_VDO_SVDM_VER(p[0]));
2585 /* If cable is discovered before partner, downgrade svdm */
2586 if (!IS_ERR_OR_NULL(port->cable) &&
2587 (typec_get_cable_svdm_version(port->typec_port) >
2588 svdm_version))
2589 typec_cable_set_svdm_version(port->cable,
2590 svdm_version);
2591 }
2592 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_PARTNER_IDENT);
2593
2594 /* 6.4.4.3.1 */
2595 svdm_consume_identity(port, p, cnt);
2596 /* Attempt Vconn swap, delay SOP' discovery if necessary */
2597 if (tcpm_attempt_vconn_swap_discovery(port)) {
2598 port->upcoming_state = VCONN_SWAP_SEND;
2599 ret = tcpm_ams_start(port, VCONN_SWAP);
2600 if (!ret)
2601 return 0;
2602 /* Cannot perform Vconn swap */
2603 port->upcoming_state = INVALID_STATE;
2604 }
2605
2606 /*
2607 * Attempt Discover Identity on SOP' if the
2608 * cable was not discovered previously, and use
2609 * the SVDM version of the partner to probe.
2610 */
2611 if (IS_ERR_OR_NULL(port->cable) &&
2612 tcpm_can_communicate_sop_prime(port)) {
2613 *response_tx_sop_type = TCPC_TX_SOP_PRIME;
2614 response[0] = VDO(USB_SID_PD, 1,
2615 typec_get_negotiated_svdm_version(typec),
2616 CMD_DISCOVER_IDENT);
2617 rlen = 1;
2618 } else {
2619 *response_tx_sop_type = TCPC_TX_SOP;
2620 response[0] = VDO(USB_SID_PD, 1,
2621 typec_get_negotiated_svdm_version(typec),
2622 CMD_DISCOVER_SVID);
2623 rlen = 1;
2624 }
2625 break;
2626 case TCPC_TX_SOP_PRIME:
2627 /*
2628 * svdm_consume_identity_sop_prime will determine
2629 * the svdm_version for the cable moving forward.
2630 */
2631 svdm_consume_identity_sop_prime(port, p, cnt);
2632
2633 /*
2634 * If received in SRC_VDM_IDENTITY_REQUEST, continue
2635 * to SRC_SEND_CAPABILITIES
2636 */
2637 if (port->state == SRC_VDM_IDENTITY_REQUEST) {
2638 tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
2639 return 0;
2640 }
2641 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_CABLE_IDENT);
2642
2643 *response_tx_sop_type = TCPC_TX_SOP;
2644 response[0] = VDO(USB_SID_PD, 1,
2645 typec_get_negotiated_svdm_version(typec),
2646 CMD_DISCOVER_SVID);
2647 rlen = 1;
2648 break;
2649 default:
2650 return 0;
2651 }
2652 break;
2653 case CMD_DISCOVER_SVID:
2654 *response_tx_sop_type = rx_sop_type;
2655 /* 6.4.4.3.2 */
2656 if (svdm_consume_svids(port, p, cnt, rx_sop_type)) {
2657 response[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_SVID);
2658 rlen = 1;
2659 } else {
2660 if (rx_sop_type == TCPC_TX_SOP) {
2661 tcpm_update_vdm_discovery_state(port,
2662 VDM_DISCOVERY_PARTNER_SVIDS);
2663 if (modep->nsvids && supports_modal(port)) {
2664 response[0] = VDO(modep->svids[0], 1, svdm_version,
2665 CMD_DISCOVER_MODES);
2666 rlen = 1;
2667 } else {
2668 tcpm_update_vdm_discovery_state(port,
2669 VDM_DISCOVERY_COMPLETE);
2670 }
2671 } else if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2672 tcpm_update_vdm_discovery_state(port,
2673 VDM_DISCOVERY_CABLE_SVIDS);
2674 if (modep_prime->nsvids) {
2675 response[0] = VDO(modep_prime->svids[0], 1,
2676 svdm_version, CMD_DISCOVER_MODES);
2677 rlen = 1;
2678 } else {
2679 tcpm_register_partner_altmodes(port);
2680 tcpm_update_vdm_discovery_state(port,
2681 VDM_DISCOVERY_COMPLETE);
2682 }
2683 }
2684 }
2685 break;
2686 case CMD_DISCOVER_MODES:
2687 /* 6.4.4.3.3 */
2688 svdm_consume_modes(port, p, cnt, rx_sop_type);
2689 rlen = tcpm_handle_discover_mode(port, response,
2690 rx_sop_type,
2691 response_tx_sop_type);
2692 break;
2693 case CMD_ENTER_MODE:
2694 *response_tx_sop_type = rx_sop_type;
2695 if (rx_sop_type == TCPC_TX_SOP) {
2696 if (adev && pdev) {
2697 typec_altmode_update_active(pdev, true);
2698 *adev_action = ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL;
2699 }
2700 } else if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2701 if (adev && pdev_prime) {
2702 typec_altmode_update_active(pdev_prime, true);
2703 *adev_action = ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL;
2704 }
2705 }
2706 return 0;
2707 case CMD_EXIT_MODE:
2708 *response_tx_sop_type = rx_sop_type;
2709 if (rx_sop_type == TCPC_TX_SOP) {
2710 if (adev && pdev) {
2711 typec_altmode_update_active(pdev, false);
2712 /* Back to USB Operation */
2713 *adev_action = ADEV_NOTIFY_USB_AND_QUEUE_VDM;
2714 return 0;
2715 }
2716 }
2717 break;
2718 case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
2719 break;
2720 default:
2721 /* Unrecognized SVDM */
2722 response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
2723 rlen = 1;
2724 response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
2725 (VDO_SVDM_VERS(svdm_version));
2726 break;
2727 }
2728 break;
2729 case CMDT_RSP_NAK:
2730 tcpm_ams_finish(port);
2731 switch (cmd) {
2732 /*
2733 * The cable is not allowed to respond with NAK so this must've happened over SOP
2734 */
2735 case CMD_DISCOVER_IDENT:
2736 case CMD_DISCOVER_SVID:
2737 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
2738 break;
2739 case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
2740 break;
2741 case CMD_DISCOVER_MODES:
2742 tcpm_log(port, "Skip SVID 0x%04x (failed to discover mode)",
2743 PD_VDO_SVID_SVID0(p[0]));
2744 rlen = tcpm_handle_discover_mode(port, response,
2745 rx_sop_type,
2746 response_tx_sop_type);
2747 break;
2748 case CMD_ENTER_MODE:
2749 /* Back to USB Operation */
2750 *adev_action = ADEV_NOTIFY_USB_AND_QUEUE_VDM;
2751 return 0;
2752 default:
2753 /* Unrecognized SVDM */
2754 response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
2755 rlen = 1;
2756 response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
2757 (VDO_SVDM_VERS(svdm_version));
2758 break;
2759 }
2760 break;
2761 default:
2762 response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
2763 rlen = 1;
2764 response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
2765 (VDO_SVDM_VERS(svdm_version));
2766 break;
2767 }
2768
2769 /* Informing the alternate mode drivers about everything */
2770 *adev_action = ADEV_QUEUE_VDM;
2771 return rlen;
2772 }
2773
2774 static void tcpm_pd_handle_msg(struct tcpm_port *port,
2775 enum pd_msg_request message,
2776 enum tcpm_ams ams);
2777
tcpm_handle_vdm_request(struct tcpm_port * port,const __le32 * payload,int cnt,enum tcpm_transmit_type rx_sop_type)2778 static void tcpm_handle_vdm_request(struct tcpm_port *port,
2779 const __le32 *payload, int cnt,
2780 enum tcpm_transmit_type rx_sop_type)
2781 {
2782 enum adev_actions adev_action = ADEV_NONE;
2783 struct typec_altmode *adev;
2784 u32 p[PD_MAX_PAYLOAD];
2785 u32 response[8] = { };
2786 int i, rlen = 0;
2787 enum tcpm_transmit_type response_tx_sop_type = TCPC_TX_SOP;
2788
2789 for (i = 0; i < cnt; i++)
2790 p[i] = le32_to_cpu(payload[i]);
2791
2792 adev = typec_match_altmode(port->port_altmode, ALTMODE_DISCOVERY_MAX,
2793 PD_VDO_VID(p[0]), PD_VDO_OPOS(p[0]));
2794
2795 if (port->vdm_state == VDM_STATE_BUSY) {
2796 /* If UFP responded busy retry after timeout */
2797 if (PD_VDO_CMDT(p[0]) == CMDT_RSP_BUSY) {
2798 port->vdm_state = VDM_STATE_WAIT_RSP_BUSY;
2799 port->vdo_retry = (p[0] & ~VDO_CMDT_MASK) |
2800 CMDT_INIT;
2801 mod_vdm_delayed_work(port, PD_T_VDM_BUSY);
2802 return;
2803 }
2804 port->vdm_state = VDM_STATE_DONE;
2805 }
2806
2807 if (PD_VDO_SVDM(p[0]) && (adev || tcpm_vdm_ams(port) || port->nr_snk_vdo)) {
2808 /*
2809 * Here a SVDM is received (INIT or RSP or unknown). Set the vdm_sm_running in
2810 * advance because we are dropping the lock but may send VDMs soon.
2811 * For the cases of INIT received:
2812 * - If no response to send, it will be cleared later in this function.
2813 * - If there are responses to send, it will be cleared in the state machine.
2814 * For the cases of RSP received:
2815 * - If no further INIT to send, it will be cleared later in this function.
2816 * - Otherwise, it will be cleared in the state machine if timeout or it will go
2817 * back here until no further INIT to send.
2818 * For the cases of unknown type received:
2819 * - We will send NAK and the flag will be cleared in the state machine.
2820 */
2821 port->vdm_sm_running = true;
2822 rlen = tcpm_pd_svdm(port, adev, p, cnt, response, &adev_action,
2823 rx_sop_type, &response_tx_sop_type);
2824 } else {
2825 if (port->negotiated_rev >= PD_REV30)
2826 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
2827 }
2828
2829 /*
2830 * We are done with any state stored in the port struct now, except
2831 * for any port struct changes done by the tcpm_queue_vdm() call
2832 * below, which is a separate operation.
2833 *
2834 * So we can safely release the lock here; and we MUST release the
2835 * lock here to avoid an AB BA lock inversion:
2836 *
2837 * If we keep the lock here then the lock ordering in this path is:
2838 * 1. tcpm_pd_rx_handler take the tcpm port lock
2839 * 2. One of the typec_altmode_* calls below takes the alt-mode's lock
2840 *
2841 * And we also have this ordering:
2842 * 1. alt-mode driver takes the alt-mode's lock
2843 * 2. alt-mode driver calls tcpm_altmode_enter which takes the
2844 * tcpm port lock
2845 *
2846 * Dropping our lock here avoids this.
2847 */
2848 mutex_unlock(&port->lock);
2849
2850 if (adev) {
2851 switch (adev_action) {
2852 case ADEV_NONE:
2853 break;
2854 case ADEV_NOTIFY_USB_AND_QUEUE_VDM:
2855 if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2856 typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P, p[0], &p[1], cnt);
2857 } else {
2858 WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, NULL));
2859 typec_altmode_vdm(adev, p[0], &p[1], cnt);
2860 }
2861 break;
2862 case ADEV_QUEUE_VDM:
2863 if (rx_sop_type == TCPC_TX_SOP_PRIME)
2864 typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P, p[0], &p[1], cnt);
2865 else
2866 typec_altmode_vdm(adev, p[0], &p[1], cnt);
2867 break;
2868 case ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL:
2869 if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2870 if (typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P,
2871 p[0], &p[1], cnt)) {
2872 int svdm_version = typec_get_cable_svdm_version(
2873 port->typec_port);
2874 if (svdm_version < 0)
2875 break;
2876
2877 response[0] = VDO(adev->svid, 1, svdm_version,
2878 CMD_EXIT_MODE);
2879 response[0] |= VDO_OPOS(adev->mode);
2880 rlen = 1;
2881 }
2882 } else {
2883 if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) {
2884 int svdm_version = typec_get_negotiated_svdm_version(
2885 port->typec_port);
2886 if (svdm_version < 0)
2887 break;
2888
2889 response[0] = VDO(adev->svid, 1, svdm_version,
2890 CMD_EXIT_MODE);
2891 response[0] |= VDO_OPOS(adev->mode);
2892 rlen = 1;
2893 }
2894 }
2895 break;
2896 case ADEV_ATTENTION:
2897 if (typec_altmode_attention(adev, p[1]))
2898 tcpm_log(port, "typec_altmode_attention no port partner altmode");
2899 break;
2900 }
2901 }
2902
2903 /*
2904 * We must re-take the lock here to balance the unlock in
2905 * tcpm_pd_rx_handler, note that no changes, other then the
2906 * tcpm_queue_vdm call, are made while the lock is held again.
2907 * All that is done after the call is unwinding the call stack until
2908 * we return to tcpm_pd_rx_handler and do the unlock there.
2909 */
2910 mutex_lock(&port->lock);
2911
2912 if (rlen > 0)
2913 tcpm_queue_vdm(port, response[0], &response[1], rlen - 1, response_tx_sop_type);
2914 else
2915 port->vdm_sm_running = false;
2916 }
2917
vdm_ready_timeout(u32 vdm_hdr)2918 static unsigned int vdm_ready_timeout(u32 vdm_hdr)
2919 {
2920 unsigned int timeout;
2921 int cmd = PD_VDO_CMD(vdm_hdr);
2922
2923 /* its not a structured VDM command */
2924 if (!PD_VDO_SVDM(vdm_hdr))
2925 return PD_T_VDM_UNSTRUCTURED;
2926
2927 switch (PD_VDO_CMDT(vdm_hdr)) {
2928 case CMDT_INIT:
2929 if (cmd == CMD_ENTER_MODE || cmd == CMD_EXIT_MODE)
2930 timeout = PD_T_VDM_WAIT_MODE_E;
2931 else
2932 timeout = PD_T_VDM_SNDR_RSP;
2933 break;
2934 default:
2935 if (cmd == CMD_ENTER_MODE || cmd == CMD_EXIT_MODE)
2936 timeout = PD_T_VDM_E_MODE;
2937 else
2938 timeout = PD_T_VDM_RCVR_RSP;
2939 break;
2940 }
2941 return timeout;
2942 }
2943
vdm_run_state_machine(struct tcpm_port * port)2944 static void vdm_run_state_machine(struct tcpm_port *port)
2945 {
2946 struct pd_message msg;
2947 int i, res = 0;
2948 u32 vdo_hdr = port->vdo_data[0];
2949 u32 response[8] = { };
2950
2951 switch (port->vdm_state) {
2952 case VDM_STATE_READY:
2953 /* Only transmit VDM if attached */
2954 if (!port->attached) {
2955 port->vdm_state = VDM_STATE_ERR_BUSY;
2956 break;
2957 }
2958
2959 /*
2960 * if there's traffic or we're not in PDO ready state don't send
2961 * a VDM.
2962 */
2963 if (!tcpm_can_send_vdm(port->state)) {
2964 port->vdm_sm_running = false;
2965 break;
2966 }
2967
2968 /* TODO: AMS operation for Unstructured VDM */
2969 if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) {
2970 switch (PD_VDO_CMD(vdo_hdr)) {
2971 case CMD_DISCOVER_IDENT:
2972 res = tcpm_ams_start(port, DISCOVER_IDENTITY);
2973 if (res == -EAGAIN) {
2974 port->vdo_data[0] = 0;
2975 mod_vdm_discovery_delayed_work(port,
2976 SEND_DISCOVERY_VDM_RETRY_MS);
2977 }
2978 break;
2979 case CMD_DISCOVER_SVID:
2980 res = tcpm_ams_start(port, DISCOVER_SVIDS);
2981 break;
2982 case CMD_DISCOVER_MODES:
2983 res = tcpm_ams_start(port, DISCOVER_MODES);
2984 break;
2985 case CMD_ENTER_MODE:
2986 res = tcpm_ams_start(port, DFP_TO_UFP_ENTER_MODE);
2987 break;
2988 case CMD_EXIT_MODE:
2989 res = tcpm_ams_start(port, DFP_TO_UFP_EXIT_MODE);
2990 break;
2991 case CMD_ATTENTION:
2992 res = tcpm_ams_start(port, ATTENTION);
2993 break;
2994 case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
2995 res = tcpm_ams_start(port, STRUCTURED_VDMS);
2996 break;
2997 default:
2998 res = -EOPNOTSUPP;
2999 break;
3000 }
3001
3002 if (res < 0) {
3003 port->vdm_state = VDM_STATE_ERR_BUSY;
3004 return;
3005 }
3006 }
3007
3008 port->vdm_state = VDM_STATE_SEND_MESSAGE;
3009 mod_vdm_delayed_work(port, (port->negotiated_rev >= PD_REV30 &&
3010 port->pwr_role == TYPEC_SOURCE &&
3011 PD_VDO_SVDM(vdo_hdr) &&
3012 PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) ?
3013 PD_T_SINK_TX : 0);
3014 break;
3015 case VDM_STATE_WAIT_RSP_BUSY:
3016 port->vdo_data[0] = port->vdo_retry;
3017 port->vdo_count = 1;
3018 port->vdm_state = VDM_STATE_READY;
3019 tcpm_ams_finish(port);
3020 break;
3021 case VDM_STATE_BUSY:
3022 port->vdm_state = VDM_STATE_ERR_TMOUT;
3023 if (port->ams != NONE_AMS)
3024 tcpm_ams_finish(port);
3025 break;
3026 case VDM_STATE_ERR_SEND:
3027 /*
3028 * When sending Discover Identity to SOP' before establishing an
3029 * explicit contract, do not retry. Instead, weave sending
3030 * Source_Capabilities over SOP and Discover Identity over SOP'.
3031 */
3032 if (port->state == SRC_VDM_IDENTITY_REQUEST) {
3033 tcpm_ams_finish(port);
3034 port->vdo_data[0] = 0;
3035 port->vdm_state = VDM_STATE_DONE;
3036 tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
3037 /*
3038 * A partner which does not support USB PD will not reply,
3039 * so this is not a fatal error. At the same time, some
3040 * devices may not return GoodCRC under some circumstances,
3041 * so we need to retry.
3042 */
3043 } else if (port->vdm_retries < 3) {
3044 tcpm_log(port, "VDM Tx error, retry");
3045 port->vdm_retries++;
3046 port->vdm_state = VDM_STATE_READY;
3047 if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT)
3048 tcpm_ams_finish(port);
3049 } else {
3050 tcpm_ams_finish(port);
3051 port->vdo_data[0] = 0;
3052 if (port->tx_sop_type == TCPC_TX_SOP)
3053 break;
3054 /* Handle SOP' Transmission Errors */
3055 switch (PD_VDO_CMD(vdo_hdr)) {
3056 /*
3057 * If Discover Identity fails on SOP', then resume
3058 * discovery process on SOP only.
3059 */
3060 case CMD_DISCOVER_IDENT:
3061 response[0] = VDO(USB_SID_PD, 1,
3062 typec_get_negotiated_svdm_version(
3063 port->typec_port),
3064 CMD_DISCOVER_SVID);
3065 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_CABLE_IDENT);
3066 tcpm_queue_vdm(port, response[0], &response[1],
3067 0, TCPC_TX_SOP);
3068 break;
3069 /*
3070 * If Discover SVIDs or Discover Modes fail, then
3071 * proceed with Alt Mode discovery process on SOP.
3072 */
3073 case CMD_DISCOVER_SVID:
3074 tcpm_register_partner_altmodes(port);
3075 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
3076 break;
3077 case CMD_DISCOVER_MODES:
3078 tcpm_register_partner_altmodes(port);
3079 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
3080 break;
3081 default:
3082 break;
3083 }
3084 }
3085 break;
3086 case VDM_STATE_SEND_MESSAGE:
3087 /* Prepare and send VDM */
3088 memset(&msg, 0, sizeof(msg));
3089 if (port->tx_sop_type == TCPC_TX_SOP_PRIME) {
3090 msg.header = PD_HEADER_LE(PD_DATA_VENDOR_DEF,
3091 0, /* Cable Plug Indicator for DFP/UFP */
3092 0, /* Reserved */
3093 port->negotiated_rev_prime,
3094 port->message_id_prime,
3095 port->vdo_count);
3096 } else {
3097 msg.header = PD_HEADER_LE(PD_DATA_VENDOR_DEF,
3098 port->pwr_role,
3099 port->data_role,
3100 port->negotiated_rev,
3101 port->message_id,
3102 port->vdo_count);
3103 }
3104 for (i = 0; i < port->vdo_count; i++)
3105 msg.payload[i] = cpu_to_le32(port->vdo_data[i]);
3106 res = tcpm_pd_transmit(port, port->tx_sop_type, &msg);
3107 if (res < 0) {
3108 port->vdm_state = VDM_STATE_ERR_SEND;
3109 } else {
3110 unsigned long timeout;
3111
3112 port->vdm_retries = 0;
3113 port->vdo_data[0] = 0;
3114 port->vdm_state = VDM_STATE_BUSY;
3115 timeout = vdm_ready_timeout(vdo_hdr);
3116 mod_vdm_delayed_work(port, timeout);
3117 }
3118 break;
3119 default:
3120 break;
3121 }
3122 }
3123
vdm_state_machine_work(struct kthread_work * work)3124 static void vdm_state_machine_work(struct kthread_work *work)
3125 {
3126 struct tcpm_port *port = container_of(work, struct tcpm_port, vdm_state_machine);
3127 enum vdm_states prev_state;
3128
3129 mutex_lock(&port->lock);
3130
3131 /*
3132 * Continue running as long as the port is not busy and there was
3133 * a state change.
3134 */
3135 do {
3136 prev_state = port->vdm_state;
3137 vdm_run_state_machine(port);
3138 } while (port->vdm_state != prev_state &&
3139 port->vdm_state != VDM_STATE_BUSY &&
3140 port->vdm_state != VDM_STATE_SEND_MESSAGE);
3141
3142 if (port->vdm_state < VDM_STATE_READY)
3143 port->vdm_sm_running = false;
3144
3145 mutex_unlock(&port->lock);
3146 }
3147
3148 enum pdo_err {
3149 PDO_NO_ERR,
3150 PDO_ERR_NO_VSAFE5V,
3151 PDO_ERR_VSAFE5V_NOT_FIRST,
3152 PDO_ERR_PDO_TYPE_NOT_IN_ORDER,
3153 PDO_ERR_FIXED_NOT_SORTED,
3154 PDO_ERR_VARIABLE_BATT_NOT_SORTED,
3155 PDO_ERR_DUPE_PDO,
3156 PDO_ERR_PPS_APDO_NOT_SORTED,
3157 PDO_ERR_DUPE_PPS_APDO,
3158 };
3159
3160 static const char * const pdo_err_msg[] = {
3161 [PDO_ERR_NO_VSAFE5V] =
3162 " err: source/sink caps should at least have vSafe5V",
3163 [PDO_ERR_VSAFE5V_NOT_FIRST] =
3164 " err: vSafe5V Fixed Supply Object Shall always be the first object",
3165 [PDO_ERR_PDO_TYPE_NOT_IN_ORDER] =
3166 " err: PDOs should be in the following order: Fixed; Battery; Variable",
3167 [PDO_ERR_FIXED_NOT_SORTED] =
3168 " err: Fixed supply pdos should be in increasing order of their fixed voltage",
3169 [PDO_ERR_VARIABLE_BATT_NOT_SORTED] =
3170 " err: Variable/Battery supply pdos should be in increasing order of their minimum voltage",
3171 [PDO_ERR_DUPE_PDO] =
3172 " err: Variable/Batt supply pdos cannot have same min/max voltage",
3173 [PDO_ERR_PPS_APDO_NOT_SORTED] =
3174 " err: Programmable power supply apdos should be in increasing order of their maximum voltage",
3175 [PDO_ERR_DUPE_PPS_APDO] =
3176 " err: Programmable power supply apdos cannot have same min/max voltage and max current",
3177 };
3178
tcpm_caps_err(struct tcpm_port * port,const u32 * pdo,unsigned int nr_pdo)3179 static enum pdo_err tcpm_caps_err(struct tcpm_port *port, const u32 *pdo,
3180 unsigned int nr_pdo)
3181 {
3182 unsigned int i;
3183
3184 /* Should at least contain vSafe5v */
3185 if (nr_pdo < 1)
3186 return PDO_ERR_NO_VSAFE5V;
3187
3188 /* The vSafe5V Fixed Supply Object Shall always be the first object */
3189 if (pdo_type(pdo[0]) != PDO_TYPE_FIXED ||
3190 pdo_fixed_voltage(pdo[0]) != VSAFE5V)
3191 return PDO_ERR_VSAFE5V_NOT_FIRST;
3192
3193 for (i = 1; i < nr_pdo; i++) {
3194 if (pdo_type(pdo[i]) < pdo_type(pdo[i - 1])) {
3195 return PDO_ERR_PDO_TYPE_NOT_IN_ORDER;
3196 } else if (pdo_type(pdo[i]) == pdo_type(pdo[i - 1])) {
3197 enum pd_pdo_type type = pdo_type(pdo[i]);
3198
3199 switch (type) {
3200 /*
3201 * The remaining Fixed Supply Objects, if
3202 * present, shall be sent in voltage order;
3203 * lowest to highest.
3204 */
3205 case PDO_TYPE_FIXED:
3206 if (pdo_fixed_voltage(pdo[i]) <=
3207 pdo_fixed_voltage(pdo[i - 1]))
3208 return PDO_ERR_FIXED_NOT_SORTED;
3209 break;
3210 /*
3211 * The Battery Supply Objects and Variable
3212 * supply, if present shall be sent in Minimum
3213 * Voltage order; lowest to highest.
3214 */
3215 case PDO_TYPE_VAR:
3216 case PDO_TYPE_BATT:
3217 if (pdo_min_voltage(pdo[i]) <
3218 pdo_min_voltage(pdo[i - 1]))
3219 return PDO_ERR_VARIABLE_BATT_NOT_SORTED;
3220 else if ((pdo_min_voltage(pdo[i]) ==
3221 pdo_min_voltage(pdo[i - 1])) &&
3222 (pdo_max_voltage(pdo[i]) ==
3223 pdo_max_voltage(pdo[i - 1])))
3224 return PDO_ERR_DUPE_PDO;
3225 break;
3226 /*
3227 * The Programmable Power Supply APDOs, if present,
3228 * shall be sent in Maximum Voltage order;
3229 * lowest to highest.
3230 */
3231 case PDO_TYPE_APDO:
3232 if (pdo_apdo_type(pdo[i]) != APDO_TYPE_PPS)
3233 break;
3234
3235 if (pdo_pps_apdo_max_voltage(pdo[i]) <
3236 pdo_pps_apdo_max_voltage(pdo[i - 1]))
3237 return PDO_ERR_PPS_APDO_NOT_SORTED;
3238 else if (pdo_pps_apdo_min_voltage(pdo[i]) ==
3239 pdo_pps_apdo_min_voltage(pdo[i - 1]) &&
3240 pdo_pps_apdo_max_voltage(pdo[i]) ==
3241 pdo_pps_apdo_max_voltage(pdo[i - 1]) &&
3242 pdo_pps_apdo_max_current(pdo[i]) ==
3243 pdo_pps_apdo_max_current(pdo[i - 1]))
3244 return PDO_ERR_DUPE_PPS_APDO;
3245 break;
3246 default:
3247 tcpm_log_force(port, " Unknown pdo type");
3248 }
3249 }
3250 }
3251
3252 return PDO_NO_ERR;
3253 }
3254
tcpm_validate_caps(struct tcpm_port * port,const u32 * pdo,unsigned int nr_pdo)3255 static int tcpm_validate_caps(struct tcpm_port *port, const u32 *pdo,
3256 unsigned int nr_pdo)
3257 {
3258 enum pdo_err err_index = tcpm_caps_err(port, pdo, nr_pdo);
3259
3260 if (err_index != PDO_NO_ERR) {
3261 tcpm_log_force(port, " %s", pdo_err_msg[err_index]);
3262 return -EINVAL;
3263 }
3264
3265 return 0;
3266 }
3267
tcpm_altmode_enter(struct typec_altmode * altmode,u32 * vdo)3268 static int tcpm_altmode_enter(struct typec_altmode *altmode, u32 *vdo)
3269 {
3270 struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
3271 int svdm_version;
3272 u32 header;
3273
3274 svdm_version = typec_get_negotiated_svdm_version(port->typec_port);
3275 if (svdm_version < 0)
3276 return svdm_version;
3277
3278 header = VDO(altmode->svid, 1, svdm_version, CMD_ENTER_MODE);
3279 header |= VDO_OPOS(altmode->mode);
3280
3281 return tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0, TCPC_TX_SOP);
3282 }
3283
tcpm_altmode_exit(struct typec_altmode * altmode)3284 static int tcpm_altmode_exit(struct typec_altmode *altmode)
3285 {
3286 struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
3287 int svdm_version;
3288 u32 header;
3289
3290 svdm_version = typec_get_negotiated_svdm_version(port->typec_port);
3291 if (svdm_version < 0)
3292 return svdm_version;
3293
3294 header = VDO(altmode->svid, 1, svdm_version, CMD_EXIT_MODE);
3295 header |= VDO_OPOS(altmode->mode);
3296
3297 return tcpm_queue_vdm_unlocked(port, header, NULL, 0, TCPC_TX_SOP);
3298 }
3299
tcpm_altmode_vdm(struct typec_altmode * altmode,u32 header,const u32 * data,int count)3300 static int tcpm_altmode_vdm(struct typec_altmode *altmode,
3301 u32 header, const u32 *data, int count)
3302 {
3303 struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
3304
3305 return tcpm_queue_vdm_unlocked(port, header, data, count - 1, TCPC_TX_SOP);
3306 }
3307
3308 static const struct typec_altmode_ops tcpm_altmode_ops = {
3309 .enter = tcpm_altmode_enter,
3310 .exit = tcpm_altmode_exit,
3311 .vdm = tcpm_altmode_vdm,
3312 };
3313
3314
tcpm_cable_altmode_enter(struct typec_altmode * altmode,enum typec_plug_index sop,u32 * vdo)3315 static int tcpm_cable_altmode_enter(struct typec_altmode *altmode, enum typec_plug_index sop,
3316 u32 *vdo)
3317 {
3318 struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
3319 int svdm_version;
3320 u32 header;
3321
3322 svdm_version = typec_get_cable_svdm_version(port->typec_port);
3323 if (svdm_version < 0)
3324 return svdm_version;
3325
3326 header = VDO(altmode->svid, 1, svdm_version, CMD_ENTER_MODE);
3327 header |= VDO_OPOS(altmode->mode);
3328
3329 return tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0, TCPC_TX_SOP_PRIME);
3330 }
3331
tcpm_cable_altmode_exit(struct typec_altmode * altmode,enum typec_plug_index sop)3332 static int tcpm_cable_altmode_exit(struct typec_altmode *altmode, enum typec_plug_index sop)
3333 {
3334 struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
3335 int svdm_version;
3336 u32 header;
3337
3338 svdm_version = typec_get_cable_svdm_version(port->typec_port);
3339 if (svdm_version < 0)
3340 return svdm_version;
3341
3342 header = VDO(altmode->svid, 1, svdm_version, CMD_EXIT_MODE);
3343 header |= VDO_OPOS(altmode->mode);
3344
3345 return tcpm_queue_vdm_unlocked(port, header, NULL, 0, TCPC_TX_SOP_PRIME);
3346 }
3347
tcpm_cable_altmode_vdm(struct typec_altmode * altmode,enum typec_plug_index sop,u32 header,const u32 * data,int count)3348 static int tcpm_cable_altmode_vdm(struct typec_altmode *altmode, enum typec_plug_index sop,
3349 u32 header, const u32 *data, int count)
3350 {
3351 struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
3352
3353 return tcpm_queue_vdm_unlocked(port, header, data, count - 1, TCPC_TX_SOP_PRIME);
3354 }
3355
3356 static const struct typec_cable_ops tcpm_cable_ops = {
3357 .enter = tcpm_cable_altmode_enter,
3358 .exit = tcpm_cable_altmode_exit,
3359 .vdm = tcpm_cable_altmode_vdm,
3360 };
3361
3362 /*
3363 * PD (data, control) command handling functions
3364 */
ready_state(struct tcpm_port * port)3365 static inline enum tcpm_state ready_state(struct tcpm_port *port)
3366 {
3367 if (port->pwr_role == TYPEC_SOURCE)
3368 return SRC_READY;
3369 else
3370 return SNK_READY;
3371 }
3372
3373 static int tcpm_pd_send_control(struct tcpm_port *port,
3374 enum pd_ctrl_msg_type type,
3375 enum tcpm_transmit_type tx_sop_type);
3376
tcpm_handle_alert(struct tcpm_port * port,const __le32 * payload,int cnt)3377 static void tcpm_handle_alert(struct tcpm_port *port, const __le32 *payload,
3378 int cnt)
3379 {
3380 u32 p0 = le32_to_cpu(payload[0]);
3381 unsigned int type = usb_pd_ado_type(p0);
3382
3383 if (!type) {
3384 tcpm_log(port, "Alert message received with no type");
3385 tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP);
3386 return;
3387 }
3388
3389 /* Just handling non-battery alerts for now */
3390 if (!(type & USB_PD_ADO_TYPE_BATT_STATUS_CHANGE)) {
3391 if (port->pwr_role == TYPEC_SOURCE) {
3392 port->upcoming_state = GET_STATUS_SEND;
3393 tcpm_ams_start(port, GETTING_SOURCE_SINK_STATUS);
3394 } else {
3395 /*
3396 * Do not check SinkTxOk here in case the Source doesn't set its Rp to
3397 * SinkTxOk in time.
3398 */
3399 port->ams = GETTING_SOURCE_SINK_STATUS;
3400 tcpm_set_state(port, GET_STATUS_SEND, 0);
3401 }
3402 } else {
3403 tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP);
3404 }
3405 }
3406
tcpm_set_auto_vbus_discharge_threshold(struct tcpm_port * port,enum typec_pwr_opmode mode,bool pps_active,u32 requested_vbus_voltage)3407 static int tcpm_set_auto_vbus_discharge_threshold(struct tcpm_port *port,
3408 enum typec_pwr_opmode mode, bool pps_active,
3409 u32 requested_vbus_voltage)
3410 {
3411 int ret;
3412
3413 if (!port->tcpc->set_auto_vbus_discharge_threshold)
3414 return 0;
3415
3416 ret = port->tcpc->set_auto_vbus_discharge_threshold(port->tcpc, mode, pps_active,
3417 requested_vbus_voltage,
3418 port->pps_data.min_volt);
3419 tcpm_log_force(port,
3420 "set_auto_vbus_discharge_threshold mode:%d pps_active:%c vbus:%u pps_apdo_min_volt:%u ret:%d",
3421 mode, pps_active ? 'y' : 'n', requested_vbus_voltage,
3422 port->pps_data.min_volt, ret);
3423
3424 return ret;
3425 }
3426
tcpm_pd_handle_state(struct tcpm_port * port,enum tcpm_state state,enum tcpm_ams ams,unsigned int delay_ms)3427 static void tcpm_pd_handle_state(struct tcpm_port *port,
3428 enum tcpm_state state,
3429 enum tcpm_ams ams,
3430 unsigned int delay_ms)
3431 {
3432 switch (port->state) {
3433 case SRC_READY:
3434 case SNK_READY:
3435 port->ams = ams;
3436 tcpm_set_state(port, state, delay_ms);
3437 break;
3438 /* 8.3.3.4.1.1 and 6.8.1 power transitioning */
3439 case SNK_TRANSITION_SINK:
3440 case SNK_TRANSITION_SINK_VBUS:
3441 case SRC_TRANSITION_SUPPLY:
3442 tcpm_set_state(port, HARD_RESET_SEND, 0);
3443 break;
3444 default:
3445 if (!tcpm_ams_interruptible(port)) {
3446 tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
3447 SRC_SOFT_RESET_WAIT_SNK_TX :
3448 SNK_SOFT_RESET,
3449 0);
3450 } else {
3451 /* process the Message 6.8.1 */
3452 port->upcoming_state = state;
3453 port->next_ams = ams;
3454 tcpm_set_state(port, ready_state(port), delay_ms);
3455 }
3456 break;
3457 }
3458 }
3459
tcpm_pd_handle_msg(struct tcpm_port * port,enum pd_msg_request message,enum tcpm_ams ams)3460 static void tcpm_pd_handle_msg(struct tcpm_port *port,
3461 enum pd_msg_request message,
3462 enum tcpm_ams ams)
3463 {
3464 switch (port->state) {
3465 case SRC_READY:
3466 case SNK_READY:
3467 port->ams = ams;
3468 tcpm_queue_message(port, message);
3469 break;
3470 /* PD 3.0 Spec 8.3.3.4.1.1 and 6.8.1 */
3471 case SNK_TRANSITION_SINK:
3472 case SNK_TRANSITION_SINK_VBUS:
3473 case SRC_TRANSITION_SUPPLY:
3474 tcpm_set_state(port, HARD_RESET_SEND, 0);
3475 break;
3476 default:
3477 if (!tcpm_ams_interruptible(port)) {
3478 tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
3479 SRC_SOFT_RESET_WAIT_SNK_TX :
3480 SNK_SOFT_RESET,
3481 0);
3482 } else {
3483 port->next_ams = ams;
3484 tcpm_set_state(port, ready_state(port), 0);
3485 /* 6.8.1 process the Message */
3486 tcpm_queue_message(port, message);
3487 }
3488 break;
3489 }
3490 }
3491
tcpm_register_source_caps(struct tcpm_port * port)3492 static int tcpm_register_source_caps(struct tcpm_port *port)
3493 {
3494 struct usb_power_delivery_desc desc = { port->negotiated_rev };
3495 struct usb_power_delivery_capabilities_desc caps = { };
3496 struct usb_power_delivery_capabilities *cap = port->partner_source_caps;
3497
3498 if (!port->partner_pd)
3499 port->partner_pd = usb_power_delivery_register(NULL, &desc);
3500 if (IS_ERR(port->partner_pd))
3501 return PTR_ERR(port->partner_pd);
3502
3503 memcpy(caps.pdo, port->source_caps, sizeof(u32) * port->nr_source_caps);
3504 caps.role = TYPEC_SOURCE;
3505
3506 if (cap) {
3507 usb_power_delivery_unregister_capabilities(cap);
3508 port->partner_source_caps = NULL;
3509 }
3510
3511 cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
3512 if (IS_ERR(cap))
3513 return PTR_ERR(cap);
3514
3515 port->partner_source_caps = cap;
3516
3517 return 0;
3518 }
3519
tcpm_register_sink_caps(struct tcpm_port * port)3520 static int tcpm_register_sink_caps(struct tcpm_port *port)
3521 {
3522 struct usb_power_delivery_desc desc = { port->negotiated_rev };
3523 struct usb_power_delivery_capabilities_desc caps = { };
3524 struct usb_power_delivery_capabilities *cap;
3525
3526 if (!port->partner_pd)
3527 port->partner_pd = usb_power_delivery_register(NULL, &desc);
3528 if (IS_ERR(port->partner_pd))
3529 return PTR_ERR(port->partner_pd);
3530
3531 memcpy(caps.pdo, port->sink_caps, sizeof(u32) * port->nr_sink_caps);
3532 caps.role = TYPEC_SINK;
3533
3534 cap = usb_power_delivery_register_capabilities(port->partner_pd, &caps);
3535 if (IS_ERR(cap))
3536 return PTR_ERR(cap);
3537
3538 port->partner_sink_caps = cap;
3539
3540 return 0;
3541 }
3542
tcpm_pd_data_request(struct tcpm_port * port,const struct pd_message * msg,enum tcpm_transmit_type rx_sop_type)3543 static void tcpm_pd_data_request(struct tcpm_port *port,
3544 const struct pd_message *msg,
3545 enum tcpm_transmit_type rx_sop_type)
3546 {
3547 enum pd_data_msg_type type = pd_header_type_le(msg->header);
3548 unsigned int cnt = pd_header_cnt_le(msg->header);
3549 unsigned int rev = pd_header_rev_le(msg->header);
3550 unsigned int i;
3551 enum frs_typec_current partner_frs_current;
3552 bool frs_enable;
3553 int ret;
3554
3555 if (tcpm_vdm_ams(port) && type != PD_DATA_VENDOR_DEF) {
3556 port->vdm_state = VDM_STATE_ERR_BUSY;
3557 tcpm_ams_finish(port);
3558 mod_vdm_delayed_work(port, 0);
3559 }
3560
3561 switch (type) {
3562 case PD_DATA_SOURCE_CAP:
3563 port->spr_avs_data.port_partner_src_status = SPR_AVS_UNKNOWN;
3564 for (i = 0; i < cnt; i++)
3565 port->source_caps[i] = le32_to_cpu(msg->payload[i]);
3566
3567 port->nr_source_caps = cnt;
3568
3569 tcpm_log_source_caps(port);
3570
3571 tcpm_validate_caps(port, port->source_caps,
3572 port->nr_source_caps);
3573
3574 tcpm_register_source_caps(port);
3575
3576 /*
3577 * Adjust revision in subsequent message headers, as required,
3578 * to comply with 6.2.1.1.5 of the USB PD 3.0 spec. We don't
3579 * support Rev 1.0 so just do nothing in that scenario.
3580 */
3581 if (rev == PD_REV10) {
3582 if (port->ams == GET_SOURCE_CAPABILITIES)
3583 tcpm_ams_finish(port);
3584 break;
3585 }
3586
3587 if (rev < PD_MAX_REV) {
3588 port->negotiated_rev = rev;
3589 if (port->negotiated_rev_prime > port->negotiated_rev)
3590 port->negotiated_rev_prime = port->negotiated_rev;
3591 }
3592
3593 if (port->pwr_role == TYPEC_SOURCE) {
3594 if (port->ams == GET_SOURCE_CAPABILITIES)
3595 tcpm_pd_handle_state(port, SRC_READY, NONE_AMS, 0);
3596 /* Unexpected Source Capabilities */
3597 else
3598 tcpm_pd_handle_msg(port,
3599 port->negotiated_rev < PD_REV30 ?
3600 PD_MSG_CTRL_REJECT :
3601 PD_MSG_CTRL_NOT_SUPP,
3602 NONE_AMS);
3603 } else if (port->state == SNK_WAIT_CAPABILITIES ||
3604 port->state == SNK_WAIT_CAPABILITIES_TIMEOUT) {
3605 /*
3606 * This message may be received even if VBUS is not
3607 * present. This is quite unexpected; see USB PD
3608 * specification, sections 8.3.3.6.3.1 and 8.3.3.6.3.2.
3609 * However, at the same time, we must be ready to
3610 * receive this message and respond to it 15ms after
3611 * receiving PS_RDY during power swap operations, no matter
3612 * if VBUS is available or not (USB PD specification,
3613 * section 6.5.9.2).
3614 * So we need to accept the message either way,
3615 * but be prepared to keep waiting for VBUS after it was
3616 * handled.
3617 */
3618 port->ams = POWER_NEGOTIATION;
3619 port->in_ams = true;
3620 tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
3621 } else {
3622 if (port->ams == GET_SOURCE_CAPABILITIES)
3623 tcpm_ams_finish(port);
3624 tcpm_pd_handle_state(port, SNK_NEGOTIATE_CAPABILITIES,
3625 POWER_NEGOTIATION, 0);
3626 }
3627 break;
3628 case PD_DATA_REQUEST:
3629 /*
3630 * Adjust revision in subsequent message headers, as required,
3631 * to comply with 6.2.1.1.5 of the USB PD 3.0 spec. We don't
3632 * support Rev 1.0 so just reject in that scenario.
3633 */
3634 if (rev == PD_REV10) {
3635 tcpm_pd_handle_msg(port,
3636 port->negotiated_rev < PD_REV30 ?
3637 PD_MSG_CTRL_REJECT :
3638 PD_MSG_CTRL_NOT_SUPP,
3639 NONE_AMS);
3640 break;
3641 }
3642
3643 if (rev < PD_MAX_REV) {
3644 port->negotiated_rev = rev;
3645 if (port->negotiated_rev_prime > port->negotiated_rev)
3646 port->negotiated_rev_prime = port->negotiated_rev;
3647 }
3648
3649 if (port->pwr_role != TYPEC_SOURCE || cnt != 1) {
3650 tcpm_pd_handle_msg(port,
3651 port->negotiated_rev < PD_REV30 ?
3652 PD_MSG_CTRL_REJECT :
3653 PD_MSG_CTRL_NOT_SUPP,
3654 NONE_AMS);
3655 break;
3656 }
3657
3658 port->sink_request = le32_to_cpu(msg->payload[0]);
3659
3660 if (port->vdm_sm_running && port->explicit_contract) {
3661 tcpm_pd_handle_msg(port, PD_MSG_CTRL_WAIT, port->ams);
3662 break;
3663 }
3664
3665 if (port->state == SRC_SEND_CAPABILITIES)
3666 tcpm_set_state(port, SRC_NEGOTIATE_CAPABILITIES, 0);
3667 else
3668 tcpm_pd_handle_state(port, SRC_NEGOTIATE_CAPABILITIES,
3669 POWER_NEGOTIATION, 0);
3670 break;
3671 case PD_DATA_SINK_CAP:
3672 /* We don't do anything with this at the moment... */
3673 for (i = 0; i < cnt; i++)
3674 port->sink_caps[i] = le32_to_cpu(msg->payload[i]);
3675
3676 partner_frs_current = (port->sink_caps[0] & PDO_FIXED_FRS_CURR_MASK) >>
3677 PDO_FIXED_FRS_CURR_SHIFT;
3678 frs_enable = partner_frs_current && (partner_frs_current <=
3679 port->new_source_frs_current);
3680 tcpm_log(port,
3681 "Port partner FRS capable partner_frs_current:%u port_frs_current:%u enable:%c",
3682 partner_frs_current, port->new_source_frs_current, frs_enable ? 'y' : 'n');
3683 if (frs_enable) {
3684 ret = port->tcpc->enable_frs(port->tcpc, true);
3685 tcpm_log(port, "Enable FRS %s, ret:%d\n", ret ? "fail" : "success", ret);
3686 }
3687
3688 port->nr_sink_caps = cnt;
3689 port->sink_cap_done = true;
3690 tcpm_register_sink_caps(port);
3691
3692 if (port->ams == GET_SINK_CAPABILITIES)
3693 tcpm_set_state(port, ready_state(port), 0);
3694 /* Unexpected Sink Capabilities */
3695 else
3696 tcpm_pd_handle_msg(port,
3697 port->negotiated_rev < PD_REV30 ?
3698 PD_MSG_CTRL_REJECT :
3699 PD_MSG_CTRL_NOT_SUPP,
3700 NONE_AMS);
3701 break;
3702 case PD_DATA_VENDOR_DEF:
3703 tcpm_handle_vdm_request(port, msg->payload, cnt, rx_sop_type);
3704 break;
3705 case PD_DATA_BIST:
3706 port->bist_request = le32_to_cpu(msg->payload[0]);
3707 tcpm_pd_handle_state(port, BIST_RX, BIST, 0);
3708 break;
3709 case PD_DATA_ALERT:
3710 if (port->state != SRC_READY && port->state != SNK_READY)
3711 tcpm_pd_handle_state(port, port->pwr_role == TYPEC_SOURCE ?
3712 SRC_SOFT_RESET_WAIT_SNK_TX : SNK_SOFT_RESET,
3713 NONE_AMS, 0);
3714 else
3715 tcpm_handle_alert(port, msg->payload, cnt);
3716 break;
3717 case PD_DATA_BATT_STATUS:
3718 case PD_DATA_GET_COUNTRY_INFO:
3719 /* Currently unsupported */
3720 tcpm_pd_handle_msg(port, port->negotiated_rev < PD_REV30 ?
3721 PD_MSG_CTRL_REJECT :
3722 PD_MSG_CTRL_NOT_SUPP,
3723 NONE_AMS);
3724 break;
3725 default:
3726 tcpm_pd_handle_msg(port, port->negotiated_rev < PD_REV30 ?
3727 PD_MSG_CTRL_REJECT :
3728 PD_MSG_CTRL_NOT_SUPP,
3729 NONE_AMS);
3730 tcpm_log(port, "Unrecognized data message type %#x", type);
3731 break;
3732 }
3733 }
3734
tcpm_aug_supply_req_complete(struct tcpm_port * port,int result)3735 static void tcpm_aug_supply_req_complete(struct tcpm_port *port, int result)
3736 {
3737 if (port->aug_supply_req_pending) {
3738 port->aug_supply_req_status = result;
3739 port->aug_supply_req_pending = false;
3740 complete(&port->aug_supply_req_complete);
3741 }
3742 }
3743
tcpm_pd_ctrl_request(struct tcpm_port * port,const struct pd_message * msg,enum tcpm_transmit_type rx_sop_type)3744 static void tcpm_pd_ctrl_request(struct tcpm_port *port,
3745 const struct pd_message *msg,
3746 enum tcpm_transmit_type rx_sop_type)
3747 {
3748 enum pd_ctrl_msg_type type = pd_header_type_le(msg->header);
3749 enum tcpm_state next_state;
3750 unsigned int rev = pd_header_rev_le(msg->header);
3751
3752 /*
3753 * Stop VDM state machine if interrupted by other Messages while NOT_SUPP is allowed in
3754 * VDM AMS if waiting for VDM responses and will be handled later.
3755 */
3756 if (tcpm_vdm_ams(port) && type != PD_CTRL_NOT_SUPP && type != PD_CTRL_GOOD_CRC) {
3757 port->vdm_state = VDM_STATE_ERR_BUSY;
3758 tcpm_ams_finish(port);
3759 mod_vdm_delayed_work(port, 0);
3760 }
3761
3762 switch (type) {
3763 case PD_CTRL_GOOD_CRC:
3764 case PD_CTRL_PING:
3765 break;
3766 case PD_CTRL_GET_SOURCE_CAP:
3767 tcpm_pd_handle_msg(port, PD_MSG_DATA_SOURCE_CAP, GET_SOURCE_CAPABILITIES);
3768 break;
3769 case PD_CTRL_GET_SINK_CAP:
3770 tcpm_pd_handle_msg(port, PD_MSG_DATA_SINK_CAP, GET_SINK_CAPABILITIES);
3771 break;
3772 case PD_CTRL_GOTO_MIN:
3773 break;
3774 case PD_CTRL_PS_RDY:
3775 switch (port->state) {
3776 case SNK_TRANSITION_SINK:
3777 if (port->vbus_present) {
3778 tcpm_set_current_limit(port,
3779 port->req_current_limit,
3780 port->req_supply_voltage);
3781 port->explicit_contract = true;
3782 tcpm_set_auto_vbus_discharge_threshold(port,
3783 TYPEC_PWR_MODE_PD,
3784 port->pps_data.active,
3785 port->supply_voltage);
3786 tcpm_set_state(port, SNK_READY, 0);
3787 } else {
3788 /*
3789 * Seen after power swap. Keep waiting for VBUS
3790 * in a transitional state.
3791 */
3792 tcpm_set_state(port,
3793 SNK_TRANSITION_SINK_VBUS, 0);
3794 }
3795 break;
3796 case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
3797 tcpm_set_state(port, PR_SWAP_SRC_SNK_SINK_ON, 0);
3798 break;
3799 case PR_SWAP_SNK_SRC_SINK_OFF:
3800 tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON, 0);
3801 break;
3802 case VCONN_SWAP_WAIT_FOR_VCONN:
3803 tcpm_set_state(port, VCONN_SWAP_TURN_OFF_VCONN, 0);
3804 break;
3805 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
3806 tcpm_set_state(port, FR_SWAP_SNK_SRC_NEW_SINK_READY, 0);
3807 break;
3808 default:
3809 tcpm_pd_handle_state(port,
3810 port->pwr_role == TYPEC_SOURCE ?
3811 SRC_SOFT_RESET_WAIT_SNK_TX :
3812 SNK_SOFT_RESET,
3813 NONE_AMS, 0);
3814 break;
3815 }
3816 break;
3817 case PD_CTRL_REJECT:
3818 case PD_CTRL_WAIT:
3819 case PD_CTRL_NOT_SUPP:
3820 switch (port->state) {
3821 case SNK_NEGOTIATE_CAPABILITIES:
3822 /* USB PD specification, Figure 8-43 */
3823 if (port->explicit_contract)
3824 next_state = SNK_READY;
3825 else
3826 next_state = SNK_WAIT_CAPABILITIES;
3827
3828 /* Threshold was relaxed before sending Request. Restore it back. */
3829 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
3830 port->pps_data.active,
3831 port->supply_voltage);
3832 tcpm_set_state(port, next_state, 0);
3833 break;
3834 case SNK_NEGOTIATE_PPS_CAPABILITIES:
3835 /* Revert data back from any requested PPS updates */
3836 port->pps_data.req_out_volt = port->supply_voltage;
3837 port->pps_data.req_op_curr = port->current_limit;
3838 port->aug_supply_req_status = (type == PD_CTRL_WAIT ?
3839 -EAGAIN : -EOPNOTSUPP);
3840
3841 /* Threshold was relaxed before sending Request. Restore it back. */
3842 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
3843 port->pps_data.active,
3844 port->supply_voltage);
3845
3846 tcpm_set_state(port, SNK_READY, 0);
3847 break;
3848 case SNK_NEGOTIATE_SPR_AVS_CAPABILITIES:
3849 /* Revert data back from any requested SPR AVS updates */
3850 port->spr_avs_data.req_out_volt_mv = port->supply_voltage;
3851 port->spr_avs_data.req_op_curr_ma = port->current_limit;
3852 port->aug_supply_req_status = (type == PD_CTRL_WAIT ?
3853 -EAGAIN : -EOPNOTSUPP);
3854
3855 /* Threshold was relaxed before sending Request. Restore it back. */
3856 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
3857 port->spr_avs_data.active,
3858 port->supply_voltage);
3859
3860 tcpm_set_state(port, SNK_READY, 0);
3861 break;
3862 case DR_SWAP_SEND:
3863 port->swap_status = (type == PD_CTRL_WAIT ?
3864 -EAGAIN : -EOPNOTSUPP);
3865 tcpm_set_state(port, DR_SWAP_CANCEL, 0);
3866 break;
3867 case PR_SWAP_SEND:
3868 port->swap_status = (type == PD_CTRL_WAIT ?
3869 -EAGAIN : -EOPNOTSUPP);
3870 tcpm_set_state(port, PR_SWAP_CANCEL, 0);
3871 break;
3872 case VCONN_SWAP_SEND:
3873 port->swap_status = (type == PD_CTRL_WAIT ?
3874 -EAGAIN : -EOPNOTSUPP);
3875 tcpm_set_state(port, VCONN_SWAP_CANCEL, 0);
3876 break;
3877 case FR_SWAP_SEND:
3878 tcpm_set_state(port, FR_SWAP_CANCEL, 0);
3879 break;
3880 case GET_SINK_CAP:
3881 port->sink_cap_done = true;
3882 tcpm_set_state(port, ready_state(port), 0);
3883 break;
3884 /*
3885 * Some port partners do not support GET_STATUS, avoid soft reset the link to
3886 * prevent redundant power re-negotiation
3887 */
3888 case GET_STATUS_SEND:
3889 tcpm_set_state(port, ready_state(port), 0);
3890 break;
3891 case SRC_READY:
3892 case SNK_READY:
3893 if (port->vdm_state > VDM_STATE_READY) {
3894 port->vdm_state = VDM_STATE_DONE;
3895 if (tcpm_vdm_ams(port))
3896 tcpm_ams_finish(port);
3897 mod_vdm_delayed_work(port, 0);
3898 break;
3899 }
3900 fallthrough;
3901 default:
3902 tcpm_pd_handle_state(port,
3903 port->pwr_role == TYPEC_SOURCE ?
3904 SRC_SOFT_RESET_WAIT_SNK_TX :
3905 SNK_SOFT_RESET,
3906 NONE_AMS, 0);
3907 break;
3908 }
3909 break;
3910 case PD_CTRL_ACCEPT:
3911 switch (port->state) {
3912 case SNK_NEGOTIATE_CAPABILITIES:
3913 port->pps_data.active = false;
3914 port->spr_avs_data.active = false;
3915 tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
3916 break;
3917 case SNK_NEGOTIATE_PPS_CAPABILITIES:
3918 port->pps_data.active = true;
3919 port->pps_data.min_volt = port->pps_data.req_min_volt;
3920 port->pps_data.max_volt = port->pps_data.req_max_volt;
3921 port->pps_data.max_curr = port->pps_data.req_max_curr;
3922 port->req_supply_voltage = port->pps_data.req_out_volt;
3923 port->req_current_limit = port->pps_data.req_op_curr;
3924 power_supply_changed(port->psy);
3925 tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
3926 break;
3927 case SNK_NEGOTIATE_SPR_AVS_CAPABILITIES:
3928 port->spr_avs_data.active = true;
3929 port->req_supply_voltage = port->spr_avs_data.req_out_volt_mv;
3930 port->req_current_limit = port->spr_avs_data.req_op_curr_ma;
3931 power_supply_changed(port->psy);
3932 tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
3933 break;
3934 case SOFT_RESET_SEND:
3935 if (port->ams == SOFT_RESET_AMS)
3936 tcpm_ams_finish(port);
3937 /*
3938 * SOP' Soft Reset is done after Vconn Swap,
3939 * which returns to ready state
3940 */
3941 if (rx_sop_type == TCPC_TX_SOP_PRIME) {
3942 if (rev < port->negotiated_rev_prime)
3943 port->negotiated_rev_prime = rev;
3944 tcpm_set_state(port, ready_state(port), 0);
3945 break;
3946 }
3947 if (port->pwr_role == TYPEC_SOURCE) {
3948 port->upcoming_state = SRC_SEND_CAPABILITIES;
3949 tcpm_ams_start(port, POWER_NEGOTIATION);
3950 } else {
3951 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
3952 }
3953 break;
3954 case DR_SWAP_SEND:
3955 tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0);
3956 break;
3957 case PR_SWAP_SEND:
3958 tcpm_set_state(port, PR_SWAP_START, 0);
3959 break;
3960 case VCONN_SWAP_SEND:
3961 tcpm_set_state(port, VCONN_SWAP_START, 0);
3962 break;
3963 case FR_SWAP_SEND:
3964 tcpm_set_state(port, FR_SWAP_SNK_SRC_TRANSITION_TO_OFF, 0);
3965 break;
3966 default:
3967 tcpm_pd_handle_state(port,
3968 port->pwr_role == TYPEC_SOURCE ?
3969 SRC_SOFT_RESET_WAIT_SNK_TX :
3970 SNK_SOFT_RESET,
3971 NONE_AMS, 0);
3972 break;
3973 }
3974 break;
3975 case PD_CTRL_SOFT_RESET:
3976 port->ams = SOFT_RESET_AMS;
3977 tcpm_set_state(port, SOFT_RESET, 0);
3978 break;
3979 case PD_CTRL_DR_SWAP:
3980 /*
3981 * XXX
3982 * 6.3.9: If an alternate mode is active, a request to swap
3983 * alternate modes shall trigger a port reset.
3984 */
3985 if (port->typec_caps.data != TYPEC_PORT_DRD) {
3986 tcpm_pd_handle_msg(port,
3987 port->negotiated_rev < PD_REV30 ?
3988 PD_MSG_CTRL_REJECT :
3989 PD_MSG_CTRL_NOT_SUPP,
3990 NONE_AMS);
3991 } else {
3992 if (port->vdm_discovery_state == VDM_DISCOVERY_UNKNOWN &&
3993 port->negotiated_rev < PD_REV30) {
3994 tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
3995 break;
3996 }
3997
3998 tcpm_pd_handle_state(port, DR_SWAP_ACCEPT, DATA_ROLE_SWAP, 0);
3999 }
4000 break;
4001 case PD_CTRL_PR_SWAP:
4002 if (port->port_type != TYPEC_PORT_DRP) {
4003 tcpm_pd_handle_msg(port,
4004 port->negotiated_rev < PD_REV30 ?
4005 PD_MSG_CTRL_REJECT :
4006 PD_MSG_CTRL_NOT_SUPP,
4007 NONE_AMS);
4008 } else {
4009 if (port->vdm_discovery_state == VDM_DISCOVERY_UNKNOWN &&
4010 port->negotiated_rev < PD_REV30) {
4011 tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
4012 break;
4013 }
4014
4015 tcpm_pd_handle_state(port, PR_SWAP_ACCEPT, POWER_ROLE_SWAP, 0);
4016 }
4017 break;
4018 case PD_CTRL_VCONN_SWAP:
4019 if (port->vdm_discovery_state == VDM_DISCOVERY_UNKNOWN &&
4020 port->negotiated_rev < PD_REV30) {
4021 tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
4022 break;
4023 }
4024
4025 tcpm_pd_handle_state(port, VCONN_SWAP_ACCEPT, VCONN_SWAP, 0);
4026 break;
4027 case PD_CTRL_GET_SOURCE_CAP_EXT:
4028 case PD_CTRL_GET_STATUS:
4029 case PD_CTRL_FR_SWAP:
4030 case PD_CTRL_GET_PPS_STATUS:
4031 case PD_CTRL_GET_COUNTRY_CODES:
4032 /* Currently not supported */
4033 tcpm_pd_handle_msg(port,
4034 port->negotiated_rev < PD_REV30 ?
4035 PD_MSG_CTRL_REJECT :
4036 PD_MSG_CTRL_NOT_SUPP,
4037 NONE_AMS);
4038 break;
4039 case PD_CTRL_GET_REVISION:
4040 if (port->negotiated_rev >= PD_REV30 && port->pd_rev.rev_major)
4041 tcpm_pd_handle_msg(port, PD_MSG_DATA_REV,
4042 REVISION_INFORMATION);
4043 else
4044 tcpm_pd_handle_msg(port,
4045 port->negotiated_rev < PD_REV30 ?
4046 PD_MSG_CTRL_REJECT :
4047 PD_MSG_CTRL_NOT_SUPP,
4048 NONE_AMS);
4049 break;
4050 case PD_CTRL_GET_SINK_CAP_EXT:
4051 /* This is an unsupported message if port type is SRC */
4052 if (port->negotiated_rev >= PD_REV30 &&
4053 port->port_type != TYPEC_PORT_SRC)
4054 tcpm_pd_handle_msg(port, PD_MSG_EXT_SINK_CAP_EXT,
4055 GETTING_SINK_EXTENDED_CAPABILITIES);
4056 else
4057 tcpm_pd_handle_msg(port,
4058 port->negotiated_rev < PD_REV30 ?
4059 PD_MSG_CTRL_REJECT :
4060 PD_MSG_CTRL_NOT_SUPP,
4061 NONE_AMS);
4062 break;
4063 default:
4064 tcpm_pd_handle_msg(port,
4065 port->negotiated_rev < PD_REV30 ?
4066 PD_MSG_CTRL_REJECT :
4067 PD_MSG_CTRL_NOT_SUPP,
4068 NONE_AMS);
4069 tcpm_log(port, "Unrecognized ctrl message type %#x", type);
4070 break;
4071 }
4072 }
4073
tcpm_pd_ext_msg_request(struct tcpm_port * port,const struct pd_message * msg)4074 static void tcpm_pd_ext_msg_request(struct tcpm_port *port,
4075 const struct pd_message *msg)
4076 {
4077 enum pd_ext_msg_type type = pd_header_type_le(msg->header);
4078 unsigned int data_size = pd_ext_header_data_size_le(msg->ext_msg.header);
4079 const struct pd_chunked_ext_message_data *ext_msg = &msg->ext_msg;
4080
4081 /* stopping VDM state machine if interrupted by other Messages */
4082 if (tcpm_vdm_ams(port)) {
4083 port->vdm_state = VDM_STATE_ERR_BUSY;
4084 tcpm_ams_finish(port);
4085 mod_vdm_delayed_work(port, 0);
4086 }
4087
4088 if (!(le16_to_cpu(ext_msg->header) & PD_EXT_HDR_CHUNKED)) {
4089 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
4090 tcpm_log(port, "Unchunked extended messages unsupported");
4091 return;
4092 }
4093
4094 if (data_size > PD_EXT_MAX_CHUNK_DATA) {
4095 tcpm_pd_handle_state(port, CHUNK_NOT_SUPP, NONE_AMS, PD_T_CHUNK_NOT_SUPP);
4096 tcpm_log(port, "Chunk handling not yet supported");
4097 return;
4098 }
4099
4100 switch (type) {
4101 case PD_EXT_STATUS:
4102 case PD_EXT_PPS_STATUS:
4103 if (port->ams == GETTING_SOURCE_SINK_STATUS) {
4104 tcpm_ams_finish(port);
4105 tcpm_set_state(port, ready_state(port), 0);
4106 } else {
4107 /* unexpected Status or PPS_Status Message */
4108 tcpm_pd_handle_state(port, port->pwr_role == TYPEC_SOURCE ?
4109 SRC_SOFT_RESET_WAIT_SNK_TX : SNK_SOFT_RESET,
4110 NONE_AMS, 0);
4111 }
4112 break;
4113 case PD_EXT_GET_BATT_STATUS:
4114 if (data_size >= 1) {
4115 port->batt_request_id = ext_msg->data[0];
4116 tcpm_pd_handle_msg(port, PD_MSG_DATA_BATT_STATUS,
4117 GETTING_BATTERY_STATUS);
4118 } else {
4119 tcpm_set_state(port, SOFT_RESET_SEND, 0);
4120 }
4121 break;
4122 case PD_EXT_GET_BATT_CAP:
4123 if (data_size >= 1) {
4124 port->batt_request_id = ext_msg->data[0];
4125 tcpm_pd_handle_msg(port, PD_MSG_EXT_BATT_CAP,
4126 GETTING_BATTERY_CAPABILITIES);
4127 } else {
4128 tcpm_set_state(port, SOFT_RESET_SEND, 0);
4129 }
4130 break;
4131 case PD_EXT_SOURCE_CAP_EXT:
4132 case PD_EXT_BATT_CAP:
4133 case PD_EXT_GET_MANUFACTURER_INFO:
4134 case PD_EXT_MANUFACTURER_INFO:
4135 case PD_EXT_SECURITY_REQUEST:
4136 case PD_EXT_SECURITY_RESPONSE:
4137 case PD_EXT_FW_UPDATE_REQUEST:
4138 case PD_EXT_FW_UPDATE_RESPONSE:
4139 case PD_EXT_COUNTRY_INFO:
4140 case PD_EXT_COUNTRY_CODES:
4141 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
4142 break;
4143 default:
4144 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
4145 tcpm_log(port, "Unrecognized extended message type %#x", type);
4146 break;
4147 }
4148 }
4149
tcpm_pd_rx_handler(struct kthread_work * work)4150 static void tcpm_pd_rx_handler(struct kthread_work *work)
4151 {
4152 struct pd_rx_event *event = container_of(work,
4153 struct pd_rx_event, work);
4154 const struct pd_message *msg = &event->msg;
4155 unsigned int cnt = pd_header_cnt_le(msg->header);
4156 struct tcpm_port *port = event->port;
4157 enum tcpm_transmit_type rx_sop_type = event->rx_sop_type;
4158
4159 mutex_lock(&port->lock);
4160
4161 tcpm_log(port, "PD RX, header: %#x [%d]", le16_to_cpu(msg->header),
4162 port->attached);
4163
4164 if (port->attached) {
4165 enum pd_ctrl_msg_type type = pd_header_type_le(msg->header);
4166 unsigned int msgid = pd_header_msgid_le(msg->header);
4167
4168 /*
4169 * Drop SOP' messages if cannot receive via
4170 * tcpm_can_communicate_sop_prime
4171 */
4172 if (rx_sop_type == TCPC_TX_SOP_PRIME &&
4173 !tcpm_can_communicate_sop_prime(port))
4174 goto done;
4175
4176 /*
4177 * USB PD standard, 6.6.1.2:
4178 * "... if MessageID value in a received Message is the
4179 * same as the stored value, the receiver shall return a
4180 * GoodCRC Message with that MessageID value and drop
4181 * the Message (this is a retry of an already received
4182 * Message). Note: this shall not apply to the Soft_Reset
4183 * Message which always has a MessageID value of zero."
4184 */
4185 switch (rx_sop_type) {
4186 case TCPC_TX_SOP_PRIME:
4187 if (msgid == port->rx_msgid_prime)
4188 goto done;
4189 port->rx_msgid_prime = msgid;
4190 break;
4191 case TCPC_TX_SOP:
4192 default:
4193 if (msgid == port->rx_msgid && type != PD_CTRL_SOFT_RESET)
4194 goto done;
4195 port->rx_msgid = msgid;
4196 break;
4197 }
4198
4199 /*
4200 * If both ends believe to be DFP/host, we have a data role
4201 * mismatch.
4202 */
4203 if (!!(le16_to_cpu(msg->header) & PD_HEADER_DATA_ROLE) ==
4204 (port->data_role == TYPEC_HOST) && rx_sop_type == TCPC_TX_SOP) {
4205 tcpm_log(port,
4206 "Data role mismatch, initiating error recovery");
4207 tcpm_set_state(port, ERROR_RECOVERY, 0);
4208 } else {
4209 if (le16_to_cpu(msg->header) & PD_HEADER_EXT_HDR)
4210 tcpm_pd_ext_msg_request(port, msg);
4211 else if (cnt)
4212 tcpm_pd_data_request(port, msg, rx_sop_type);
4213 else
4214 tcpm_pd_ctrl_request(port, msg, rx_sop_type);
4215 }
4216 }
4217
4218 done:
4219 mutex_unlock(&port->lock);
4220 kfree(event);
4221 }
4222
tcpm_pd_receive(struct tcpm_port * port,const struct pd_message * msg,enum tcpm_transmit_type rx_sop_type)4223 void tcpm_pd_receive(struct tcpm_port *port, const struct pd_message *msg,
4224 enum tcpm_transmit_type rx_sop_type)
4225 {
4226 struct pd_rx_event *event;
4227
4228 event = kzalloc_obj(*event, GFP_ATOMIC);
4229 if (!event)
4230 return;
4231
4232 kthread_init_work(&event->work, tcpm_pd_rx_handler);
4233 event->port = port;
4234 event->rx_sop_type = rx_sop_type;
4235 memcpy(&event->msg, msg, sizeof(*msg));
4236 kthread_queue_work(port->wq, &event->work);
4237 }
4238 EXPORT_SYMBOL_GPL(tcpm_pd_receive);
4239
tcpm_pd_send_control(struct tcpm_port * port,enum pd_ctrl_msg_type type,enum tcpm_transmit_type tx_sop_type)4240 static int tcpm_pd_send_control(struct tcpm_port *port,
4241 enum pd_ctrl_msg_type type,
4242 enum tcpm_transmit_type tx_sop_type)
4243 {
4244 struct pd_message msg;
4245
4246 memset(&msg, 0, sizeof(msg));
4247 switch (tx_sop_type) {
4248 case TCPC_TX_SOP_PRIME:
4249 msg.header = PD_HEADER_LE(type,
4250 0, /* Cable Plug Indicator for DFP/UFP */
4251 0, /* Reserved */
4252 port->negotiated_rev,
4253 port->message_id_prime,
4254 0);
4255 break;
4256 case TCPC_TX_SOP:
4257 msg.header = PD_HEADER_LE(type,
4258 port->pwr_role,
4259 port->data_role,
4260 port->negotiated_rev,
4261 port->message_id,
4262 0);
4263 break;
4264 default:
4265 msg.header = PD_HEADER_LE(type,
4266 port->pwr_role,
4267 port->data_role,
4268 port->negotiated_rev,
4269 port->message_id,
4270 0);
4271 break;
4272 }
4273
4274 return tcpm_pd_transmit(port, tx_sop_type, &msg);
4275 }
4276
4277 /*
4278 * Send queued message without affecting state.
4279 * Return true if state machine should go back to sleep,
4280 * false otherwise.
4281 */
tcpm_send_queued_message(struct tcpm_port * port)4282 static bool tcpm_send_queued_message(struct tcpm_port *port)
4283 {
4284 enum pd_msg_request queued_message;
4285 int ret;
4286
4287 do {
4288 queued_message = port->queued_message;
4289 port->queued_message = PD_MSG_NONE;
4290
4291 switch (queued_message) {
4292 case PD_MSG_CTRL_WAIT:
4293 tcpm_pd_send_control(port, PD_CTRL_WAIT, TCPC_TX_SOP);
4294 break;
4295 case PD_MSG_CTRL_REJECT:
4296 tcpm_pd_send_control(port, PD_CTRL_REJECT, TCPC_TX_SOP);
4297 break;
4298 case PD_MSG_CTRL_NOT_SUPP:
4299 tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP, TCPC_TX_SOP);
4300 break;
4301 case PD_MSG_DATA_SINK_CAP:
4302 ret = tcpm_pd_send_sink_caps(port);
4303 if (ret < 0) {
4304 tcpm_log(port, "Unable to send snk caps, ret=%d", ret);
4305 tcpm_set_state(port, SNK_SOFT_RESET, 0);
4306 }
4307 tcpm_ams_finish(port);
4308 break;
4309 case PD_MSG_DATA_SOURCE_CAP:
4310 ret = tcpm_pd_send_source_caps(port);
4311 if (ret < 0) {
4312 tcpm_log(port,
4313 "Unable to send src caps, ret=%d",
4314 ret);
4315 tcpm_set_state(port, SOFT_RESET_SEND, 0);
4316 } else if (port->pwr_role == TYPEC_SOURCE) {
4317 tcpm_ams_finish(port);
4318 tcpm_set_state(port, HARD_RESET_SEND,
4319 PD_T_SENDER_RESPONSE);
4320 } else {
4321 tcpm_ams_finish(port);
4322 }
4323 break;
4324 case PD_MSG_DATA_REV:
4325 ret = tcpm_pd_send_revision(port);
4326 if (ret)
4327 tcpm_log(port,
4328 "Unable to send revision msg, ret=%d",
4329 ret);
4330 tcpm_ams_finish(port);
4331 break;
4332 case PD_MSG_EXT_SINK_CAP_EXT:
4333 ret = tcpm_pd_send_sink_cap_ext(port);
4334 if (ret == -EOPNOTSUPP)
4335 tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP, TCPC_TX_SOP);
4336 else if (ret < 0)
4337 tcpm_log(port,
4338 "Unable to transmit sink cap extended, ret=%d",
4339 ret);
4340 tcpm_ams_finish(port);
4341 break;
4342 case PD_MSG_DATA_BATT_STATUS:
4343 ret = tcpm_pd_send_batt_status(port);
4344 if (ret)
4345 tcpm_log(port,
4346 "Failed to send battery status ret=%d",
4347 ret);
4348 tcpm_ams_finish(port);
4349 break;
4350 case PD_MSG_EXT_BATT_CAP:
4351 ret = tcpm_pd_send_batt_cap(port);
4352 if (ret)
4353 tcpm_log(port,
4354 "Failed to send battery cap ret=%d",
4355 ret);
4356 tcpm_ams_finish(port);
4357 break;
4358 default:
4359 break;
4360 }
4361 } while (port->queued_message != PD_MSG_NONE);
4362
4363 if (port->delayed_state != INVALID_STATE) {
4364 if (ktime_after(port->delayed_runtime, ktime_get())) {
4365 mod_tcpm_delayed_work(port, ktime_to_ms(ktime_sub(port->delayed_runtime,
4366 ktime_get())));
4367 return true;
4368 }
4369 port->delayed_state = INVALID_STATE;
4370 }
4371 return false;
4372 }
4373
tcpm_pd_check_request(struct tcpm_port * port)4374 static int tcpm_pd_check_request(struct tcpm_port *port)
4375 {
4376 u32 pdo, rdo = port->sink_request;
4377 unsigned int max, op, pdo_max, index;
4378 enum pd_pdo_type type;
4379
4380 index = rdo_index(rdo);
4381 if (!index || index > port->nr_src_pdo)
4382 return -EINVAL;
4383
4384 pdo = port->src_pdo[index - 1];
4385 type = pdo_type(pdo);
4386 switch (type) {
4387 case PDO_TYPE_FIXED:
4388 case PDO_TYPE_VAR:
4389 max = rdo_max_current(rdo);
4390 op = rdo_op_current(rdo);
4391 pdo_max = pdo_max_current(pdo);
4392
4393 if (op > pdo_max)
4394 return -EINVAL;
4395 if (max > pdo_max && !(rdo & RDO_CAP_MISMATCH))
4396 return -EINVAL;
4397
4398 if (type == PDO_TYPE_FIXED)
4399 tcpm_log(port,
4400 "Requested %u mV, %u mA for %u / %u mA",
4401 pdo_fixed_voltage(pdo), pdo_max, op, max);
4402 else
4403 tcpm_log(port,
4404 "Requested %u -> %u mV, %u mA for %u / %u mA",
4405 pdo_min_voltage(pdo), pdo_max_voltage(pdo),
4406 pdo_max, op, max);
4407 break;
4408 case PDO_TYPE_BATT:
4409 max = rdo_max_power(rdo);
4410 op = rdo_op_power(rdo);
4411 pdo_max = pdo_max_power(pdo);
4412
4413 if (op > pdo_max)
4414 return -EINVAL;
4415 if (max > pdo_max && !(rdo & RDO_CAP_MISMATCH))
4416 return -EINVAL;
4417 tcpm_log(port,
4418 "Requested %u -> %u mV, %u mW for %u / %u mW",
4419 pdo_min_voltage(pdo), pdo_max_voltage(pdo),
4420 pdo_max, op, max);
4421 break;
4422 default:
4423 return -EINVAL;
4424 }
4425
4426 port->op_vsafe5v = index == 1;
4427
4428 return 0;
4429 }
4430
4431 #define min_power(x, y) min(pdo_max_power(x), pdo_max_power(y))
4432 #define min_current(x, y) min(pdo_max_current(x), pdo_max_current(y))
4433
tcpm_pd_select_pdo(struct tcpm_port * port,int * sink_pdo,int * src_pdo)4434 static int tcpm_pd_select_pdo(struct tcpm_port *port, int *sink_pdo,
4435 int *src_pdo)
4436 {
4437 unsigned int i, j, max_src_mv = 0, min_src_mv = 0, max_mw = 0,
4438 max_mv = 0, src_mw = 0, src_ma = 0, max_snk_mv = 0,
4439 min_snk_mv = 0;
4440 int ret = -EINVAL;
4441
4442 port->pps_data.supported = false;
4443 port->usb_type = POWER_SUPPLY_USB_TYPE_PD;
4444 power_supply_changed(port->psy);
4445
4446 /*
4447 * Select the source PDO providing the most power which has a
4448 * matchig sink cap.
4449 */
4450 for (i = 0; i < port->nr_source_caps; i++) {
4451 u32 pdo = port->source_caps[i];
4452 enum pd_pdo_type type = pdo_type(pdo);
4453
4454 switch (type) {
4455 case PDO_TYPE_FIXED:
4456 max_src_mv = pdo_fixed_voltage(pdo);
4457 min_src_mv = max_src_mv;
4458 break;
4459 case PDO_TYPE_BATT:
4460 case PDO_TYPE_VAR:
4461 max_src_mv = pdo_max_voltage(pdo);
4462 min_src_mv = pdo_min_voltage(pdo);
4463 break;
4464 case PDO_TYPE_APDO:
4465 if (pdo_apdo_type(pdo) == APDO_TYPE_PPS) {
4466 port->pps_data.supported = true;
4467 } else if (pdo_apdo_type(pdo) == APDO_TYPE_SPR_AVS) {
4468 port->spr_avs_data.port_partner_src_status = SPR_AVS_SUPPORTED;
4469 port->spr_avs_data.port_partner_src_pdo_index = i;
4470 }
4471 continue;
4472 default:
4473 tcpm_log(port, "Invalid source PDO type, ignoring");
4474 continue;
4475 }
4476
4477 switch (type) {
4478 case PDO_TYPE_FIXED:
4479 case PDO_TYPE_VAR:
4480 src_ma = pdo_max_current(pdo);
4481 src_mw = src_ma * min_src_mv / 1000;
4482 break;
4483 case PDO_TYPE_BATT:
4484 src_mw = pdo_max_power(pdo);
4485 break;
4486 case PDO_TYPE_APDO:
4487 continue;
4488 default:
4489 tcpm_log(port, "Invalid source PDO type, ignoring");
4490 continue;
4491 }
4492
4493 for (j = 0; j < port->nr_snk_pdo; j++) {
4494 pdo = port->snk_pdo[j];
4495
4496 switch (pdo_type(pdo)) {
4497 case PDO_TYPE_FIXED:
4498 max_snk_mv = pdo_fixed_voltage(pdo);
4499 min_snk_mv = max_snk_mv;
4500 break;
4501 case PDO_TYPE_BATT:
4502 case PDO_TYPE_VAR:
4503 max_snk_mv = pdo_max_voltage(pdo);
4504 min_snk_mv = pdo_min_voltage(pdo);
4505 break;
4506 case PDO_TYPE_APDO:
4507 if (pdo_apdo_type(pdo) == APDO_TYPE_SPR_AVS) {
4508 port->spr_avs_data.port_snk_status = SPR_AVS_SUPPORTED;
4509 port->spr_avs_data.port_snk_pdo_index = j;
4510 }
4511 continue;
4512 default:
4513 tcpm_log(port, "Invalid sink PDO type, ignoring");
4514 continue;
4515 }
4516
4517 if (max_src_mv <= max_snk_mv &&
4518 min_src_mv >= min_snk_mv) {
4519 /* Prefer higher voltages if available */
4520 if ((src_mw == max_mw && min_src_mv > max_mv) ||
4521 src_mw > max_mw) {
4522 *src_pdo = i;
4523 *sink_pdo = j;
4524 max_mw = src_mw;
4525 max_mv = min_src_mv;
4526 ret = 0;
4527 }
4528 }
4529 }
4530 }
4531
4532 if (port->spr_avs_data.port_snk_status == SPR_AVS_UNKNOWN)
4533 port->spr_avs_data.port_snk_status = SPR_AVS_NOT_SUPPORTED;
4534
4535 if (port->spr_avs_data.port_partner_src_status == SPR_AVS_UNKNOWN)
4536 port->spr_avs_data.port_partner_src_status = SPR_AVS_NOT_SUPPORTED;
4537
4538 if (port->pps_data.supported &&
4539 port->spr_avs_data.port_partner_src_status == SPR_AVS_SUPPORTED)
4540 port->usb_type = POWER_SUPPLY_USB_TYPE_PD_PPS_SPR_AVS;
4541 else if (port->pps_data.supported)
4542 port->usb_type = POWER_SUPPLY_USB_TYPE_PD_PPS;
4543 else if (port->spr_avs_data.port_partner_src_status == SPR_AVS_SUPPORTED)
4544 port->usb_type = POWER_SUPPLY_USB_TYPE_PD_SPR_AVS;
4545
4546 if (port->usb_type != POWER_SUPPLY_USB_TYPE_PD)
4547 power_supply_changed(port->psy);
4548
4549 return ret;
4550 }
4551
tcpm_pd_select_pps_apdo(struct tcpm_port * port)4552 static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port)
4553 {
4554 unsigned int i, src_ma, max_temp_mw = 0, max_op_ma, op_mw;
4555 unsigned int src_pdo = 0;
4556 u32 pdo, src;
4557
4558 for (i = 1; i < port->nr_source_caps; ++i) {
4559 pdo = port->source_caps[i];
4560
4561 switch (pdo_type(pdo)) {
4562 case PDO_TYPE_APDO:
4563 if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
4564 tcpm_log(port, "Not PPS APDO (source), ignoring");
4565 continue;
4566 }
4567
4568 if (port->pps_data.req_out_volt > pdo_pps_apdo_max_voltage(pdo) ||
4569 port->pps_data.req_out_volt < pdo_pps_apdo_min_voltage(pdo))
4570 continue;
4571
4572 src_ma = pdo_pps_apdo_max_current(pdo);
4573 max_op_ma = min(src_ma, port->pps_data.req_op_curr);
4574 op_mw = max_op_ma * port->pps_data.req_out_volt / 1000;
4575 if (op_mw > max_temp_mw) {
4576 src_pdo = i;
4577 max_temp_mw = op_mw;
4578 }
4579 break;
4580 default:
4581 tcpm_log(port, "Not APDO type (source), ignoring");
4582 continue;
4583 }
4584 }
4585
4586 if (src_pdo) {
4587 src = port->source_caps[src_pdo];
4588
4589 port->pps_data.req_min_volt = pdo_pps_apdo_min_voltage(src);
4590 port->pps_data.req_max_volt = pdo_pps_apdo_max_voltage(src);
4591 port->pps_data.req_max_curr = pdo_pps_apdo_max_current(src);
4592 port->pps_data.req_op_curr = min(port->pps_data.req_max_curr,
4593 port->pps_data.req_op_curr);
4594 }
4595
4596 return src_pdo;
4597 }
4598
tcpm_pd_select_spr_avs_apdo(struct tcpm_port * port)4599 static int tcpm_pd_select_spr_avs_apdo(struct tcpm_port *port)
4600 {
4601 u32 req_out_volt_mv, req_op_curr_ma, src_max_curr_ma = 0, source_cap;
4602 u32 snk_max_curr_ma = 0, src_pdo_index, snk_pdo_index, snk_pdo;
4603
4604 if (port->spr_avs_data.port_snk_status != SPR_AVS_SUPPORTED ||
4605 port->spr_avs_data.port_partner_src_status !=
4606 SPR_AVS_SUPPORTED) {
4607 tcpm_log(port, "SPR AVS not supported. port:%s partner:%s",
4608 spr_avs_status_strings[port->spr_avs_data.port_snk_status],
4609 spr_avs_status_strings[port->spr_avs_data.port_partner_src_status]);
4610 return -EOPNOTSUPP;
4611 }
4612
4613 /* Round up to SPR_AVS_VOLT_MV_STEP */
4614 req_out_volt_mv = port->spr_avs_data.req_out_volt_mv;
4615 if (req_out_volt_mv % SPR_AVS_VOLT_MV_STEP) {
4616 req_out_volt_mv += SPR_AVS_VOLT_MV_STEP -
4617 (req_out_volt_mv % SPR_AVS_VOLT_MV_STEP);
4618 port->spr_avs_data.req_out_volt_mv = req_out_volt_mv;
4619 }
4620
4621 /* Round up to RDO_SPR_AVS_CURR_MA_STEP */
4622 req_op_curr_ma = port->spr_avs_data.req_op_curr_ma;
4623 if (req_op_curr_ma % RDO_SPR_AVS_CURR_MA_STEP) {
4624 req_op_curr_ma += RDO_SPR_AVS_CURR_MA_STEP -
4625 (req_op_curr_ma % RDO_SPR_AVS_CURR_MA_STEP);
4626 port->spr_avs_data.req_op_curr_ma = req_op_curr_ma;
4627 }
4628
4629 src_pdo_index = port->spr_avs_data.port_partner_src_pdo_index;
4630 snk_pdo_index = port->spr_avs_data.port_snk_pdo_index;
4631 source_cap = port->source_caps[src_pdo_index];
4632 snk_pdo = port->snk_pdo[snk_pdo_index];
4633 tcpm_log(port,
4634 "SPR AVS src_pdo_index:%d snk_pdo_index:%d req_op_curr_ma roundup:%u req_out_volt_mv roundup:%u",
4635 src_pdo_index, snk_pdo_index, req_op_curr_ma, req_out_volt_mv);
4636
4637 if (req_out_volt_mv >= SPR_AVS_TIER1_MIN_VOLT_MV &&
4638 req_out_volt_mv <= SPR_AVS_TIER1_MAX_VOLT_MV) {
4639 src_max_curr_ma =
4640 pdo_spr_avs_apdo_9v_to_15v_max_current_ma(source_cap);
4641 snk_max_curr_ma =
4642 pdo_spr_avs_apdo_9v_to_15v_max_current_ma(snk_pdo);
4643 } else if (req_out_volt_mv > SPR_AVS_TIER1_MAX_VOLT_MV &&
4644 req_out_volt_mv <= SPR_AVS_TIER2_MAX_VOLT_MV) {
4645 src_max_curr_ma =
4646 pdo_spr_avs_apdo_15v_to_20v_max_current_ma(source_cap);
4647 snk_max_curr_ma =
4648 pdo_spr_avs_apdo_15v_to_20v_max_current_ma(snk_pdo);
4649 } else {
4650 tcpm_log(port, "Invalid SPR AVS req_volt:%umV", req_out_volt_mv);
4651 return -EINVAL;
4652 }
4653
4654 if (req_op_curr_ma > src_max_curr_ma ||
4655 req_op_curr_ma > snk_max_curr_ma) {
4656 tcpm_log(port,
4657 "Invalid SPR AVS request. req_volt:%umV req_curr:%umA src_max_cur:%umA snk_max_cur:%umA",
4658 req_out_volt_mv, req_op_curr_ma, src_max_curr_ma,
4659 snk_max_curr_ma);
4660 return -EINVAL;
4661 }
4662
4663 /* Max SPR voltage based on both the port and the partner caps */
4664 if (pdo_spr_avs_apdo_15v_to_20v_max_current_ma(snk_pdo) &&
4665 pdo_spr_avs_apdo_15v_to_20v_max_current_ma(source_cap))
4666 port->spr_avs_data.max_out_volt_mv = SPR_AVS_TIER2_MAX_VOLT_MV;
4667 else
4668 port->spr_avs_data.max_out_volt_mv = SPR_AVS_TIER1_MAX_VOLT_MV;
4669
4670 /*
4671 * Max SPR AVS curr based on 9V to 15V. This should be higher than or
4672 * equal to 15V to 20V range.
4673 */
4674 port->spr_avs_data.max_current_ma =
4675 min(pdo_spr_avs_apdo_9v_to_15v_max_current_ma(source_cap),
4676 pdo_spr_avs_apdo_9v_to_15v_max_current_ma(snk_pdo));
4677
4678 return src_pdo_index;
4679 }
4680
tcpm_pd_build_request(struct tcpm_port * port,u32 * rdo)4681 static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo)
4682 {
4683 unsigned int mv, ma, mw, flags;
4684 unsigned int max_ma, max_mw;
4685 enum pd_pdo_type type;
4686 u32 pdo, matching_snk_pdo;
4687 int src_pdo_index = 0;
4688 int snk_pdo_index = 0;
4689 int ret;
4690
4691 ret = tcpm_pd_select_pdo(port, &snk_pdo_index, &src_pdo_index);
4692 if (ret < 0)
4693 return ret;
4694
4695 pdo = port->source_caps[src_pdo_index];
4696 matching_snk_pdo = port->snk_pdo[snk_pdo_index];
4697 type = pdo_type(pdo);
4698
4699 switch (type) {
4700 case PDO_TYPE_FIXED:
4701 mv = pdo_fixed_voltage(pdo);
4702 break;
4703 case PDO_TYPE_BATT:
4704 case PDO_TYPE_VAR:
4705 mv = pdo_min_voltage(pdo);
4706 break;
4707 default:
4708 tcpm_log(port, "Invalid PDO selected!");
4709 return -EINVAL;
4710 }
4711
4712 /* Select maximum available current within the sink pdo's limit */
4713 if (type == PDO_TYPE_BATT) {
4714 mw = min_power(pdo, matching_snk_pdo);
4715 ma = 1000 * mw / mv;
4716 } else {
4717 ma = min_current(pdo, matching_snk_pdo);
4718 mw = ma * mv / 1000;
4719 }
4720
4721 flags = RDO_USB_COMM | RDO_NO_SUSPEND;
4722
4723 /* Set mismatch bit if offered power is less than operating power */
4724 max_ma = ma;
4725 max_mw = mw;
4726 if (mw < port->operating_snk_mw) {
4727 flags |= RDO_CAP_MISMATCH;
4728 if (type == PDO_TYPE_BATT &&
4729 (pdo_max_power(matching_snk_pdo) > pdo_max_power(pdo)))
4730 max_mw = pdo_max_power(matching_snk_pdo);
4731 else if (pdo_max_current(matching_snk_pdo) >
4732 pdo_max_current(pdo))
4733 max_ma = pdo_max_current(matching_snk_pdo);
4734 }
4735
4736 tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d",
4737 port->cc_req, port->cc1, port->cc2, port->vbus_source,
4738 port->vconn_role == TYPEC_SOURCE ? "source" : "sink",
4739 port->polarity);
4740
4741 if (type == PDO_TYPE_BATT) {
4742 *rdo = RDO_BATT(src_pdo_index + 1, mw, max_mw, flags);
4743
4744 tcpm_log(port, "Requesting PDO %d: %u mV, %u mW%s",
4745 src_pdo_index, mv, mw,
4746 flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
4747 } else {
4748 *rdo = RDO_FIXED(src_pdo_index + 1, ma, max_ma, flags);
4749
4750 tcpm_log(port, "Requesting PDO %d: %u mV, %u mA%s",
4751 src_pdo_index, mv, ma,
4752 flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
4753 }
4754
4755 port->req_current_limit = ma;
4756 port->req_supply_voltage = mv;
4757
4758 return 0;
4759 }
4760
tcpm_pd_send_request(struct tcpm_port * port)4761 static int tcpm_pd_send_request(struct tcpm_port *port)
4762 {
4763 struct pd_message msg;
4764 int ret;
4765 u32 rdo;
4766
4767 ret = tcpm_pd_build_request(port, &rdo);
4768 if (ret < 0)
4769 return ret;
4770
4771 /*
4772 * Relax the threshold as voltage will be adjusted after Accept Message plus tSrcTransition.
4773 * It is safer to modify the threshold here.
4774 */
4775 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, 0);
4776
4777 memset(&msg, 0, sizeof(msg));
4778 msg.header = PD_HEADER_LE(PD_DATA_REQUEST,
4779 port->pwr_role,
4780 port->data_role,
4781 port->negotiated_rev,
4782 port->message_id, 1);
4783 msg.payload[0] = cpu_to_le32(rdo);
4784
4785 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
4786 }
4787
tcpm_pd_build_pps_request(struct tcpm_port * port,u32 * rdo)4788 static int tcpm_pd_build_pps_request(struct tcpm_port *port, u32 *rdo)
4789 {
4790 unsigned int out_mv, op_ma, op_mw, max_mv, max_ma, flags;
4791 unsigned int src_pdo_index;
4792
4793 src_pdo_index = tcpm_pd_select_pps_apdo(port);
4794 if (!src_pdo_index)
4795 return -EOPNOTSUPP;
4796
4797 max_mv = port->pps_data.req_max_volt;
4798 max_ma = port->pps_data.req_max_curr;
4799 out_mv = port->pps_data.req_out_volt;
4800 op_ma = port->pps_data.req_op_curr;
4801
4802 flags = RDO_USB_COMM | RDO_NO_SUSPEND;
4803
4804 op_mw = (op_ma * out_mv) / 1000;
4805 if (op_mw < port->operating_snk_mw) {
4806 /*
4807 * Try raising current to meet power needs. If that's not enough
4808 * then try upping the voltage. If that's still not enough
4809 * then we've obviously chosen a PPS APDO which really isn't
4810 * suitable so abandon ship.
4811 */
4812 op_ma = (port->operating_snk_mw * 1000) / out_mv;
4813 if ((port->operating_snk_mw * 1000) % out_mv)
4814 ++op_ma;
4815 op_ma += RDO_PROG_CURR_MA_STEP - (op_ma % RDO_PROG_CURR_MA_STEP);
4816
4817 if (op_ma > max_ma) {
4818 op_ma = max_ma;
4819 out_mv = (port->operating_snk_mw * 1000) / op_ma;
4820 if ((port->operating_snk_mw * 1000) % op_ma)
4821 ++out_mv;
4822 out_mv += RDO_PROG_VOLT_MV_STEP -
4823 (out_mv % RDO_PROG_VOLT_MV_STEP);
4824
4825 if (out_mv > max_mv) {
4826 tcpm_log(port, "Invalid PPS APDO selected!");
4827 return -EINVAL;
4828 }
4829 }
4830 }
4831
4832 tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d",
4833 port->cc_req, port->cc1, port->cc2, port->vbus_source,
4834 port->vconn_role == TYPEC_SOURCE ? "source" : "sink",
4835 port->polarity);
4836
4837 *rdo = RDO_PROG(src_pdo_index + 1, out_mv, op_ma, flags);
4838
4839 tcpm_log(port, "Requesting APDO %d: %u mV, %u mA",
4840 src_pdo_index, out_mv, op_ma);
4841
4842 port->pps_data.req_op_curr = op_ma;
4843 port->pps_data.req_out_volt = out_mv;
4844
4845 return 0;
4846 }
4847
tcpm_pd_build_spr_avs_request(struct tcpm_port * port,u32 * rdo)4848 static int tcpm_pd_build_spr_avs_request(struct tcpm_port *port, u32 *rdo)
4849 {
4850 u32 out_mv, op_ma, flags, snk_pdo_index, source_cap;
4851 unsigned int src_power_mw, snk_power_mw;
4852 int src_pdo_index;
4853 u32 snk_pdo;
4854
4855 src_pdo_index = tcpm_pd_select_spr_avs_apdo(port);
4856 if (src_pdo_index < 0)
4857 return src_pdo_index;
4858 snk_pdo_index = port->spr_avs_data.port_snk_pdo_index;
4859 source_cap = port->source_caps[src_pdo_index];
4860 snk_pdo = port->snk_pdo[snk_pdo_index];
4861 out_mv = port->spr_avs_data.req_out_volt_mv;
4862 op_ma = port->spr_avs_data.req_op_curr_ma;
4863
4864 flags = RDO_USB_COMM | RDO_NO_SUSPEND;
4865
4866 /*
4867 * Set capability mismatch when the maximum power needs in the current
4868 * requested AVS voltage tier range is greater than
4869 * port->operating_snk_mw, however, the maximum power offered by the
4870 * source at the current requested AVS voltage tier is less than
4871 * port->operating_sink_mw.
4872 */
4873 if (out_mv > SPR_AVS_TIER1_MAX_VOLT_MV) {
4874 src_power_mw =
4875 pdo_spr_avs_apdo_15v_to_20v_max_current_ma(source_cap) *
4876 SPR_AVS_TIER2_MAX_VOLT_MV / 1000;
4877 snk_power_mw =
4878 pdo_spr_avs_apdo_15v_to_20v_max_current_ma(snk_pdo) *
4879 SPR_AVS_TIER2_MAX_VOLT_MV / 1000;
4880 } else {
4881 src_power_mw =
4882 pdo_spr_avs_apdo_9v_to_15v_max_current_ma(source_cap) *
4883 SPR_AVS_TIER1_MAX_VOLT_MV / 1000;
4884 snk_power_mw =
4885 pdo_spr_avs_apdo_9v_to_15v_max_current_ma(snk_pdo) *
4886 SPR_AVS_TIER1_MAX_VOLT_MV / 1000;
4887 }
4888
4889 if (snk_power_mw >= port->operating_snk_mw &&
4890 src_power_mw < port->operating_snk_mw)
4891 flags |= RDO_CAP_MISMATCH;
4892
4893 *rdo = RDO_AVS(src_pdo_index + 1, out_mv, op_ma, flags);
4894
4895 tcpm_log(port, "Requesting APDO SPR AVS %d: %u mV, %u mA",
4896 src_pdo_index, out_mv, op_ma);
4897
4898 return 0;
4899 }
4900
tcpm_pd_send_aug_supply_request(struct tcpm_port * port,enum aug_req_type type)4901 static int tcpm_pd_send_aug_supply_request(struct tcpm_port *port,
4902 enum aug_req_type type)
4903 {
4904 struct pd_message msg;
4905 int ret;
4906 u32 rdo;
4907
4908 if (type == PD_PPS) {
4909 ret = tcpm_pd_build_pps_request(port, &rdo);
4910 } else if (type == PD_SPR_AVS) {
4911 ret = tcpm_pd_build_spr_avs_request(port, &rdo);
4912 } else {
4913 tcpm_log(port, "Invalid aug_req_type %d", type);
4914 ret = -EOPNOTSUPP;
4915 }
4916 if (ret < 0)
4917 return ret;
4918
4919 /* Relax the threshold as voltage will be adjusted right after Accept Message. */
4920 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, 0);
4921
4922 memset(&msg, 0, sizeof(msg));
4923 msg.header = PD_HEADER_LE(PD_DATA_REQUEST,
4924 port->pwr_role,
4925 port->data_role,
4926 port->negotiated_rev,
4927 port->message_id, 1);
4928 msg.payload[0] = cpu_to_le32(rdo);
4929
4930 return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
4931 }
4932
tcpm_set_vbus(struct tcpm_port * port,bool enable)4933 static int tcpm_set_vbus(struct tcpm_port *port, bool enable)
4934 {
4935 int ret;
4936
4937 if (enable && port->vbus_charge)
4938 return -EINVAL;
4939
4940 tcpm_log(port, "vbus:=%d charge=%d", enable, port->vbus_charge);
4941
4942 ret = port->tcpc->set_vbus(port->tcpc, enable, port->vbus_charge);
4943 if (ret < 0)
4944 return ret;
4945
4946 port->vbus_source = enable;
4947 return 0;
4948 }
4949
tcpm_set_charge(struct tcpm_port * port,bool charge)4950 static int tcpm_set_charge(struct tcpm_port *port, bool charge)
4951 {
4952 int ret;
4953
4954 if (charge && port->vbus_source)
4955 return -EINVAL;
4956
4957 if (charge != port->vbus_charge) {
4958 tcpm_log(port, "vbus=%d charge:=%d", port->vbus_source, charge);
4959 ret = port->tcpc->set_vbus(port->tcpc, port->vbus_source,
4960 charge);
4961 if (ret < 0)
4962 return ret;
4963 }
4964 port->vbus_charge = charge;
4965 power_supply_changed(port->psy);
4966 return 0;
4967 }
4968
tcpm_start_toggling(struct tcpm_port * port,enum typec_cc_status cc)4969 static bool tcpm_start_toggling(struct tcpm_port *port, enum typec_cc_status cc)
4970 {
4971 int ret;
4972
4973 if (!port->tcpc->start_toggling)
4974 return false;
4975
4976 tcpm_log_force(port, "Start toggling");
4977 ret = port->tcpc->start_toggling(port->tcpc, port->port_type, cc);
4978 return ret == 0;
4979 }
4980
tcpm_init_vbus(struct tcpm_port * port)4981 static int tcpm_init_vbus(struct tcpm_port *port)
4982 {
4983 int ret;
4984
4985 ret = port->tcpc->set_vbus(port->tcpc, false, false);
4986 port->vbus_source = false;
4987 port->vbus_charge = false;
4988 return ret;
4989 }
4990
tcpm_init_vconn(struct tcpm_port * port)4991 static int tcpm_init_vconn(struct tcpm_port *port)
4992 {
4993 int ret;
4994
4995 ret = port->tcpc->set_vconn(port->tcpc, false);
4996 port->vconn_role = TYPEC_SINK;
4997 return ret;
4998 }
4999
tcpm_typec_connect(struct tcpm_port * port)5000 static void tcpm_typec_connect(struct tcpm_port *port)
5001 {
5002 struct typec_partner *partner;
5003
5004 if (!port->connected) {
5005 port->connected = true;
5006 /* Make sure we don't report stale identity information */
5007 memset(&port->partner_ident, 0, sizeof(port->partner_ident));
5008 port->partner_desc.usb_pd = port->pd_capable;
5009 if (tcpm_port_is_debug(port))
5010 port->partner_desc.accessory = TYPEC_ACCESSORY_DEBUG;
5011 else if (tcpm_port_is_audio(port))
5012 port->partner_desc.accessory = TYPEC_ACCESSORY_AUDIO;
5013 else
5014 port->partner_desc.accessory = TYPEC_ACCESSORY_NONE;
5015 partner = typec_register_partner(port->typec_port, &port->partner_desc);
5016 if (IS_ERR(partner)) {
5017 dev_err(port->dev, "Failed to register partner (%ld)\n", PTR_ERR(partner));
5018 return;
5019 }
5020
5021 port->partner = partner;
5022 typec_partner_set_usb_power_delivery(port->partner, port->partner_pd);
5023 }
5024 }
5025
tcpm_src_attach(struct tcpm_port * port)5026 static int tcpm_src_attach(struct tcpm_port *port)
5027 {
5028 enum typec_cc_polarity polarity =
5029 port->cc2 == TYPEC_CC_RD ? TYPEC_POLARITY_CC2
5030 : TYPEC_POLARITY_CC1;
5031 int ret;
5032
5033 if (port->attached)
5034 return 0;
5035
5036 ret = tcpm_set_polarity(port, polarity);
5037 if (ret < 0)
5038 return ret;
5039
5040 tcpm_enable_auto_vbus_discharge(port, true);
5041
5042 /*
5043 * USB Type-C specification, version 1.2,
5044 * chapter 4.5.2.2.8.1 (Attached.SRC Requirements)
5045 * Enable VCONN only if the non-RD port is set to RA.
5046 */
5047 if ((polarity == TYPEC_POLARITY_CC1 && port->cc2 == TYPEC_CC_RA) ||
5048 (polarity == TYPEC_POLARITY_CC2 && port->cc1 == TYPEC_CC_RA)) {
5049 ret = tcpm_set_vconn(port, true);
5050 if (ret < 0)
5051 return ret;
5052 }
5053
5054 ret = tcpm_set_vbus(port, true);
5055 if (ret < 0)
5056 goto out_disable_vconn;
5057
5058 ret = tcpm_set_roles(port, true, TYPEC_STATE_USB, TYPEC_SOURCE,
5059 tcpm_data_role_for_source(port));
5060 if (ret < 0)
5061 goto out_disable_vbus;
5062
5063 if (port->pd_supported) {
5064 ret = port->tcpc->set_pd_rx(port->tcpc, true);
5065 if (ret < 0)
5066 goto out_disable_mux;
5067 }
5068
5069 port->pd_capable = false;
5070
5071 port->partner = NULL;
5072
5073 port->attached = true;
5074 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_UNKNOWN);
5075
5076 return 0;
5077
5078 out_disable_mux:
5079 tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,
5080 TYPEC_ORIENTATION_NONE);
5081 out_disable_vbus:
5082 tcpm_set_vbus(port, false);
5083 out_disable_vconn:
5084 tcpm_set_vconn(port, false);
5085
5086 return ret;
5087 }
5088
tcpm_typec_disconnect(struct tcpm_port * port)5089 static void tcpm_typec_disconnect(struct tcpm_port *port)
5090 {
5091 /*
5092 * Unregister plug/cable outside of port->connected because cable can
5093 * be discovered before SRC_READY/SNK_READY states where port->connected
5094 * is set.
5095 */
5096 typec_unregister_plug(port->plug_prime);
5097 typec_unregister_cable(port->cable);
5098 port->plug_prime = NULL;
5099 port->cable = NULL;
5100 if (port->connected) {
5101 if (port->partner) {
5102 typec_partner_set_usb_power_delivery(port->partner, NULL);
5103 typec_unregister_partner(port->partner);
5104 port->partner = NULL;
5105 }
5106 port->connected = false;
5107 }
5108 }
5109
tcpm_unregister_altmodes(struct tcpm_port * port)5110 static void tcpm_unregister_altmodes(struct tcpm_port *port)
5111 {
5112 struct pd_mode_data *modep = &port->mode_data;
5113 struct pd_mode_data *modep_prime = &port->mode_data_prime;
5114 int i;
5115
5116 for (i = 0; i < modep->altmodes && i < ALTMODE_DISCOVERY_MAX; i++) {
5117 typec_unregister_altmode(port->partner_altmode[i]);
5118 port->partner_altmode[i] = NULL;
5119 }
5120 for (i = 0; i < modep_prime->altmodes && i < ALTMODE_DISCOVERY_MAX; i++) {
5121 typec_unregister_altmode(port->plug_prime_altmode[i]);
5122 port->plug_prime_altmode[i] = NULL;
5123 }
5124
5125 memset(modep, 0, sizeof(*modep));
5126 memset(modep_prime, 0, sizeof(*modep_prime));
5127 }
5128
tcpm_set_partner_usb_comm_capable(struct tcpm_port * port,bool capable)5129 static void tcpm_set_partner_usb_comm_capable(struct tcpm_port *port, bool capable)
5130 {
5131 tcpm_log(port, "Setting usb_comm capable %s", str_true_false(capable));
5132
5133 if (port->tcpc->set_partner_usb_comm_capable)
5134 port->tcpc->set_partner_usb_comm_capable(port->tcpc, capable);
5135 }
5136
tcpm_partner_source_caps_reset(struct tcpm_port * port)5137 static void tcpm_partner_source_caps_reset(struct tcpm_port *port)
5138 {
5139 usb_power_delivery_unregister_capabilities(port->partner_source_caps);
5140 port->partner_source_caps = NULL;
5141 port->spr_avs_data.port_partner_src_status = SPR_AVS_UNKNOWN;
5142 port->spr_avs_data.active = false;
5143 }
5144
tcpm_reset_port(struct tcpm_port * port)5145 static void tcpm_reset_port(struct tcpm_port *port)
5146 {
5147 tcpm_enable_auto_vbus_discharge(port, false);
5148 port->in_ams = false;
5149 port->ams = NONE_AMS;
5150 port->vdm_sm_running = false;
5151 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_UNKNOWN);
5152 mod_vdm_discovery_cancel_delayed_work(port);
5153 tcpm_unregister_altmodes(port);
5154 tcpm_typec_disconnect(port);
5155 port->attached = false;
5156 port->pd_capable = false;
5157 port->pps_data.supported = false;
5158 tcpm_set_partner_usb_comm_capable(port, false);
5159
5160 /*
5161 * First Rx ID should be 0; set this to a sentinel of -1 so that
5162 * we can check tcpm_pd_rx_handler() if we had seen it before.
5163 */
5164 port->rx_msgid = -1;
5165 port->rx_msgid_prime = -1;
5166
5167 port->tcpc->set_pd_rx(port->tcpc, false);
5168 tcpm_init_vbus(port); /* also disables charging */
5169 tcpm_init_vconn(port);
5170 tcpm_set_current_limit(port, 0, 0);
5171 tcpm_set_polarity(port, TYPEC_POLARITY_CC1);
5172 tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,
5173 TYPEC_ORIENTATION_NONE);
5174 tcpm_set_attached_state(port, false);
5175 port->try_src_count = 0;
5176 port->try_snk_count = 0;
5177 port->usb_type = POWER_SUPPLY_USB_TYPE_C;
5178 power_supply_changed(port->psy);
5179 port->nr_sink_caps = 0;
5180 port->sink_cap_done = false;
5181 if (port->tcpc->enable_frs)
5182 port->tcpc->enable_frs(port->tcpc, false);
5183
5184 usb_power_delivery_unregister_capabilities(port->partner_sink_caps);
5185 port->partner_sink_caps = NULL;
5186 tcpm_partner_source_caps_reset(port);
5187 usb_power_delivery_unregister(port->partner_pd);
5188 port->partner_pd = NULL;
5189 }
5190
tcpm_detach(struct tcpm_port * port)5191 static void tcpm_detach(struct tcpm_port *port)
5192 {
5193 if (tcpm_port_is_disconnected(port))
5194 port->hard_reset_count = 0;
5195
5196 if (!port->attached)
5197 return;
5198
5199 if (port->tcpc->set_bist_data) {
5200 tcpm_log(port, "disable BIST MODE TESTDATA");
5201 port->tcpc->set_bist_data(port->tcpc, false);
5202 }
5203
5204 tcpm_reset_port(port);
5205 }
5206
tcpm_src_detach(struct tcpm_port * port)5207 static void tcpm_src_detach(struct tcpm_port *port)
5208 {
5209 tcpm_detach(port);
5210 }
5211
tcpm_snk_attach(struct tcpm_port * port)5212 static int tcpm_snk_attach(struct tcpm_port *port)
5213 {
5214 int ret;
5215
5216 if (port->attached)
5217 return 0;
5218
5219 ret = tcpm_set_polarity(port, port->cc2 != TYPEC_CC_OPEN ?
5220 TYPEC_POLARITY_CC2 : TYPEC_POLARITY_CC1);
5221 if (ret < 0)
5222 return ret;
5223
5224 tcpm_enable_auto_vbus_discharge(port, true);
5225
5226 ret = tcpm_set_roles(port, true, TYPEC_STATE_USB,
5227 TYPEC_SINK, tcpm_data_role_for_sink(port));
5228 if (ret < 0)
5229 return ret;
5230
5231 port->pd_capable = false;
5232
5233 port->partner = NULL;
5234
5235 port->attached = true;
5236 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_UNKNOWN);
5237
5238 return 0;
5239 }
5240
tcpm_snk_detach(struct tcpm_port * port)5241 static void tcpm_snk_detach(struct tcpm_port *port)
5242 {
5243 tcpm_detach(port);
5244 }
5245
tcpm_acc_attach(struct tcpm_port * port)5246 static int tcpm_acc_attach(struct tcpm_port *port)
5247 {
5248 int ret;
5249 enum typec_role role;
5250 enum typec_data_role data;
5251 int state = TYPEC_STATE_USB;
5252
5253 if (port->attached)
5254 return 0;
5255
5256 role = tcpm_port_is_sink(port) ? TYPEC_SINK : TYPEC_SOURCE;
5257 data = tcpm_port_is_sink(port) ? tcpm_data_role_for_sink(port)
5258 : tcpm_data_role_for_source(port);
5259
5260 if (tcpm_port_is_audio(port))
5261 state = TYPEC_MODE_AUDIO;
5262
5263 if (tcpm_port_is_debug(port))
5264 state = TYPEC_MODE_DEBUG;
5265
5266 ret = tcpm_set_roles(port, true, state, role, data);
5267 if (ret < 0)
5268 return ret;
5269
5270 port->partner = NULL;
5271
5272 tcpm_typec_connect(port);
5273
5274 port->attached = true;
5275
5276 return 0;
5277 }
5278
tcpm_acc_detach(struct tcpm_port * port)5279 static void tcpm_acc_detach(struct tcpm_port *port)
5280 {
5281 tcpm_detach(port);
5282 }
5283
hard_reset_state(struct tcpm_port * port)5284 static inline enum tcpm_state hard_reset_state(struct tcpm_port *port)
5285 {
5286 if (port->hard_reset_count < PD_N_HARD_RESET_COUNT)
5287 return HARD_RESET_SEND;
5288 if (port->pd_capable)
5289 return ERROR_RECOVERY;
5290 if (port->pwr_role == TYPEC_SOURCE)
5291 return SRC_UNATTACHED;
5292 if (port->state == SNK_WAIT_CAPABILITIES ||
5293 port->state == SNK_WAIT_CAPABILITIES_TIMEOUT)
5294 return SNK_READY;
5295 return SNK_UNATTACHED;
5296 }
5297
unattached_state(struct tcpm_port * port)5298 static inline enum tcpm_state unattached_state(struct tcpm_port *port)
5299 {
5300 if (port->port_type == TYPEC_PORT_DRP) {
5301 if (port->pwr_role == TYPEC_SOURCE)
5302 return SRC_UNATTACHED;
5303 else
5304 return SNK_UNATTACHED;
5305 } else if (port->port_type == TYPEC_PORT_SRC) {
5306 return SRC_UNATTACHED;
5307 }
5308
5309 return SNK_UNATTACHED;
5310 }
5311
tcpm_swap_complete(struct tcpm_port * port,int result)5312 static void tcpm_swap_complete(struct tcpm_port *port, int result)
5313 {
5314 if (port->swap_pending) {
5315 port->swap_status = result;
5316 port->swap_pending = false;
5317 port->non_pd_role_swap = false;
5318 complete(&port->swap_complete);
5319 }
5320 }
5321
tcpm_get_pwr_opmode(enum typec_cc_status cc)5322 static enum typec_pwr_opmode tcpm_get_pwr_opmode(enum typec_cc_status cc)
5323 {
5324 switch (cc) {
5325 case TYPEC_CC_RP_1_5:
5326 return TYPEC_PWR_MODE_1_5A;
5327 case TYPEC_CC_RP_3_0:
5328 return TYPEC_PWR_MODE_3_0A;
5329 case TYPEC_CC_RP_DEF:
5330 default:
5331 return TYPEC_PWR_MODE_USB;
5332 }
5333 }
5334
tcpm_pwr_opmode_to_rp(enum typec_pwr_opmode opmode)5335 static enum typec_cc_status tcpm_pwr_opmode_to_rp(enum typec_pwr_opmode opmode)
5336 {
5337 switch (opmode) {
5338 case TYPEC_PWR_MODE_USB:
5339 return TYPEC_CC_RP_DEF;
5340 case TYPEC_PWR_MODE_1_5A:
5341 return TYPEC_CC_RP_1_5;
5342 case TYPEC_PWR_MODE_3_0A:
5343 case TYPEC_PWR_MODE_PD:
5344 default:
5345 return TYPEC_CC_RP_3_0;
5346 }
5347 }
5348
tcpm_set_initial_svdm_version(struct tcpm_port * port)5349 static void tcpm_set_initial_svdm_version(struct tcpm_port *port)
5350 {
5351 if (!port->partner)
5352 return;
5353
5354 switch (port->negotiated_rev) {
5355 case PD_REV30:
5356 break;
5357 /*
5358 * 6.4.4.2.3 Structured VDM Version
5359 * 2.0 states "At this time, there is only one version (1.0) defined.
5360 * This field Shall be set to zero to indicate Version 1.0."
5361 * 3.0 states "This field Shall be set to 01b to indicate Version 2.0."
5362 * To ensure that we follow the Power Delivery revision we are currently
5363 * operating on, downgrade the SVDM version to the highest one supported
5364 * by the Power Delivery revision.
5365 */
5366 case PD_REV20:
5367 typec_partner_set_svdm_version(port->partner, SVDM_VER_1_0);
5368 break;
5369 default:
5370 typec_partner_set_svdm_version(port->partner, SVDM_VER_1_0);
5371 break;
5372 }
5373 }
5374
tcpm_set_initial_negotiated_rev(struct tcpm_port * port)5375 static void tcpm_set_initial_negotiated_rev(struct tcpm_port *port)
5376 {
5377 switch (port->pd_rev.rev_major) {
5378 case PD_CAP_REV10:
5379 port->negotiated_rev = PD_REV10;
5380 break;
5381 case PD_CAP_REV20:
5382 port->negotiated_rev = PD_REV20;
5383 break;
5384 case PD_CAP_REV30:
5385 port->negotiated_rev = PD_REV30;
5386 break;
5387 default:
5388 port->negotiated_rev = PD_MAX_REV;
5389 break;
5390 }
5391 port->negotiated_rev_prime = port->negotiated_rev;
5392 }
5393
run_state_machine(struct tcpm_port * port)5394 static void run_state_machine(struct tcpm_port *port)
5395 {
5396 int ret;
5397 enum typec_pwr_opmode opmode;
5398 unsigned int msecs;
5399 enum tcpm_state upcoming_state;
5400
5401 if (port->tcpc->check_contaminant && port->state != CHECK_CONTAMINANT)
5402 port->potential_contaminant = ((port->enter_state == SRC_ATTACH_WAIT &&
5403 port->state == SRC_UNATTACHED) ||
5404 (port->enter_state == SNK_ATTACH_WAIT &&
5405 port->state == SNK_UNATTACHED) ||
5406 (port->enter_state == SNK_DEBOUNCED &&
5407 port->state == SNK_UNATTACHED));
5408
5409 port->enter_state = port->state;
5410 switch (port->state) {
5411 case TOGGLING:
5412 break;
5413 case CHECK_CONTAMINANT:
5414 port->tcpc->check_contaminant(port->tcpc);
5415 break;
5416 /* SRC states */
5417 case SRC_UNATTACHED:
5418 if (!port->non_pd_role_swap)
5419 tcpm_swap_complete(port, -ENOTCONN);
5420 tcpm_src_detach(port);
5421 if (port->potential_contaminant) {
5422 tcpm_set_state(port, CHECK_CONTAMINANT, 0);
5423 break;
5424 }
5425 if (tcpm_start_toggling(port, tcpm_rp_cc(port))) {
5426 tcpm_set_state(port, TOGGLING, 0);
5427 break;
5428 }
5429 tcpm_set_cc(port, tcpm_rp_cc(port));
5430 if (port->port_type == TYPEC_PORT_DRP)
5431 tcpm_set_state(port, SNK_UNATTACHED, PD_T_DRP_SNK);
5432 break;
5433 case SRC_ATTACH_WAIT:
5434 if (tcpm_port_is_debug_source(port))
5435 tcpm_set_state(port, DEBUG_ACC_ATTACHED,
5436 port->timings.cc_debounce_time);
5437 else if (tcpm_port_is_audio(port))
5438 tcpm_set_state(port, AUDIO_ACC_ATTACHED,
5439 port->timings.cc_debounce_time);
5440 else if (tcpm_port_is_source(port) && port->vbus_vsafe0v)
5441 tcpm_set_state(port,
5442 tcpm_try_snk(port) ? SNK_TRY
5443 : SRC_ATTACHED,
5444 port->timings.cc_debounce_time);
5445 break;
5446
5447 case SNK_TRY:
5448 port->try_snk_count++;
5449 /*
5450 * Requirements:
5451 * - Do not drive vconn or vbus
5452 * - Terminate CC pins (both) to Rd
5453 * Action:
5454 * - Wait for tDRPTry (PD_T_DRP_TRY).
5455 * Until then, ignore any state changes.
5456 */
5457 tcpm_set_cc(port, TYPEC_CC_RD);
5458 tcpm_set_state(port, SNK_TRY_WAIT, PD_T_DRP_TRY);
5459 break;
5460 case SNK_TRY_WAIT:
5461 if (tcpm_port_is_sink(port)) {
5462 tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE, 0);
5463 } else {
5464 tcpm_set_state(port, SRC_TRYWAIT, 0);
5465 port->max_wait = 0;
5466 }
5467 break;
5468 case SNK_TRY_WAIT_DEBOUNCE:
5469 tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS,
5470 PD_T_TRY_CC_DEBOUNCE);
5471 break;
5472 case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
5473 if (port->vbus_present && tcpm_port_is_sink(port))
5474 tcpm_set_state(port, SNK_ATTACHED, 0);
5475 else
5476 port->max_wait = 0;
5477 break;
5478 case SRC_TRYWAIT:
5479 tcpm_set_cc(port, tcpm_rp_cc(port));
5480 if (port->max_wait == 0) {
5481 port->max_wait = jiffies +
5482 msecs_to_jiffies(PD_T_DRP_TRY);
5483 tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED,
5484 PD_T_DRP_TRY);
5485 } else {
5486 if (time_is_after_jiffies(port->max_wait))
5487 tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED,
5488 jiffies_to_msecs(port->max_wait -
5489 jiffies));
5490 else
5491 tcpm_set_state(port, SNK_UNATTACHED, 0);
5492 }
5493 break;
5494 case SRC_TRYWAIT_DEBOUNCE:
5495 tcpm_set_state(port, SRC_ATTACHED, port->timings.cc_debounce_time);
5496 break;
5497 case SRC_TRYWAIT_UNATTACHED:
5498 tcpm_set_state(port, SNK_UNATTACHED, 0);
5499 break;
5500
5501 case SRC_ATTACHED:
5502 ret = tcpm_src_attach(port);
5503 tcpm_set_state(port, SRC_UNATTACHED,
5504 ret < 0 ? 0 : PD_T_PS_SOURCE_ON);
5505 break;
5506 case SRC_STARTUP:
5507 opmode = tcpm_get_pwr_opmode(tcpm_rp_cc(port));
5508 typec_set_pwr_opmode(port->typec_port, opmode);
5509 port->pwr_opmode = TYPEC_PWR_MODE_USB;
5510 port->caps_count = 0;
5511 tcpm_set_initial_negotiated_rev(port);
5512 port->message_id = 0;
5513 port->message_id_prime = 0;
5514 port->rx_msgid = -1;
5515 port->rx_msgid_prime = -1;
5516 port->explicit_contract = false;
5517 /* SNK -> SRC POWER/FAST_ROLE_SWAP finished */
5518 if (port->ams == POWER_ROLE_SWAP ||
5519 port->ams == FAST_ROLE_SWAP)
5520 tcpm_ams_finish(port);
5521 if (!port->pd_supported) {
5522 tcpm_set_state(port, SRC_READY, 0);
5523 break;
5524 }
5525 port->upcoming_state = SRC_SEND_CAPABILITIES;
5526 tcpm_ams_start(port, POWER_NEGOTIATION);
5527 break;
5528 case SRC_SEND_CAPABILITIES:
5529 port->caps_count++;
5530 if (port->caps_count > PD_N_CAPS_COUNT) {
5531 tcpm_set_state(port, SRC_READY, 0);
5532 break;
5533 }
5534 ret = tcpm_pd_send_source_caps(port);
5535 if (ret < 0) {
5536 if (tcpm_can_communicate_sop_prime(port) &&
5537 IS_ERR_OR_NULL(port->cable))
5538 tcpm_set_state(port, SRC_VDM_IDENTITY_REQUEST, 0);
5539 else
5540 tcpm_set_state(port, SRC_SEND_CAPABILITIES,
5541 PD_T_SEND_SOURCE_CAP);
5542 } else {
5543 /*
5544 * Per standard, we should clear the reset counter here.
5545 * However, that can result in state machine hang-ups.
5546 * Reset it only in READY state to improve stability.
5547 */
5548 /* port->hard_reset_count = 0; */
5549 port->caps_count = 0;
5550 port->pd_capable = true;
5551 tcpm_set_state_cond(port, SRC_SEND_CAPABILITIES_TIMEOUT,
5552 PD_T_SENDER_RESPONSE);
5553 }
5554 break;
5555 case SRC_SEND_CAPABILITIES_TIMEOUT:
5556 /*
5557 * Error recovery for a PD_DATA_SOURCE_CAP reply timeout.
5558 *
5559 * PD 2.0 sinks are supposed to accept src-capabilities with a
5560 * 3.0 header and simply ignore any src PDOs which the sink does
5561 * not understand such as PPS but some 2.0 sinks instead ignore
5562 * the entire PD_DATA_SOURCE_CAP message, causing contract
5563 * negotiation to fail.
5564 *
5565 * After PD_N_HARD_RESET_COUNT hard-reset attempts, we try
5566 * sending src-capabilities with a lower PD revision to
5567 * make these broken sinks work.
5568 */
5569 if (port->hard_reset_count < PD_N_HARD_RESET_COUNT) {
5570 tcpm_set_state(port, HARD_RESET_SEND, 0);
5571 } else if (port->negotiated_rev > PD_REV20) {
5572 port->negotiated_rev--;
5573 port->hard_reset_count = 0;
5574 tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
5575 } else {
5576 tcpm_set_state(port, hard_reset_state(port), 0);
5577 }
5578 break;
5579 case SRC_NEGOTIATE_CAPABILITIES:
5580 ret = tcpm_pd_check_request(port);
5581 if (ret < 0) {
5582 tcpm_pd_send_control(port, PD_CTRL_REJECT, TCPC_TX_SOP);
5583 if (!port->explicit_contract) {
5584 tcpm_set_state(port,
5585 SRC_WAIT_NEW_CAPABILITIES, 0);
5586 } else {
5587 tcpm_set_state(port, SRC_READY, 0);
5588 }
5589 } else {
5590 tcpm_pd_send_control(port, PD_CTRL_ACCEPT, TCPC_TX_SOP);
5591 tcpm_set_partner_usb_comm_capable(port,
5592 !!(port->sink_request & RDO_USB_COMM));
5593 tcpm_set_state(port, SRC_TRANSITION_SUPPLY,
5594 PD_T_SRC_TRANSITION);
5595 }
5596 break;
5597 case SRC_TRANSITION_SUPPLY:
5598 /* XXX: regulator_set_voltage(vbus, ...) */
5599 tcpm_pd_send_control(port, PD_CTRL_PS_RDY, TCPC_TX_SOP);
5600 port->explicit_contract = true;
5601 typec_set_pwr_opmode(port->typec_port, TYPEC_PWR_MODE_PD);
5602 port->pwr_opmode = TYPEC_PWR_MODE_PD;
5603 tcpm_set_state_cond(port, SRC_READY, 0);
5604 break;
5605 case SRC_READY:
5606 #if 1
5607 port->hard_reset_count = 0;
5608 #endif
5609 port->try_src_count = 0;
5610
5611 tcpm_swap_complete(port, 0);
5612 tcpm_typec_connect(port);
5613
5614 if (port->ams != NONE_AMS)
5615 tcpm_ams_finish(port);
5616 if (port->next_ams != NONE_AMS) {
5617 port->ams = port->next_ams;
5618 port->next_ams = NONE_AMS;
5619 }
5620
5621 /*
5622 * If previous AMS is interrupted, switch to the upcoming
5623 * state.
5624 */
5625 if (port->upcoming_state != INVALID_STATE) {
5626 upcoming_state = port->upcoming_state;
5627 port->upcoming_state = INVALID_STATE;
5628 tcpm_set_state(port, upcoming_state, 0);
5629 break;
5630 }
5631
5632 /*
5633 * 6.4.4.3.1 Discover Identity
5634 * "The Discover Identity Command Shall only be sent to SOP when there is an
5635 * Explicit Contract."
5636 *
5637 * Discover Identity on SOP' should be discovered prior to the
5638 * ready state, but if done after a Vconn Swap following Discover
5639 * Identity on SOP then the discovery process can be run here
5640 * as well.
5641 */
5642 if (port->explicit_contract) {
5643 if (port->vdm_discovery_state == VDM_DISCOVERY_UNKNOWN)
5644 tcpm_set_initial_svdm_version(port);
5645 mod_vdm_discovery_delayed_work(port, 0);
5646 } else {
5647 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
5648 }
5649
5650 /*
5651 * 6.3.5
5652 * Sending ping messages is not necessary if
5653 * - the source operates at vSafe5V
5654 * or
5655 * - The system is not operating in PD mode
5656 * or
5657 * - Both partners are connected using a Type-C connector
5658 *
5659 * There is no actual need to send PD messages since the local
5660 * port type-c and the spec does not clearly say whether PD is
5661 * possible when type-c is connected to Type-A/B
5662 */
5663 break;
5664 case SRC_WAIT_NEW_CAPABILITIES:
5665 /* Nothing to do... */
5666 break;
5667
5668 /* SNK states */
5669 case SNK_UNATTACHED:
5670 if (!port->non_pd_role_swap)
5671 tcpm_swap_complete(port, -ENOTCONN);
5672 tcpm_aug_supply_req_complete(port, -ENOTCONN);
5673 tcpm_snk_detach(port);
5674 if (port->potential_contaminant) {
5675 tcpm_set_state(port, CHECK_CONTAMINANT, 0);
5676 break;
5677 }
5678 if (tcpm_start_toggling(port, TYPEC_CC_RD)) {
5679 tcpm_set_state(port, TOGGLING, 0);
5680 break;
5681 }
5682 tcpm_set_cc(port, TYPEC_CC_RD);
5683 if (port->port_type == TYPEC_PORT_DRP)
5684 tcpm_set_state(port, SRC_UNATTACHED, PD_T_DRP_SRC);
5685 break;
5686 case SNK_ATTACH_WAIT:
5687 if (tcpm_port_is_debug_sink(port))
5688 tcpm_set_state(port, DEBUG_ACC_ATTACHED,
5689 PD_T_CC_DEBOUNCE);
5690 else if (tcpm_port_is_audio(port))
5691 tcpm_set_state(port, AUDIO_ACC_ATTACHED,
5692 PD_T_CC_DEBOUNCE);
5693 else if ((port->cc1 == TYPEC_CC_OPEN &&
5694 port->cc2 != TYPEC_CC_OPEN) ||
5695 (port->cc1 != TYPEC_CC_OPEN &&
5696 port->cc2 == TYPEC_CC_OPEN))
5697 tcpm_set_state(port, SNK_DEBOUNCED,
5698 port->timings.cc_debounce_time);
5699 else if (tcpm_port_is_disconnected(port))
5700 tcpm_set_state(port, SNK_UNATTACHED,
5701 PD_T_PD_DEBOUNCE);
5702 break;
5703 case SNK_DEBOUNCED:
5704 if (tcpm_port_is_disconnected(port))
5705 tcpm_set_state(port, SNK_UNATTACHED,
5706 PD_T_PD_DEBOUNCE);
5707 else if (tcpm_port_is_debug_sink(port))
5708 tcpm_set_state(port, DEBUG_ACC_ATTACHED,
5709 PD_T_CC_DEBOUNCE);
5710 else if (tcpm_port_is_audio(port))
5711 tcpm_set_state(port, AUDIO_ACC_ATTACHED,
5712 PD_T_CC_DEBOUNCE);
5713 else if (port->vbus_present)
5714 tcpm_set_state(port,
5715 tcpm_try_src(port) ? SRC_TRY
5716 : SNK_ATTACHED,
5717 0);
5718 break;
5719 case SRC_TRY:
5720 port->try_src_count++;
5721 tcpm_set_cc(port, tcpm_rp_cc(port));
5722 port->max_wait = 0;
5723 tcpm_set_state(port, SRC_TRY_WAIT, 0);
5724 break;
5725 case SRC_TRY_WAIT:
5726 if (port->max_wait == 0) {
5727 port->max_wait = jiffies +
5728 msecs_to_jiffies(PD_T_DRP_TRY);
5729 msecs = PD_T_DRP_TRY;
5730 } else {
5731 if (time_is_after_jiffies(port->max_wait))
5732 msecs = jiffies_to_msecs(port->max_wait -
5733 jiffies);
5734 else
5735 msecs = 0;
5736 }
5737 tcpm_set_state(port, SNK_TRYWAIT, msecs);
5738 break;
5739 case SRC_TRY_DEBOUNCE:
5740 tcpm_set_state(port, SRC_ATTACHED, PD_T_PD_DEBOUNCE);
5741 break;
5742 case SNK_TRYWAIT:
5743 tcpm_set_cc(port, TYPEC_CC_RD);
5744 tcpm_set_state(port, SNK_TRYWAIT_VBUS, port->timings.cc_debounce_time);
5745 break;
5746 case SNK_TRYWAIT_VBUS:
5747 /*
5748 * TCPM stays in this state indefinitely until VBUS
5749 * is detected as long as Rp is not detected for
5750 * more than a time period of tPDDebounce.
5751 */
5752 if (port->vbus_present && tcpm_port_is_sink(port)) {
5753 tcpm_set_state(port, SNK_ATTACHED, 0);
5754 break;
5755 }
5756 if (!tcpm_port_is_sink(port))
5757 tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
5758 break;
5759 case SNK_TRYWAIT_DEBOUNCE:
5760 tcpm_set_state(port, SNK_UNATTACHED, PD_T_PD_DEBOUNCE);
5761 break;
5762 case SNK_ATTACHED:
5763 ret = tcpm_snk_attach(port);
5764 if (ret < 0)
5765 tcpm_set_state(port, SNK_UNATTACHED, 0);
5766 else
5767 /*
5768 * For Type C port controllers that use Battery Charging
5769 * Detection (based on BCv1.2 spec) to detect USB
5770 * charger type, add a delay of "snk_bc12_cmpletion_time"
5771 * before transitioning to SNK_STARTUP to allow BC1.2
5772 * detection to complete before PD is eventually enabled
5773 * in later states.
5774 */
5775 tcpm_set_state(port, SNK_STARTUP,
5776 port->timings.snk_bc12_cmpletion_time);
5777 break;
5778 case SNK_STARTUP:
5779 opmode = tcpm_get_pwr_opmode(port->polarity ?
5780 port->cc2 : port->cc1);
5781 typec_set_pwr_opmode(port->typec_port, opmode);
5782 port->pwr_opmode = TYPEC_PWR_MODE_USB;
5783 tcpm_set_initial_negotiated_rev(port);
5784 port->message_id = 0;
5785 port->message_id_prime = 0;
5786 port->rx_msgid = -1;
5787 port->rx_msgid_prime = -1;
5788 port->explicit_contract = false;
5789
5790 if (port->ams == POWER_ROLE_SWAP ||
5791 port->ams == FAST_ROLE_SWAP)
5792 /* SRC -> SNK POWER/FAST_ROLE_SWAP finished */
5793 tcpm_ams_finish(port);
5794
5795 tcpm_set_state(port, SNK_DISCOVERY, 0);
5796 break;
5797 case SNK_DISCOVERY:
5798 if (port->vbus_present) {
5799 u32 current_lim = tcpm_get_current_limit(port);
5800
5801 if (port->slow_charger_loop && (current_lim > PD_P_SNK_STDBY_MW / 5))
5802 current_lim = PD_P_SNK_STDBY_MW / 5;
5803 tcpm_set_current_limit(port, current_lim, 5000);
5804 /* Not sink vbus if operational current is 0mA */
5805 tcpm_set_charge(port, !port->pd_supported ||
5806 pdo_max_current(port->snk_pdo[0]));
5807
5808 if (!port->pd_supported)
5809 tcpm_set_state(port, SNK_READY, 0);
5810 else
5811 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
5812 break;
5813 }
5814 /*
5815 * For DRP, timeouts differ. Also, handling is supposed to be
5816 * different and much more complex (dead battery detection;
5817 * see USB power delivery specification, section 8.3.3.6.1.5.1).
5818 */
5819 tcpm_set_state(port, hard_reset_state(port),
5820 port->port_type == TYPEC_PORT_DRP ?
5821 PD_T_DB_DETECT : PD_T_NO_RESPONSE);
5822 break;
5823 case SNK_DISCOVERY_DEBOUNCE:
5824 tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE_DONE,
5825 port->timings.cc_debounce_time);
5826 break;
5827 case SNK_DISCOVERY_DEBOUNCE_DONE:
5828 if (!tcpm_port_is_disconnected(port) &&
5829 tcpm_port_is_sink(port) &&
5830 ktime_after(port->delayed_runtime, ktime_get())) {
5831 tcpm_set_state(port, SNK_DISCOVERY,
5832 ktime_to_ms(ktime_sub(port->delayed_runtime, ktime_get())));
5833 break;
5834 }
5835 tcpm_set_state(port, unattached_state(port), 0);
5836 break;
5837 case SNK_WAIT_CAPABILITIES:
5838 ret = port->tcpc->set_pd_rx(port->tcpc, true);
5839 if (ret < 0) {
5840 tcpm_set_state(port, SNK_READY, 0);
5841 break;
5842 }
5843 /*
5844 * If VBUS has never been low, and we time out waiting
5845 * for source cap, try a soft reset first, in case we
5846 * were already in a stable contract before this boot.
5847 * Do this only once.
5848 */
5849 if (port->vbus_never_low) {
5850 port->vbus_never_low = false;
5851 upcoming_state = SNK_SOFT_RESET;
5852 } else {
5853 if (!port->self_powered)
5854 upcoming_state = SNK_WAIT_CAPABILITIES_TIMEOUT;
5855 else
5856 upcoming_state = hard_reset_state(port);
5857 }
5858
5859 tcpm_set_state(port, upcoming_state,
5860 port->timings.sink_wait_cap_time);
5861 break;
5862 case SNK_WAIT_CAPABILITIES_TIMEOUT:
5863 /*
5864 * There are some USB PD sources in the field, which do not
5865 * properly implement the specification and fail to start
5866 * sending Source Capability messages after a soft reset. The
5867 * specification suggests to do a hard reset when no Source
5868 * capability message is received within PD_T_SINK_WAIT_CAP,
5869 * but that might effectively kil the machine's power source.
5870 *
5871 * This slightly diverges from the specification and tries to
5872 * recover from this by explicitly asking for the capabilities
5873 * using the Get_Source_Cap control message before falling back
5874 * to a hard reset. The control message should also be supported
5875 * and handled by all USB PD source and dual role devices
5876 * according to the specification.
5877 */
5878 if (tcpm_pd_send_control(port, PD_CTRL_GET_SOURCE_CAP, TCPC_TX_SOP))
5879 tcpm_set_state_cond(port, hard_reset_state(port), 0);
5880 else
5881 tcpm_set_state(port, hard_reset_state(port),
5882 port->timings.sink_wait_cap_time);
5883 break;
5884 case SNK_NEGOTIATE_CAPABILITIES:
5885 port->pd_capable = true;
5886 tcpm_set_partner_usb_comm_capable(port,
5887 !!(port->source_caps[0] & PDO_FIXED_USB_COMM));
5888 port->hard_reset_count = 0;
5889 ret = tcpm_pd_send_request(port);
5890 if (ret < 0) {
5891 /* Restore back to the original state */
5892 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
5893 port->pps_data.active,
5894 port->supply_voltage);
5895 /* Let the Source send capabilities again. */
5896 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
5897 } else {
5898 tcpm_set_state_cond(port, hard_reset_state(port),
5899 PD_T_SENDER_RESPONSE);
5900 }
5901 break;
5902 case SNK_NEGOTIATE_PPS_CAPABILITIES:
5903 case SNK_NEGOTIATE_SPR_AVS_CAPABILITIES:
5904 ret = tcpm_pd_send_aug_supply_request(port, port->state ==
5905 SNK_NEGOTIATE_PPS_CAPABILITIES ?
5906 PD_PPS : PD_SPR_AVS);
5907 if (ret < 0) {
5908 /* Restore back to the original state */
5909 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
5910 port->pps_data.active,
5911 port->supply_voltage);
5912 port->aug_supply_req_status = ret;
5913 /*
5914 * If this was called due to updates to sink
5915 * capabilities, and pps is no longer valid, we should
5916 * safely fall back to a standard PDO.
5917 */
5918 if (port->update_sink_caps)
5919 tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
5920 else
5921 tcpm_set_state(port, SNK_READY, 0);
5922 } else {
5923 tcpm_set_state_cond(port, hard_reset_state(port),
5924 PD_T_SENDER_RESPONSE);
5925 }
5926 break;
5927 case SNK_TRANSITION_SINK:
5928 if (port->spr_avs_data.active) {
5929 if (abs(port->req_supply_voltage - port->supply_voltage) >
5930 SPR_AVS_AVS_SMALL_STEP_V * 1000) {
5931 /*
5932 * The Sink Shall reduce its current draw to
5933 * iSnkStdby within tSnkStdby. The reduction to
5934 * iSnkStdby is not required if the voltage
5935 * increase is less than or equal to
5936 * vAvsSmallStep.
5937 */
5938 tcpm_log(port,
5939 "SPR AVS Setting iSnkstandby. Req vol: %u mV Curr vol: %u mV",
5940 port->req_supply_voltage,
5941 port->supply_voltage);
5942 tcpm_set_current_limit(port, PD_I_SNK_STBY_MA,
5943 port->supply_voltage);
5944 }
5945 /*
5946 * Although tAvsSrcTransSmall is expected to be used
5947 * for voltage transistions smaller than 1V, using
5948 * tAvsSrcTransLarge to be resilient against chargers
5949 * which strictly cannot honor tAvsSrcTransSmall to
5950 * improve interoperability.
5951 */
5952 tcpm_set_state(port, hard_reset_state(port),
5953 PD_T_AVS_SRC_TRANS_LARGE);
5954 /*
5955 * From the USB PD spec:
5956 * "The Sink Shall transition to Sink Standby before a
5957 * positive ornegative voltage transition of VBUS.
5958 * During Sink Standby the Sink Shall reduce its power
5959 * draw to pSnkStdby."
5960 *
5961 * This is not applicable to PPS though as the port can
5962 * continue to draw negotiated power without switching
5963 * to standby.
5964 */
5965 } else if (port->supply_voltage != port->req_supply_voltage &&
5966 !port->pps_data.active &&
5967 (port->current_limit * port->supply_voltage / 1000 >
5968 PD_P_SNK_STDBY_MW)) {
5969 u32 stdby_ma = PD_P_SNK_STDBY_MW * 1000 /
5970 port->supply_voltage;
5971
5972 tcpm_log(port, "Setting standby current %u mV @ %u mA",
5973 port->supply_voltage, stdby_ma);
5974 tcpm_set_current_limit(port, stdby_ma,
5975 port->supply_voltage);
5976 tcpm_set_state(port, hard_reset_state(port),
5977 PD_T_PS_TRANSITION);
5978 }
5979 break;
5980 case SNK_TRANSITION_SINK_VBUS:
5981 tcpm_set_state(port, hard_reset_state(port),
5982 PD_T_PS_TRANSITION);
5983 break;
5984 case SNK_READY:
5985 port->try_snk_count = 0;
5986 port->update_sink_caps = false;
5987 if (port->explicit_contract) {
5988 typec_set_pwr_opmode(port->typec_port,
5989 TYPEC_PWR_MODE_PD);
5990 port->pwr_opmode = TYPEC_PWR_MODE_PD;
5991 }
5992
5993 if (!port->pd_capable && port->slow_charger_loop)
5994 tcpm_set_current_limit(port, tcpm_get_current_limit(port), 5000);
5995 tcpm_swap_complete(port, 0);
5996 tcpm_typec_connect(port);
5997 if (port->pd_capable && port->source_caps[0] & PDO_FIXED_DUAL_ROLE)
5998 mod_enable_frs_delayed_work(port, 0);
5999 tcpm_aug_supply_req_complete(port, port->aug_supply_req_status);
6000
6001 if (port->ams != NONE_AMS)
6002 tcpm_ams_finish(port);
6003 if (port->next_ams != NONE_AMS) {
6004 port->ams = port->next_ams;
6005 port->next_ams = NONE_AMS;
6006 }
6007
6008 /*
6009 * If previous AMS is interrupted, switch to the upcoming
6010 * state.
6011 */
6012 if (port->upcoming_state != INVALID_STATE) {
6013 upcoming_state = port->upcoming_state;
6014 port->upcoming_state = INVALID_STATE;
6015 tcpm_set_state(port, upcoming_state, 0);
6016 break;
6017 }
6018
6019 /*
6020 * 6.4.4.3.1 Discover Identity
6021 * "The Discover Identity Command Shall only be sent to SOP when there is an
6022 * Explicit Contract."
6023 *
6024 * Discover Identity on SOP' should be discovered prior to the
6025 * ready state, but if done after a Vconn Swap following Discover
6026 * Identity on SOP then the discovery process can be run here
6027 * as well.
6028 */
6029 if (port->explicit_contract) {
6030 if (port->vdm_discovery_state == VDM_DISCOVERY_UNKNOWN)
6031 tcpm_set_initial_svdm_version(port);
6032 mod_vdm_discovery_delayed_work(port, 0);
6033 } else {
6034 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
6035 }
6036
6037 power_supply_changed(port->psy);
6038 break;
6039
6040 /* Accessory states */
6041 case ACC_UNATTACHED:
6042 tcpm_acc_detach(port);
6043 if (port->port_type == TYPEC_PORT_SRC)
6044 tcpm_set_state(port, SRC_UNATTACHED, 0);
6045 else
6046 tcpm_set_state(port, SNK_UNATTACHED, 0);
6047 break;
6048 case DEBUG_ACC_ATTACHED:
6049 case AUDIO_ACC_ATTACHED:
6050 ret = tcpm_acc_attach(port);
6051 if (ret < 0)
6052 tcpm_set_state(port, ACC_UNATTACHED, 0);
6053 break;
6054 case DEBUG_ACC_DEBOUNCE:
6055 case AUDIO_ACC_DEBOUNCE:
6056 tcpm_set_state(port, ACC_UNATTACHED, port->timings.cc_debounce_time);
6057 break;
6058
6059 /* Hard_Reset states */
6060 case HARD_RESET_SEND:
6061 if (port->ams != NONE_AMS)
6062 tcpm_ams_finish(port);
6063 if (!port->self_powered && port->port_type == TYPEC_PORT_SNK)
6064 dev_err(port->dev, "Initiating hard-reset, which might result in machine power-loss.\n");
6065 /*
6066 * State machine will be directed to HARD_RESET_START,
6067 * thus set upcoming_state to INVALID_STATE.
6068 */
6069 port->upcoming_state = INVALID_STATE;
6070 tcpm_ams_start(port, HARD_RESET);
6071 break;
6072 case HARD_RESET_START:
6073 port->sink_cap_done = false;
6074 if (port->tcpc->enable_frs)
6075 port->tcpc->enable_frs(port->tcpc, false);
6076 port->hard_reset_count++;
6077 port->tcpc->set_pd_rx(port->tcpc, false);
6078 tcpm_unregister_altmodes(port);
6079 port->nr_sink_caps = 0;
6080 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_UNKNOWN);
6081 mod_vdm_discovery_cancel_delayed_work(port);
6082 if (port->pwr_role == TYPEC_SOURCE)
6083 tcpm_set_state(port, SRC_HARD_RESET_VBUS_OFF,
6084 PD_T_PS_HARD_RESET);
6085 else
6086 tcpm_set_state(port, SNK_HARD_RESET_SINK_OFF, 0);
6087 break;
6088 case SRC_HARD_RESET_VBUS_OFF:
6089 /*
6090 * 7.1.5 Response to Hard Resets
6091 * Hard Reset Signaling indicates a communication failure has occurred and the
6092 * Source Shall stop driving VCONN, Shall remove Rp from the VCONN pin and Shall
6093 * drive VBUS to vSafe0V as shown in Figure 7-9.
6094 */
6095 tcpm_set_vconn(port, false);
6096 tcpm_set_vbus(port, false);
6097 tcpm_set_roles(port, port->self_powered, TYPEC_STATE_USB, TYPEC_SOURCE,
6098 tcpm_data_role_for_source(port));
6099 /*
6100 * If tcpc fails to notify vbus off, TCPM will wait for PD_T_SAFE_0V +
6101 * PD_T_SRC_RECOVER before turning vbus back on.
6102 * From Table 7-12 Sequence Description for a Source Initiated Hard Reset:
6103 * 4. Policy Engine waits tPSHardReset after sending Hard Reset Signaling and then
6104 * tells the Device Policy Manager to instruct the power supply to perform a
6105 * Hard Reset. The transition to vSafe0V Shall occur within tSafe0V (t2).
6106 * 5. After tSrcRecover the Source applies power to VBUS in an attempt to
6107 * re-establish communication with the Sink and resume USB Default Operation.
6108 * The transition to vSafe5V Shall occur within tSrcTurnOn(t4).
6109 */
6110 tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SAFE_0V + PD_T_SRC_RECOVER);
6111 break;
6112 case SRC_HARD_RESET_VBUS_ON:
6113 tcpm_set_vconn(port, true);
6114 tcpm_set_vbus(port, true);
6115 if (port->ams == HARD_RESET)
6116 tcpm_ams_finish(port);
6117 if (port->pd_supported)
6118 port->tcpc->set_pd_rx(port->tcpc, true);
6119 tcpm_set_attached_state(port, true);
6120 tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON);
6121 break;
6122 case SNK_HARD_RESET_SINK_OFF:
6123 /* Do not discharge/disconnect during hard reset */
6124 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, 0);
6125 memset(&port->pps_data, 0, sizeof(port->pps_data));
6126 tcpm_set_vconn(port, false);
6127 if (port->pd_capable)
6128 tcpm_set_charge(port, false);
6129 tcpm_set_roles(port, port->self_powered, TYPEC_STATE_USB, TYPEC_SINK,
6130 tcpm_data_role_for_sink(port));
6131 /*
6132 * VBUS may or may not toggle, depending on the adapter.
6133 * If it doesn't toggle, transition to SNK_HARD_RESET_SINK_ON
6134 * directly after timeout.
6135 */
6136 tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, PD_T_SAFE_0V);
6137 break;
6138 case SNK_HARD_RESET_WAIT_VBUS:
6139 if (port->ams == HARD_RESET)
6140 tcpm_ams_finish(port);
6141 /* Assume we're disconnected if VBUS doesn't come back. */
6142 tcpm_set_state(port, SNK_UNATTACHED,
6143 PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON);
6144 break;
6145 case SNK_HARD_RESET_SINK_ON:
6146 /* Note: There is no guarantee that VBUS is on in this state */
6147 /*
6148 * XXX:
6149 * The specification suggests that dual mode ports in sink
6150 * mode should transition to state PE_SRC_Transition_to_default.
6151 * See USB power delivery specification chapter 8.3.3.6.1.3.
6152 * This would mean to
6153 * - turn off VCONN, reset power supply
6154 * - request hardware reset
6155 * - turn on VCONN
6156 * - Transition to state PE_Src_Startup
6157 * SNK only ports shall transition to state Snk_Startup
6158 * (see chapter 8.3.3.3.8).
6159 * Similar, dual-mode ports in source mode should transition
6160 * to PE_SNK_Transition_to_default.
6161 */
6162 if (port->pd_capable) {
6163 tcpm_set_current_limit(port,
6164 tcpm_get_current_limit(port),
6165 5000);
6166 /* Not sink vbus if operational current is 0mA */
6167 tcpm_set_charge(port, !!pdo_max_current(port->snk_pdo[0]));
6168 }
6169 if (port->ams == HARD_RESET)
6170 tcpm_ams_finish(port);
6171 tcpm_set_attached_state(port, true);
6172 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, VSAFE5V);
6173 tcpm_set_state(port, SNK_STARTUP, 0);
6174 break;
6175
6176 /* Soft_Reset states */
6177 case SOFT_RESET:
6178 port->message_id = 0;
6179 port->rx_msgid = -1;
6180 /* remove existing capabilities */
6181 tcpm_partner_source_caps_reset(port);
6182 tcpm_pd_send_control(port, PD_CTRL_ACCEPT, TCPC_TX_SOP);
6183 port->vdm_sm_running = false;
6184 port->explicit_contract = false;
6185 tcpm_ams_finish(port);
6186 if (port->pwr_role == TYPEC_SOURCE) {
6187 port->upcoming_state = SRC_SEND_CAPABILITIES;
6188 tcpm_ams_start(port, POWER_NEGOTIATION);
6189 } else {
6190 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
6191 }
6192 break;
6193 case SRC_SOFT_RESET_WAIT_SNK_TX:
6194 case SNK_SOFT_RESET:
6195 if (port->ams != NONE_AMS)
6196 tcpm_ams_finish(port);
6197 port->upcoming_state = SOFT_RESET_SEND;
6198 tcpm_ams_start(port, SOFT_RESET_AMS);
6199 break;
6200 case SOFT_RESET_SEND:
6201 /*
6202 * Power Delivery 3.0 Section 6.3.13
6203 *
6204 * A Soft_Reset Message Shall be targeted at a specific entity
6205 * depending on the type of SOP* packet used.
6206 */
6207 if (port->tx_sop_type == TCPC_TX_SOP_PRIME) {
6208 port->message_id_prime = 0;
6209 port->rx_msgid_prime = -1;
6210 tcpm_pd_send_control(port, PD_CTRL_SOFT_RESET, TCPC_TX_SOP_PRIME);
6211 tcpm_set_state_cond(port, ready_state(port), PD_T_SENDER_RESPONSE);
6212 } else {
6213 port->message_id = 0;
6214 port->rx_msgid = -1;
6215 /* remove existing capabilities */
6216 tcpm_partner_source_caps_reset(port);
6217 if (tcpm_pd_send_control(port, PD_CTRL_SOFT_RESET, TCPC_TX_SOP))
6218 tcpm_set_state_cond(port, hard_reset_state(port), 0);
6219 else
6220 tcpm_set_state_cond(port, hard_reset_state(port),
6221 PD_T_SENDER_RESPONSE);
6222 }
6223 break;
6224
6225 /* DR_Swap states */
6226 case DR_SWAP_SEND:
6227 tcpm_pd_send_control(port, PD_CTRL_DR_SWAP, TCPC_TX_SOP);
6228 tcpm_set_state_cond(port, DR_SWAP_SEND_TIMEOUT,
6229 PD_T_SENDER_RESPONSE);
6230 break;
6231 case DR_SWAP_ACCEPT:
6232 tcpm_pd_send_control(port, PD_CTRL_ACCEPT, TCPC_TX_SOP);
6233 tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0);
6234 break;
6235 case DR_SWAP_SEND_TIMEOUT:
6236 tcpm_swap_complete(port, -ETIMEDOUT);
6237 tcpm_ams_finish(port);
6238 tcpm_set_state(port, ready_state(port), 0);
6239 break;
6240 case DR_SWAP_CHANGE_DR:
6241 tcpm_unregister_altmodes(port);
6242 if (port->data_role == TYPEC_HOST)
6243 tcpm_set_roles(port, true, TYPEC_STATE_USB, port->pwr_role,
6244 TYPEC_DEVICE);
6245 else
6246 tcpm_set_roles(port, true, TYPEC_STATE_USB, port->pwr_role,
6247 TYPEC_HOST);
6248 if (port->data_role == TYPEC_HOST || port->negotiated_rev > PD_REV20)
6249 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_UNKNOWN);
6250 tcpm_ams_finish(port);
6251 tcpm_set_state(port, ready_state(port), 0);
6252 break;
6253
6254 case FR_SWAP_SEND:
6255 if (tcpm_pd_send_control(port, PD_CTRL_FR_SWAP, TCPC_TX_SOP)) {
6256 tcpm_set_state(port, ERROR_RECOVERY, 0);
6257 break;
6258 }
6259 tcpm_set_state_cond(port, FR_SWAP_SEND_TIMEOUT, PD_T_SENDER_RESPONSE);
6260 break;
6261 case FR_SWAP_SEND_TIMEOUT:
6262 tcpm_set_state(port, ERROR_RECOVERY, 0);
6263 break;
6264 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
6265 tcpm_set_state(port, ERROR_RECOVERY, port->timings.ps_src_off_time);
6266 break;
6267 case FR_SWAP_SNK_SRC_NEW_SINK_READY:
6268 if (port->vbus_source)
6269 tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0);
6270 else
6271 tcpm_set_state(port, ERROR_RECOVERY, PD_T_RECEIVER_RESPONSE);
6272 break;
6273 case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
6274 tcpm_set_pwr_role(port, TYPEC_SOURCE);
6275 if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY, TCPC_TX_SOP)) {
6276 tcpm_set_state(port, ERROR_RECOVERY, 0);
6277 break;
6278 }
6279 tcpm_set_cc(port, tcpm_rp_cc(port));
6280 tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START);
6281 break;
6282
6283 /* PR_Swap states */
6284 case PR_SWAP_ACCEPT:
6285 tcpm_pd_send_control(port, PD_CTRL_ACCEPT, TCPC_TX_SOP);
6286 tcpm_set_state(port, PR_SWAP_START, 0);
6287 break;
6288 case PR_SWAP_SEND:
6289 tcpm_pd_send_control(port, PD_CTRL_PR_SWAP, TCPC_TX_SOP);
6290 tcpm_set_state_cond(port, PR_SWAP_SEND_TIMEOUT,
6291 PD_T_SENDER_RESPONSE);
6292 break;
6293 case PR_SWAP_SEND_TIMEOUT:
6294 tcpm_swap_complete(port, -ETIMEDOUT);
6295 tcpm_set_state(port, ready_state(port), 0);
6296 break;
6297 case PR_SWAP_START:
6298 tcpm_apply_rc(port);
6299 if (port->pwr_role == TYPEC_SOURCE)
6300 tcpm_set_state(port, PR_SWAP_SRC_SNK_TRANSITION_OFF,
6301 PD_T_SRC_TRANSITION);
6302 else
6303 tcpm_set_state(port, PR_SWAP_SNK_SRC_SINK_OFF, 0);
6304 break;
6305 case PR_SWAP_SRC_SNK_TRANSITION_OFF:
6306 /*
6307 * Prevent vbus discharge circuit from turning on during PR_SWAP
6308 * as this is not a disconnect.
6309 */
6310 tcpm_set_vbus(port, false);
6311 port->explicit_contract = false;
6312 /* allow time for Vbus discharge, must be < tSrcSwapStdby */
6313 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF,
6314 PD_T_SRCSWAPSTDBY);
6315 break;
6316 case PR_SWAP_SRC_SNK_SOURCE_OFF:
6317 tcpm_set_cc(port, TYPEC_CC_RD);
6318 /* allow CC debounce */
6319 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED,
6320 port->timings.cc_debounce_time);
6321 break;
6322 case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
6323 /*
6324 * USB-PD standard, 6.2.1.4, Port Power Role:
6325 * "During the Power Role Swap Sequence, for the initial Source
6326 * Port, the Port Power Role field shall be set to Sink in the
6327 * PS_RDY Message indicating that the initial Source’s power
6328 * supply is turned off"
6329 */
6330 tcpm_set_pwr_role(port, TYPEC_SINK);
6331 if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY, TCPC_TX_SOP)) {
6332 tcpm_set_state(port, ERROR_RECOVERY, 0);
6333 break;
6334 }
6335 tcpm_set_state(port, ERROR_RECOVERY, PD_T_PS_SOURCE_ON_PRS);
6336 break;
6337 case PR_SWAP_SRC_SNK_SINK_ON:
6338 tcpm_enable_auto_vbus_discharge(port, true);
6339 /* Set the vbus disconnect threshold for implicit contract */
6340 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, VSAFE5V);
6341 tcpm_set_state(port, SNK_STARTUP, 0);
6342 break;
6343 case PR_SWAP_SNK_SRC_SINK_OFF:
6344 /* will be source, remove existing capabilities */
6345 tcpm_partner_source_caps_reset(port);
6346 /*
6347 * Prevent vbus discharge circuit from turning on during PR_SWAP
6348 * as this is not a disconnect.
6349 */
6350 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB,
6351 port->pps_data.active, 0);
6352 tcpm_set_charge(port, false);
6353 tcpm_set_state(port, ERROR_RECOVERY, port->timings.ps_src_off_time);
6354 break;
6355 case PR_SWAP_SNK_SRC_SOURCE_ON:
6356 tcpm_enable_auto_vbus_discharge(port, true);
6357 tcpm_set_cc(port, tcpm_rp_cc(port));
6358 tcpm_set_vbus(port, true);
6359 /*
6360 * allow time VBUS ramp-up, must be < tNewSrc
6361 * Also, this window overlaps with CC debounce as well.
6362 * So, Wait for the max of two which is PD_T_NEWSRC
6363 */
6364 tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP,
6365 PD_T_NEWSRC);
6366 break;
6367 case PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP:
6368 /*
6369 * USB PD standard, 6.2.1.4:
6370 * "Subsequent Messages initiated by the Policy Engine,
6371 * such as the PS_RDY Message sent to indicate that Vbus
6372 * is ready, will have the Port Power Role field set to
6373 * Source."
6374 */
6375 tcpm_set_pwr_role(port, TYPEC_SOURCE);
6376 tcpm_pd_send_control(port, PD_CTRL_PS_RDY, TCPC_TX_SOP);
6377 tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START);
6378 break;
6379
6380 case VCONN_SWAP_ACCEPT:
6381 tcpm_pd_send_control(port, PD_CTRL_ACCEPT, TCPC_TX_SOP);
6382 tcpm_ams_finish(port);
6383 tcpm_set_state(port, VCONN_SWAP_START, 0);
6384 break;
6385 case VCONN_SWAP_SEND:
6386 tcpm_pd_send_control(port, PD_CTRL_VCONN_SWAP, TCPC_TX_SOP);
6387 tcpm_set_state(port, VCONN_SWAP_SEND_TIMEOUT,
6388 PD_T_SENDER_RESPONSE);
6389 break;
6390 case VCONN_SWAP_SEND_TIMEOUT:
6391 tcpm_swap_complete(port, -ETIMEDOUT);
6392 tcpm_set_state(port, ready_state(port), 0);
6393 break;
6394 case VCONN_SWAP_START:
6395 if (port->vconn_role == TYPEC_SOURCE)
6396 tcpm_set_state(port, VCONN_SWAP_WAIT_FOR_VCONN, 0);
6397 else
6398 tcpm_set_state(port, VCONN_SWAP_TURN_ON_VCONN, 0);
6399 break;
6400 case VCONN_SWAP_WAIT_FOR_VCONN:
6401 tcpm_set_state(port, hard_reset_state(port),
6402 PD_T_VCONN_SOURCE_ON);
6403 break;
6404 case VCONN_SWAP_TURN_ON_VCONN:
6405 ret = tcpm_set_vconn(port, true);
6406 tcpm_pd_send_control(port, PD_CTRL_PS_RDY, TCPC_TX_SOP);
6407 /*
6408 * USB PD 3.0 Section 6.4.4.3.1
6409 *
6410 * Note that a Cable Plug or VPD will not be ready for PD
6411 * Communication until tVCONNStable after VCONN has been applied
6412 */
6413 if (!ret)
6414 tcpm_set_state(port, VCONN_SWAP_SEND_SOFT_RESET,
6415 PD_T_VCONN_STABLE);
6416 else
6417 tcpm_set_state(port, ready_state(port), 0);
6418 break;
6419 case VCONN_SWAP_TURN_OFF_VCONN:
6420 tcpm_set_vconn(port, false);
6421 tcpm_set_state(port, ready_state(port), 0);
6422 break;
6423 case VCONN_SWAP_SEND_SOFT_RESET:
6424 tcpm_swap_complete(port, port->swap_status);
6425 if (tcpm_can_communicate_sop_prime(port)) {
6426 port->tx_sop_type = TCPC_TX_SOP_PRIME;
6427 port->upcoming_state = SOFT_RESET_SEND;
6428 tcpm_ams_start(port, SOFT_RESET_AMS);
6429 } else {
6430 tcpm_set_state(port, ready_state(port), 0);
6431 }
6432 break;
6433
6434 case DR_SWAP_CANCEL:
6435 case PR_SWAP_CANCEL:
6436 case VCONN_SWAP_CANCEL:
6437 tcpm_swap_complete(port, port->swap_status);
6438 if (port->pwr_role == TYPEC_SOURCE)
6439 tcpm_set_state(port, SRC_READY, 0);
6440 else
6441 tcpm_set_state(port, SNK_READY, 0);
6442 break;
6443 case FR_SWAP_CANCEL:
6444 if (port->pwr_role == TYPEC_SOURCE)
6445 tcpm_set_state(port, SRC_READY, 0);
6446 else
6447 tcpm_set_state(port, SNK_READY, 0);
6448 break;
6449
6450 case BIST_RX:
6451 switch (BDO_MODE_MASK(port->bist_request)) {
6452 case BDO_MODE_CARRIER2:
6453 tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL);
6454 tcpm_set_state(port, unattached_state(port),
6455 PD_T_BIST_CONT_MODE);
6456 break;
6457 case BDO_MODE_TESTDATA:
6458 if (port->tcpc->set_bist_data) {
6459 tcpm_log(port, "Enable BIST MODE TESTDATA");
6460 port->tcpc->set_bist_data(port->tcpc, true);
6461 }
6462 break;
6463 default:
6464 break;
6465 }
6466 break;
6467 case GET_STATUS_SEND:
6468 tcpm_pd_send_control(port, PD_CTRL_GET_STATUS, TCPC_TX_SOP);
6469 tcpm_set_state(port, GET_STATUS_SEND_TIMEOUT,
6470 PD_T_SENDER_RESPONSE);
6471 break;
6472 case GET_STATUS_SEND_TIMEOUT:
6473 tcpm_set_state(port, ready_state(port), 0);
6474 break;
6475 case GET_PPS_STATUS_SEND:
6476 tcpm_pd_send_control(port, PD_CTRL_GET_PPS_STATUS, TCPC_TX_SOP);
6477 tcpm_set_state(port, GET_PPS_STATUS_SEND_TIMEOUT,
6478 PD_T_SENDER_RESPONSE);
6479 break;
6480 case GET_PPS_STATUS_SEND_TIMEOUT:
6481 tcpm_set_state(port, ready_state(port), 0);
6482 break;
6483 case GET_SINK_CAP:
6484 tcpm_pd_send_control(port, PD_CTRL_GET_SINK_CAP, TCPC_TX_SOP);
6485 tcpm_set_state(port, GET_SINK_CAP_TIMEOUT, PD_T_SENDER_RESPONSE);
6486 break;
6487 case GET_SINK_CAP_TIMEOUT:
6488 port->sink_cap_done = true;
6489 tcpm_set_state(port, ready_state(port), 0);
6490 break;
6491 case ERROR_RECOVERY:
6492 tcpm_swap_complete(port, -EPROTO);
6493 tcpm_aug_supply_req_complete(port, -EPROTO);
6494 tcpm_set_state(port, PORT_RESET, 0);
6495 break;
6496 case PORT_RESET:
6497 tcpm_reset_port(port);
6498 if (port->self_powered)
6499 tcpm_set_cc(port, TYPEC_CC_OPEN);
6500 else
6501 tcpm_set_cc(port, tcpm_default_state(port) == SNK_UNATTACHED ?
6502 TYPEC_CC_RD : tcpm_rp_cc(port));
6503 tcpm_set_state(port, PORT_RESET_WAIT_OFF,
6504 PD_T_ERROR_RECOVERY);
6505 break;
6506 case PORT_RESET_WAIT_OFF:
6507 tcpm_set_state(port,
6508 tcpm_default_state(port),
6509 port->vbus_present ? port->timings.ps_src_off_time : 0);
6510 break;
6511
6512 /* AMS intermediate state */
6513 case AMS_START:
6514 if (port->upcoming_state == INVALID_STATE) {
6515 tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
6516 SRC_READY : SNK_READY, 0);
6517 break;
6518 }
6519
6520 upcoming_state = port->upcoming_state;
6521 port->upcoming_state = INVALID_STATE;
6522 tcpm_set_state(port, upcoming_state, 0);
6523 break;
6524
6525 /* Chunk state */
6526 case CHUNK_NOT_SUPP:
6527 tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP, TCPC_TX_SOP);
6528 tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ? SRC_READY : SNK_READY, 0);
6529 break;
6530
6531 /* Cable states */
6532 case SRC_VDM_IDENTITY_REQUEST:
6533 mod_vdm_discovery_delayed_work(port, 0);
6534 port->upcoming_state = SRC_SEND_CAPABILITIES;
6535 break;
6536
6537 default:
6538 WARN(1, "Unexpected port state %d\n", port->state);
6539 break;
6540 }
6541 }
6542
tcpm_state_machine_work(struct kthread_work * work)6543 static void tcpm_state_machine_work(struct kthread_work *work)
6544 {
6545 struct tcpm_port *port = container_of(work, struct tcpm_port, state_machine);
6546 enum tcpm_state prev_state;
6547
6548 mutex_lock(&port->lock);
6549 port->state_machine_running = true;
6550
6551 if (port->queued_message && tcpm_send_queued_message(port))
6552 goto done;
6553
6554 /* If we were queued due to a delayed state change, update it now */
6555 if (port->delayed_state) {
6556 tcpm_log(port, "state change %s -> %s [delayed %ld ms]",
6557 tcpm_states[port->state],
6558 tcpm_states[port->delayed_state], port->delay_ms);
6559 port->prev_state = port->state;
6560 port->state = port->delayed_state;
6561 port->delayed_state = INVALID_STATE;
6562 }
6563
6564 /*
6565 * Continue running as long as we have (non-delayed) state changes
6566 * to make.
6567 */
6568 do {
6569 prev_state = port->state;
6570 run_state_machine(port);
6571 if (port->queued_message)
6572 tcpm_send_queued_message(port);
6573 } while (port->state != prev_state && !port->delayed_state);
6574
6575 done:
6576 port->state_machine_running = false;
6577 mutex_unlock(&port->lock);
6578 }
6579
_tcpm_cc_change(struct tcpm_port * port,enum typec_cc_status cc1,enum typec_cc_status cc2)6580 static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
6581 enum typec_cc_status cc2)
6582 {
6583 enum typec_cc_status old_cc1, old_cc2;
6584 enum tcpm_state new_state;
6585
6586 old_cc1 = port->cc1;
6587 old_cc2 = port->cc2;
6588 port->cc1 = cc1;
6589 port->cc2 = cc2;
6590
6591 tcpm_log_force(port,
6592 "CC1: %u -> %u, CC2: %u -> %u [state %s, polarity %d, %s]",
6593 old_cc1, cc1, old_cc2, cc2, tcpm_states[port->state],
6594 port->polarity,
6595 tcpm_port_is_disconnected(port) ? "disconnected"
6596 : "connected");
6597
6598 switch (port->state) {
6599 case TOGGLING:
6600 if (tcpm_port_is_debug_source(port) || tcpm_port_is_audio(port) ||
6601 tcpm_port_is_source(port))
6602 tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
6603 else if (tcpm_port_is_debug_sink(port) || tcpm_port_is_sink(port))
6604 tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
6605 break;
6606 case CHECK_CONTAMINANT:
6607 /* Wait for Toggling to be resumed */
6608 break;
6609 case SRC_UNATTACHED:
6610 case ACC_UNATTACHED:
6611 if (tcpm_port_is_debug_source(port) || tcpm_port_is_audio(port) ||
6612 tcpm_port_is_source(port))
6613 tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
6614 else if (tcpm_port_is_debug_sink(port))
6615 tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
6616 break;
6617 case SRC_ATTACH_WAIT:
6618 if (tcpm_port_is_disconnected(port) ||
6619 tcpm_port_is_audio_detached(port))
6620 tcpm_set_state(port, SRC_UNATTACHED, 0);
6621 else if (cc1 != old_cc1 || cc2 != old_cc2)
6622 tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
6623 break;
6624 case SRC_ATTACHED:
6625 case SRC_STARTUP:
6626 case SRC_SEND_CAPABILITIES:
6627 case SRC_READY:
6628 if (tcpm_port_is_disconnected(port) ||
6629 !tcpm_port_is_source(port)) {
6630 if (port->port_type == TYPEC_PORT_SRC)
6631 tcpm_set_state(port, SRC_UNATTACHED, tcpm_wait_for_discharge(port));
6632 else
6633 tcpm_set_state(port, SNK_UNATTACHED, tcpm_wait_for_discharge(port));
6634 }
6635 break;
6636 case SNK_UNATTACHED:
6637 if (tcpm_port_is_debug_sink(port) || tcpm_port_is_audio(port) ||
6638 tcpm_port_is_sink(port))
6639 tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
6640 break;
6641 case SNK_ATTACH_WAIT:
6642 if ((port->cc1 == TYPEC_CC_OPEN &&
6643 port->cc2 != TYPEC_CC_OPEN) ||
6644 (port->cc1 != TYPEC_CC_OPEN &&
6645 port->cc2 == TYPEC_CC_OPEN))
6646 new_state = SNK_DEBOUNCED;
6647 else if (tcpm_port_is_disconnected(port))
6648 new_state = SNK_UNATTACHED;
6649 else
6650 break;
6651 if (new_state != port->delayed_state)
6652 tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
6653 break;
6654 case SNK_DEBOUNCED:
6655 if (tcpm_port_is_disconnected(port))
6656 new_state = SNK_UNATTACHED;
6657 else if (port->vbus_present)
6658 new_state = tcpm_try_src(port) ? SRC_TRY : SNK_ATTACHED;
6659 else
6660 new_state = SNK_UNATTACHED;
6661 if (new_state != port->delayed_state)
6662 tcpm_set_state(port, SNK_DEBOUNCED, 0);
6663 break;
6664 case SNK_READY:
6665 /*
6666 * EXIT condition is based primarily on vbus disconnect and CC is secondary.
6667 * "A port that has entered into USB PD communications with the Source and
6668 * has seen the CC voltage exceed vRd-USB may monitor the CC pin to detect
6669 * cable disconnect in addition to monitoring VBUS.
6670 *
6671 * A port that is monitoring the CC voltage for disconnect (but is not in
6672 * the process of a USB PD PR_Swap or USB PD FR_Swap) shall transition to
6673 * Unattached.SNK within tSinkDisconnect after the CC voltage remains below
6674 * vRd-USB for tPDDebounce."
6675 *
6676 * When set_auto_vbus_discharge_threshold is enabled, CC pins go
6677 * away before vbus decays to disconnect threshold. Allow
6678 * disconnect to be driven by vbus disconnect when auto vbus
6679 * discharge is enabled.
6680 */
6681 if (!port->auto_vbus_discharge_enabled && tcpm_port_is_disconnected(port))
6682 tcpm_set_state(port, unattached_state(port), 0);
6683 else if (!port->pd_capable &&
6684 (cc1 != old_cc1 || cc2 != old_cc2))
6685 tcpm_set_current_limit(port,
6686 tcpm_get_current_limit(port),
6687 5000);
6688 break;
6689
6690 case AUDIO_ACC_ATTACHED:
6691 if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
6692 tcpm_set_state(port, AUDIO_ACC_DEBOUNCE, 0);
6693 break;
6694 case AUDIO_ACC_DEBOUNCE:
6695 if (tcpm_port_is_audio(port))
6696 tcpm_set_state(port, AUDIO_ACC_ATTACHED, 0);
6697 break;
6698
6699 case DEBUG_ACC_ATTACHED:
6700 if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
6701 tcpm_set_state(port, DEBUG_ACC_DEBOUNCE, 0);
6702 break;
6703
6704 case DEBUG_ACC_DEBOUNCE:
6705 if (tcpm_port_is_debug(port))
6706 tcpm_set_state(port, DEBUG_ACC_ATTACHED, 0);
6707 break;
6708
6709 case SNK_TRY:
6710 /* Do nothing, waiting for timeout */
6711 break;
6712
6713 case SNK_DISCOVERY:
6714 /* CC line is unstable, wait for debounce */
6715 if (tcpm_port_is_disconnected(port))
6716 tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE, 0);
6717 break;
6718 case SNK_DISCOVERY_DEBOUNCE:
6719 break;
6720
6721 case SRC_TRYWAIT:
6722 /* Hand over to state machine if needed */
6723 if (!port->vbus_present && tcpm_port_is_source(port))
6724 tcpm_set_state(port, SRC_TRYWAIT_DEBOUNCE, 0);
6725 break;
6726 case SRC_TRYWAIT_DEBOUNCE:
6727 if (port->vbus_present || !tcpm_port_is_source(port))
6728 tcpm_set_state(port, SRC_TRYWAIT, 0);
6729 break;
6730 case SNK_TRY_WAIT_DEBOUNCE:
6731 if (!tcpm_port_is_sink(port)) {
6732 port->max_wait = 0;
6733 tcpm_set_state(port, SRC_TRYWAIT, PD_T_PD_DEBOUNCE);
6734 }
6735 break;
6736 case SRC_TRY_WAIT:
6737 if (tcpm_port_is_source(port))
6738 tcpm_set_state(port, SRC_TRY_DEBOUNCE, 0);
6739 break;
6740 case SRC_TRY_DEBOUNCE:
6741 tcpm_set_state(port, SRC_TRY_WAIT, 0);
6742 break;
6743 case SNK_TRYWAIT_DEBOUNCE:
6744 if (tcpm_port_is_sink(port))
6745 tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
6746 break;
6747 case SNK_TRYWAIT_VBUS:
6748 if (!tcpm_port_is_sink(port))
6749 tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
6750 break;
6751 case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
6752 if (!tcpm_port_is_sink(port))
6753 tcpm_set_state(port, SRC_TRYWAIT, PD_T_TRY_CC_DEBOUNCE);
6754 else
6755 tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS, 0);
6756 break;
6757 case SNK_TRYWAIT:
6758 /* Do nothing, waiting for tCCDebounce */
6759 break;
6760 case PR_SWAP_SNK_SRC_SINK_OFF:
6761 case PR_SWAP_SRC_SNK_TRANSITION_OFF:
6762 case PR_SWAP_SRC_SNK_SOURCE_OFF:
6763 case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
6764 case PR_SWAP_SNK_SRC_SOURCE_ON:
6765 /*
6766 * CC state change is expected in PR_SWAP
6767 * Ignore it.
6768 */
6769 break;
6770 case FR_SWAP_SEND:
6771 case FR_SWAP_SEND_TIMEOUT:
6772 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
6773 case FR_SWAP_SNK_SRC_NEW_SINK_READY:
6774 case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
6775 /* Do nothing, CC change expected */
6776 break;
6777
6778 case PORT_RESET:
6779 case PORT_RESET_WAIT_OFF:
6780 /*
6781 * State set back to default mode once the timer completes.
6782 * Ignore CC changes here.
6783 */
6784 break;
6785 default:
6786 /*
6787 * While acting as sink and auto vbus discharge is enabled, Allow disconnect
6788 * to be driven by vbus disconnect.
6789 */
6790 if (tcpm_port_is_disconnected(port) && !(port->pwr_role == TYPEC_SINK &&
6791 port->auto_vbus_discharge_enabled))
6792 tcpm_set_state(port, unattached_state(port), 0);
6793 break;
6794 }
6795 }
6796
_tcpm_pd_vbus_on(struct tcpm_port * port)6797 static void _tcpm_pd_vbus_on(struct tcpm_port *port)
6798 {
6799 tcpm_log_force(port, "VBUS on");
6800 port->vbus_present = true;
6801 /*
6802 * When vbus_present is true i.e. Voltage at VBUS is greater than VSAFE5V implicitly
6803 * states that vbus is not at VSAFE0V, hence clear the vbus_vsafe0v flag here.
6804 */
6805 port->vbus_vsafe0v = false;
6806
6807 switch (port->state) {
6808 case SNK_TRANSITION_SINK_VBUS:
6809 port->explicit_contract = true;
6810 tcpm_set_state(port, SNK_READY, 0);
6811 break;
6812 case SNK_DISCOVERY:
6813 tcpm_set_state(port, SNK_DISCOVERY, 0);
6814 break;
6815
6816 case SNK_DEBOUNCED:
6817 tcpm_set_state(port, tcpm_try_src(port) ? SRC_TRY
6818 : SNK_ATTACHED,
6819 0);
6820 break;
6821 case SNK_HARD_RESET_WAIT_VBUS:
6822 tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, 0);
6823 break;
6824 case SRC_ATTACHED:
6825 tcpm_set_state(port, SRC_STARTUP, 0);
6826 break;
6827 case SRC_HARD_RESET_VBUS_ON:
6828 tcpm_set_state(port, SRC_STARTUP, 0);
6829 break;
6830
6831 case SNK_TRY:
6832 /* Do nothing, waiting for timeout */
6833 break;
6834 case SRC_TRYWAIT:
6835 /* Do nothing, Waiting for Rd to be detected */
6836 break;
6837 case SRC_TRYWAIT_DEBOUNCE:
6838 tcpm_set_state(port, SRC_TRYWAIT, 0);
6839 break;
6840 case SNK_TRY_WAIT_DEBOUNCE:
6841 /* Do nothing, waiting for PD_DEBOUNCE to do be done */
6842 break;
6843 case SNK_TRYWAIT:
6844 /* Do nothing, waiting for tCCDebounce */
6845 break;
6846 case SNK_TRYWAIT_VBUS:
6847 if (tcpm_port_is_sink(port))
6848 tcpm_set_state(port, SNK_ATTACHED, 0);
6849 break;
6850 case SNK_TRYWAIT_DEBOUNCE:
6851 /* Do nothing, waiting for Rp */
6852 break;
6853 case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
6854 if (port->vbus_present && tcpm_port_is_sink(port))
6855 tcpm_set_state(port, SNK_ATTACHED, 0);
6856 break;
6857 case SRC_TRY_WAIT:
6858 case SRC_TRY_DEBOUNCE:
6859 /* Do nothing, waiting for sink detection */
6860 break;
6861 case FR_SWAP_SEND:
6862 case FR_SWAP_SEND_TIMEOUT:
6863 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
6864 case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
6865 if (port->tcpc->frs_sourcing_vbus)
6866 port->tcpc->frs_sourcing_vbus(port->tcpc);
6867 break;
6868 case FR_SWAP_SNK_SRC_NEW_SINK_READY:
6869 if (port->tcpc->frs_sourcing_vbus)
6870 port->tcpc->frs_sourcing_vbus(port->tcpc);
6871 tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0);
6872 break;
6873
6874 case PORT_RESET:
6875 case PORT_RESET_WAIT_OFF:
6876 /*
6877 * State set back to default mode once the timer completes.
6878 * Ignore vbus changes here.
6879 */
6880 break;
6881
6882 default:
6883 break;
6884 }
6885 }
6886
_tcpm_pd_vbus_off(struct tcpm_port * port)6887 static void _tcpm_pd_vbus_off(struct tcpm_port *port)
6888 {
6889 tcpm_log_force(port, "VBUS off");
6890 port->vbus_present = false;
6891 port->vbus_never_low = false;
6892 switch (port->state) {
6893 case SNK_HARD_RESET_SINK_OFF:
6894 tcpm_set_state(port, SNK_HARD_RESET_WAIT_VBUS, 0);
6895 break;
6896 case HARD_RESET_SEND:
6897 break;
6898 case SNK_TRY:
6899 /* Do nothing, waiting for timeout */
6900 break;
6901 case SRC_TRYWAIT:
6902 /* Hand over to state machine if needed */
6903 if (tcpm_port_is_source(port))
6904 tcpm_set_state(port, SRC_TRYWAIT_DEBOUNCE, 0);
6905 break;
6906 case SNK_TRY_WAIT_DEBOUNCE:
6907 /* Do nothing, waiting for PD_DEBOUNCE to do be done */
6908 break;
6909 case SNK_TRYWAIT:
6910 case SNK_TRYWAIT_VBUS:
6911 case SNK_TRYWAIT_DEBOUNCE:
6912 break;
6913 case SNK_ATTACH_WAIT:
6914 case SNK_DEBOUNCED:
6915 /* Do nothing, as TCPM is still waiting for vbus to reach VSAFE5V to connect */
6916 break;
6917
6918 case SNK_NEGOTIATE_CAPABILITIES:
6919 break;
6920
6921 case PR_SWAP_SRC_SNK_TRANSITION_OFF:
6922 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, 0);
6923 break;
6924
6925 case PR_SWAP_SNK_SRC_SINK_OFF:
6926 /* Do nothing, expected */
6927 break;
6928
6929 case PR_SWAP_SNK_SRC_SOURCE_ON:
6930 /*
6931 * Do nothing when vbus off notification is received.
6932 * TCPM can wait for PD_T_NEWSRC in PR_SWAP_SNK_SRC_SOURCE_ON
6933 * for the vbus source to ramp up.
6934 */
6935 break;
6936
6937 case PORT_RESET_WAIT_OFF:
6938 tcpm_set_state(port, tcpm_default_state(port), 0);
6939 break;
6940
6941 case SRC_TRY_WAIT:
6942 case SRC_TRY_DEBOUNCE:
6943 /* Do nothing, waiting for sink detection */
6944 break;
6945
6946 case SRC_STARTUP:
6947 case SRC_SEND_CAPABILITIES:
6948 case SRC_SEND_CAPABILITIES_TIMEOUT:
6949 case SRC_NEGOTIATE_CAPABILITIES:
6950 case SRC_TRANSITION_SUPPLY:
6951 case SRC_READY:
6952 case SRC_WAIT_NEW_CAPABILITIES:
6953 /*
6954 * Force to unattached state to re-initiate connection.
6955 * DRP port should move to Unattached.SNK instead of Unattached.SRC if
6956 * sink removed. Although sink removal here is due to source's vbus collapse,
6957 * treat it the same way for consistency.
6958 */
6959 if (port->port_type == TYPEC_PORT_SRC)
6960 tcpm_set_state(port, SRC_UNATTACHED, tcpm_wait_for_discharge(port));
6961 else
6962 tcpm_set_state(port, SNK_UNATTACHED, tcpm_wait_for_discharge(port));
6963 break;
6964
6965 case PORT_RESET:
6966 /*
6967 * State set back to default mode once the timer completes.
6968 * Ignore vbus changes here.
6969 */
6970 break;
6971
6972 case FR_SWAP_SEND:
6973 case FR_SWAP_SEND_TIMEOUT:
6974 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
6975 case FR_SWAP_SNK_SRC_NEW_SINK_READY:
6976 case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
6977 /* Do nothing, vbus drop expected */
6978 break;
6979
6980 case SNK_HARD_RESET_WAIT_VBUS:
6981 /* Do nothing, its OK to receive vbus off events */
6982 break;
6983
6984 default:
6985 if (port->pwr_role == TYPEC_SINK && port->attached)
6986 tcpm_set_state(port, SNK_UNATTACHED, tcpm_wait_for_discharge(port));
6987 break;
6988 }
6989 }
6990
_tcpm_pd_vbus_vsafe0v(struct tcpm_port * port)6991 static void _tcpm_pd_vbus_vsafe0v(struct tcpm_port *port)
6992 {
6993 tcpm_log_force(port, "VBUS VSAFE0V");
6994 port->vbus_vsafe0v = true;
6995 switch (port->state) {
6996 case SRC_HARD_RESET_VBUS_OFF:
6997 /*
6998 * After establishing the vSafe0V voltage condition on VBUS, the Source Shall wait
6999 * tSrcRecover before re-applying VCONN and restoring VBUS to vSafe5V.
7000 */
7001 tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SRC_RECOVER);
7002 break;
7003 case SRC_ATTACH_WAIT:
7004 if (tcpm_port_is_source(port))
7005 tcpm_set_state(port, tcpm_try_snk(port) ? SNK_TRY : SRC_ATTACHED,
7006 port->timings.cc_debounce_time);
7007 break;
7008 case SRC_STARTUP:
7009 case SRC_SEND_CAPABILITIES:
7010 case SRC_SEND_CAPABILITIES_TIMEOUT:
7011 case SRC_NEGOTIATE_CAPABILITIES:
7012 case SRC_TRANSITION_SUPPLY:
7013 case SRC_READY:
7014 case SRC_WAIT_NEW_CAPABILITIES:
7015 if (port->auto_vbus_discharge_enabled) {
7016 if (port->port_type == TYPEC_PORT_SRC)
7017 tcpm_set_state(port, SRC_UNATTACHED, 0);
7018 else
7019 tcpm_set_state(port, SNK_UNATTACHED, 0);
7020 }
7021 break;
7022 case PR_SWAP_SNK_SRC_SINK_OFF:
7023 case PR_SWAP_SNK_SRC_SOURCE_ON:
7024 /* Do nothing, vsafe0v is expected during transition */
7025 break;
7026 case SNK_ATTACH_WAIT:
7027 case SNK_DEBOUNCED:
7028 /*Do nothing, still waiting for VSAFE5V for connect */
7029 break;
7030 case SNK_HARD_RESET_WAIT_VBUS:
7031 /* Do nothing, its OK to receive vbus off events */
7032 break;
7033 default:
7034 if (port->pwr_role == TYPEC_SINK && port->auto_vbus_discharge_enabled)
7035 tcpm_set_state(port, SNK_UNATTACHED, 0);
7036 break;
7037 }
7038 }
7039
_tcpm_pd_hard_reset(struct tcpm_port * port)7040 static void _tcpm_pd_hard_reset(struct tcpm_port *port)
7041 {
7042 tcpm_log_force(port, "Received hard reset");
7043 if (port->bist_request == BDO_MODE_TESTDATA && port->tcpc->set_bist_data)
7044 port->tcpc->set_bist_data(port->tcpc, false);
7045
7046 switch (port->state) {
7047 case TOGGLING:
7048 case ERROR_RECOVERY:
7049 case PORT_RESET:
7050 case PORT_RESET_WAIT_OFF:
7051 return;
7052 default:
7053 break;
7054 }
7055
7056 if (port->ams != NONE_AMS)
7057 port->ams = NONE_AMS;
7058 if (port->hard_reset_count < PD_N_HARD_RESET_COUNT)
7059 port->ams = HARD_RESET;
7060 /*
7061 * If we keep receiving hard reset requests, executing the hard reset
7062 * must have failed. Revert to error recovery if that happens.
7063 */
7064 tcpm_set_state(port,
7065 port->hard_reset_count < PD_N_HARD_RESET_COUNT ?
7066 HARD_RESET_START : ERROR_RECOVERY,
7067 0);
7068 }
7069
tcpm_pd_event_handler(struct kthread_work * work)7070 static void tcpm_pd_event_handler(struct kthread_work *work)
7071 {
7072 struct tcpm_port *port = container_of(work, struct tcpm_port,
7073 event_work);
7074 u32 events;
7075
7076 mutex_lock(&port->lock);
7077
7078 spin_lock(&port->pd_event_lock);
7079 while (port->pd_events) {
7080 events = port->pd_events;
7081 port->pd_events = 0;
7082 spin_unlock(&port->pd_event_lock);
7083 if (events & TCPM_RESET_EVENT)
7084 _tcpm_pd_hard_reset(port);
7085 if (events & TCPM_VBUS_EVENT) {
7086 bool vbus;
7087
7088 vbus = port->tcpc->get_vbus(port->tcpc);
7089 if (vbus) {
7090 _tcpm_pd_vbus_on(port);
7091 } else {
7092 _tcpm_pd_vbus_off(port);
7093 /*
7094 * When TCPC does not support detecting vsafe0v voltage level,
7095 * treat vbus absent as vsafe0v. Else invoke is_vbus_vsafe0v
7096 * to see if vbus has discharge to VSAFE0V.
7097 */
7098 if (!port->tcpc->is_vbus_vsafe0v ||
7099 port->tcpc->is_vbus_vsafe0v(port->tcpc))
7100 _tcpm_pd_vbus_vsafe0v(port);
7101 }
7102 }
7103 if (events & TCPM_CC_EVENT) {
7104 enum typec_cc_status cc1, cc2;
7105
7106 if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
7107 _tcpm_cc_change(port, cc1, cc2);
7108 }
7109 if (events & TCPM_FRS_EVENT) {
7110 if (port->state == SNK_READY) {
7111 int ret;
7112
7113 port->upcoming_state = FR_SWAP_SEND;
7114 ret = tcpm_ams_start(port, FAST_ROLE_SWAP);
7115 if (ret == -EAGAIN)
7116 port->upcoming_state = INVALID_STATE;
7117 } else {
7118 tcpm_log(port, "Discarding FRS_SIGNAL! Not in sink ready");
7119 }
7120 }
7121 if (events & TCPM_SOURCING_VBUS) {
7122 /*
7123 * In fast role swap case TCPC autonomously sources vbus. Set vbus_source
7124 * true conditionally as TCPM wouldn't have called tcpm_set_vbus.
7125 * If TCPM calls tcpm_set_vbus to source vbus, vbus_source would already
7126 * be true.
7127 *
7128 * When TCPM_FRS_EVENT and TCPM_SOURCING_VBUS arrive simultaneously,
7129 * handling TCPM_FRS_EVENT above transitions the state to AMS_START
7130 * with upcoming_state FR_SWAP_SEND.
7131 */
7132
7133 if (tcpm_port_is_source(port) ||
7134 tcpm_port_is_debug_source(port) ||
7135 (port->state == AMS_START && port->upcoming_state == FR_SWAP_SEND) ||
7136 port->state == FR_SWAP_SEND ||
7137 port->state == FR_SWAP_SEND_TIMEOUT ||
7138 port->state == FR_SWAP_SNK_SRC_TRANSITION_TO_OFF ||
7139 port->state == FR_SWAP_SNK_SRC_NEW_SINK_READY ||
7140 port->state == FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED) {
7141 tcpm_log(port, "sourcing vbus");
7142 port->vbus_source = true;
7143 _tcpm_pd_vbus_on(port);
7144 } else {
7145 tcpm_log(port, "Discarding sourcing vbus! Invalid state %s",
7146 tcpm_states[port->state]);
7147 }
7148 }
7149 if (events & TCPM_PORT_CLEAN) {
7150 tcpm_log(port, "port clean");
7151 if (port->state == CHECK_CONTAMINANT) {
7152 if (tcpm_start_toggling(port, tcpm_rp_cc(port)))
7153 tcpm_set_state(port, TOGGLING, 0);
7154 else
7155 tcpm_set_state(port, tcpm_default_state(port), 0);
7156 }
7157 }
7158 if (events & TCPM_PORT_ERROR) {
7159 tcpm_log(port, "port triggering error recovery");
7160 tcpm_set_state(port, ERROR_RECOVERY, 0);
7161 }
7162
7163 spin_lock(&port->pd_event_lock);
7164 }
7165 spin_unlock(&port->pd_event_lock);
7166 mutex_unlock(&port->lock);
7167 }
7168
tcpm_cc_change(struct tcpm_port * port)7169 void tcpm_cc_change(struct tcpm_port *port)
7170 {
7171 spin_lock(&port->pd_event_lock);
7172 port->pd_events |= TCPM_CC_EVENT;
7173 spin_unlock(&port->pd_event_lock);
7174 kthread_queue_work(port->wq, &port->event_work);
7175 }
7176 EXPORT_SYMBOL_GPL(tcpm_cc_change);
7177
tcpm_vbus_change(struct tcpm_port * port)7178 void tcpm_vbus_change(struct tcpm_port *port)
7179 {
7180 spin_lock(&port->pd_event_lock);
7181 port->pd_events |= TCPM_VBUS_EVENT;
7182 spin_unlock(&port->pd_event_lock);
7183 kthread_queue_work(port->wq, &port->event_work);
7184 }
7185 EXPORT_SYMBOL_GPL(tcpm_vbus_change);
7186
tcpm_pd_hard_reset(struct tcpm_port * port)7187 void tcpm_pd_hard_reset(struct tcpm_port *port)
7188 {
7189 spin_lock(&port->pd_event_lock);
7190 port->pd_events = TCPM_RESET_EVENT;
7191 spin_unlock(&port->pd_event_lock);
7192 kthread_queue_work(port->wq, &port->event_work);
7193 }
7194 EXPORT_SYMBOL_GPL(tcpm_pd_hard_reset);
7195
tcpm_sink_frs(struct tcpm_port * port)7196 void tcpm_sink_frs(struct tcpm_port *port)
7197 {
7198 spin_lock(&port->pd_event_lock);
7199 port->pd_events |= TCPM_FRS_EVENT;
7200 spin_unlock(&port->pd_event_lock);
7201 kthread_queue_work(port->wq, &port->event_work);
7202 }
7203 EXPORT_SYMBOL_GPL(tcpm_sink_frs);
7204
tcpm_sourcing_vbus(struct tcpm_port * port)7205 void tcpm_sourcing_vbus(struct tcpm_port *port)
7206 {
7207 spin_lock(&port->pd_event_lock);
7208 port->pd_events |= TCPM_SOURCING_VBUS;
7209 spin_unlock(&port->pd_event_lock);
7210 kthread_queue_work(port->wq, &port->event_work);
7211 }
7212 EXPORT_SYMBOL_GPL(tcpm_sourcing_vbus);
7213
tcpm_port_clean(struct tcpm_port * port)7214 void tcpm_port_clean(struct tcpm_port *port)
7215 {
7216 spin_lock(&port->pd_event_lock);
7217 port->pd_events |= TCPM_PORT_CLEAN;
7218 spin_unlock(&port->pd_event_lock);
7219 kthread_queue_work(port->wq, &port->event_work);
7220 }
7221 EXPORT_SYMBOL_GPL(tcpm_port_clean);
7222
tcpm_port_is_toggling(struct tcpm_port * port)7223 bool tcpm_port_is_toggling(struct tcpm_port *port)
7224 {
7225 return port->port_type == TYPEC_PORT_DRP && port->state == TOGGLING;
7226 }
7227 EXPORT_SYMBOL_GPL(tcpm_port_is_toggling);
7228
tcpm_port_error_recovery(struct tcpm_port * port)7229 void tcpm_port_error_recovery(struct tcpm_port *port)
7230 {
7231 spin_lock(&port->pd_event_lock);
7232 port->pd_events |= TCPM_PORT_ERROR;
7233 spin_unlock(&port->pd_event_lock);
7234 kthread_queue_work(port->wq, &port->event_work);
7235 }
7236 EXPORT_SYMBOL_GPL(tcpm_port_error_recovery);
7237
tcpm_enable_frs_work(struct kthread_work * work)7238 static void tcpm_enable_frs_work(struct kthread_work *work)
7239 {
7240 struct tcpm_port *port = container_of(work, struct tcpm_port, enable_frs);
7241 int ret;
7242
7243 mutex_lock(&port->lock);
7244 /* Not FRS capable */
7245 if (!port->connected || port->port_type != TYPEC_PORT_DRP ||
7246 port->pwr_opmode != TYPEC_PWR_MODE_PD ||
7247 !port->tcpc->enable_frs ||
7248 /* Sink caps queried */
7249 port->sink_cap_done || port->negotiated_rev < PD_REV30)
7250 goto unlock;
7251
7252 /* Send when the state machine is idle */
7253 if (port->state != SNK_READY || port->vdm_sm_running ||
7254 port->vdm_discovery_state == VDM_DISCOVERY_UNKNOWN)
7255 goto resched;
7256
7257 port->upcoming_state = GET_SINK_CAP;
7258 ret = tcpm_ams_start(port, GET_SINK_CAPABILITIES);
7259 if (ret == -EAGAIN) {
7260 port->upcoming_state = INVALID_STATE;
7261 } else {
7262 port->sink_cap_done = true;
7263 goto unlock;
7264 }
7265 resched:
7266 mod_enable_frs_delayed_work(port, GET_SINK_CAP_RETRY_MS);
7267 unlock:
7268 mutex_unlock(&port->lock);
7269 }
7270
tcpm_vdm_discovery_work(struct kthread_work * work)7271 static void tcpm_vdm_discovery_work(struct kthread_work *work)
7272 {
7273 struct tcpm_port *port = container_of(work, struct tcpm_port, vdm_discovery_work);
7274 enum tcpm_transmit_type tx_sop_type = TCPC_TX_SOP;
7275 struct typec_port *typec = port->typec_port;
7276 struct pd_mode_data *modep, *modep_prime;
7277 u32 msg[2] = { };
7278 int svdm_version;
7279
7280 mutex_lock(&port->lock);
7281
7282 tcpm_log_force(port, "%s state [%s]", __func__,
7283 vdm_discovery_state_strings[port->vdm_discovery_state]);
7284
7285 /* No need to perform work if Discovery process is complete */
7286 if (port->vdm_discovery_state == VDM_DISCOVERY_COMPLETE)
7287 goto unlock;
7288
7289 /* Retry if the port is not idle */
7290 if (!tcpm_can_send_vdm(port->state) || port->vdm_sm_running) {
7291 mod_vdm_discovery_delayed_work(port, SEND_DISCOVERY_VDM_RETRY_MS);
7292 goto unlock;
7293 }
7294
7295 modep = &port->mode_data;
7296 modep_prime = &port->mode_data_prime;
7297
7298 svdm_version = typec_get_negotiated_svdm_version(typec);
7299
7300 switch (port->vdm_discovery_state) {
7301 /*
7302 * The port has not received a Discover Identity response from the port partner.
7303 *
7304 * 1. The port will send Discover Identity to the partner over SOP in the SRC_READY and
7305 * SNK_READY states if there is an explicit contract
7306 * 2. The port will send Discover Identity to the cable over SOP' in the
7307 * SRC_VDM_IDENTITY_REQUEST state if capable of doing so.
7308 */
7309 case VDM_DISCOVERY_UNKNOWN:
7310 /* Can't send Discover Identity, VDM discovery is complete */
7311 if (port->data_role == TYPEC_DEVICE && port->negotiated_rev < PD_REV30) {
7312 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
7313 goto unlock;
7314 }
7315
7316 if (port->state == SRC_VDM_IDENTITY_REQUEST) {
7317 tx_sop_type = TCPC_TX_SOP_PRIME;
7318 svdm_version = SVDM_VER_MAX;
7319 }
7320
7321 msg[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_IDENT);
7322 break;
7323 /*
7324 * The port has received a Discover Identity ACK from the port partner.
7325 *
7326 * 1. The port will send Discover Identity to the cable over SOP' in the SRC_READY and
7327 * SNK_READY states if it did not previously discover the cable but is capable of doing
7328 * so.
7329 * 2. The port will send Discover SVIDs to the partner over SOP in the SRC_READY and
7330 * SNK_READY states otherwise.
7331 */
7332 case VDM_DISCOVERY_PARTNER_IDENT:
7333 if (tcpm_can_communicate_sop_prime(port) && !port->cable) {
7334 tx_sop_type = TCPC_TX_SOP_PRIME;
7335 msg[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_IDENT);
7336 } else {
7337 if (tcpm_can_communicate_sop_prime(port))
7338 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_CABLE_IDENT);
7339 msg[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_SVID);
7340 }
7341 break;
7342 /*
7343 * The port has received a Discover Identity ACK from the cable.
7344 *
7345 * 1. The port will send Discover SVIDs to the partner over SOP.
7346 */
7347 case VDM_DISCOVERY_CABLE_IDENT:
7348 msg[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_SVID);
7349 break;
7350 /*
7351 * The port has received a Discover SVIDs ACK from the partner or the last SVIDs supported
7352 * by the partner.
7353 *
7354 * 1. The port will send Discover Modes for the first SVID over SOP if the partner supports
7355 * modal operation and valid SVIDs were registered.
7356 * 2. The vdm_discovery_state will move to VDM_DISCOVERY_COMPLETE otherwise.
7357 */
7358 case VDM_DISCOVERY_PARTNER_SVIDS:
7359 if (modep->nsvids && supports_modal(port)) {
7360 msg[0] = VDO(modep->svids[0], 1, svdm_version, CMD_DISCOVER_MODES);
7361 } else {
7362 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
7363 goto unlock;
7364 }
7365 break;
7366 /*
7367 * The port has received a Discover Modes ACK from the partner for any mode.
7368 *
7369 * 1. The port will send Discover Modes for the next SVID that has not been discovered to
7370 * the port partner over SOP.
7371 * 2. The port will send Discover SVIDs over SOP' if the port can communicate over SOP'
7372 * and the cable supports VDMs.
7373 * 3. The vdm_discovery_state will move to VDM_DISCOVERY_COMPLETE otherwise.
7374 */
7375 case VDM_DISCOVERY_PARTNER_MODES:
7376 /* Not all modes have been discovered yet */
7377 if (modep->svid_index < modep->nsvids) {
7378 msg[0] = VDO(modep_prime->svids[modep->svid_index], 1, svdm_version,
7379 CMD_DISCOVER_MODES);
7380 } else if (tcpm_can_communicate_sop_prime(port) && tcpm_cable_vdm_supported(port)) {
7381 tx_sop_type = TCPC_TX_SOP_PRIME;
7382 svdm_version = typec_get_cable_svdm_version(typec);
7383 msg[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_SVID);
7384 } else {
7385 tcpm_update_vdm_discovery_state(port, VDM_DISCOVERY_COMPLETE);
7386 goto unlock;
7387 }
7388 break;
7389 /*
7390 * The port has received a Discover SVIDs ACK from the cable over SOP'.
7391 *
7392 * 1. The port will send Discover Modes for the first SVID over SOP'.
7393 */
7394 case VDM_DISCOVERY_CABLE_SVIDS:
7395 if (modep_prime->nsvids) {
7396 tx_sop_type = TCPC_TX_SOP_PRIME;
7397 svdm_version = typec_get_cable_svdm_version(typec);
7398 msg[0] = VDO(modep_prime->svids[0], 1, svdm_version, CMD_DISCOVER_MODES);
7399 } else {
7400 goto unlock;
7401 }
7402 break;
7403 /*
7404 * The port has received a Discover Modes ACK from the cable for any mode.
7405 *
7406 * 1. The port will send Discover Modes for the next SVID that has not been discovered to
7407 * the cable over SOP'.
7408 */
7409 case VDM_DISCOVERY_CABLE_MODES:
7410 if (modep_prime->svid_index < modep_prime->nsvids) {
7411 tx_sop_type = TCPC_TX_SOP_PRIME;
7412 svdm_version = typec_get_cable_svdm_version(typec);
7413 msg[0] = VDO(modep_prime->svids[modep->svid_index], 1, svdm_version,
7414 CMD_DISCOVER_MODES);
7415 } else {
7416 goto unlock;
7417 }
7418 break;
7419 default:
7420 goto unlock;
7421 }
7422
7423 if (svdm_version >= 0)
7424 tcpm_queue_vdm(port, msg[0], &msg[1], 0, tx_sop_type);
7425
7426 unlock:
7427 mutex_unlock(&port->lock);
7428 }
7429
tcpm_dr_set(struct typec_port * p,enum typec_data_role data)7430 static int tcpm_dr_set(struct typec_port *p, enum typec_data_role data)
7431 {
7432 struct tcpm_port *port = typec_get_drvdata(p);
7433 int ret;
7434
7435 mutex_lock(&port->swap_lock);
7436 mutex_lock(&port->lock);
7437
7438 if (port->typec_caps.data != TYPEC_PORT_DRD) {
7439 ret = -EINVAL;
7440 goto port_unlock;
7441 }
7442 if (port->state != SRC_READY && port->state != SNK_READY) {
7443 ret = -EAGAIN;
7444 goto port_unlock;
7445 }
7446
7447 if (port->data_role == data) {
7448 ret = 0;
7449 goto port_unlock;
7450 }
7451
7452 /*
7453 * XXX
7454 * 6.3.9: If an alternate mode is active, a request to swap
7455 * alternate modes shall trigger a port reset.
7456 * Reject data role swap request in this case.
7457 */
7458
7459 if (!port->pd_capable) {
7460 /*
7461 * If the partner is not PD capable, reset the port to
7462 * trigger a role change. This can only work if a preferred
7463 * role is configured, and if it matches the requested role.
7464 */
7465 if (port->try_role == TYPEC_NO_PREFERRED_ROLE ||
7466 port->try_role == port->pwr_role) {
7467 ret = -EINVAL;
7468 goto port_unlock;
7469 }
7470 port->non_pd_role_swap = true;
7471 tcpm_set_state(port, PORT_RESET, 0);
7472 } else {
7473 port->upcoming_state = DR_SWAP_SEND;
7474 ret = tcpm_ams_start(port, DATA_ROLE_SWAP);
7475 if (ret == -EAGAIN) {
7476 port->upcoming_state = INVALID_STATE;
7477 goto port_unlock;
7478 }
7479 }
7480
7481 port->swap_status = 0;
7482 port->swap_pending = true;
7483 reinit_completion(&port->swap_complete);
7484 mutex_unlock(&port->lock);
7485
7486 if (!wait_for_completion_timeout(&port->swap_complete,
7487 msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
7488 ret = -ETIMEDOUT;
7489 else
7490 ret = port->swap_status;
7491
7492 port->non_pd_role_swap = false;
7493 goto swap_unlock;
7494
7495 port_unlock:
7496 mutex_unlock(&port->lock);
7497 swap_unlock:
7498 mutex_unlock(&port->swap_lock);
7499 return ret;
7500 }
7501
tcpm_pr_set(struct typec_port * p,enum typec_role role)7502 static int tcpm_pr_set(struct typec_port *p, enum typec_role role)
7503 {
7504 struct tcpm_port *port = typec_get_drvdata(p);
7505 int ret;
7506
7507 mutex_lock(&port->swap_lock);
7508 mutex_lock(&port->lock);
7509
7510 if (port->port_type != TYPEC_PORT_DRP) {
7511 ret = -EINVAL;
7512 goto port_unlock;
7513 }
7514 if (port->state != SRC_READY && port->state != SNK_READY) {
7515 ret = -EAGAIN;
7516 goto port_unlock;
7517 }
7518
7519 if (role == port->pwr_role) {
7520 ret = 0;
7521 goto port_unlock;
7522 }
7523
7524 port->upcoming_state = PR_SWAP_SEND;
7525 ret = tcpm_ams_start(port, POWER_ROLE_SWAP);
7526 if (ret == -EAGAIN) {
7527 port->upcoming_state = INVALID_STATE;
7528 goto port_unlock;
7529 }
7530
7531 port->swap_status = 0;
7532 port->swap_pending = true;
7533 reinit_completion(&port->swap_complete);
7534 mutex_unlock(&port->lock);
7535
7536 if (!wait_for_completion_timeout(&port->swap_complete,
7537 msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
7538 ret = -ETIMEDOUT;
7539 else
7540 ret = port->swap_status;
7541
7542 goto swap_unlock;
7543
7544 port_unlock:
7545 mutex_unlock(&port->lock);
7546 swap_unlock:
7547 mutex_unlock(&port->swap_lock);
7548 return ret;
7549 }
7550
tcpm_vconn_set(struct typec_port * p,enum typec_role role)7551 static int tcpm_vconn_set(struct typec_port *p, enum typec_role role)
7552 {
7553 struct tcpm_port *port = typec_get_drvdata(p);
7554 int ret;
7555
7556 mutex_lock(&port->swap_lock);
7557 mutex_lock(&port->lock);
7558
7559 if (port->state != SRC_READY && port->state != SNK_READY) {
7560 ret = -EAGAIN;
7561 goto port_unlock;
7562 }
7563
7564 if (role == port->vconn_role) {
7565 ret = 0;
7566 goto port_unlock;
7567 }
7568
7569 port->upcoming_state = VCONN_SWAP_SEND;
7570 ret = tcpm_ams_start(port, VCONN_SWAP);
7571 if (ret == -EAGAIN) {
7572 port->upcoming_state = INVALID_STATE;
7573 goto port_unlock;
7574 }
7575
7576 port->swap_status = 0;
7577 port->swap_pending = true;
7578 reinit_completion(&port->swap_complete);
7579 mutex_unlock(&port->lock);
7580
7581 if (!wait_for_completion_timeout(&port->swap_complete,
7582 msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
7583 ret = -ETIMEDOUT;
7584 else
7585 ret = port->swap_status;
7586
7587 goto swap_unlock;
7588
7589 port_unlock:
7590 mutex_unlock(&port->lock);
7591 swap_unlock:
7592 mutex_unlock(&port->swap_lock);
7593 return ret;
7594 }
7595
tcpm_try_role(struct typec_port * p,int role)7596 static int tcpm_try_role(struct typec_port *p, int role)
7597 {
7598 struct tcpm_port *port = typec_get_drvdata(p);
7599 struct tcpc_dev *tcpc = port->tcpc;
7600 int ret = 0;
7601
7602 mutex_lock(&port->lock);
7603 if (tcpc->try_role)
7604 ret = tcpc->try_role(tcpc, role);
7605 if (!ret)
7606 port->try_role = role;
7607 port->try_src_count = 0;
7608 port->try_snk_count = 0;
7609 mutex_unlock(&port->lock);
7610
7611 return ret;
7612 }
7613
tcpm_aug_set_op_curr(struct tcpm_port * port,u16 req_op_curr_ma)7614 static int tcpm_aug_set_op_curr(struct tcpm_port *port, u16 req_op_curr_ma)
7615 {
7616 unsigned int target_mw;
7617 int ret;
7618
7619 mutex_lock(&port->swap_lock);
7620 mutex_lock(&port->lock);
7621
7622 if (port->pps_data.active) {
7623 req_op_curr_ma = req_op_curr_ma -
7624 (req_op_curr_ma % RDO_PROG_CURR_MA_STEP);
7625 if (req_op_curr_ma > port->pps_data.max_curr) {
7626 ret = -EINVAL;
7627 goto port_unlock;
7628 }
7629 target_mw = (req_op_curr_ma * port->supply_voltage) / 1000;
7630 if (target_mw < port->operating_snk_mw) {
7631 ret = -EINVAL;
7632 goto port_unlock;
7633 }
7634 } else if (!port->spr_avs_data.active) {
7635 ret = -EOPNOTSUPP;
7636 goto port_unlock;
7637 }
7638
7639 if (port->state != SNK_READY) {
7640 ret = -EAGAIN;
7641 goto port_unlock;
7642 }
7643
7644 if (port->pps_data.active)
7645 port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
7646 else
7647 port->upcoming_state = SNK_NEGOTIATE_SPR_AVS_CAPABILITIES;
7648
7649 ret = tcpm_ams_start(port, POWER_NEGOTIATION);
7650 if (ret == -EAGAIN) {
7651 port->upcoming_state = INVALID_STATE;
7652 goto port_unlock;
7653 }
7654
7655 reinit_completion(&port->aug_supply_req_complete);
7656 if (port->pps_data.active)
7657 port->pps_data.req_op_curr = req_op_curr_ma;
7658 else
7659 port->spr_avs_data.req_op_curr_ma = req_op_curr_ma;
7660 port->aug_supply_req_status = 0;
7661 port->aug_supply_req_pending = true;
7662 mutex_unlock(&port->lock);
7663
7664 if (!wait_for_completion_timeout(&port->aug_supply_req_complete,
7665 msecs_to_jiffies(PD_AUG_PSY_CTRL_TIMEOUT)))
7666 ret = -ETIMEDOUT;
7667 else
7668 ret = port->aug_supply_req_status;
7669
7670 goto swap_unlock;
7671
7672 port_unlock:
7673 mutex_unlock(&port->lock);
7674 swap_unlock:
7675 mutex_unlock(&port->swap_lock);
7676
7677 return ret;
7678 }
7679
tcpm_aug_set_out_volt(struct tcpm_port * port,u16 req_out_volt_mv)7680 static int tcpm_aug_set_out_volt(struct tcpm_port *port, u16 req_out_volt_mv)
7681 {
7682 unsigned int target_mw;
7683 int ret;
7684
7685 mutex_lock(&port->swap_lock);
7686 mutex_lock(&port->lock);
7687
7688 if (port->pps_data.active) {
7689 req_out_volt_mv = req_out_volt_mv - (req_out_volt_mv %
7690 RDO_PROG_VOLT_MV_STEP);
7691 /* Round down output voltage to align with PPS valid steps */
7692 target_mw = (port->current_limit * req_out_volt_mv) / 1000;
7693 if (target_mw < port->operating_snk_mw) {
7694 ret = -EINVAL;
7695 goto port_unlock;
7696 }
7697 } else if (!port->spr_avs_data.active) {
7698 ret = -EOPNOTSUPP;
7699 goto port_unlock;
7700 }
7701
7702 if (port->state != SNK_READY) {
7703 ret = -EAGAIN;
7704 goto port_unlock;
7705 }
7706
7707 if (port->pps_data.active)
7708 port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
7709 else
7710 port->upcoming_state = SNK_NEGOTIATE_SPR_AVS_CAPABILITIES;
7711
7712 ret = tcpm_ams_start(port, POWER_NEGOTIATION);
7713 if (ret == -EAGAIN) {
7714 port->upcoming_state = INVALID_STATE;
7715 goto port_unlock;
7716 }
7717
7718 reinit_completion(&port->aug_supply_req_complete);
7719 if (port->pps_data.active)
7720 port->pps_data.req_out_volt = req_out_volt_mv;
7721 else
7722 port->spr_avs_data.req_out_volt_mv = req_out_volt_mv;
7723 port->aug_supply_req_status = 0;
7724 port->aug_supply_req_pending = true;
7725 mutex_unlock(&port->lock);
7726
7727 if (!wait_for_completion_timeout(&port->aug_supply_req_complete,
7728 msecs_to_jiffies(PD_AUG_PSY_CTRL_TIMEOUT)))
7729 ret = -ETIMEDOUT;
7730 else
7731 ret = port->aug_supply_req_status;
7732
7733 goto swap_unlock;
7734
7735 port_unlock:
7736 mutex_unlock(&port->lock);
7737 swap_unlock:
7738 mutex_unlock(&port->swap_lock);
7739
7740 return ret;
7741 }
7742
tcpm_pps_activate(struct tcpm_port * port,bool activate)7743 static int tcpm_pps_activate(struct tcpm_port *port, bool activate)
7744 {
7745 int ret = 0;
7746
7747 mutex_lock(&port->swap_lock);
7748 mutex_lock(&port->lock);
7749
7750 if (!port->pps_data.supported) {
7751 ret = -EOPNOTSUPP;
7752 goto port_unlock;
7753 }
7754
7755 /* Trying to deactivate PPS when already deactivated so just bail */
7756 if (!port->pps_data.active && !activate)
7757 goto port_unlock;
7758
7759 if (port->state != SNK_READY) {
7760 ret = -EAGAIN;
7761 goto port_unlock;
7762 }
7763
7764 if (activate)
7765 port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
7766 else
7767 port->upcoming_state = SNK_NEGOTIATE_CAPABILITIES;
7768 ret = tcpm_ams_start(port, POWER_NEGOTIATION);
7769 if (ret == -EAGAIN) {
7770 port->upcoming_state = INVALID_STATE;
7771 goto port_unlock;
7772 }
7773
7774 reinit_completion(&port->aug_supply_req_complete);
7775 port->aug_supply_req_status = 0;
7776 port->aug_supply_req_pending = true;
7777
7778 /* Trigger PPS request or move back to standard PDO contract */
7779 if (activate) {
7780 port->pps_data.req_out_volt = port->supply_voltage;
7781 port->pps_data.req_op_curr = port->current_limit;
7782 }
7783 mutex_unlock(&port->lock);
7784
7785 if (!wait_for_completion_timeout(&port->aug_supply_req_complete,
7786 msecs_to_jiffies(PD_AUG_PSY_CTRL_TIMEOUT)))
7787 ret = -ETIMEDOUT;
7788 else
7789 ret = port->aug_supply_req_status;
7790
7791 goto swap_unlock;
7792
7793 port_unlock:
7794 mutex_unlock(&port->lock);
7795 swap_unlock:
7796 mutex_unlock(&port->swap_lock);
7797
7798 return ret;
7799 }
7800
tcpm_spr_avs_activate(struct tcpm_port * port,bool activate)7801 static int tcpm_spr_avs_activate(struct tcpm_port *port, bool activate)
7802 {
7803 int ret = 0;
7804
7805 mutex_lock(&port->swap_lock);
7806 mutex_lock(&port->lock);
7807
7808 if (port->spr_avs_data.port_snk_status == SPR_AVS_NOT_SUPPORTED ||
7809 port->spr_avs_data.port_partner_src_status == SPR_AVS_NOT_SUPPORTED) {
7810 tcpm_log(port, "SPR_AVS not supported");
7811 ret = -EOPNOTSUPP;
7812 goto port_unlock;
7813 }
7814
7815 /* Trying to deactivate SPR AVS when already deactivated so just bail */
7816 if (!port->spr_avs_data.active && !activate)
7817 goto port_unlock;
7818
7819 if (port->state != SNK_READY) {
7820 tcpm_log(port,
7821 "SPR_AVS cannot be activated. Port not in SNK_READY");
7822 ret = -EAGAIN;
7823 goto port_unlock;
7824 }
7825
7826 if (activate)
7827 port->upcoming_state = SNK_NEGOTIATE_SPR_AVS_CAPABILITIES;
7828 else
7829 port->upcoming_state = SNK_NEGOTIATE_CAPABILITIES;
7830 ret = tcpm_ams_start(port, POWER_NEGOTIATION);
7831 if (ret == -EAGAIN) {
7832 tcpm_log(port, "SPR_AVS cannot be %s. AMS start failed",
7833 activate ? "activated" : "deactivated");
7834 port->upcoming_state = INVALID_STATE;
7835 goto port_unlock;
7836 }
7837
7838 reinit_completion(&port->aug_supply_req_complete);
7839 port->aug_supply_req_status = 0;
7840 port->aug_supply_req_pending = true;
7841
7842 /* Trigger AVS request or move back to standard PDO contract */
7843 if (activate) {
7844 port->spr_avs_data.req_out_volt_mv = port->supply_voltage;
7845 port->spr_avs_data.req_op_curr_ma = port->current_limit;
7846 }
7847 mutex_unlock(&port->lock);
7848
7849 if (!wait_for_completion_timeout(&port->aug_supply_req_complete,
7850 msecs_to_jiffies(PD_AUG_PSY_CTRL_TIMEOUT)))
7851 ret = -ETIMEDOUT;
7852 else
7853 ret = port->aug_supply_req_status;
7854
7855 goto swap_unlock;
7856
7857 port_unlock:
7858 mutex_unlock(&port->lock);
7859 swap_unlock:
7860 mutex_unlock(&port->swap_lock);
7861
7862 return ret;
7863 }
7864
tcpm_init(struct tcpm_port * port)7865 static void tcpm_init(struct tcpm_port *port)
7866 {
7867 enum typec_cc_status cc1, cc2;
7868
7869 port->tcpc->init(port->tcpc);
7870
7871 tcpm_reset_port(port);
7872
7873 /*
7874 * XXX
7875 * Should possibly wait for VBUS to settle if it was enabled locally
7876 * since tcpm_reset_port() will disable VBUS.
7877 */
7878 port->vbus_present = port->tcpc->get_vbus(port->tcpc);
7879 if (port->vbus_present)
7880 port->vbus_never_low = true;
7881
7882 /*
7883 * 1. When vbus_present is true, voltage on VBUS is already at VSAFE5V.
7884 * So implicitly vbus_vsafe0v = false.
7885 *
7886 * 2. When vbus_present is false and TCPC does NOT support querying
7887 * vsafe0v status, then, it's best to assume vbus is at VSAFE0V i.e.
7888 * vbus_vsafe0v is true.
7889 *
7890 * 3. When vbus_present is false and TCPC does support querying vsafe0v,
7891 * then, query tcpc for vsafe0v status.
7892 */
7893 if (port->vbus_present)
7894 port->vbus_vsafe0v = false;
7895 else if (!port->tcpc->is_vbus_vsafe0v)
7896 port->vbus_vsafe0v = true;
7897 else
7898 port->vbus_vsafe0v = port->tcpc->is_vbus_vsafe0v(port->tcpc);
7899
7900 tcpm_set_state(port, tcpm_default_state(port), 0);
7901
7902 if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
7903 _tcpm_cc_change(port, cc1, cc2);
7904
7905 /*
7906 * Some adapters need a clean slate at startup, and won't recover
7907 * otherwise. So do not try to be fancy and force a clean disconnect.
7908 */
7909 tcpm_set_state(port, PORT_RESET, 0);
7910 }
7911
tcpm_port_type_set(struct typec_port * p,enum typec_port_type type)7912 static int tcpm_port_type_set(struct typec_port *p, enum typec_port_type type)
7913 {
7914 struct tcpm_port *port = typec_get_drvdata(p);
7915
7916 mutex_lock(&port->lock);
7917 if (type == port->port_type)
7918 goto port_unlock;
7919
7920 port->port_type = type;
7921
7922 if (!port->connected) {
7923 tcpm_set_state(port, PORT_RESET, 0);
7924 } else if (type == TYPEC_PORT_SNK) {
7925 if (!(port->pwr_role == TYPEC_SINK &&
7926 port->data_role == TYPEC_DEVICE))
7927 tcpm_set_state(port, PORT_RESET, 0);
7928 } else if (type == TYPEC_PORT_SRC) {
7929 if (!(port->pwr_role == TYPEC_SOURCE &&
7930 port->data_role == TYPEC_HOST))
7931 tcpm_set_state(port, PORT_RESET, 0);
7932 }
7933
7934 port_unlock:
7935 mutex_unlock(&port->lock);
7936 return 0;
7937 }
7938
tcpm_find_pd_data(struct tcpm_port * port,struct usb_power_delivery * pd)7939 static struct pd_data *tcpm_find_pd_data(struct tcpm_port *port, struct usb_power_delivery *pd)
7940 {
7941 int i;
7942
7943 for (i = 0; port->pd_list[i]; i++) {
7944 if (port->pd_list[i]->pd == pd)
7945 return port->pd_list[i];
7946 }
7947
7948 return ERR_PTR(-ENODATA);
7949 }
7950
tcpm_pd_get(struct typec_port * p)7951 static struct usb_power_delivery **tcpm_pd_get(struct typec_port *p)
7952 {
7953 struct tcpm_port *port = typec_get_drvdata(p);
7954
7955 return port->pds;
7956 }
7957
tcpm_pd_set(struct typec_port * p,struct usb_power_delivery * pd)7958 static int tcpm_pd_set(struct typec_port *p, struct usb_power_delivery *pd)
7959 {
7960 struct tcpm_port *port = typec_get_drvdata(p);
7961 struct pd_data *data;
7962 int i, ret = 0;
7963
7964 mutex_lock(&port->lock);
7965
7966 if (port->selected_pd == pd)
7967 goto unlock;
7968
7969 data = tcpm_find_pd_data(port, pd);
7970 if (IS_ERR(data)) {
7971 ret = PTR_ERR(data);
7972 goto unlock;
7973 }
7974
7975 if (data->sink_desc.pdo[0]) {
7976 for (i = 0; i < PDO_MAX_OBJECTS && data->sink_desc.pdo[i]; i++)
7977 port->snk_pdo[i] = data->sink_desc.pdo[i];
7978 port->nr_snk_pdo = i;
7979 port->operating_snk_mw = data->operating_snk_mw;
7980 }
7981
7982 if (data->source_desc.pdo[0]) {
7983 for (i = 0; i < PDO_MAX_OBJECTS && data->source_desc.pdo[i]; i++)
7984 port->src_pdo[i] = data->source_desc.pdo[i];
7985 port->nr_src_pdo = i;
7986 }
7987
7988 switch (port->state) {
7989 case SRC_UNATTACHED:
7990 case SRC_ATTACH_WAIT:
7991 case SRC_TRYWAIT:
7992 tcpm_set_cc(port, tcpm_rp_cc(port));
7993 break;
7994 case SRC_SEND_CAPABILITIES:
7995 case SRC_SEND_CAPABILITIES_TIMEOUT:
7996 case SRC_NEGOTIATE_CAPABILITIES:
7997 case SRC_READY:
7998 case SRC_WAIT_NEW_CAPABILITIES:
7999 port->caps_count = 0;
8000 port->upcoming_state = SRC_SEND_CAPABILITIES;
8001 ret = tcpm_ams_start(port, POWER_NEGOTIATION);
8002 if (ret == -EAGAIN) {
8003 port->upcoming_state = INVALID_STATE;
8004 goto unlock;
8005 }
8006 break;
8007 case SNK_NEGOTIATE_CAPABILITIES:
8008 case SNK_NEGOTIATE_PPS_CAPABILITIES:
8009 case SNK_NEGOTIATE_SPR_AVS_CAPABILITIES:
8010 case SNK_READY:
8011 case SNK_TRANSITION_SINK:
8012 case SNK_TRANSITION_SINK_VBUS:
8013 if (port->pps_data.active) {
8014 port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
8015 } else if (port->pd_capable) {
8016 port->upcoming_state = SNK_NEGOTIATE_CAPABILITIES;
8017 if (port->spr_avs_data.active) {
8018 /*
8019 * De-activate AVS and fallback to PD to
8020 * re-evaluate whether AVS is supported in the
8021 * current sink cap set.
8022 */
8023 port->spr_avs_data.active = false;
8024 port->spr_avs_data.port_snk_status = SPR_AVS_UNKNOWN;
8025 }
8026 } else {
8027 break;
8028 }
8029 port->update_sink_caps = true;
8030
8031 ret = tcpm_ams_start(port, POWER_NEGOTIATION);
8032 if (ret == -EAGAIN) {
8033 port->upcoming_state = INVALID_STATE;
8034 goto unlock;
8035 }
8036 break;
8037 default:
8038 break;
8039 }
8040
8041 port->port_source_caps = data->source_cap;
8042 port->port_sink_caps = data->sink_cap;
8043 typec_port_set_usb_power_delivery(p, NULL);
8044 port->selected_pd = pd;
8045 typec_port_set_usb_power_delivery(p, port->selected_pd);
8046 unlock:
8047 mutex_unlock(&port->lock);
8048 return ret;
8049 }
8050
8051 static const struct typec_operations tcpm_ops = {
8052 .try_role = tcpm_try_role,
8053 .dr_set = tcpm_dr_set,
8054 .pr_set = tcpm_pr_set,
8055 .vconn_set = tcpm_vconn_set,
8056 .port_type_set = tcpm_port_type_set,
8057 .pd_get = tcpm_pd_get,
8058 .pd_set = tcpm_pd_set
8059 };
8060
tcpm_tcpc_reset(struct tcpm_port * port)8061 void tcpm_tcpc_reset(struct tcpm_port *port)
8062 {
8063 mutex_lock(&port->lock);
8064 /* XXX: Maintain PD connection if possible? */
8065 tcpm_init(port);
8066 mutex_unlock(&port->lock);
8067 }
8068 EXPORT_SYMBOL_GPL(tcpm_tcpc_reset);
8069
tcpm_port_unregister_pd(struct tcpm_port * port)8070 static void tcpm_port_unregister_pd(struct tcpm_port *port)
8071 {
8072 int i;
8073
8074 port->port_sink_caps = NULL;
8075 port->port_source_caps = NULL;
8076 for (i = 0; i < port->pd_count; i++) {
8077 usb_power_delivery_unregister_capabilities(port->pd_list[i]->sink_cap);
8078 usb_power_delivery_unregister_capabilities(port->pd_list[i]->source_cap);
8079 devm_kfree(port->dev, port->pd_list[i]);
8080 port->pd_list[i] = NULL;
8081 usb_power_delivery_unregister(port->pds[i]);
8082 port->pds[i] = NULL;
8083 }
8084 }
8085
tcpm_port_register_pd(struct tcpm_port * port)8086 static int tcpm_port_register_pd(struct tcpm_port *port)
8087 {
8088 u16 pd_revision = port->typec_caps.pd_revision;
8089 u16 pd_version = port->pd_rev.ver_major << 8 | port->pd_rev.ver_minor;
8090 struct usb_power_delivery_desc desc = { pd_revision, pd_version };
8091 struct usb_power_delivery_capabilities *cap;
8092 int ret, i;
8093
8094 if (!port->nr_src_pdo && !port->nr_snk_pdo)
8095 return 0;
8096
8097 for (i = 0; i < port->pd_count; i++) {
8098 port->pds[i] = usb_power_delivery_register(port->dev, &desc);
8099 if (IS_ERR(port->pds[i])) {
8100 ret = PTR_ERR(port->pds[i]);
8101 goto err_unregister;
8102 }
8103 port->pd_list[i]->pd = port->pds[i];
8104
8105 if (port->pd_list[i]->source_desc.pdo[0]) {
8106 cap = usb_power_delivery_register_capabilities(port->pds[i],
8107 &port->pd_list[i]->source_desc);
8108 if (IS_ERR(cap)) {
8109 ret = PTR_ERR(cap);
8110 goto err_unregister;
8111 }
8112 port->pd_list[i]->source_cap = cap;
8113 }
8114
8115 if (port->pd_list[i]->sink_desc.pdo[0]) {
8116 cap = usb_power_delivery_register_capabilities(port->pds[i],
8117 &port->pd_list[i]->sink_desc);
8118 if (IS_ERR(cap)) {
8119 ret = PTR_ERR(cap);
8120 goto err_unregister;
8121 }
8122 port->pd_list[i]->sink_cap = cap;
8123 }
8124 }
8125
8126 port->port_source_caps = port->pd_list[0]->source_cap;
8127 port->port_sink_caps = port->pd_list[0]->sink_cap;
8128 port->selected_pd = port->pds[0];
8129 return 0;
8130
8131 err_unregister:
8132 tcpm_port_unregister_pd(port);
8133
8134 return ret;
8135 }
8136
tcpm_fw_get_timings(struct tcpm_port * port,struct fwnode_handle * fwnode)8137 static void tcpm_fw_get_timings(struct tcpm_port *port, struct fwnode_handle *fwnode)
8138 {
8139 int ret;
8140 u32 val;
8141
8142 ret = fwnode_property_read_u32(fwnode, "sink-wait-cap-time-ms", &val);
8143 if (!ret)
8144 port->timings.sink_wait_cap_time = val;
8145 else
8146 port->timings.sink_wait_cap_time = PD_T_SINK_WAIT_CAP;
8147
8148 ret = fwnode_property_read_u32(fwnode, "ps-source-off-time-ms", &val);
8149 if (!ret)
8150 port->timings.ps_src_off_time = val;
8151 else
8152 port->timings.ps_src_off_time = PD_T_PS_SOURCE_OFF;
8153
8154 ret = fwnode_property_read_u32(fwnode, "cc-debounce-time-ms", &val);
8155 if (!ret)
8156 port->timings.cc_debounce_time = val;
8157 else
8158 port->timings.cc_debounce_time = PD_T_CC_DEBOUNCE;
8159
8160 ret = fwnode_property_read_u32(fwnode, "sink-bc12-completion-time-ms", &val);
8161 if (!ret)
8162 port->timings.snk_bc12_cmpletion_time = val;
8163 }
8164
tcpm_fw_get_pd_ident(struct tcpm_port * port)8165 static void tcpm_fw_get_pd_ident(struct tcpm_port *port)
8166 {
8167 struct pd_identifier *pd_ident = &port->pd_ident;
8168 u32 *vdo;
8169
8170 /* First 3 vdo values contain info regarding USB PID, VID & XID */
8171 if (port->nr_snk_vdo >= 3)
8172 vdo = port->snk_vdo;
8173 else if (port->nr_snk_vdo_v1 >= 3)
8174 vdo = port->snk_vdo_v1;
8175 else
8176 return;
8177
8178 pd_ident->vid = PD_IDH_VID(vdo[0]);
8179 pd_ident->pid = PD_PRODUCT_PID(vdo[2]);
8180 pd_ident->xid = PD_CSTAT_XID(vdo[1]);
8181 tcpm_log(port, "vid:%#x pid:%#x xid:%#x",
8182 pd_ident->vid, pd_ident->pid, pd_ident->xid);
8183 }
8184
tcpm_parse_snk_pdos(struct tcpm_port * port)8185 static void tcpm_parse_snk_pdos(struct tcpm_port *port)
8186 {
8187 struct sink_caps_ext_data *caps = &port->sink_caps_ext;
8188 u32 max_mv, max_ma;
8189 u8 avs_tier1_pdp, avs_tier2_pdp;
8190 int i, pdo_itr;
8191 u32 *snk_pdos;
8192
8193 for (i = 0; i < port->pd_count; ++i) {
8194 snk_pdos = port->pd_list[i]->sink_desc.pdo;
8195 for (pdo_itr = 0; pdo_itr < PDO_MAX_OBJECTS && snk_pdos[pdo_itr];
8196 ++pdo_itr) {
8197 u32 pdo = snk_pdos[pdo_itr];
8198 u8 curr_snk_pdp = 0;
8199
8200 switch (pdo_type(pdo)) {
8201 case PDO_TYPE_FIXED:
8202 max_mv = pdo_fixed_voltage(pdo);
8203 max_ma = pdo_fixed_current(pdo);
8204 curr_snk_pdp = UW_TO_W(max_mv * max_ma);
8205 break;
8206 case PDO_TYPE_BATT:
8207 curr_snk_pdp = UW_TO_W(pdo_max_power(pdo));
8208 break;
8209 case PDO_TYPE_VAR:
8210 max_mv = pdo_max_voltage(pdo);
8211 max_ma = pdo_max_current(pdo);
8212 curr_snk_pdp = UW_TO_W(max_mv * max_ma);
8213 break;
8214 case PDO_TYPE_APDO:
8215 if (pdo_apdo_type(pdo) == APDO_TYPE_PPS) {
8216 max_mv = pdo_pps_apdo_max_voltage(pdo);
8217 max_ma = pdo_pps_apdo_max_current(pdo);
8218 curr_snk_pdp = UW_TO_W(max_mv * max_ma);
8219 caps->modes |= SINK_MODE_PPS;
8220 } else if (pdo_apdo_type(pdo) ==
8221 APDO_TYPE_SPR_AVS) {
8222 avs_tier1_pdp = UW_TO_W(SPR_AVS_TIER1_MAX_VOLT_MV
8223 * pdo_spr_avs_apdo_9v_to_15v_max_current_ma(pdo));
8224 avs_tier2_pdp = UW_TO_W(SPR_AVS_TIER2_MAX_VOLT_MV
8225 * pdo_spr_avs_apdo_15v_to_20v_max_current_ma(pdo));
8226 curr_snk_pdp = max(avs_tier1_pdp, avs_tier2_pdp);
8227 caps->modes |= SINK_MODE_AVS;
8228 }
8229 break;
8230 default:
8231 tcpm_log(port, "Invalid source PDO type, ignoring");
8232 continue;
8233 }
8234
8235 caps->spr_max_pdp = max(caps->spr_max_pdp,
8236 curr_snk_pdp);
8237 }
8238 }
8239 }
8240
tcpm_fw_get_sink_caps_ext(struct tcpm_port * port,struct fwnode_handle * fwnode)8241 static void tcpm_fw_get_sink_caps_ext(struct tcpm_port *port,
8242 struct fwnode_handle *fwnode)
8243 {
8244 struct sink_caps_ext_data *caps = &port->sink_caps_ext;
8245 int ret;
8246 u32 val;
8247
8248 /*
8249 * Load step represents the change in current per usec that a given
8250 * source can tolerate while maintaining Vbus within the vSrcValid
8251 * range. For a sink this represents the "preferred" load-step value. It
8252 * can only have 2 values (150 mA/usec or 500 mA/usec) with 150 mA/usec
8253 * being the default.
8254 */
8255 ret = fwnode_property_read_u32(fwnode, "sink-load-step", &val);
8256 if (!ret)
8257 caps->load_step = val == 500 ? 1 : 0;
8258
8259 fwnode_property_read_u16(fwnode, "sink-load-characteristics",
8260 &caps->load_char);
8261 fwnode_property_read_u8(fwnode, "sink-compliance", &caps->compliance);
8262 caps->modes = SINK_MODE_VBUS;
8263
8264 /*
8265 * As per "6.5.13.14" SPR Sink Operational PDP definition, for battery
8266 * powered devices, this value will correspond to the PDP of the
8267 * charging adapter either shipped or recommended for use with it. For
8268 * batteryless sink devices SPR Operational PDP indicates the power
8269 * required to operate all the device's functional modes. Hence, this
8270 * value may be considered equal to port's operating_snk_mw. As
8271 * operating_sink_mw can change as per the pd set used thus, OP PDP
8272 * is determined when populating Sink Caps Extended Data Block.
8273 */
8274 if (port->self_powered) {
8275 fwnode_property_read_u32(fwnode, "charging-adapter-pdp-milliwatt",
8276 &val);
8277 caps->spr_op_pdp = (u8)(val / 1000);
8278 caps->modes |= SINK_MODE_BATT;
8279 }
8280
8281 tcpm_parse_snk_pdos(port);
8282 tcpm_log(port,
8283 "load-step:%#x load-char:%#x compl:%#x op-pdp:%#x max-pdp:%#x",
8284 caps->load_step, caps->load_char, caps->compliance,
8285 caps->spr_op_pdp, caps->spr_max_pdp);
8286 }
8287
tcpm_fw_get_caps(struct tcpm_port * port,struct fwnode_handle * fwnode)8288 static int tcpm_fw_get_caps(struct tcpm_port *port, struct fwnode_handle *fwnode)
8289 {
8290 struct fwnode_handle *capabilities, *caps = NULL;
8291 unsigned int nr_src_pdo, nr_snk_pdo;
8292 const char *opmode_str;
8293 u32 *src_pdo, *snk_pdo;
8294 u32 uw, frs_current;
8295 int ret = 0, i;
8296 int mode;
8297
8298 if (!fwnode)
8299 return -EINVAL;
8300
8301 /*
8302 * This fwnode has a "compatible" property, but is never populated as a
8303 * struct device. Instead we simply parse it to read the properties.
8304 * This it breaks fw_devlink=on. To maintain backward compatibility
8305 * with existing DT files, we work around this by deleting any
8306 * fwnode_links to/from this fwnode.
8307 */
8308 fw_devlink_purge_absent_suppliers(fwnode);
8309
8310 ret = typec_get_fw_cap(&port->typec_caps, fwnode);
8311 if (ret < 0)
8312 return ret;
8313
8314 mode = 0;
8315
8316 if (fwnode_property_read_bool(fwnode, "accessory-mode-audio"))
8317 port->typec_caps.accessory[mode++] = TYPEC_ACCESSORY_AUDIO;
8318
8319 if (fwnode_property_read_bool(fwnode, "accessory-mode-debug"))
8320 port->typec_caps.accessory[mode++] = TYPEC_ACCESSORY_DEBUG;
8321
8322 port->port_type = port->typec_caps.type;
8323 port->pd_supported = !fwnode_property_read_bool(fwnode, "pd-disable");
8324 port->slow_charger_loop = fwnode_property_read_bool(fwnode, "slow-charger-loop");
8325 port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");
8326
8327 if (!port->pd_supported) {
8328 ret = fwnode_property_read_string(fwnode, "typec-power-opmode", &opmode_str);
8329 if (ret)
8330 return ret;
8331 ret = typec_find_pwr_opmode(opmode_str);
8332 if (ret < 0)
8333 return ret;
8334 port->src_rp = tcpm_pwr_opmode_to_rp(ret);
8335 return 0;
8336 }
8337
8338 /* The following code are applicable to pd-capable ports, i.e. pd_supported is true. */
8339
8340 /* FRS can only be supported by DRP ports */
8341 if (port->port_type == TYPEC_PORT_DRP) {
8342 ret = fwnode_property_read_u32(fwnode, "new-source-frs-typec-current",
8343 &frs_current);
8344 if (!ret && frs_current <= FRS_5V_3A)
8345 port->new_source_frs_current = frs_current;
8346
8347 if (ret)
8348 ret = 0;
8349 }
8350
8351 /* For the backward compatibility, "capabilities" node is optional. */
8352 capabilities = fwnode_get_named_child_node(fwnode, "capabilities");
8353 if (!capabilities) {
8354 port->pd_count = 1;
8355 } else {
8356 port->pd_count = fwnode_get_child_node_count(capabilities);
8357 if (!port->pd_count) {
8358 ret = -ENODATA;
8359 goto put_capabilities;
8360 }
8361 }
8362
8363 port->pds = devm_kcalloc(port->dev, port->pd_count, sizeof(struct usb_power_delivery *),
8364 GFP_KERNEL);
8365 if (!port->pds) {
8366 ret = -ENOMEM;
8367 goto put_capabilities;
8368 }
8369
8370 port->pd_list = devm_kcalloc(port->dev, port->pd_count, sizeof(struct pd_data *),
8371 GFP_KERNEL);
8372 if (!port->pd_list) {
8373 ret = -ENOMEM;
8374 goto put_capabilities;
8375 }
8376
8377 for (i = 0; i < port->pd_count; i++) {
8378 port->pd_list[i] = devm_kzalloc(port->dev, sizeof(struct pd_data), GFP_KERNEL);
8379 if (!port->pd_list[i]) {
8380 ret = -ENOMEM;
8381 goto put_capabilities;
8382 }
8383
8384 src_pdo = port->pd_list[i]->source_desc.pdo;
8385 port->pd_list[i]->source_desc.role = TYPEC_SOURCE;
8386 snk_pdo = port->pd_list[i]->sink_desc.pdo;
8387 port->pd_list[i]->sink_desc.role = TYPEC_SINK;
8388
8389 /* If "capabilities" is NULL, fall back to single pd cap population. */
8390 if (!capabilities)
8391 caps = fwnode;
8392 else
8393 caps = fwnode_get_next_child_node(capabilities, caps);
8394
8395 if (port->port_type != TYPEC_PORT_SNK) {
8396 ret = fwnode_property_count_u32(caps, "source-pdos");
8397 if (ret == 0) {
8398 ret = -EINVAL;
8399 goto put_caps;
8400 }
8401 if (ret < 0)
8402 goto put_caps;
8403
8404 nr_src_pdo = min(ret, PDO_MAX_OBJECTS);
8405 ret = fwnode_property_read_u32_array(caps, "source-pdos", src_pdo,
8406 nr_src_pdo);
8407 if (ret)
8408 goto put_caps;
8409
8410 ret = tcpm_validate_caps(port, src_pdo, nr_src_pdo);
8411 if (ret)
8412 goto put_caps;
8413
8414 if (i == 0) {
8415 port->nr_src_pdo = nr_src_pdo;
8416 memcpy_and_pad(port->src_pdo, sizeof(u32) * PDO_MAX_OBJECTS,
8417 port->pd_list[0]->source_desc.pdo,
8418 sizeof(u32) * nr_src_pdo,
8419 0);
8420 }
8421 }
8422
8423 if (port->port_type != TYPEC_PORT_SRC) {
8424 ret = fwnode_property_count_u32(caps, "sink-pdos");
8425 if (ret == 0) {
8426 ret = -EINVAL;
8427 goto put_caps;
8428 }
8429
8430 if (ret < 0)
8431 goto put_caps;
8432
8433 nr_snk_pdo = min(ret, PDO_MAX_OBJECTS);
8434 ret = fwnode_property_read_u32_array(caps, "sink-pdos", snk_pdo,
8435 nr_snk_pdo);
8436 if (ret)
8437 goto put_caps;
8438
8439 ret = tcpm_validate_caps(port, snk_pdo, nr_snk_pdo);
8440 if (ret)
8441 goto put_caps;
8442
8443 if (fwnode_property_read_u32(caps, "op-sink-microwatt", &uw) < 0) {
8444 ret = -EINVAL;
8445 goto put_caps;
8446 }
8447
8448 port->pd_list[i]->operating_snk_mw = uw / 1000;
8449
8450 if (i == 0) {
8451 port->nr_snk_pdo = nr_snk_pdo;
8452 memcpy_and_pad(port->snk_pdo, sizeof(u32) * PDO_MAX_OBJECTS,
8453 port->pd_list[0]->sink_desc.pdo,
8454 sizeof(u32) * nr_snk_pdo,
8455 0);
8456 port->operating_snk_mw = port->pd_list[0]->operating_snk_mw;
8457 }
8458 }
8459 }
8460
8461 if (port->port_type != TYPEC_PORT_SRC)
8462 tcpm_fw_get_sink_caps_ext(port, fwnode);
8463
8464 put_caps:
8465 if (caps != fwnode)
8466 fwnode_handle_put(caps);
8467 put_capabilities:
8468 fwnode_handle_put(capabilities);
8469 return ret;
8470 }
8471
tcpm_fw_get_snk_vdos(struct tcpm_port * port,struct fwnode_handle * fwnode)8472 static int tcpm_fw_get_snk_vdos(struct tcpm_port *port, struct fwnode_handle *fwnode)
8473 {
8474 int ret;
8475
8476 /* sink-vdos is optional */
8477 ret = fwnode_property_count_u32(fwnode, "sink-vdos");
8478 if (ret < 0)
8479 return 0;
8480
8481 port->nr_snk_vdo = min(ret, VDO_MAX_OBJECTS);
8482 if (port->nr_snk_vdo) {
8483 ret = fwnode_property_read_u32_array(fwnode, "sink-vdos",
8484 port->snk_vdo,
8485 port->nr_snk_vdo);
8486 if (ret < 0)
8487 return ret;
8488 }
8489
8490 /* If sink-vdos is found, sink-vdos-v1 is expected for backward compatibility. */
8491 if (port->nr_snk_vdo) {
8492 ret = fwnode_property_count_u32(fwnode, "sink-vdos-v1");
8493 if (ret < 0)
8494 return ret;
8495 else if (ret == 0)
8496 return -ENODATA;
8497
8498 port->nr_snk_vdo_v1 = min(ret, VDO_MAX_OBJECTS);
8499 ret = fwnode_property_read_u32_array(fwnode, "sink-vdos-v1",
8500 port->snk_vdo_v1,
8501 port->nr_snk_vdo_v1);
8502 if (ret < 0)
8503 return ret;
8504 }
8505
8506 tcpm_fw_get_pd_ident(port);
8507
8508 return 0;
8509 }
8510
tcpm_fw_get_pd_revision(struct tcpm_port * port,struct fwnode_handle * fwnode)8511 static void tcpm_fw_get_pd_revision(struct tcpm_port *port, struct fwnode_handle *fwnode)
8512 {
8513 int ret;
8514 u8 val[4];
8515
8516 ret = fwnode_property_count_u8(fwnode, "pd-revision");
8517 if (!ret || ret != 4) {
8518 tcpm_log(port, "Unable to find pd-revision property or incorrect array size");
8519 return;
8520 }
8521
8522 ret = fwnode_property_read_u8_array(fwnode, "pd-revision", val, 4);
8523 if (ret) {
8524 tcpm_log(port, "Failed to parse pd-revision, ret:(%d)", ret);
8525 return;
8526 }
8527
8528 port->pd_rev.rev_major = val[0];
8529 port->pd_rev.rev_minor = val[1];
8530 port->pd_rev.ver_major = val[2];
8531 port->pd_rev.ver_minor = val[3];
8532 }
8533
8534 /* Power Supply access to expose source power information */
8535 enum tcpm_psy_online_states {
8536 TCPM_PSY_OFFLINE = 0,
8537 TCPM_PSY_FIXED_ONLINE,
8538 TCPM_PSY_PPS_ONLINE,
8539 TCPM_PSY_SPR_AVS_ONLINE,
8540 };
8541
8542 static enum power_supply_property tcpm_psy_props[] = {
8543 POWER_SUPPLY_PROP_USB_TYPE,
8544 POWER_SUPPLY_PROP_ONLINE,
8545 POWER_SUPPLY_PROP_VOLTAGE_MIN,
8546 POWER_SUPPLY_PROP_VOLTAGE_MAX,
8547 POWER_SUPPLY_PROP_VOLTAGE_NOW,
8548 POWER_SUPPLY_PROP_CURRENT_MAX,
8549 POWER_SUPPLY_PROP_CURRENT_NOW,
8550 };
8551
tcpm_psy_get_online(struct tcpm_port * port,union power_supply_propval * val)8552 static int tcpm_psy_get_online(struct tcpm_port *port,
8553 union power_supply_propval *val)
8554 {
8555 if (port->vbus_charge) {
8556 if (port->pps_data.active)
8557 val->intval = TCPM_PSY_PPS_ONLINE;
8558 else if (port->spr_avs_data.active)
8559 val->intval = TCPM_PSY_SPR_AVS_ONLINE;
8560 else
8561 val->intval = TCPM_PSY_FIXED_ONLINE;
8562 } else {
8563 val->intval = TCPM_PSY_OFFLINE;
8564 }
8565
8566 return 0;
8567 }
8568
tcpm_psy_get_voltage_min(struct tcpm_port * port,union power_supply_propval * val)8569 static int tcpm_psy_get_voltage_min(struct tcpm_port *port,
8570 union power_supply_propval *val)
8571 {
8572 if (port->pps_data.active)
8573 val->intval = port->pps_data.min_volt * 1000;
8574 else if (port->spr_avs_data.active)
8575 val->intval = SPR_AVS_TIER1_MIN_VOLT_MV * 1000;
8576 else
8577 val->intval = port->supply_voltage * 1000;
8578
8579 return 0;
8580 }
8581
tcpm_psy_get_voltage_max(struct tcpm_port * port,union power_supply_propval * val)8582 static int tcpm_psy_get_voltage_max(struct tcpm_port *port,
8583 union power_supply_propval *val)
8584 {
8585 if (port->pps_data.active)
8586 val->intval = port->pps_data.max_volt * 1000;
8587 else if (port->spr_avs_data.active)
8588 val->intval = port->spr_avs_data.max_out_volt_mv * 1000;
8589 else
8590 val->intval = port->supply_voltage * 1000;
8591
8592 return 0;
8593 }
8594
tcpm_psy_get_voltage_now(struct tcpm_port * port,union power_supply_propval * val)8595 static int tcpm_psy_get_voltage_now(struct tcpm_port *port,
8596 union power_supply_propval *val)
8597 {
8598 val->intval = port->supply_voltage * 1000;
8599
8600 return 0;
8601 }
8602
tcpm_psy_get_current_max(struct tcpm_port * port,union power_supply_propval * val)8603 static int tcpm_psy_get_current_max(struct tcpm_port *port,
8604 union power_supply_propval *val)
8605 {
8606 if (port->pps_data.active)
8607 val->intval = port->pps_data.max_curr * 1000;
8608 else if (port->spr_avs_data.active)
8609 val->intval = port->spr_avs_data.max_current_ma * 1000;
8610 else
8611 val->intval = port->current_limit * 1000;
8612
8613 return 0;
8614 }
8615
tcpm_psy_get_current_now(struct tcpm_port * port,union power_supply_propval * val)8616 static int tcpm_psy_get_current_now(struct tcpm_port *port,
8617 union power_supply_propval *val)
8618 {
8619 val->intval = port->current_limit * 1000;
8620
8621 return 0;
8622 }
8623
tcpm_psy_get_input_power_limit(struct tcpm_port * port,union power_supply_propval * val)8624 static int tcpm_psy_get_input_power_limit(struct tcpm_port *port,
8625 union power_supply_propval *val)
8626 {
8627 unsigned int src_mv, src_ma, max_src_uw = 0;
8628 unsigned int i, tmp;
8629
8630 for (i = 0; i < port->nr_source_caps; i++) {
8631 u32 pdo = port->source_caps[i];
8632
8633 if (pdo_type(pdo) == PDO_TYPE_FIXED) {
8634 src_mv = pdo_fixed_voltage(pdo);
8635 src_ma = pdo_max_current(pdo);
8636 tmp = src_mv * src_ma;
8637 max_src_uw = max(tmp, max_src_uw);
8638 }
8639 }
8640
8641 val->intval = max_src_uw;
8642 return 0;
8643 }
8644
tcpm_psy_get_prop(struct power_supply * psy,enum power_supply_property psp,union power_supply_propval * val)8645 static int tcpm_psy_get_prop(struct power_supply *psy,
8646 enum power_supply_property psp,
8647 union power_supply_propval *val)
8648 {
8649 struct tcpm_port *port = power_supply_get_drvdata(psy);
8650 int ret = 0;
8651
8652 switch (psp) {
8653 case POWER_SUPPLY_PROP_USB_TYPE:
8654 val->intval = port->usb_type;
8655 break;
8656 case POWER_SUPPLY_PROP_ONLINE:
8657 ret = tcpm_psy_get_online(port, val);
8658 break;
8659 case POWER_SUPPLY_PROP_VOLTAGE_MIN:
8660 ret = tcpm_psy_get_voltage_min(port, val);
8661 break;
8662 case POWER_SUPPLY_PROP_VOLTAGE_MAX:
8663 ret = tcpm_psy_get_voltage_max(port, val);
8664 break;
8665 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
8666 ret = tcpm_psy_get_voltage_now(port, val);
8667 break;
8668 case POWER_SUPPLY_PROP_CURRENT_MAX:
8669 ret = tcpm_psy_get_current_max(port, val);
8670 break;
8671 case POWER_SUPPLY_PROP_CURRENT_NOW:
8672 ret = tcpm_psy_get_current_now(port, val);
8673 break;
8674 case POWER_SUPPLY_PROP_INPUT_POWER_LIMIT:
8675 tcpm_psy_get_input_power_limit(port, val);
8676 break;
8677 default:
8678 ret = -EINVAL;
8679 break;
8680 }
8681
8682 return ret;
8683 }
8684
tcpm_disable_pps_avs(struct tcpm_port * port)8685 static int tcpm_disable_pps_avs(struct tcpm_port *port)
8686 {
8687 int ret = 0;
8688
8689 if (port->pps_data.active)
8690 ret = tcpm_pps_activate(port, false);
8691 else if (port->spr_avs_data.active)
8692 ret = tcpm_spr_avs_activate(port, false);
8693
8694 return ret;
8695 }
8696
tcpm_psy_set_online(struct tcpm_port * port,const union power_supply_propval * val)8697 static int tcpm_psy_set_online(struct tcpm_port *port,
8698 const union power_supply_propval *val)
8699 {
8700 int ret = 0;
8701
8702 switch (val->intval) {
8703 case TCPM_PSY_FIXED_ONLINE:
8704 ret = tcpm_disable_pps_avs(port);
8705 break;
8706 case TCPM_PSY_PPS_ONLINE:
8707 if (port->spr_avs_data.active)
8708 ret = tcpm_spr_avs_activate(port, false);
8709 if (!ret)
8710 ret = tcpm_pps_activate(port, true);
8711 break;
8712 case TCPM_PSY_SPR_AVS_ONLINE:
8713 tcpm_log(port, "request to set AVS online");
8714 if (port->spr_avs_data.active)
8715 return 0;
8716 ret = tcpm_disable_pps_avs(port);
8717 if (ret)
8718 break;
8719 ret = tcpm_spr_avs_activate(port, true);
8720 break;
8721 default:
8722 ret = -EINVAL;
8723 break;
8724 }
8725
8726 return ret;
8727 }
8728
tcpm_psy_set_prop(struct power_supply * psy,enum power_supply_property psp,const union power_supply_propval * val)8729 static int tcpm_psy_set_prop(struct power_supply *psy,
8730 enum power_supply_property psp,
8731 const union power_supply_propval *val)
8732 {
8733 struct tcpm_port *port = power_supply_get_drvdata(psy);
8734 int ret;
8735
8736 /*
8737 * All the properties below are related to USB PD. The check needs to be
8738 * property specific when a non-pd related property is added.
8739 */
8740 if (!port->pd_supported)
8741 return -EOPNOTSUPP;
8742
8743 switch (psp) {
8744 case POWER_SUPPLY_PROP_ONLINE:
8745 ret = tcpm_psy_set_online(port, val);
8746 break;
8747 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
8748 ret = tcpm_aug_set_out_volt(port, val->intval / 1000);
8749 break;
8750 case POWER_SUPPLY_PROP_CURRENT_NOW:
8751 ret = tcpm_aug_set_op_curr(port, val->intval / 1000);
8752 break;
8753 default:
8754 ret = -EINVAL;
8755 break;
8756 }
8757 power_supply_changed(port->psy);
8758 return ret;
8759 }
8760
tcpm_psy_prop_writeable(struct power_supply * psy,enum power_supply_property psp)8761 static int tcpm_psy_prop_writeable(struct power_supply *psy,
8762 enum power_supply_property psp)
8763 {
8764 switch (psp) {
8765 case POWER_SUPPLY_PROP_ONLINE:
8766 case POWER_SUPPLY_PROP_VOLTAGE_NOW:
8767 case POWER_SUPPLY_PROP_CURRENT_NOW:
8768 return 1;
8769 default:
8770 return 0;
8771 }
8772 }
8773
8774 static const char *tcpm_psy_name_prefix = "tcpm-source-psy-";
8775
devm_tcpm_psy_register(struct tcpm_port * port)8776 static int devm_tcpm_psy_register(struct tcpm_port *port)
8777 {
8778 struct power_supply_config psy_cfg = {};
8779 const char *port_dev_name = dev_name(port->dev);
8780 size_t psy_name_len = strlen(tcpm_psy_name_prefix) +
8781 strlen(port_dev_name) + 1;
8782 char *psy_name;
8783
8784 psy_cfg.drv_data = port;
8785 psy_cfg.fwnode = dev_fwnode(port->dev);
8786 psy_name = devm_kzalloc(port->dev, psy_name_len, GFP_KERNEL);
8787 if (!psy_name)
8788 return -ENOMEM;
8789
8790 snprintf(psy_name, psy_name_len, "%s%s", tcpm_psy_name_prefix,
8791 port_dev_name);
8792 port->psy_desc.name = psy_name;
8793 port->psy_desc.type = POWER_SUPPLY_TYPE_USB;
8794 port->psy_desc.usb_types = BIT(POWER_SUPPLY_USB_TYPE_C) |
8795 BIT(POWER_SUPPLY_USB_TYPE_PD) |
8796 BIT(POWER_SUPPLY_USB_TYPE_PD_PPS) |
8797 BIT(POWER_SUPPLY_USB_TYPE_PD_PPS_SPR_AVS) |
8798 BIT(POWER_SUPPLY_USB_TYPE_PD_SPR_AVS);
8799 port->psy_desc.properties = tcpm_psy_props;
8800 port->psy_desc.num_properties = ARRAY_SIZE(tcpm_psy_props);
8801 port->psy_desc.get_property = tcpm_psy_get_prop;
8802 port->psy_desc.set_property = tcpm_psy_set_prop;
8803 port->psy_desc.property_is_writeable = tcpm_psy_prop_writeable;
8804
8805 port->usb_type = POWER_SUPPLY_USB_TYPE_C;
8806
8807 port->psy = devm_power_supply_register(port->dev, &port->psy_desc,
8808 &psy_cfg);
8809
8810 return PTR_ERR_OR_ZERO(port->psy);
8811 }
8812
state_machine_timer_handler(struct hrtimer * timer)8813 static enum hrtimer_restart state_machine_timer_handler(struct hrtimer *timer)
8814 {
8815 struct tcpm_port *port = container_of(timer, struct tcpm_port, state_machine_timer);
8816
8817 if (port->registered)
8818 kthread_queue_work(port->wq, &port->state_machine);
8819 return HRTIMER_NORESTART;
8820 }
8821
vdm_state_machine_timer_handler(struct hrtimer * timer)8822 static enum hrtimer_restart vdm_state_machine_timer_handler(struct hrtimer *timer)
8823 {
8824 struct tcpm_port *port = container_of(timer, struct tcpm_port, vdm_state_machine_timer);
8825
8826 if (port->registered)
8827 kthread_queue_work(port->wq, &port->vdm_state_machine);
8828 return HRTIMER_NORESTART;
8829 }
8830
enable_frs_timer_handler(struct hrtimer * timer)8831 static enum hrtimer_restart enable_frs_timer_handler(struct hrtimer *timer)
8832 {
8833 struct tcpm_port *port = container_of(timer, struct tcpm_port, enable_frs_timer);
8834
8835 if (port->registered)
8836 kthread_queue_work(port->wq, &port->enable_frs);
8837 return HRTIMER_NORESTART;
8838 }
8839
vdm_discovery_timer_handler(struct hrtimer * timer)8840 static enum hrtimer_restart vdm_discovery_timer_handler(struct hrtimer *timer)
8841 {
8842 struct tcpm_port *port = container_of(timer, struct tcpm_port, vdm_discovery_timer);
8843
8844 if (port->registered)
8845 kthread_queue_work(port->wq, &port->vdm_discovery_work);
8846 return HRTIMER_NORESTART;
8847 }
8848
tcpm_register_port(struct device * dev,struct tcpc_dev * tcpc)8849 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
8850 {
8851 struct tcpm_port *port;
8852 int err;
8853
8854 if (!dev || !tcpc ||
8855 !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
8856 !tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus ||
8857 !tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit)
8858 return ERR_PTR(-EINVAL);
8859
8860 port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
8861 if (!port)
8862 return ERR_PTR(-ENOMEM);
8863
8864 port->dev = dev;
8865 port->tcpc = tcpc;
8866
8867 mutex_init(&port->lock);
8868 mutex_init(&port->swap_lock);
8869
8870 port->wq = kthread_run_worker(0, dev_name(dev));
8871 if (IS_ERR(port->wq))
8872 return ERR_CAST(port->wq);
8873 sched_set_fifo(port->wq->task);
8874
8875 kthread_init_work(&port->state_machine, tcpm_state_machine_work);
8876 kthread_init_work(&port->vdm_state_machine, vdm_state_machine_work);
8877 kthread_init_work(&port->event_work, tcpm_pd_event_handler);
8878 kthread_init_work(&port->enable_frs, tcpm_enable_frs_work);
8879 kthread_init_work(&port->vdm_discovery_work, tcpm_vdm_discovery_work);
8880 hrtimer_setup(&port->state_machine_timer, state_machine_timer_handler, CLOCK_MONOTONIC,
8881 HRTIMER_MODE_REL);
8882 hrtimer_setup(&port->vdm_state_machine_timer, vdm_state_machine_timer_handler,
8883 CLOCK_MONOTONIC, HRTIMER_MODE_REL);
8884 hrtimer_setup(&port->enable_frs_timer, enable_frs_timer_handler, CLOCK_MONOTONIC,
8885 HRTIMER_MODE_REL);
8886 hrtimer_setup(&port->vdm_discovery_timer, vdm_discovery_timer_handler, CLOCK_MONOTONIC,
8887 HRTIMER_MODE_REL);
8888
8889 spin_lock_init(&port->pd_event_lock);
8890
8891 init_completion(&port->tx_complete);
8892 init_completion(&port->swap_complete);
8893 init_completion(&port->aug_supply_req_complete);
8894 tcpm_debugfs_init(port);
8895
8896 err = tcpm_fw_get_caps(port, tcpc->fwnode);
8897 if (err < 0)
8898 goto out_destroy_wq;
8899 err = tcpm_fw_get_snk_vdos(port, tcpc->fwnode);
8900 if (err < 0)
8901 goto out_destroy_wq;
8902
8903 tcpm_fw_get_timings(port, tcpc->fwnode);
8904 tcpm_fw_get_pd_revision(port, tcpc->fwnode);
8905
8906 port->try_role = port->typec_caps.prefer_role;
8907
8908 port->typec_caps.revision = 0x0120; /* Type-C spec release 1.2 */
8909
8910 if (port->pd_rev.rev_major)
8911 port->typec_caps.pd_revision = port->pd_rev.rev_major << 8 |
8912 port->pd_rev.rev_minor;
8913 else
8914 port->typec_caps.pd_revision = 0x0300; /* USB-PD spec release 3.0 */
8915
8916 port->typec_caps.svdm_version = SVDM_VER_2_0;
8917 port->typec_caps.driver_data = port;
8918 port->typec_caps.ops = &tcpm_ops;
8919 port->typec_caps.orientation_aware = 1;
8920
8921 port->partner_desc.identity = &port->partner_ident;
8922
8923 port->role_sw = fwnode_usb_role_switch_get(tcpc->fwnode);
8924 if (!port->role_sw)
8925 port->role_sw = usb_role_switch_get(port->dev);
8926 if (IS_ERR(port->role_sw)) {
8927 err = PTR_ERR(port->role_sw);
8928 goto out_destroy_wq;
8929 }
8930
8931 err = devm_tcpm_psy_register(port);
8932 if (err)
8933 goto out_role_sw_put;
8934 power_supply_changed(port->psy);
8935
8936 err = tcpm_port_register_pd(port);
8937 if (err)
8938 goto out_role_sw_put;
8939
8940 if (port->pds)
8941 port->typec_caps.pd = port->pds[0];
8942
8943 port->typec_port = typec_register_port(port->dev, &port->typec_caps);
8944 if (IS_ERR(port->typec_port)) {
8945 err = PTR_ERR(port->typec_port);
8946 goto out_unregister_pd;
8947 }
8948
8949 typec_port_register_altmodes(port->typec_port,
8950 &tcpm_altmode_ops, port,
8951 port->port_altmode, ALTMODE_DISCOVERY_MAX);
8952 typec_port_register_cable_ops(port->port_altmode, ARRAY_SIZE(port->port_altmode),
8953 &tcpm_cable_ops);
8954 port->registered = true;
8955
8956 mutex_lock(&port->lock);
8957 tcpm_init(port);
8958 mutex_unlock(&port->lock);
8959
8960 tcpm_log(port, "%s: registered", dev_name(dev));
8961 return port;
8962
8963 out_unregister_pd:
8964 tcpm_port_unregister_pd(port);
8965 out_role_sw_put:
8966 usb_role_switch_put(port->role_sw);
8967 out_destroy_wq:
8968 tcpm_debugfs_exit(port);
8969 kthread_destroy_worker(port->wq);
8970 return ERR_PTR(err);
8971 }
8972 EXPORT_SYMBOL_GPL(tcpm_register_port);
8973
tcpm_unregister_port(struct tcpm_port * port)8974 void tcpm_unregister_port(struct tcpm_port *port)
8975 {
8976 int i;
8977
8978 port->registered = false;
8979 kthread_destroy_worker(port->wq);
8980
8981 hrtimer_cancel(&port->vdm_discovery_timer);
8982 hrtimer_cancel(&port->enable_frs_timer);
8983 hrtimer_cancel(&port->vdm_state_machine_timer);
8984 hrtimer_cancel(&port->state_machine_timer);
8985
8986 power_supply_put_system_batteries(port->fixed_batt, port->fixed_batt_cnt);
8987 tcpm_reset_port(port);
8988
8989 tcpm_port_unregister_pd(port);
8990
8991 for (i = 0; i < ARRAY_SIZE(port->port_altmode); i++)
8992 typec_unregister_altmode(port->port_altmode[i]);
8993 typec_unregister_port(port->typec_port);
8994 usb_role_switch_put(port->role_sw);
8995 tcpm_debugfs_exit(port);
8996 }
8997 EXPORT_SYMBOL_GPL(tcpm_unregister_port);
8998
8999 MODULE_AUTHOR("Guenter Roeck <groeck@chromium.org>");
9000 MODULE_DESCRIPTION("USB Type-C Port Manager");
9001 MODULE_LICENSE("GPL");
9002