]> Git Repo - linux.git/blob - drivers/usb/typec/tcpm/tcpm.c
Merge tag 'trace-v5.13-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux.git] / drivers / usb / typec / tcpm / tcpm.c
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/module.h>
16 #include <linux/mutex.h>
17 #include <linux/power_supply.h>
18 #include <linux/proc_fs.h>
19 #include <linux/property.h>
20 #include <linux/sched/clock.h>
21 #include <linux/seq_file.h>
22 #include <linux/slab.h>
23 #include <linux/spinlock.h>
24 #include <linux/usb.h>
25 #include <linux/usb/pd.h>
26 #include <linux/usb/pd_ado.h>
27 #include <linux/usb/pd_bdo.h>
28 #include <linux/usb/pd_ext_sdb.h>
29 #include <linux/usb/pd_vdo.h>
30 #include <linux/usb/role.h>
31 #include <linux/usb/tcpm.h>
32 #include <linux/usb/typec_altmode.h>
33
34 #include <uapi/linux/sched/types.h>
35
36 #define FOREACH_STATE(S)                        \
37         S(INVALID_STATE),                       \
38         S(TOGGLING),                    \
39         S(SRC_UNATTACHED),                      \
40         S(SRC_ATTACH_WAIT),                     \
41         S(SRC_ATTACHED),                        \
42         S(SRC_STARTUP),                         \
43         S(SRC_SEND_CAPABILITIES),               \
44         S(SRC_SEND_CAPABILITIES_TIMEOUT),       \
45         S(SRC_NEGOTIATE_CAPABILITIES),          \
46         S(SRC_TRANSITION_SUPPLY),               \
47         S(SRC_READY),                           \
48         S(SRC_WAIT_NEW_CAPABILITIES),           \
49                                                 \
50         S(SNK_UNATTACHED),                      \
51         S(SNK_ATTACH_WAIT),                     \
52         S(SNK_DEBOUNCED),                       \
53         S(SNK_ATTACHED),                        \
54         S(SNK_STARTUP),                         \
55         S(SNK_DISCOVERY),                       \
56         S(SNK_DISCOVERY_DEBOUNCE),              \
57         S(SNK_DISCOVERY_DEBOUNCE_DONE),         \
58         S(SNK_WAIT_CAPABILITIES),               \
59         S(SNK_NEGOTIATE_CAPABILITIES),          \
60         S(SNK_NEGOTIATE_PPS_CAPABILITIES),      \
61         S(SNK_TRANSITION_SINK),                 \
62         S(SNK_TRANSITION_SINK_VBUS),            \
63         S(SNK_READY),                           \
64                                                 \
65         S(ACC_UNATTACHED),                      \
66         S(DEBUG_ACC_ATTACHED),                  \
67         S(AUDIO_ACC_ATTACHED),                  \
68         S(AUDIO_ACC_DEBOUNCE),                  \
69                                                 \
70         S(HARD_RESET_SEND),                     \
71         S(HARD_RESET_START),                    \
72         S(SRC_HARD_RESET_VBUS_OFF),             \
73         S(SRC_HARD_RESET_VBUS_ON),              \
74         S(SNK_HARD_RESET_SINK_OFF),             \
75         S(SNK_HARD_RESET_WAIT_VBUS),            \
76         S(SNK_HARD_RESET_SINK_ON),              \
77                                                 \
78         S(SOFT_RESET),                          \
79         S(SRC_SOFT_RESET_WAIT_SNK_TX),          \
80         S(SNK_SOFT_RESET),                      \
81         S(SOFT_RESET_SEND),                     \
82                                                 \
83         S(DR_SWAP_ACCEPT),                      \
84         S(DR_SWAP_SEND),                        \
85         S(DR_SWAP_SEND_TIMEOUT),                \
86         S(DR_SWAP_CANCEL),                      \
87         S(DR_SWAP_CHANGE_DR),                   \
88                                                 \
89         S(PR_SWAP_ACCEPT),                      \
90         S(PR_SWAP_SEND),                        \
91         S(PR_SWAP_SEND_TIMEOUT),                \
92         S(PR_SWAP_CANCEL),                      \
93         S(PR_SWAP_START),                       \
94         S(PR_SWAP_SRC_SNK_TRANSITION_OFF),      \
95         S(PR_SWAP_SRC_SNK_SOURCE_OFF),          \
96         S(PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED), \
97         S(PR_SWAP_SRC_SNK_SINK_ON),             \
98         S(PR_SWAP_SNK_SRC_SINK_OFF),            \
99         S(PR_SWAP_SNK_SRC_SOURCE_ON),           \
100         S(PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP),    \
101                                                 \
102         S(VCONN_SWAP_ACCEPT),                   \
103         S(VCONN_SWAP_SEND),                     \
104         S(VCONN_SWAP_SEND_TIMEOUT),             \
105         S(VCONN_SWAP_CANCEL),                   \
106         S(VCONN_SWAP_START),                    \
107         S(VCONN_SWAP_WAIT_FOR_VCONN),           \
108         S(VCONN_SWAP_TURN_ON_VCONN),            \
109         S(VCONN_SWAP_TURN_OFF_VCONN),           \
110                                                 \
111         S(FR_SWAP_SEND),                        \
112         S(FR_SWAP_SEND_TIMEOUT),                \
113         S(FR_SWAP_SNK_SRC_TRANSITION_TO_OFF),                   \
114         S(FR_SWAP_SNK_SRC_NEW_SINK_READY),              \
115         S(FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED), \
116         S(FR_SWAP_CANCEL),                      \
117                                                 \
118         S(SNK_TRY),                             \
119         S(SNK_TRY_WAIT),                        \
120         S(SNK_TRY_WAIT_DEBOUNCE),               \
121         S(SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS),    \
122         S(SRC_TRYWAIT),                         \
123         S(SRC_TRYWAIT_DEBOUNCE),                \
124         S(SRC_TRYWAIT_UNATTACHED),              \
125                                                 \
126         S(SRC_TRY),                             \
127         S(SRC_TRY_WAIT),                        \
128         S(SRC_TRY_DEBOUNCE),                    \
129         S(SNK_TRYWAIT),                         \
130         S(SNK_TRYWAIT_DEBOUNCE),                \
131         S(SNK_TRYWAIT_VBUS),                    \
132         S(BIST_RX),                             \
133                                                 \
134         S(GET_STATUS_SEND),                     \
135         S(GET_STATUS_SEND_TIMEOUT),             \
136         S(GET_PPS_STATUS_SEND),                 \
137         S(GET_PPS_STATUS_SEND_TIMEOUT),         \
138                                                 \
139         S(GET_SINK_CAP),                        \
140         S(GET_SINK_CAP_TIMEOUT),                \
141                                                 \
142         S(ERROR_RECOVERY),                      \
143         S(PORT_RESET),                          \
144         S(PORT_RESET_WAIT_OFF),                 \
145                                                 \
146         S(AMS_START),                           \
147         S(CHUNK_NOT_SUPP)
148
149 #define FOREACH_AMS(S)                          \
150         S(NONE_AMS),                            \
151         S(POWER_NEGOTIATION),                   \
152         S(GOTOMIN),                             \
153         S(SOFT_RESET_AMS),                      \
154         S(HARD_RESET),                          \
155         S(CABLE_RESET),                         \
156         S(GET_SOURCE_CAPABILITIES),             \
157         S(GET_SINK_CAPABILITIES),               \
158         S(POWER_ROLE_SWAP),                     \
159         S(FAST_ROLE_SWAP),                      \
160         S(DATA_ROLE_SWAP),                      \
161         S(VCONN_SWAP),                          \
162         S(SOURCE_ALERT),                        \
163         S(GETTING_SOURCE_EXTENDED_CAPABILITIES),\
164         S(GETTING_SOURCE_SINK_STATUS),          \
165         S(GETTING_BATTERY_CAPABILITIES),        \
166         S(GETTING_BATTERY_STATUS),              \
167         S(GETTING_MANUFACTURER_INFORMATION),    \
168         S(SECURITY),                            \
169         S(FIRMWARE_UPDATE),                     \
170         S(DISCOVER_IDENTITY),                   \
171         S(SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY), \
172         S(DISCOVER_SVIDS),                      \
173         S(DISCOVER_MODES),                      \
174         S(DFP_TO_UFP_ENTER_MODE),               \
175         S(DFP_TO_UFP_EXIT_MODE),                \
176         S(DFP_TO_CABLE_PLUG_ENTER_MODE),        \
177         S(DFP_TO_CABLE_PLUG_EXIT_MODE),         \
178         S(ATTENTION),                           \
179         S(BIST),                                \
180         S(UNSTRUCTURED_VDMS),                   \
181         S(STRUCTURED_VDMS),                     \
182         S(COUNTRY_INFO),                        \
183         S(COUNTRY_CODES)
184
185 #define GENERATE_ENUM(e)        e
186 #define GENERATE_STRING(s)      #s
187
188 enum tcpm_state {
189         FOREACH_STATE(GENERATE_ENUM)
190 };
191
192 static const char * const tcpm_states[] = {
193         FOREACH_STATE(GENERATE_STRING)
194 };
195
196 enum tcpm_ams {
197         FOREACH_AMS(GENERATE_ENUM)
198 };
199
200 static const char * const tcpm_ams_str[] = {
201         FOREACH_AMS(GENERATE_STRING)
202 };
203
204 enum vdm_states {
205         VDM_STATE_ERR_BUSY = -3,
206         VDM_STATE_ERR_SEND = -2,
207         VDM_STATE_ERR_TMOUT = -1,
208         VDM_STATE_DONE = 0,
209         /* Anything >0 represents an active state */
210         VDM_STATE_READY = 1,
211         VDM_STATE_BUSY = 2,
212         VDM_STATE_WAIT_RSP_BUSY = 3,
213         VDM_STATE_SEND_MESSAGE = 4,
214 };
215
216 enum pd_msg_request {
217         PD_MSG_NONE = 0,
218         PD_MSG_CTRL_REJECT,
219         PD_MSG_CTRL_WAIT,
220         PD_MSG_CTRL_NOT_SUPP,
221         PD_MSG_DATA_SINK_CAP,
222         PD_MSG_DATA_SOURCE_CAP,
223 };
224
225 enum adev_actions {
226         ADEV_NONE = 0,
227         ADEV_NOTIFY_USB_AND_QUEUE_VDM,
228         ADEV_QUEUE_VDM,
229         ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL,
230         ADEV_ATTENTION,
231 };
232
233 /*
234  * Initial current capability of the new source when vSafe5V is applied during PD3.0 Fast Role Swap.
235  * Based on "Table 6-14 Fixed Supply PDO - Sink" of "USB Power Delivery Specification Revision 3.0,
236  * Version 1.2"
237  */
238 enum frs_typec_current {
239         FRS_NOT_SUPPORTED,
240         FRS_DEFAULT_POWER,
241         FRS_5V_1P5A,
242         FRS_5V_3A,
243 };
244
245 /* Events from low level driver */
246
247 #define TCPM_CC_EVENT           BIT(0)
248 #define TCPM_VBUS_EVENT         BIT(1)
249 #define TCPM_RESET_EVENT        BIT(2)
250 #define TCPM_FRS_EVENT          BIT(3)
251 #define TCPM_SOURCING_VBUS      BIT(4)
252
253 #define LOG_BUFFER_ENTRIES      1024
254 #define LOG_BUFFER_ENTRY_SIZE   128
255
256 /* Alternate mode support */
257
258 #define SVID_DISCOVERY_MAX      16
259 #define ALTMODE_DISCOVERY_MAX   (SVID_DISCOVERY_MAX * MODE_DISCOVERY_MAX)
260
261 #define GET_SINK_CAP_RETRY_MS   100
262
263 struct pd_mode_data {
264         int svid_index;         /* current SVID index           */
265         int nsvids;
266         u16 svids[SVID_DISCOVERY_MAX];
267         int altmodes;           /* number of alternate modes    */
268         struct typec_altmode_desc altmode_desc[ALTMODE_DISCOVERY_MAX];
269 };
270
271 /*
272  * @min_volt: Actual min voltage at the local port
273  * @req_min_volt: Requested min voltage to the port partner
274  * @max_volt: Actual max voltage at the local port
275  * @req_max_volt: Requested max voltage to the port partner
276  * @max_curr: Actual max current at the local port
277  * @req_max_curr: Requested max current of the port partner
278  * @req_out_volt: Requested output voltage to the port partner
279  * @req_op_curr: Requested operating current to the port partner
280  * @supported: Parter has atleast one APDO hence supports PPS
281  * @active: PPS mode is active
282  */
283 struct pd_pps_data {
284         u32 min_volt;
285         u32 req_min_volt;
286         u32 max_volt;
287         u32 req_max_volt;
288         u32 max_curr;
289         u32 req_max_curr;
290         u32 req_out_volt;
291         u32 req_op_curr;
292         bool supported;
293         bool active;
294 };
295
296 struct tcpm_port {
297         struct device *dev;
298
299         struct mutex lock;              /* tcpm state machine lock */
300         struct kthread_worker *wq;
301
302         struct typec_capability typec_caps;
303         struct typec_port *typec_port;
304
305         struct tcpc_dev *tcpc;
306         struct usb_role_switch *role_sw;
307
308         enum typec_role vconn_role;
309         enum typec_role pwr_role;
310         enum typec_data_role data_role;
311         enum typec_pwr_opmode pwr_opmode;
312
313         struct usb_pd_identity partner_ident;
314         struct typec_partner_desc partner_desc;
315         struct typec_partner *partner;
316
317         enum typec_cc_status cc_req;
318
319         enum typec_cc_status cc1;
320         enum typec_cc_status cc2;
321         enum typec_cc_polarity polarity;
322
323         bool attached;
324         bool connected;
325         enum typec_port_type port_type;
326
327         /*
328          * Set to true when vbus is greater than VSAFE5V min.
329          * Set to false when vbus falls below vSinkDisconnect max threshold.
330          */
331         bool vbus_present;
332
333         /*
334          * Set to true when vbus is less than VSAFE0V max.
335          * Set to false when vbus is greater than VSAFE0V max.
336          */
337         bool vbus_vsafe0v;
338
339         bool vbus_never_low;
340         bool vbus_source;
341         bool vbus_charge;
342
343         bool send_discover;
344         bool op_vsafe5v;
345
346         int try_role;
347         int try_snk_count;
348         int try_src_count;
349
350         enum pd_msg_request queued_message;
351
352         enum tcpm_state enter_state;
353         enum tcpm_state prev_state;
354         enum tcpm_state state;
355         enum tcpm_state delayed_state;
356         ktime_t delayed_runtime;
357         unsigned long delay_ms;
358
359         spinlock_t pd_event_lock;
360         u32 pd_events;
361
362         struct kthread_work event_work;
363         struct hrtimer state_machine_timer;
364         struct kthread_work state_machine;
365         struct hrtimer vdm_state_machine_timer;
366         struct kthread_work vdm_state_machine;
367         struct hrtimer enable_frs_timer;
368         struct kthread_work enable_frs;
369         bool state_machine_running;
370         bool vdm_sm_running;
371
372         struct completion tx_complete;
373         enum tcpm_transmit_status tx_status;
374
375         struct mutex swap_lock;         /* swap command lock */
376         bool swap_pending;
377         bool non_pd_role_swap;
378         struct completion swap_complete;
379         int swap_status;
380
381         unsigned int negotiated_rev;
382         unsigned int message_id;
383         unsigned int caps_count;
384         unsigned int hard_reset_count;
385         bool pd_capable;
386         bool explicit_contract;
387         unsigned int rx_msgid;
388
389         /* Partner capabilities/requests */
390         u32 sink_request;
391         u32 source_caps[PDO_MAX_OBJECTS];
392         unsigned int nr_source_caps;
393         u32 sink_caps[PDO_MAX_OBJECTS];
394         unsigned int nr_sink_caps;
395
396         /* Local capabilities */
397         u32 src_pdo[PDO_MAX_OBJECTS];
398         unsigned int nr_src_pdo;
399         u32 snk_pdo[PDO_MAX_OBJECTS];
400         unsigned int nr_snk_pdo;
401         u32 snk_vdo[VDO_MAX_OBJECTS];
402         unsigned int nr_snk_vdo;
403
404         unsigned int operating_snk_mw;
405         bool update_sink_caps;
406
407         /* Requested current / voltage to the port partner */
408         u32 req_current_limit;
409         u32 req_supply_voltage;
410         /* Actual current / voltage limit of the local port */
411         u32 current_limit;
412         u32 supply_voltage;
413
414         /* Used to export TA voltage and current */
415         struct power_supply *psy;
416         struct power_supply_desc psy_desc;
417         enum power_supply_usb_type usb_type;
418
419         u32 bist_request;
420
421         /* PD state for Vendor Defined Messages */
422         enum vdm_states vdm_state;
423         u32 vdm_retries;
424         /* next Vendor Defined Message to send */
425         u32 vdo_data[VDO_MAX_SIZE];
426         u8 vdo_count;
427         /* VDO to retry if UFP responder replied busy */
428         u32 vdo_retry;
429
430         /* PPS */
431         struct pd_pps_data pps_data;
432         struct completion pps_complete;
433         bool pps_pending;
434         int pps_status;
435
436         /* Alternate mode data */
437         struct pd_mode_data mode_data;
438         struct typec_altmode *partner_altmode[ALTMODE_DISCOVERY_MAX];
439         struct typec_altmode *port_altmode[ALTMODE_DISCOVERY_MAX];
440
441         /* Deadline in jiffies to exit src_try_wait state */
442         unsigned long max_wait;
443
444         /* port belongs to a self powered device */
445         bool self_powered;
446
447         /* Sink FRS */
448         enum frs_typec_current new_source_frs_current;
449
450         /* Sink caps have been queried */
451         bool sink_cap_done;
452
453         /* Collision Avoidance and Atomic Message Sequence */
454         enum tcpm_state upcoming_state;
455         enum tcpm_ams ams;
456         enum tcpm_ams next_ams;
457         bool in_ams;
458
459         /* Auto vbus discharge status */
460         bool auto_vbus_discharge_enabled;
461
462         /*
463          * When set, port requests PD_P_SNK_STDBY_MW upon entering SNK_DISCOVERY and
464          * the actual currrent limit after RX of PD_CTRL_PSRDY for PD link,
465          * SNK_READY for non-pd link.
466          */
467         bool slow_charger_loop;
468 #ifdef CONFIG_DEBUG_FS
469         struct dentry *dentry;
470         struct mutex logbuffer_lock;    /* log buffer access lock */
471         int logbuffer_head;
472         int logbuffer_tail;
473         u8 *logbuffer[LOG_BUFFER_ENTRIES];
474 #endif
475 };
476
477 struct pd_rx_event {
478         struct kthread_work work;
479         struct tcpm_port *port;
480         struct pd_message msg;
481 };
482
483 static const char * const pd_rev[] = {
484         [PD_REV10]              = "rev1",
485         [PD_REV20]              = "rev2",
486         [PD_REV30]              = "rev3",
487 };
488
489 #define tcpm_cc_is_sink(cc) \
490         ((cc) == TYPEC_CC_RP_DEF || (cc) == TYPEC_CC_RP_1_5 || \
491          (cc) == TYPEC_CC_RP_3_0)
492
493 #define tcpm_port_is_sink(port) \
494         ((tcpm_cc_is_sink((port)->cc1) && !tcpm_cc_is_sink((port)->cc2)) || \
495          (tcpm_cc_is_sink((port)->cc2) && !tcpm_cc_is_sink((port)->cc1)))
496
497 #define tcpm_cc_is_source(cc) ((cc) == TYPEC_CC_RD)
498 #define tcpm_cc_is_audio(cc) ((cc) == TYPEC_CC_RA)
499 #define tcpm_cc_is_open(cc) ((cc) == TYPEC_CC_OPEN)
500
501 #define tcpm_port_is_source(port) \
502         ((tcpm_cc_is_source((port)->cc1) && \
503          !tcpm_cc_is_source((port)->cc2)) || \
504          (tcpm_cc_is_source((port)->cc2) && \
505           !tcpm_cc_is_source((port)->cc1)))
506
507 #define tcpm_port_is_debug(port) \
508         (tcpm_cc_is_source((port)->cc1) && tcpm_cc_is_source((port)->cc2))
509
510 #define tcpm_port_is_audio(port) \
511         (tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_audio((port)->cc2))
512
513 #define tcpm_port_is_audio_detached(port) \
514         ((tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_open((port)->cc2)) || \
515          (tcpm_cc_is_audio((port)->cc2) && tcpm_cc_is_open((port)->cc1)))
516
517 #define tcpm_try_snk(port) \
518         ((port)->try_snk_count == 0 && (port)->try_role == TYPEC_SINK && \
519         (port)->port_type == TYPEC_PORT_DRP)
520
521 #define tcpm_try_src(port) \
522         ((port)->try_src_count == 0 && (port)->try_role == TYPEC_SOURCE && \
523         (port)->port_type == TYPEC_PORT_DRP)
524
525 #define tcpm_data_role_for_source(port) \
526         ((port)->typec_caps.data == TYPEC_PORT_UFP ? \
527         TYPEC_DEVICE : TYPEC_HOST)
528
529 #define tcpm_data_role_for_sink(port) \
530         ((port)->typec_caps.data == TYPEC_PORT_DFP ? \
531         TYPEC_HOST : TYPEC_DEVICE)
532
533 #define tcpm_sink_tx_ok(port) \
534         (tcpm_port_is_sink(port) && \
535         ((port)->cc1 == TYPEC_CC_RP_3_0 || (port)->cc2 == TYPEC_CC_RP_3_0))
536
537 #define tcpm_wait_for_discharge(port) \
538         (((port)->auto_vbus_discharge_enabled && !(port)->vbus_vsafe0v) ? PD_T_SAFE_0V : 0)
539
540 static enum tcpm_state tcpm_default_state(struct tcpm_port *port)
541 {
542         if (port->port_type == TYPEC_PORT_DRP) {
543                 if (port->try_role == TYPEC_SINK)
544                         return SNK_UNATTACHED;
545                 else if (port->try_role == TYPEC_SOURCE)
546                         return SRC_UNATTACHED;
547                 /* Fall through to return SRC_UNATTACHED */
548         } else if (port->port_type == TYPEC_PORT_SNK) {
549                 return SNK_UNATTACHED;
550         }
551         return SRC_UNATTACHED;
552 }
553
554 static bool tcpm_port_is_disconnected(struct tcpm_port *port)
555 {
556         return (!port->attached && port->cc1 == TYPEC_CC_OPEN &&
557                 port->cc2 == TYPEC_CC_OPEN) ||
558                (port->attached && ((port->polarity == TYPEC_POLARITY_CC1 &&
559                                     port->cc1 == TYPEC_CC_OPEN) ||
560                                    (port->polarity == TYPEC_POLARITY_CC2 &&
561                                     port->cc2 == TYPEC_CC_OPEN)));
562 }
563
564 /*
565  * Logging
566  */
567
568 #ifdef CONFIG_DEBUG_FS
569
570 static bool tcpm_log_full(struct tcpm_port *port)
571 {
572         return port->logbuffer_tail ==
573                 (port->logbuffer_head + 1) % LOG_BUFFER_ENTRIES;
574 }
575
576 __printf(2, 0)
577 static void _tcpm_log(struct tcpm_port *port, const char *fmt, va_list args)
578 {
579         char tmpbuffer[LOG_BUFFER_ENTRY_SIZE];
580         u64 ts_nsec = local_clock();
581         unsigned long rem_nsec;
582
583         mutex_lock(&port->logbuffer_lock);
584         if (!port->logbuffer[port->logbuffer_head]) {
585                 port->logbuffer[port->logbuffer_head] =
586                                 kzalloc(LOG_BUFFER_ENTRY_SIZE, GFP_KERNEL);
587                 if (!port->logbuffer[port->logbuffer_head]) {
588                         mutex_unlock(&port->logbuffer_lock);
589                         return;
590                 }
591         }
592
593         vsnprintf(tmpbuffer, sizeof(tmpbuffer), fmt, args);
594
595         if (tcpm_log_full(port)) {
596                 port->logbuffer_head = max(port->logbuffer_head - 1, 0);
597                 strcpy(tmpbuffer, "overflow");
598         }
599
600         if (port->logbuffer_head < 0 ||
601             port->logbuffer_head >= LOG_BUFFER_ENTRIES) {
602                 dev_warn(port->dev,
603                          "Bad log buffer index %d\n", port->logbuffer_head);
604                 goto abort;
605         }
606
607         if (!port->logbuffer[port->logbuffer_head]) {
608                 dev_warn(port->dev,
609                          "Log buffer index %d is NULL\n", port->logbuffer_head);
610                 goto abort;
611         }
612
613         rem_nsec = do_div(ts_nsec, 1000000000);
614         scnprintf(port->logbuffer[port->logbuffer_head],
615                   LOG_BUFFER_ENTRY_SIZE, "[%5lu.%06lu] %s",
616                   (unsigned long)ts_nsec, rem_nsec / 1000,
617                   tmpbuffer);
618         port->logbuffer_head = (port->logbuffer_head + 1) % LOG_BUFFER_ENTRIES;
619
620 abort:
621         mutex_unlock(&port->logbuffer_lock);
622 }
623
624 __printf(2, 3)
625 static void tcpm_log(struct tcpm_port *port, const char *fmt, ...)
626 {
627         va_list args;
628
629         /* Do not log while disconnected and unattached */
630         if (tcpm_port_is_disconnected(port) &&
631             (port->state == SRC_UNATTACHED || port->state == SNK_UNATTACHED ||
632              port->state == TOGGLING))
633                 return;
634
635         va_start(args, fmt);
636         _tcpm_log(port, fmt, args);
637         va_end(args);
638 }
639
640 __printf(2, 3)
641 static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...)
642 {
643         va_list args;
644
645         va_start(args, fmt);
646         _tcpm_log(port, fmt, args);
647         va_end(args);
648 }
649
650 static void tcpm_log_source_caps(struct tcpm_port *port)
651 {
652         int i;
653
654         for (i = 0; i < port->nr_source_caps; i++) {
655                 u32 pdo = port->source_caps[i];
656                 enum pd_pdo_type type = pdo_type(pdo);
657                 char msg[64];
658
659                 switch (type) {
660                 case PDO_TYPE_FIXED:
661                         scnprintf(msg, sizeof(msg),
662                                   "%u mV, %u mA [%s%s%s%s%s%s]",
663                                   pdo_fixed_voltage(pdo),
664                                   pdo_max_current(pdo),
665                                   (pdo & PDO_FIXED_DUAL_ROLE) ?
666                                                         "R" : "",
667                                   (pdo & PDO_FIXED_SUSPEND) ?
668                                                         "S" : "",
669                                   (pdo & PDO_FIXED_HIGHER_CAP) ?
670                                                         "H" : "",
671                                   (pdo & PDO_FIXED_USB_COMM) ?
672                                                         "U" : "",
673                                   (pdo & PDO_FIXED_DATA_SWAP) ?
674                                                         "D" : "",
675                                   (pdo & PDO_FIXED_EXTPOWER) ?
676                                                         "E" : "");
677                         break;
678                 case PDO_TYPE_VAR:
679                         scnprintf(msg, sizeof(msg),
680                                   "%u-%u mV, %u mA",
681                                   pdo_min_voltage(pdo),
682                                   pdo_max_voltage(pdo),
683                                   pdo_max_current(pdo));
684                         break;
685                 case PDO_TYPE_BATT:
686                         scnprintf(msg, sizeof(msg),
687                                   "%u-%u mV, %u mW",
688                                   pdo_min_voltage(pdo),
689                                   pdo_max_voltage(pdo),
690                                   pdo_max_power(pdo));
691                         break;
692                 case PDO_TYPE_APDO:
693                         if (pdo_apdo_type(pdo) == APDO_TYPE_PPS)
694                                 scnprintf(msg, sizeof(msg),
695                                           "%u-%u mV, %u mA",
696                                           pdo_pps_apdo_min_voltage(pdo),
697                                           pdo_pps_apdo_max_voltage(pdo),
698                                           pdo_pps_apdo_max_current(pdo));
699                         else
700                                 strcpy(msg, "undefined APDO");
701                         break;
702                 default:
703                         strcpy(msg, "undefined");
704                         break;
705                 }
706                 tcpm_log(port, " PDO %d: type %d, %s",
707                          i, type, msg);
708         }
709 }
710
711 static int tcpm_debug_show(struct seq_file *s, void *v)
712 {
713         struct tcpm_port *port = (struct tcpm_port *)s->private;
714         int tail;
715
716         mutex_lock(&port->logbuffer_lock);
717         tail = port->logbuffer_tail;
718         while (tail != port->logbuffer_head) {
719                 seq_printf(s, "%s\n", port->logbuffer[tail]);
720                 tail = (tail + 1) % LOG_BUFFER_ENTRIES;
721         }
722         if (!seq_has_overflowed(s))
723                 port->logbuffer_tail = tail;
724         mutex_unlock(&port->logbuffer_lock);
725
726         return 0;
727 }
728 DEFINE_SHOW_ATTRIBUTE(tcpm_debug);
729
730 static void tcpm_debugfs_init(struct tcpm_port *port)
731 {
732         char name[NAME_MAX];
733
734         mutex_init(&port->logbuffer_lock);
735         snprintf(name, NAME_MAX, "tcpm-%s", dev_name(port->dev));
736         port->dentry = debugfs_create_dir(name, usb_debug_root);
737         debugfs_create_file("log", S_IFREG | 0444, port->dentry, port,
738                             &tcpm_debug_fops);
739 }
740
741 static void tcpm_debugfs_exit(struct tcpm_port *port)
742 {
743         int i;
744
745         mutex_lock(&port->logbuffer_lock);
746         for (i = 0; i < LOG_BUFFER_ENTRIES; i++) {
747                 kfree(port->logbuffer[i]);
748                 port->logbuffer[i] = NULL;
749         }
750         mutex_unlock(&port->logbuffer_lock);
751
752         debugfs_remove(port->dentry);
753 }
754
755 #else
756
757 __printf(2, 3)
758 static void tcpm_log(const struct tcpm_port *port, const char *fmt, ...) { }
759 __printf(2, 3)
760 static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...) { }
761 static void tcpm_log_source_caps(struct tcpm_port *port) { }
762 static void tcpm_debugfs_init(const struct tcpm_port *port) { }
763 static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
764
765 #endif
766
767 static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
768 {
769         tcpm_log(port, "cc:=%d", cc);
770         port->cc_req = cc;
771         port->tcpc->set_cc(port->tcpc, cc);
772 }
773
774 /*
775  * Determine RP value to set based on maximum current supported
776  * by a port if configured as source.
777  * Returns CC value to report to link partner.
778  */
779 static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port)
780 {
781         const u32 *src_pdo = port->src_pdo;
782         int nr_pdo = port->nr_src_pdo;
783         int i;
784
785         /*
786          * Search for first entry with matching voltage.
787          * It should report the maximum supported current.
788          */
789         for (i = 0; i < nr_pdo; i++) {
790                 const u32 pdo = src_pdo[i];
791
792                 if (pdo_type(pdo) == PDO_TYPE_FIXED &&
793                     pdo_fixed_voltage(pdo) == 5000) {
794                         unsigned int curr = pdo_max_current(pdo);
795
796                         if (curr >= 3000)
797                                 return TYPEC_CC_RP_3_0;
798                         else if (curr >= 1500)
799                                 return TYPEC_CC_RP_1_5;
800                         return TYPEC_CC_RP_DEF;
801                 }
802         }
803
804         return TYPEC_CC_RP_DEF;
805 }
806
807 static void tcpm_ams_finish(struct tcpm_port *port)
808 {
809         tcpm_log(port, "AMS %s finished", tcpm_ams_str[port->ams]);
810
811         if (port->pd_capable && port->pwr_role == TYPEC_SOURCE) {
812                 if (port->negotiated_rev >= PD_REV30)
813                         tcpm_set_cc(port, SINK_TX_OK);
814                 else
815                         tcpm_set_cc(port, SINK_TX_NG);
816         } else if (port->pwr_role == TYPEC_SOURCE) {
817                 tcpm_set_cc(port, tcpm_rp_cc(port));
818         }
819
820         port->in_ams = false;
821         port->ams = NONE_AMS;
822 }
823
824 static int tcpm_pd_transmit(struct tcpm_port *port,
825                             enum tcpm_transmit_type type,
826                             const struct pd_message *msg)
827 {
828         unsigned long timeout;
829         int ret;
830
831         if (msg)
832                 tcpm_log(port, "PD TX, header: %#x", le16_to_cpu(msg->header));
833         else
834                 tcpm_log(port, "PD TX, type: %#x", type);
835
836         reinit_completion(&port->tx_complete);
837         ret = port->tcpc->pd_transmit(port->tcpc, type, msg, port->negotiated_rev);
838         if (ret < 0)
839                 return ret;
840
841         mutex_unlock(&port->lock);
842         timeout = wait_for_completion_timeout(&port->tx_complete,
843                                 msecs_to_jiffies(PD_T_TCPC_TX_TIMEOUT));
844         mutex_lock(&port->lock);
845         if (!timeout)
846                 return -ETIMEDOUT;
847
848         switch (port->tx_status) {
849         case TCPC_TX_SUCCESS:
850                 port->message_id = (port->message_id + 1) & PD_HEADER_ID_MASK;
851                 /*
852                  * USB PD rev 2.0, 8.3.2.2.1:
853                  * USB PD rev 3.0, 8.3.2.1.3:
854                  * "... Note that every AMS is Interruptible until the first
855                  * Message in the sequence has been successfully sent (GoodCRC
856                  * Message received)."
857                  */
858                 if (port->ams != NONE_AMS)
859                         port->in_ams = true;
860                 break;
861         case TCPC_TX_DISCARDED:
862                 ret = -EAGAIN;
863                 break;
864         case TCPC_TX_FAILED:
865         default:
866                 ret = -EIO;
867                 break;
868         }
869
870         /* Some AMS don't expect responses. Finish them here. */
871         if (port->ams == ATTENTION || port->ams == SOURCE_ALERT)
872                 tcpm_ams_finish(port);
873
874         return ret;
875 }
876
877 void tcpm_pd_transmit_complete(struct tcpm_port *port,
878                                enum tcpm_transmit_status status)
879 {
880         tcpm_log(port, "PD TX complete, status: %u", status);
881         port->tx_status = status;
882         complete(&port->tx_complete);
883 }
884 EXPORT_SYMBOL_GPL(tcpm_pd_transmit_complete);
885
886 static int tcpm_mux_set(struct tcpm_port *port, int state,
887                         enum usb_role usb_role,
888                         enum typec_orientation orientation)
889 {
890         int ret;
891
892         tcpm_log(port, "Requesting mux state %d, usb-role %d, orientation %d",
893                  state, usb_role, orientation);
894
895         ret = typec_set_orientation(port->typec_port, orientation);
896         if (ret)
897                 return ret;
898
899         if (port->role_sw) {
900                 ret = usb_role_switch_set_role(port->role_sw, usb_role);
901                 if (ret)
902                         return ret;
903         }
904
905         return typec_set_mode(port->typec_port, state);
906 }
907
908 static int tcpm_set_polarity(struct tcpm_port *port,
909                              enum typec_cc_polarity polarity)
910 {
911         int ret;
912
913         tcpm_log(port, "polarity %d", polarity);
914
915         ret = port->tcpc->set_polarity(port->tcpc, polarity);
916         if (ret < 0)
917                 return ret;
918
919         port->polarity = polarity;
920
921         return 0;
922 }
923
924 static int tcpm_set_vconn(struct tcpm_port *port, bool enable)
925 {
926         int ret;
927
928         tcpm_log(port, "vconn:=%d", enable);
929
930         ret = port->tcpc->set_vconn(port->tcpc, enable);
931         if (!ret) {
932                 port->vconn_role = enable ? TYPEC_SOURCE : TYPEC_SINK;
933                 typec_set_vconn_role(port->typec_port, port->vconn_role);
934         }
935
936         return ret;
937 }
938
939 static u32 tcpm_get_current_limit(struct tcpm_port *port)
940 {
941         enum typec_cc_status cc;
942         u32 limit;
943
944         cc = port->polarity ? port->cc2 : port->cc1;
945         switch (cc) {
946         case TYPEC_CC_RP_1_5:
947                 limit = 1500;
948                 break;
949         case TYPEC_CC_RP_3_0:
950                 limit = 3000;
951                 break;
952         case TYPEC_CC_RP_DEF:
953         default:
954                 if (port->tcpc->get_current_limit)
955                         limit = port->tcpc->get_current_limit(port->tcpc);
956                 else
957                         limit = 0;
958                 break;
959         }
960
961         return limit;
962 }
963
964 static int tcpm_set_current_limit(struct tcpm_port *port, u32 max_ma, u32 mv)
965 {
966         int ret = -EOPNOTSUPP;
967
968         tcpm_log(port, "Setting voltage/current limit %u mV %u mA", mv, max_ma);
969
970         port->supply_voltage = mv;
971         port->current_limit = max_ma;
972         power_supply_changed(port->psy);
973
974         if (port->tcpc->set_current_limit)
975                 ret = port->tcpc->set_current_limit(port->tcpc, max_ma, mv);
976
977         return ret;
978 }
979
980 static int tcpm_set_attached_state(struct tcpm_port *port, bool attached)
981 {
982         return port->tcpc->set_roles(port->tcpc, attached, port->pwr_role,
983                                      port->data_role);
984 }
985
986 static int tcpm_set_roles(struct tcpm_port *port, bool attached,
987                           enum typec_role role, enum typec_data_role data)
988 {
989         enum typec_orientation orientation;
990         enum usb_role usb_role;
991         int ret;
992
993         if (port->polarity == TYPEC_POLARITY_CC1)
994                 orientation = TYPEC_ORIENTATION_NORMAL;
995         else
996                 orientation = TYPEC_ORIENTATION_REVERSE;
997
998         if (port->typec_caps.data == TYPEC_PORT_DRD) {
999                 if (data == TYPEC_HOST)
1000                         usb_role = USB_ROLE_HOST;
1001                 else
1002                         usb_role = USB_ROLE_DEVICE;
1003         } else if (port->typec_caps.data == TYPEC_PORT_DFP) {
1004                 if (data == TYPEC_HOST) {
1005                         if (role == TYPEC_SOURCE)
1006                                 usb_role = USB_ROLE_HOST;
1007                         else
1008                                 usb_role = USB_ROLE_NONE;
1009                 } else {
1010                         return -ENOTSUPP;
1011                 }
1012         } else {
1013                 if (data == TYPEC_DEVICE) {
1014                         if (role == TYPEC_SINK)
1015                                 usb_role = USB_ROLE_DEVICE;
1016                         else
1017                                 usb_role = USB_ROLE_NONE;
1018                 } else {
1019                         return -ENOTSUPP;
1020                 }
1021         }
1022
1023         ret = tcpm_mux_set(port, TYPEC_STATE_USB, usb_role, orientation);
1024         if (ret < 0)
1025                 return ret;
1026
1027         ret = port->tcpc->set_roles(port->tcpc, attached, role, data);
1028         if (ret < 0)
1029                 return ret;
1030
1031         port->pwr_role = role;
1032         port->data_role = data;
1033         typec_set_data_role(port->typec_port, data);
1034         typec_set_pwr_role(port->typec_port, role);
1035
1036         return 0;
1037 }
1038
1039 static int tcpm_set_pwr_role(struct tcpm_port *port, enum typec_role role)
1040 {
1041         int ret;
1042
1043         ret = port->tcpc->set_roles(port->tcpc, true, role,
1044                                     port->data_role);
1045         if (ret < 0)
1046                 return ret;
1047
1048         port->pwr_role = role;
1049         typec_set_pwr_role(port->typec_port, role);
1050
1051         return 0;
1052 }
1053
1054 /*
1055  * Transform the PDO to be compliant to PD rev2.0.
1056  * Return 0 if the PDO type is not defined in PD rev2.0.
1057  * Otherwise, return the converted PDO.
1058  */
1059 static u32 tcpm_forge_legacy_pdo(struct tcpm_port *port, u32 pdo, enum typec_role role)
1060 {
1061         switch (pdo_type(pdo)) {
1062         case PDO_TYPE_FIXED:
1063                 if (role == TYPEC_SINK)
1064                         return pdo & ~PDO_FIXED_FRS_CURR_MASK;
1065                 else
1066                         return pdo & ~PDO_FIXED_UNCHUNK_EXT;
1067         case PDO_TYPE_VAR:
1068         case PDO_TYPE_BATT:
1069                 return pdo;
1070         case PDO_TYPE_APDO:
1071         default:
1072                 return 0;
1073         }
1074 }
1075
1076 static int tcpm_pd_send_source_caps(struct tcpm_port *port)
1077 {
1078         struct pd_message msg;
1079         u32 pdo;
1080         unsigned int i, nr_pdo = 0;
1081
1082         memset(&msg, 0, sizeof(msg));
1083
1084         for (i = 0; i < port->nr_src_pdo; i++) {
1085                 if (port->negotiated_rev >= PD_REV30) {
1086                         msg.payload[nr_pdo++] = cpu_to_le32(port->src_pdo[i]);
1087                 } else {
1088                         pdo = tcpm_forge_legacy_pdo(port, port->src_pdo[i], TYPEC_SOURCE);
1089                         if (pdo)
1090                                 msg.payload[nr_pdo++] = cpu_to_le32(pdo);
1091                 }
1092         }
1093
1094         if (!nr_pdo) {
1095                 /* No source capabilities defined, sink only */
1096                 msg.header = PD_HEADER_LE(PD_CTRL_REJECT,
1097                                           port->pwr_role,
1098                                           port->data_role,
1099                                           port->negotiated_rev,
1100                                           port->message_id, 0);
1101         } else {
1102                 msg.header = PD_HEADER_LE(PD_DATA_SOURCE_CAP,
1103                                           port->pwr_role,
1104                                           port->data_role,
1105                                           port->negotiated_rev,
1106                                           port->message_id,
1107                                           nr_pdo);
1108         }
1109
1110         return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1111 }
1112
1113 static int tcpm_pd_send_sink_caps(struct tcpm_port *port)
1114 {
1115         struct pd_message msg;
1116         u32 pdo;
1117         unsigned int i, nr_pdo = 0;
1118
1119         memset(&msg, 0, sizeof(msg));
1120
1121         for (i = 0; i < port->nr_snk_pdo; i++) {
1122                 if (port->negotiated_rev >= PD_REV30) {
1123                         msg.payload[nr_pdo++] = cpu_to_le32(port->snk_pdo[i]);
1124                 } else {
1125                         pdo = tcpm_forge_legacy_pdo(port, port->snk_pdo[i], TYPEC_SINK);
1126                         if (pdo)
1127                                 msg.payload[nr_pdo++] = cpu_to_le32(pdo);
1128                 }
1129         }
1130
1131         if (!nr_pdo) {
1132                 /* No sink capabilities defined, source only */
1133                 msg.header = PD_HEADER_LE(PD_CTRL_REJECT,
1134                                           port->pwr_role,
1135                                           port->data_role,
1136                                           port->negotiated_rev,
1137                                           port->message_id, 0);
1138         } else {
1139                 msg.header = PD_HEADER_LE(PD_DATA_SINK_CAP,
1140                                           port->pwr_role,
1141                                           port->data_role,
1142                                           port->negotiated_rev,
1143                                           port->message_id,
1144                                           nr_pdo);
1145         }
1146
1147         return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1148 }
1149
1150 static void mod_tcpm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1151 {
1152         if (delay_ms) {
1153                 hrtimer_start(&port->state_machine_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
1154         } else {
1155                 hrtimer_cancel(&port->state_machine_timer);
1156                 kthread_queue_work(port->wq, &port->state_machine);
1157         }
1158 }
1159
1160 static void mod_vdm_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1161 {
1162         if (delay_ms) {
1163                 hrtimer_start(&port->vdm_state_machine_timer, ms_to_ktime(delay_ms),
1164                               HRTIMER_MODE_REL);
1165         } else {
1166                 hrtimer_cancel(&port->vdm_state_machine_timer);
1167                 kthread_queue_work(port->wq, &port->vdm_state_machine);
1168         }
1169 }
1170
1171 static void mod_enable_frs_delayed_work(struct tcpm_port *port, unsigned int delay_ms)
1172 {
1173         if (delay_ms) {
1174                 hrtimer_start(&port->enable_frs_timer, ms_to_ktime(delay_ms), HRTIMER_MODE_REL);
1175         } else {
1176                 hrtimer_cancel(&port->enable_frs_timer);
1177                 kthread_queue_work(port->wq, &port->enable_frs);
1178         }
1179 }
1180
1181 static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
1182                            unsigned int delay_ms)
1183 {
1184         if (delay_ms) {
1185                 tcpm_log(port, "pending state change %s -> %s @ %u ms [%s %s]",
1186                          tcpm_states[port->state], tcpm_states[state], delay_ms,
1187                          pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
1188                 port->delayed_state = state;
1189                 mod_tcpm_delayed_work(port, delay_ms);
1190                 port->delayed_runtime = ktime_add(ktime_get(), ms_to_ktime(delay_ms));
1191                 port->delay_ms = delay_ms;
1192         } else {
1193                 tcpm_log(port, "state change %s -> %s [%s %s]",
1194                          tcpm_states[port->state], tcpm_states[state],
1195                          pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
1196                 port->delayed_state = INVALID_STATE;
1197                 port->prev_state = port->state;
1198                 port->state = state;
1199                 /*
1200                  * Don't re-queue the state machine work item if we're currently
1201                  * in the state machine and we're immediately changing states.
1202                  * tcpm_state_machine_work() will continue running the state
1203                  * machine.
1204                  */
1205                 if (!port->state_machine_running)
1206                         mod_tcpm_delayed_work(port, 0);
1207         }
1208 }
1209
1210 static void tcpm_set_state_cond(struct tcpm_port *port, enum tcpm_state state,
1211                                 unsigned int delay_ms)
1212 {
1213         if (port->enter_state == port->state)
1214                 tcpm_set_state(port, state, delay_ms);
1215         else
1216                 tcpm_log(port,
1217                          "skipped %sstate change %s -> %s [%u ms], context state %s [%s %s]",
1218                          delay_ms ? "delayed " : "",
1219                          tcpm_states[port->state], tcpm_states[state],
1220                          delay_ms, tcpm_states[port->enter_state],
1221                          pd_rev[port->negotiated_rev], tcpm_ams_str[port->ams]);
1222 }
1223
1224 static void tcpm_queue_message(struct tcpm_port *port,
1225                                enum pd_msg_request message)
1226 {
1227         port->queued_message = message;
1228         mod_tcpm_delayed_work(port, 0);
1229 }
1230
1231 static bool tcpm_vdm_ams(struct tcpm_port *port)
1232 {
1233         switch (port->ams) {
1234         case DISCOVER_IDENTITY:
1235         case SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY:
1236         case DISCOVER_SVIDS:
1237         case DISCOVER_MODES:
1238         case DFP_TO_UFP_ENTER_MODE:
1239         case DFP_TO_UFP_EXIT_MODE:
1240         case DFP_TO_CABLE_PLUG_ENTER_MODE:
1241         case DFP_TO_CABLE_PLUG_EXIT_MODE:
1242         case ATTENTION:
1243         case UNSTRUCTURED_VDMS:
1244         case STRUCTURED_VDMS:
1245                 break;
1246         default:
1247                 return false;
1248         }
1249
1250         return true;
1251 }
1252
1253 static bool tcpm_ams_interruptible(struct tcpm_port *port)
1254 {
1255         switch (port->ams) {
1256         /* Interruptible AMS */
1257         case NONE_AMS:
1258         case SECURITY:
1259         case FIRMWARE_UPDATE:
1260         case DISCOVER_IDENTITY:
1261         case SOURCE_STARTUP_CABLE_PLUG_DISCOVER_IDENTITY:
1262         case DISCOVER_SVIDS:
1263         case DISCOVER_MODES:
1264         case DFP_TO_UFP_ENTER_MODE:
1265         case DFP_TO_UFP_EXIT_MODE:
1266         case DFP_TO_CABLE_PLUG_ENTER_MODE:
1267         case DFP_TO_CABLE_PLUG_EXIT_MODE:
1268         case UNSTRUCTURED_VDMS:
1269         case STRUCTURED_VDMS:
1270         case COUNTRY_INFO:
1271         case COUNTRY_CODES:
1272                 break;
1273         /* Non-Interruptible AMS */
1274         default:
1275                 if (port->in_ams)
1276                         return false;
1277                 break;
1278         }
1279
1280         return true;
1281 }
1282
1283 static int tcpm_ams_start(struct tcpm_port *port, enum tcpm_ams ams)
1284 {
1285         int ret = 0;
1286
1287         tcpm_log(port, "AMS %s start", tcpm_ams_str[ams]);
1288
1289         if (!tcpm_ams_interruptible(port) &&
1290             !(ams == HARD_RESET || ams == SOFT_RESET_AMS)) {
1291                 port->upcoming_state = INVALID_STATE;
1292                 tcpm_log(port, "AMS %s not interruptible, aborting",
1293                          tcpm_ams_str[port->ams]);
1294                 return -EAGAIN;
1295         }
1296
1297         if (port->pwr_role == TYPEC_SOURCE) {
1298                 enum typec_cc_status cc_req = port->cc_req;
1299
1300                 port->ams = ams;
1301
1302                 if (ams == HARD_RESET) {
1303                         tcpm_set_cc(port, tcpm_rp_cc(port));
1304                         tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
1305                         tcpm_set_state(port, HARD_RESET_START, 0);
1306                         return ret;
1307                 } else if (ams == SOFT_RESET_AMS) {
1308                         if (!port->explicit_contract)
1309                                 tcpm_set_cc(port, tcpm_rp_cc(port));
1310                         tcpm_set_state(port, SOFT_RESET_SEND, 0);
1311                         return ret;
1312                 } else if (tcpm_vdm_ams(port)) {
1313                         /* tSinkTx is enforced in vdm_run_state_machine */
1314                         if (port->negotiated_rev >= PD_REV30)
1315                                 tcpm_set_cc(port, SINK_TX_NG);
1316                         return ret;
1317                 }
1318
1319                 if (port->negotiated_rev >= PD_REV30)
1320                         tcpm_set_cc(port, SINK_TX_NG);
1321
1322                 switch (port->state) {
1323                 case SRC_READY:
1324                 case SRC_STARTUP:
1325                 case SRC_SOFT_RESET_WAIT_SNK_TX:
1326                 case SOFT_RESET:
1327                 case SOFT_RESET_SEND:
1328                         if (port->negotiated_rev >= PD_REV30)
1329                                 tcpm_set_state(port, AMS_START,
1330                                                cc_req == SINK_TX_OK ?
1331                                                PD_T_SINK_TX : 0);
1332                         else
1333                                 tcpm_set_state(port, AMS_START, 0);
1334                         break;
1335                 default:
1336                         if (port->negotiated_rev >= PD_REV30)
1337                                 tcpm_set_state(port, SRC_READY,
1338                                                cc_req == SINK_TX_OK ?
1339                                                PD_T_SINK_TX : 0);
1340                         else
1341                                 tcpm_set_state(port, SRC_READY, 0);
1342                         break;
1343                 }
1344         } else {
1345                 if (port->negotiated_rev >= PD_REV30 &&
1346                     !tcpm_sink_tx_ok(port) &&
1347                     ams != SOFT_RESET_AMS &&
1348                     ams != HARD_RESET) {
1349                         port->upcoming_state = INVALID_STATE;
1350                         tcpm_log(port, "Sink TX No Go");
1351                         return -EAGAIN;
1352                 }
1353
1354                 port->ams = ams;
1355
1356                 if (ams == HARD_RESET) {
1357                         tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
1358                         tcpm_set_state(port, HARD_RESET_START, 0);
1359                         return ret;
1360                 } else if (tcpm_vdm_ams(port)) {
1361                         return ret;
1362                 }
1363
1364                 if (port->state == SNK_READY ||
1365                     port->state == SNK_SOFT_RESET)
1366                         tcpm_set_state(port, AMS_START, 0);
1367                 else
1368                         tcpm_set_state(port, SNK_READY, 0);
1369         }
1370
1371         return ret;
1372 }
1373
1374 /*
1375  * VDM/VDO handling functions
1376  */
1377 static void tcpm_queue_vdm(struct tcpm_port *port, const u32 header,
1378                            const u32 *data, int cnt)
1379 {
1380         WARN_ON(!mutex_is_locked(&port->lock));
1381
1382         /* Make sure we are not still processing a previous VDM packet */
1383         WARN_ON(port->vdm_state > VDM_STATE_DONE);
1384
1385         port->vdo_count = cnt + 1;
1386         port->vdo_data[0] = header;
1387         memcpy(&port->vdo_data[1], data, sizeof(u32) * cnt);
1388         /* Set ready, vdm state machine will actually send */
1389         port->vdm_retries = 0;
1390         port->vdm_state = VDM_STATE_READY;
1391
1392         mod_vdm_delayed_work(port, 0);
1393 }
1394
1395 static void tcpm_queue_vdm_unlocked(struct tcpm_port *port, const u32 header,
1396                                     const u32 *data, int cnt)
1397 {
1398         mutex_lock(&port->lock);
1399         tcpm_queue_vdm(port, header, data, cnt);
1400         mutex_unlock(&port->lock);
1401 }
1402
1403 static void svdm_consume_identity(struct tcpm_port *port, const u32 *p, int cnt)
1404 {
1405         u32 vdo = p[VDO_INDEX_IDH];
1406         u32 product = p[VDO_INDEX_PRODUCT];
1407
1408         memset(&port->mode_data, 0, sizeof(port->mode_data));
1409
1410         port->partner_ident.id_header = vdo;
1411         port->partner_ident.cert_stat = p[VDO_INDEX_CSTAT];
1412         port->partner_ident.product = product;
1413
1414         typec_partner_set_identity(port->partner);
1415
1416         tcpm_log(port, "Identity: %04x:%04x.%04x",
1417                  PD_IDH_VID(vdo),
1418                  PD_PRODUCT_PID(product), product & 0xffff);
1419 }
1420
1421 static bool svdm_consume_svids(struct tcpm_port *port, const u32 *p, int cnt)
1422 {
1423         struct pd_mode_data *pmdata = &port->mode_data;
1424         int i;
1425
1426         for (i = 1; i < cnt; i++) {
1427                 u16 svid;
1428
1429                 svid = (p[i] >> 16) & 0xffff;
1430                 if (!svid)
1431                         return false;
1432
1433                 if (pmdata->nsvids >= SVID_DISCOVERY_MAX)
1434                         goto abort;
1435
1436                 pmdata->svids[pmdata->nsvids++] = svid;
1437                 tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
1438
1439                 svid = p[i] & 0xffff;
1440                 if (!svid)
1441                         return false;
1442
1443                 if (pmdata->nsvids >= SVID_DISCOVERY_MAX)
1444                         goto abort;
1445
1446                 pmdata->svids[pmdata->nsvids++] = svid;
1447                 tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
1448         }
1449         return true;
1450 abort:
1451         tcpm_log(port, "SVID_DISCOVERY_MAX(%d) too low!", SVID_DISCOVERY_MAX);
1452         return false;
1453 }
1454
1455 static void svdm_consume_modes(struct tcpm_port *port, const u32 *p, int cnt)
1456 {
1457         struct pd_mode_data *pmdata = &port->mode_data;
1458         struct typec_altmode_desc *paltmode;
1459         int i;
1460
1461         if (pmdata->altmodes >= ARRAY_SIZE(port->partner_altmode)) {
1462                 /* Already logged in svdm_consume_svids() */
1463                 return;
1464         }
1465
1466         for (i = 1; i < cnt; i++) {
1467                 paltmode = &pmdata->altmode_desc[pmdata->altmodes];
1468                 memset(paltmode, 0, sizeof(*paltmode));
1469
1470                 paltmode->svid = pmdata->svids[pmdata->svid_index];
1471                 paltmode->mode = i;
1472                 paltmode->vdo = p[i];
1473
1474                 tcpm_log(port, " Alternate mode %d: SVID 0x%04x, VDO %d: 0x%08x",
1475                          pmdata->altmodes, paltmode->svid,
1476                          paltmode->mode, paltmode->vdo);
1477
1478                 pmdata->altmodes++;
1479         }
1480 }
1481
1482 static void tcpm_register_partner_altmodes(struct tcpm_port *port)
1483 {
1484         struct pd_mode_data *modep = &port->mode_data;
1485         struct typec_altmode *altmode;
1486         int i;
1487
1488         for (i = 0; i < modep->altmodes; i++) {
1489                 altmode = typec_partner_register_altmode(port->partner,
1490                                                 &modep->altmode_desc[i]);
1491                 if (IS_ERR(altmode)) {
1492                         tcpm_log(port, "Failed to register partner SVID 0x%04x",
1493                                  modep->altmode_desc[i].svid);
1494                         altmode = NULL;
1495                 }
1496                 port->partner_altmode[i] = altmode;
1497         }
1498 }
1499
1500 #define supports_modal(port)    PD_IDH_MODAL_SUPP((port)->partner_ident.id_header)
1501
1502 static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
1503                         const u32 *p, int cnt, u32 *response,
1504                         enum adev_actions *adev_action)
1505 {
1506         struct typec_port *typec = port->typec_port;
1507         struct typec_altmode *pdev;
1508         struct pd_mode_data *modep;
1509         int svdm_version;
1510         int rlen = 0;
1511         int cmd_type;
1512         int cmd;
1513         int i;
1514
1515         cmd_type = PD_VDO_CMDT(p[0]);
1516         cmd = PD_VDO_CMD(p[0]);
1517
1518         tcpm_log(port, "Rx VDM cmd 0x%x type %d cmd %d len %d",
1519                  p[0], cmd_type, cmd, cnt);
1520
1521         modep = &port->mode_data;
1522
1523         pdev = typec_match_altmode(port->partner_altmode, ALTMODE_DISCOVERY_MAX,
1524                                    PD_VDO_VID(p[0]), PD_VDO_OPOS(p[0]));
1525
1526         svdm_version = typec_get_negotiated_svdm_version(typec);
1527         if (svdm_version < 0)
1528                 return 0;
1529
1530         switch (cmd_type) {
1531         case CMDT_INIT:
1532                 switch (cmd) {
1533                 case CMD_DISCOVER_IDENT:
1534                         if (PD_VDO_VID(p[0]) != USB_SID_PD)
1535                                 break;
1536
1537                         if (PD_VDO_SVDM_VER(p[0]) < svdm_version)
1538                                 typec_partner_set_svdm_version(port->partner,
1539                                                                PD_VDO_SVDM_VER(p[0]));
1540                         /* 6.4.4.3.1: Only respond as UFP (device) */
1541                         if (port->data_role == TYPEC_DEVICE &&
1542                             port->nr_snk_vdo) {
1543                                 /*
1544                                  * Product Type DFP and Connector Type are not defined in SVDM
1545                                  * version 1.0 and shall be set to zero.
1546                                  */
1547                                 if (typec_get_negotiated_svdm_version(typec) < SVDM_VER_2_0)
1548                                         response[1] = port->snk_vdo[0] & ~IDH_DFP_MASK
1549                                                       & ~IDH_CONN_MASK;
1550                                 else
1551                                         response[1] = port->snk_vdo[0];
1552                                 for (i = 1; i <  port->nr_snk_vdo; i++)
1553                                         response[i + 1] = port->snk_vdo[i];
1554                                 rlen = port->nr_snk_vdo + 1;
1555                         }
1556                         break;
1557                 case CMD_DISCOVER_SVID:
1558                         break;
1559                 case CMD_DISCOVER_MODES:
1560                         break;
1561                 case CMD_ENTER_MODE:
1562                         break;
1563                 case CMD_EXIT_MODE:
1564                         break;
1565                 case CMD_ATTENTION:
1566                         /* Attention command does not have response */
1567                         *adev_action = ADEV_ATTENTION;
1568                         return 0;
1569                 default:
1570                         break;
1571                 }
1572                 if (rlen >= 1) {
1573                         response[0] = p[0] | VDO_CMDT(CMDT_RSP_ACK);
1574                 } else if (rlen == 0) {
1575                         response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
1576                         rlen = 1;
1577                 } else {
1578                         response[0] = p[0] | VDO_CMDT(CMDT_RSP_BUSY);
1579                         rlen = 1;
1580                 }
1581                 response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
1582                               (VDO_SVDM_VERS(typec_get_negotiated_svdm_version(typec)));
1583                 break;
1584         case CMDT_RSP_ACK:
1585                 /* silently drop message if we are not connected */
1586                 if (IS_ERR_OR_NULL(port->partner))
1587                         break;
1588
1589                 tcpm_ams_finish(port);
1590
1591                 switch (cmd) {
1592                 case CMD_DISCOVER_IDENT:
1593                         if (PD_VDO_SVDM_VER(p[0]) < svdm_version)
1594                                 typec_partner_set_svdm_version(port->partner,
1595                                                                PD_VDO_SVDM_VER(p[0]));
1596                         /* 6.4.4.3.1 */
1597                         svdm_consume_identity(port, p, cnt);
1598                         response[0] = VDO(USB_SID_PD, 1, typec_get_negotiated_svdm_version(typec),
1599                                           CMD_DISCOVER_SVID);
1600                         rlen = 1;
1601                         break;
1602                 case CMD_DISCOVER_SVID:
1603                         /* 6.4.4.3.2 */
1604                         if (svdm_consume_svids(port, p, cnt)) {
1605                                 response[0] = VDO(USB_SID_PD, 1, svdm_version, CMD_DISCOVER_SVID);
1606                                 rlen = 1;
1607                         } else if (modep->nsvids && supports_modal(port)) {
1608                                 response[0] = VDO(modep->svids[0], 1, svdm_version,
1609                                                   CMD_DISCOVER_MODES);
1610                                 rlen = 1;
1611                         }
1612                         break;
1613                 case CMD_DISCOVER_MODES:
1614                         /* 6.4.4.3.3 */
1615                         svdm_consume_modes(port, p, cnt);
1616                         modep->svid_index++;
1617                         if (modep->svid_index < modep->nsvids) {
1618                                 u16 svid = modep->svids[modep->svid_index];
1619                                 response[0] = VDO(svid, 1, svdm_version, CMD_DISCOVER_MODES);
1620                                 rlen = 1;
1621                         } else {
1622                                 tcpm_register_partner_altmodes(port);
1623                                 port->vdm_sm_running = false;
1624                         }
1625                         break;
1626                 case CMD_ENTER_MODE:
1627                         if (adev && pdev) {
1628                                 typec_altmode_update_active(pdev, true);
1629                                 *adev_action = ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL;
1630                         }
1631                         return 0;
1632                 case CMD_EXIT_MODE:
1633                         if (adev && pdev) {
1634                                 typec_altmode_update_active(pdev, false);
1635                                 /* Back to USB Operation */
1636                                 *adev_action = ADEV_NOTIFY_USB_AND_QUEUE_VDM;
1637                                 return 0;
1638                         }
1639                         break;
1640                 case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
1641                         break;
1642                 default:
1643                         /* Unrecognized SVDM */
1644                         response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
1645                         rlen = 1;
1646                         response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
1647                                       (VDO_SVDM_VERS(svdm_version));
1648                         break;
1649                 }
1650                 break;
1651         case CMDT_RSP_NAK:
1652                 tcpm_ams_finish(port);
1653                 switch (cmd) {
1654                 case CMD_DISCOVER_IDENT:
1655                 case CMD_DISCOVER_SVID:
1656                 case CMD_DISCOVER_MODES:
1657                 case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
1658                         break;
1659                 case CMD_ENTER_MODE:
1660                         /* Back to USB Operation */
1661                         *adev_action = ADEV_NOTIFY_USB_AND_QUEUE_VDM;
1662                         return 0;
1663                 default:
1664                         /* Unrecognized SVDM */
1665                         response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
1666                         rlen = 1;
1667                         response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
1668                                       (VDO_SVDM_VERS(svdm_version));
1669                         break;
1670                 }
1671                 port->vdm_sm_running = false;
1672                 break;
1673         default:
1674                 response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
1675                 rlen = 1;
1676                 response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
1677                               (VDO_SVDM_VERS(svdm_version));
1678                 port->vdm_sm_running = false;
1679                 break;
1680         }
1681
1682         /* Informing the alternate mode drivers about everything */
1683         *adev_action = ADEV_QUEUE_VDM;
1684         return rlen;
1685 }
1686
1687 static void tcpm_handle_vdm_request(struct tcpm_port *port,
1688                                     const __le32 *payload, int cnt)
1689 {
1690         enum adev_actions adev_action = ADEV_NONE;
1691         struct typec_altmode *adev;
1692         u32 p[PD_MAX_PAYLOAD];
1693         u32 response[8] = { };
1694         int i, rlen = 0;
1695
1696         for (i = 0; i < cnt; i++)
1697                 p[i] = le32_to_cpu(payload[i]);
1698
1699         adev = typec_match_altmode(port->port_altmode, ALTMODE_DISCOVERY_MAX,
1700                                    PD_VDO_VID(p[0]), PD_VDO_OPOS(p[0]));
1701
1702         if (port->vdm_state == VDM_STATE_BUSY) {
1703                 /* If UFP responded busy retry after timeout */
1704                 if (PD_VDO_CMDT(p[0]) == CMDT_RSP_BUSY) {
1705                         port->vdm_state = VDM_STATE_WAIT_RSP_BUSY;
1706                         port->vdo_retry = (p[0] & ~VDO_CMDT_MASK) |
1707                                 CMDT_INIT;
1708                         mod_vdm_delayed_work(port, PD_T_VDM_BUSY);
1709                         return;
1710                 }
1711                 port->vdm_state = VDM_STATE_DONE;
1712         }
1713
1714         if (PD_VDO_SVDM(p[0])) {
1715                 rlen = tcpm_pd_svdm(port, adev, p, cnt, response, &adev_action);
1716         } else {
1717                 if (port->negotiated_rev >= PD_REV30)
1718                         tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP);
1719         }
1720
1721         /*
1722          * We are done with any state stored in the port struct now, except
1723          * for any port struct changes done by the tcpm_queue_vdm() call
1724          * below, which is a separate operation.
1725          *
1726          * So we can safely release the lock here; and we MUST release the
1727          * lock here to avoid an AB BA lock inversion:
1728          *
1729          * If we keep the lock here then the lock ordering in this path is:
1730          * 1. tcpm_pd_rx_handler take the tcpm port lock
1731          * 2. One of the typec_altmode_* calls below takes the alt-mode's lock
1732          *
1733          * And we also have this ordering:
1734          * 1. alt-mode driver takes the alt-mode's lock
1735          * 2. alt-mode driver calls tcpm_altmode_enter which takes the
1736          *    tcpm port lock
1737          *
1738          * Dropping our lock here avoids this.
1739          */
1740         mutex_unlock(&port->lock);
1741
1742         if (adev) {
1743                 switch (adev_action) {
1744                 case ADEV_NONE:
1745                         break;
1746                 case ADEV_NOTIFY_USB_AND_QUEUE_VDM:
1747                         WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, NULL));
1748                         typec_altmode_vdm(adev, p[0], &p[1], cnt);
1749                         break;
1750                 case ADEV_QUEUE_VDM:
1751                         typec_altmode_vdm(adev, p[0], &p[1], cnt);
1752                         break;
1753                 case ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL:
1754                         if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) {
1755                                 int svdm_version = typec_get_negotiated_svdm_version(
1756                                                                         port->typec_port);
1757                                 if (svdm_version < 0)
1758                                         break;
1759
1760                                 response[0] = VDO(adev->svid, 1, svdm_version,
1761                                                   CMD_EXIT_MODE);
1762                                 response[0] |= VDO_OPOS(adev->mode);
1763                                 rlen = 1;
1764                         }
1765                         break;
1766                 case ADEV_ATTENTION:
1767                         typec_altmode_attention(adev, p[1]);
1768                         break;
1769                 }
1770         }
1771
1772         /*
1773          * We must re-take the lock here to balance the unlock in
1774          * tcpm_pd_rx_handler, note that no changes, other then the
1775          * tcpm_queue_vdm call, are made while the lock is held again.
1776          * All that is done after the call is unwinding the call stack until
1777          * we return to tcpm_pd_rx_handler and do the unlock there.
1778          */
1779         mutex_lock(&port->lock);
1780
1781         if (rlen > 0)
1782                 tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);
1783 }
1784
1785 static void tcpm_send_vdm(struct tcpm_port *port, u32 vid, int cmd,
1786                           const u32 *data, int count)
1787 {
1788         int svdm_version = typec_get_negotiated_svdm_version(port->typec_port);
1789         u32 header;
1790
1791         if (svdm_version < 0)
1792                 return;
1793
1794         if (WARN_ON(count > VDO_MAX_SIZE - 1))
1795                 count = VDO_MAX_SIZE - 1;
1796
1797         /* set VDM header with VID & CMD */
1798         header = VDO(vid, ((vid & USB_SID_PD) == USB_SID_PD) ?
1799                         1 : (PD_VDO_CMD(cmd) <= CMD_ATTENTION),
1800                         svdm_version, cmd);
1801         tcpm_queue_vdm(port, header, data, count);
1802 }
1803
1804 static unsigned int vdm_ready_timeout(u32 vdm_hdr)
1805 {
1806         unsigned int timeout;
1807         int cmd = PD_VDO_CMD(vdm_hdr);
1808
1809         /* its not a structured VDM command */
1810         if (!PD_VDO_SVDM(vdm_hdr))
1811                 return PD_T_VDM_UNSTRUCTURED;
1812
1813         switch (PD_VDO_CMDT(vdm_hdr)) {
1814         case CMDT_INIT:
1815                 if (cmd == CMD_ENTER_MODE || cmd == CMD_EXIT_MODE)
1816                         timeout = PD_T_VDM_WAIT_MODE_E;
1817                 else
1818                         timeout = PD_T_VDM_SNDR_RSP;
1819                 break;
1820         default:
1821                 if (cmd == CMD_ENTER_MODE || cmd == CMD_EXIT_MODE)
1822                         timeout = PD_T_VDM_E_MODE;
1823                 else
1824                         timeout = PD_T_VDM_RCVR_RSP;
1825                 break;
1826         }
1827         return timeout;
1828 }
1829
1830 static void vdm_run_state_machine(struct tcpm_port *port)
1831 {
1832         struct pd_message msg;
1833         int i, res = 0;
1834         u32 vdo_hdr = port->vdo_data[0];
1835
1836         switch (port->vdm_state) {
1837         case VDM_STATE_READY:
1838                 /* Only transmit VDM if attached */
1839                 if (!port->attached) {
1840                         port->vdm_state = VDM_STATE_ERR_BUSY;
1841                         break;
1842                 }
1843
1844                 /*
1845                  * if there's traffic or we're not in PDO ready state don't send
1846                  * a VDM.
1847                  */
1848                 if (port->state != SRC_READY && port->state != SNK_READY)
1849                         break;
1850
1851                 /* TODO: AMS operation for Unstructured VDM */
1852                 if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) {
1853                         switch (PD_VDO_CMD(vdo_hdr)) {
1854                         case CMD_DISCOVER_IDENT:
1855                                 res = tcpm_ams_start(port, DISCOVER_IDENTITY);
1856                                 if (res == 0)
1857                                         port->send_discover = false;
1858                                 break;
1859                         case CMD_DISCOVER_SVID:
1860                                 res = tcpm_ams_start(port, DISCOVER_SVIDS);
1861                                 break;
1862                         case CMD_DISCOVER_MODES:
1863                                 res = tcpm_ams_start(port, DISCOVER_MODES);
1864                                 break;
1865                         case CMD_ENTER_MODE:
1866                                 res = tcpm_ams_start(port, DFP_TO_UFP_ENTER_MODE);
1867                                 break;
1868                         case CMD_EXIT_MODE:
1869                                 res = tcpm_ams_start(port, DFP_TO_UFP_EXIT_MODE);
1870                                 break;
1871                         case CMD_ATTENTION:
1872                                 res = tcpm_ams_start(port, ATTENTION);
1873                                 break;
1874                         case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
1875                                 res = tcpm_ams_start(port, STRUCTURED_VDMS);
1876                                 break;
1877                         default:
1878                                 res = -EOPNOTSUPP;
1879                                 break;
1880                         }
1881
1882                         if (res < 0) {
1883                                 port->vdm_sm_running = false;
1884                                 return;
1885                         }
1886                 }
1887
1888                 port->vdm_state = VDM_STATE_SEND_MESSAGE;
1889                 mod_vdm_delayed_work(port, (port->negotiated_rev >= PD_REV30 &&
1890                                             port->pwr_role == TYPEC_SOURCE &&
1891                                             PD_VDO_SVDM(vdo_hdr) &&
1892                                             PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) ?
1893                                            PD_T_SINK_TX : 0);
1894                 break;
1895         case VDM_STATE_WAIT_RSP_BUSY:
1896                 port->vdo_data[0] = port->vdo_retry;
1897                 port->vdo_count = 1;
1898                 port->vdm_state = VDM_STATE_READY;
1899                 break;
1900         case VDM_STATE_BUSY:
1901                 port->vdm_state = VDM_STATE_ERR_TMOUT;
1902                 if (port->ams != NONE_AMS)
1903                         tcpm_ams_finish(port);
1904                 break;
1905         case VDM_STATE_ERR_SEND:
1906                 /*
1907                  * A partner which does not support USB PD will not reply,
1908                  * so this is not a fatal error. At the same time, some
1909                  * devices may not return GoodCRC under some circumstances,
1910                  * so we need to retry.
1911                  */
1912                 if (port->vdm_retries < 3) {
1913                         tcpm_log(port, "VDM Tx error, retry");
1914                         port->vdm_retries++;
1915                         port->vdm_state = VDM_STATE_READY;
1916                         tcpm_ams_finish(port);
1917                 }
1918                 break;
1919         case VDM_STATE_SEND_MESSAGE:
1920                 /* Prepare and send VDM */
1921                 memset(&msg, 0, sizeof(msg));
1922                 msg.header = PD_HEADER_LE(PD_DATA_VENDOR_DEF,
1923                                           port->pwr_role,
1924                                           port->data_role,
1925                                           port->negotiated_rev,
1926                                           port->message_id, port->vdo_count);
1927                 for (i = 0; i < port->vdo_count; i++)
1928                         msg.payload[i] = cpu_to_le32(port->vdo_data[i]);
1929                 res = tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1930                 if (res < 0) {
1931                         port->vdm_state = VDM_STATE_ERR_SEND;
1932                 } else {
1933                         unsigned long timeout;
1934
1935                         port->vdm_retries = 0;
1936                         port->vdm_state = VDM_STATE_BUSY;
1937                         timeout = vdm_ready_timeout(vdo_hdr);
1938                         mod_vdm_delayed_work(port, timeout);
1939                 }
1940                 break;
1941         default:
1942                 break;
1943         }
1944 }
1945
1946 static void vdm_state_machine_work(struct kthread_work *work)
1947 {
1948         struct tcpm_port *port = container_of(work, struct tcpm_port, vdm_state_machine);
1949         enum vdm_states prev_state;
1950
1951         mutex_lock(&port->lock);
1952
1953         /*
1954          * Continue running as long as the port is not busy and there was
1955          * a state change.
1956          */
1957         do {
1958                 prev_state = port->vdm_state;
1959                 vdm_run_state_machine(port);
1960         } while (port->vdm_state != prev_state &&
1961                  port->vdm_state != VDM_STATE_BUSY &&
1962                  port->vdm_state != VDM_STATE_SEND_MESSAGE);
1963
1964         if (port->vdm_state == VDM_STATE_ERR_TMOUT)
1965                 port->vdm_sm_running = false;
1966
1967         mutex_unlock(&port->lock);
1968 }
1969
1970 enum pdo_err {
1971         PDO_NO_ERR,
1972         PDO_ERR_NO_VSAFE5V,
1973         PDO_ERR_VSAFE5V_NOT_FIRST,
1974         PDO_ERR_PDO_TYPE_NOT_IN_ORDER,
1975         PDO_ERR_FIXED_NOT_SORTED,
1976         PDO_ERR_VARIABLE_BATT_NOT_SORTED,
1977         PDO_ERR_DUPE_PDO,
1978         PDO_ERR_PPS_APDO_NOT_SORTED,
1979         PDO_ERR_DUPE_PPS_APDO,
1980 };
1981
1982 static const char * const pdo_err_msg[] = {
1983         [PDO_ERR_NO_VSAFE5V] =
1984         " err: source/sink caps should atleast have vSafe5V",
1985         [PDO_ERR_VSAFE5V_NOT_FIRST] =
1986         " err: vSafe5V Fixed Supply Object Shall always be the first object",
1987         [PDO_ERR_PDO_TYPE_NOT_IN_ORDER] =
1988         " err: PDOs should be in the following order: Fixed; Battery; Variable",
1989         [PDO_ERR_FIXED_NOT_SORTED] =
1990         " err: Fixed supply pdos should be in increasing order of their fixed voltage",
1991         [PDO_ERR_VARIABLE_BATT_NOT_SORTED] =
1992         " err: Variable/Battery supply pdos should be in increasing order of their minimum voltage",
1993         [PDO_ERR_DUPE_PDO] =
1994         " err: Variable/Batt supply pdos cannot have same min/max voltage",
1995         [PDO_ERR_PPS_APDO_NOT_SORTED] =
1996         " err: Programmable power supply apdos should be in increasing order of their maximum voltage",
1997         [PDO_ERR_DUPE_PPS_APDO] =
1998         " err: Programmable power supply apdos cannot have same min/max voltage and max current",
1999 };
2000
2001 static enum pdo_err tcpm_caps_err(struct tcpm_port *port, const u32 *pdo,
2002                                   unsigned int nr_pdo)
2003 {
2004         unsigned int i;
2005
2006         /* Should at least contain vSafe5v */
2007         if (nr_pdo < 1)
2008                 return PDO_ERR_NO_VSAFE5V;
2009
2010         /* The vSafe5V Fixed Supply Object Shall always be the first object */
2011         if (pdo_type(pdo[0]) != PDO_TYPE_FIXED ||
2012             pdo_fixed_voltage(pdo[0]) != VSAFE5V)
2013                 return PDO_ERR_VSAFE5V_NOT_FIRST;
2014
2015         for (i = 1; i < nr_pdo; i++) {
2016                 if (pdo_type(pdo[i]) < pdo_type(pdo[i - 1])) {
2017                         return PDO_ERR_PDO_TYPE_NOT_IN_ORDER;
2018                 } else if (pdo_type(pdo[i]) == pdo_type(pdo[i - 1])) {
2019                         enum pd_pdo_type type = pdo_type(pdo[i]);
2020
2021                         switch (type) {
2022                         /*
2023                          * The remaining Fixed Supply Objects, if
2024                          * present, shall be sent in voltage order;
2025                          * lowest to highest.
2026                          */
2027                         case PDO_TYPE_FIXED:
2028                                 if (pdo_fixed_voltage(pdo[i]) <=
2029                                     pdo_fixed_voltage(pdo[i - 1]))
2030                                         return PDO_ERR_FIXED_NOT_SORTED;
2031                                 break;
2032                         /*
2033                          * The Battery Supply Objects and Variable
2034                          * supply, if present shall be sent in Minimum
2035                          * Voltage order; lowest to highest.
2036                          */
2037                         case PDO_TYPE_VAR:
2038                         case PDO_TYPE_BATT:
2039                                 if (pdo_min_voltage(pdo[i]) <
2040                                     pdo_min_voltage(pdo[i - 1]))
2041                                         return PDO_ERR_VARIABLE_BATT_NOT_SORTED;
2042                                 else if ((pdo_min_voltage(pdo[i]) ==
2043                                           pdo_min_voltage(pdo[i - 1])) &&
2044                                          (pdo_max_voltage(pdo[i]) ==
2045                                           pdo_max_voltage(pdo[i - 1])))
2046                                         return PDO_ERR_DUPE_PDO;
2047                                 break;
2048                         /*
2049                          * The Programmable Power Supply APDOs, if present,
2050                          * shall be sent in Maximum Voltage order;
2051                          * lowest to highest.
2052                          */
2053                         case PDO_TYPE_APDO:
2054                                 if (pdo_apdo_type(pdo[i]) != APDO_TYPE_PPS)
2055                                         break;
2056
2057                                 if (pdo_pps_apdo_max_voltage(pdo[i]) <
2058                                     pdo_pps_apdo_max_voltage(pdo[i - 1]))
2059                                         return PDO_ERR_PPS_APDO_NOT_SORTED;
2060                                 else if (pdo_pps_apdo_min_voltage(pdo[i]) ==
2061                                           pdo_pps_apdo_min_voltage(pdo[i - 1]) &&
2062                                          pdo_pps_apdo_max_voltage(pdo[i]) ==
2063                                           pdo_pps_apdo_max_voltage(pdo[i - 1]) &&
2064                                          pdo_pps_apdo_max_current(pdo[i]) ==
2065                                           pdo_pps_apdo_max_current(pdo[i - 1]))
2066                                         return PDO_ERR_DUPE_PPS_APDO;
2067                                 break;
2068                         default:
2069                                 tcpm_log_force(port, " Unknown pdo type");
2070                         }
2071                 }
2072         }
2073
2074         return PDO_NO_ERR;
2075 }
2076
2077 static int tcpm_validate_caps(struct tcpm_port *port, const u32 *pdo,
2078                               unsigned int nr_pdo)
2079 {
2080         enum pdo_err err_index = tcpm_caps_err(port, pdo, nr_pdo);
2081
2082         if (err_index != PDO_NO_ERR) {
2083                 tcpm_log_force(port, " %s", pdo_err_msg[err_index]);
2084                 return -EINVAL;
2085         }
2086
2087         return 0;
2088 }
2089
2090 static int tcpm_altmode_enter(struct typec_altmode *altmode, u32 *vdo)
2091 {
2092         struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
2093         int svdm_version;
2094         u32 header;
2095
2096         svdm_version = typec_get_negotiated_svdm_version(port->typec_port);
2097         if (svdm_version < 0)
2098                 return svdm_version;
2099
2100         header = VDO(altmode->svid, vdo ? 2 : 1, svdm_version, CMD_ENTER_MODE);
2101         header |= VDO_OPOS(altmode->mode);
2102
2103         tcpm_queue_vdm_unlocked(port, header, vdo, vdo ? 1 : 0);
2104         return 0;
2105 }
2106
2107 static int tcpm_altmode_exit(struct typec_altmode *altmode)
2108 {
2109         struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
2110         int svdm_version;
2111         u32 header;
2112
2113         svdm_version = typec_get_negotiated_svdm_version(port->typec_port);
2114         if (svdm_version < 0)
2115                 return svdm_version;
2116
2117         header = VDO(altmode->svid, 1, svdm_version, CMD_EXIT_MODE);
2118         header |= VDO_OPOS(altmode->mode);
2119
2120         tcpm_queue_vdm_unlocked(port, header, NULL, 0);
2121         return 0;
2122 }
2123
2124 static int tcpm_altmode_vdm(struct typec_altmode *altmode,
2125                             u32 header, const u32 *data, int count)
2126 {
2127         struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
2128
2129         tcpm_queue_vdm_unlocked(port, header, data, count - 1);
2130
2131         return 0;
2132 }
2133
2134 static const struct typec_altmode_ops tcpm_altmode_ops = {
2135         .enter = tcpm_altmode_enter,
2136         .exit = tcpm_altmode_exit,
2137         .vdm = tcpm_altmode_vdm,
2138 };
2139
2140 /*
2141  * PD (data, control) command handling functions
2142  */
2143 static inline enum tcpm_state ready_state(struct tcpm_port *port)
2144 {
2145         if (port->pwr_role == TYPEC_SOURCE)
2146                 return SRC_READY;
2147         else
2148                 return SNK_READY;
2149 }
2150
2151 static int tcpm_pd_send_control(struct tcpm_port *port,
2152                                 enum pd_ctrl_msg_type type);
2153
2154 static void tcpm_handle_alert(struct tcpm_port *port, const __le32 *payload,
2155                               int cnt)
2156 {
2157         u32 p0 = le32_to_cpu(payload[0]);
2158         unsigned int type = usb_pd_ado_type(p0);
2159
2160         if (!type) {
2161                 tcpm_log(port, "Alert message received with no type");
2162                 return;
2163         }
2164
2165         /* Just handling non-battery alerts for now */
2166         if (!(type & USB_PD_ADO_TYPE_BATT_STATUS_CHANGE)) {
2167                 switch (port->state) {
2168                 case SRC_READY:
2169                 case SNK_READY:
2170                         tcpm_set_state(port, GET_STATUS_SEND, 0);
2171                         break;
2172                 default:
2173                         tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
2174                         break;
2175                 }
2176         }
2177 }
2178
2179 static int tcpm_set_auto_vbus_discharge_threshold(struct tcpm_port *port,
2180                                                   enum typec_pwr_opmode mode, bool pps_active,
2181                                                   u32 requested_vbus_voltage)
2182 {
2183         int ret;
2184
2185         if (!port->tcpc->set_auto_vbus_discharge_threshold)
2186                 return 0;
2187
2188         ret = port->tcpc->set_auto_vbus_discharge_threshold(port->tcpc, mode, pps_active,
2189                                                             requested_vbus_voltage);
2190         tcpm_log_force(port,
2191                        "set_auto_vbus_discharge_threshold mode:%d pps_active:%c vbus:%u ret:%d",
2192                        mode, pps_active ? 'y' : 'n', requested_vbus_voltage, ret);
2193
2194         return ret;
2195 }
2196
2197 static void tcpm_pd_handle_state(struct tcpm_port *port,
2198                                  enum tcpm_state state,
2199                                  enum tcpm_ams ams,
2200                                  unsigned int delay_ms)
2201 {
2202         switch (port->state) {
2203         case SRC_READY:
2204         case SNK_READY:
2205                 port->ams = ams;
2206                 tcpm_set_state(port, state, delay_ms);
2207                 break;
2208         /* 8.3.3.4.1.1 and 6.8.1 power transitioning */
2209         case SNK_TRANSITION_SINK:
2210         case SNK_TRANSITION_SINK_VBUS:
2211         case SRC_TRANSITION_SUPPLY:
2212                 tcpm_set_state(port, HARD_RESET_SEND, 0);
2213                 break;
2214         default:
2215                 if (!tcpm_ams_interruptible(port)) {
2216                         tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
2217                                        SRC_SOFT_RESET_WAIT_SNK_TX :
2218                                        SNK_SOFT_RESET,
2219                                        0);
2220                 } else {
2221                         /* process the Message 6.8.1 */
2222                         port->upcoming_state = state;
2223                         port->next_ams = ams;
2224                         tcpm_set_state(port, ready_state(port), delay_ms);
2225                 }
2226                 break;
2227         }
2228 }
2229
2230 static void tcpm_pd_handle_msg(struct tcpm_port *port,
2231                                enum pd_msg_request message,
2232                                enum tcpm_ams ams)
2233 {
2234         switch (port->state) {
2235         case SRC_READY:
2236         case SNK_READY:
2237                 port->ams = ams;
2238                 tcpm_queue_message(port, message);
2239                 break;
2240         /* PD 3.0 Spec 8.3.3.4.1.1 and 6.8.1 */
2241         case SNK_TRANSITION_SINK:
2242         case SNK_TRANSITION_SINK_VBUS:
2243         case SRC_TRANSITION_SUPPLY:
2244                 tcpm_set_state(port, HARD_RESET_SEND, 0);
2245                 break;
2246         default:
2247                 if (!tcpm_ams_interruptible(port)) {
2248                         tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
2249                                        SRC_SOFT_RESET_WAIT_SNK_TX :
2250                                        SNK_SOFT_RESET,
2251                                        0);
2252                 } else {
2253                         port->next_ams = ams;
2254                         tcpm_set_state(port, ready_state(port), 0);
2255                         /* 6.8.1 process the Message */
2256                         tcpm_queue_message(port, message);
2257                 }
2258                 break;
2259         }
2260 }
2261
2262 static void tcpm_pd_data_request(struct tcpm_port *port,
2263                                  const struct pd_message *msg)
2264 {
2265         enum pd_data_msg_type type = pd_header_type_le(msg->header);
2266         unsigned int cnt = pd_header_cnt_le(msg->header);
2267         unsigned int rev = pd_header_rev_le(msg->header);
2268         unsigned int i;
2269         enum frs_typec_current partner_frs_current;
2270         bool frs_enable;
2271         int ret;
2272
2273         switch (type) {
2274         case PD_DATA_SOURCE_CAP:
2275                 for (i = 0; i < cnt; i++)
2276                         port->source_caps[i] = le32_to_cpu(msg->payload[i]);
2277
2278                 port->nr_source_caps = cnt;
2279
2280                 tcpm_log_source_caps(port);
2281
2282                 tcpm_validate_caps(port, port->source_caps,
2283                                    port->nr_source_caps);
2284
2285                 /*
2286                  * Adjust revision in subsequent message headers, as required,
2287                  * to comply with 6.2.1.1.5 of the USB PD 3.0 spec. We don't
2288                  * support Rev 1.0 so just do nothing in that scenario.
2289                  */
2290                 if (rev == PD_REV10) {
2291                         if (port->ams == GET_SOURCE_CAPABILITIES)
2292                                 tcpm_ams_finish(port);
2293                         break;
2294                 }
2295
2296                 if (rev < PD_MAX_REV)
2297                         port->negotiated_rev = rev;
2298
2299                 if (port->pwr_role == TYPEC_SOURCE) {
2300                         if (port->ams == GET_SOURCE_CAPABILITIES)
2301                                 tcpm_pd_handle_state(port, SRC_READY, NONE_AMS, 0);
2302                         /* Unexpected Source Capabilities */
2303                         else
2304                                 tcpm_pd_handle_msg(port,
2305                                                    port->negotiated_rev < PD_REV30 ?
2306                                                    PD_MSG_CTRL_REJECT :
2307                                                    PD_MSG_CTRL_NOT_SUPP,
2308                                                    NONE_AMS);
2309                 } else if (port->state == SNK_WAIT_CAPABILITIES) {
2310                 /*
2311                  * This message may be received even if VBUS is not
2312                  * present. This is quite unexpected; see USB PD
2313                  * specification, sections 8.3.3.6.3.1 and 8.3.3.6.3.2.
2314                  * However, at the same time, we must be ready to
2315                  * receive this message and respond to it 15ms after
2316                  * receiving PS_RDY during power swap operations, no matter
2317                  * if VBUS is available or not (USB PD specification,
2318                  * section 6.5.9.2).
2319                  * So we need to accept the message either way,
2320                  * but be prepared to keep waiting for VBUS after it was
2321                  * handled.
2322                  */
2323                         port->ams = POWER_NEGOTIATION;
2324                         port->in_ams = true;
2325                         tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
2326                 } else {
2327                         if (port->ams == GET_SOURCE_CAPABILITIES)
2328                                 tcpm_ams_finish(port);
2329                         tcpm_pd_handle_state(port, SNK_NEGOTIATE_CAPABILITIES,
2330                                              POWER_NEGOTIATION, 0);
2331                 }
2332                 break;
2333         case PD_DATA_REQUEST:
2334                 /*
2335                  * Adjust revision in subsequent message headers, as required,
2336                  * to comply with 6.2.1.1.5 of the USB PD 3.0 spec. We don't
2337                  * support Rev 1.0 so just reject in that scenario.
2338                  */
2339                 if (rev == PD_REV10) {
2340                         tcpm_pd_handle_msg(port,
2341                                            port->negotiated_rev < PD_REV30 ?
2342                                            PD_MSG_CTRL_REJECT :
2343                                            PD_MSG_CTRL_NOT_SUPP,
2344                                            NONE_AMS);
2345                         break;
2346                 }
2347
2348                 if (rev < PD_MAX_REV)
2349                         port->negotiated_rev = rev;
2350
2351                 if (port->pwr_role != TYPEC_SOURCE || cnt != 1) {
2352                         tcpm_pd_handle_msg(port,
2353                                            port->negotiated_rev < PD_REV30 ?
2354                                            PD_MSG_CTRL_REJECT :
2355                                            PD_MSG_CTRL_NOT_SUPP,
2356                                            NONE_AMS);
2357                         break;
2358                 }
2359
2360                 port->sink_request = le32_to_cpu(msg->payload[0]);
2361
2362                 if (port->vdm_sm_running && port->explicit_contract) {
2363                         tcpm_pd_handle_msg(port, PD_MSG_CTRL_WAIT, port->ams);
2364                         break;
2365                 }
2366
2367                 if (port->state == SRC_SEND_CAPABILITIES)
2368                         tcpm_set_state(port, SRC_NEGOTIATE_CAPABILITIES, 0);
2369                 else
2370                         tcpm_pd_handle_state(port, SRC_NEGOTIATE_CAPABILITIES,
2371                                              POWER_NEGOTIATION, 0);
2372                 break;
2373         case PD_DATA_SINK_CAP:
2374                 /* We don't do anything with this at the moment... */
2375                 for (i = 0; i < cnt; i++)
2376                         port->sink_caps[i] = le32_to_cpu(msg->payload[i]);
2377
2378                 partner_frs_current = (port->sink_caps[0] & PDO_FIXED_FRS_CURR_MASK) >>
2379                         PDO_FIXED_FRS_CURR_SHIFT;
2380                 frs_enable = partner_frs_current && (partner_frs_current <=
2381                                                      port->new_source_frs_current);
2382                 tcpm_log(port,
2383                          "Port partner FRS capable partner_frs_current:%u port_frs_current:%u enable:%c",
2384                          partner_frs_current, port->new_source_frs_current, frs_enable ? 'y' : 'n');
2385                 if (frs_enable) {
2386                         ret  = port->tcpc->enable_frs(port->tcpc, true);
2387                         tcpm_log(port, "Enable FRS %s, ret:%d\n", ret ? "fail" : "success", ret);
2388                 }
2389
2390                 port->nr_sink_caps = cnt;
2391                 port->sink_cap_done = true;
2392                 if (port->ams == GET_SINK_CAPABILITIES)
2393                         tcpm_pd_handle_state(port, ready_state(port), NONE_AMS, 0);
2394                 /* Unexpected Sink Capabilities */
2395                 else
2396                         tcpm_pd_handle_msg(port,
2397                                            port->negotiated_rev < PD_REV30 ?
2398                                            PD_MSG_CTRL_REJECT :
2399                                            PD_MSG_CTRL_NOT_SUPP,
2400                                            NONE_AMS);
2401                 break;
2402         case PD_DATA_VENDOR_DEF:
2403                 tcpm_handle_vdm_request(port, msg->payload, cnt);
2404                 break;
2405         case PD_DATA_BIST:
2406                 port->bist_request = le32_to_cpu(msg->payload[0]);
2407                 tcpm_pd_handle_state(port, BIST_RX, BIST, 0);
2408                 break;
2409         case PD_DATA_ALERT:
2410                 tcpm_handle_alert(port, msg->payload, cnt);
2411                 break;
2412         case PD_DATA_BATT_STATUS:
2413         case PD_DATA_GET_COUNTRY_INFO:
2414                 /* Currently unsupported */
2415                 tcpm_pd_handle_msg(port, port->negotiated_rev < PD_REV30 ?
2416                                    PD_MSG_CTRL_REJECT :
2417                                    PD_MSG_CTRL_NOT_SUPP,
2418                                    NONE_AMS);
2419                 break;
2420         default:
2421                 tcpm_pd_handle_msg(port, port->negotiated_rev < PD_REV30 ?
2422                                    PD_MSG_CTRL_REJECT :
2423                                    PD_MSG_CTRL_NOT_SUPP,
2424                                    NONE_AMS);
2425                 tcpm_log(port, "Unrecognized data message type %#x", type);
2426                 break;
2427         }
2428 }
2429
2430 static void tcpm_pps_complete(struct tcpm_port *port, int result)
2431 {
2432         if (port->pps_pending) {
2433                 port->pps_status = result;
2434                 port->pps_pending = false;
2435                 complete(&port->pps_complete);
2436         }
2437 }
2438
2439 static void tcpm_pd_ctrl_request(struct tcpm_port *port,
2440                                  const struct pd_message *msg)
2441 {
2442         enum pd_ctrl_msg_type type = pd_header_type_le(msg->header);
2443         enum tcpm_state next_state;
2444
2445         switch (type) {
2446         case PD_CTRL_GOOD_CRC:
2447         case PD_CTRL_PING:
2448                 break;
2449         case PD_CTRL_GET_SOURCE_CAP:
2450                 tcpm_pd_handle_msg(port, PD_MSG_DATA_SOURCE_CAP, GET_SOURCE_CAPABILITIES);
2451                 break;
2452         case PD_CTRL_GET_SINK_CAP:
2453                 tcpm_pd_handle_msg(port, PD_MSG_DATA_SINK_CAP, GET_SINK_CAPABILITIES);
2454                 break;
2455         case PD_CTRL_GOTO_MIN:
2456                 break;
2457         case PD_CTRL_PS_RDY:
2458                 switch (port->state) {
2459                 case SNK_TRANSITION_SINK:
2460                         if (port->vbus_present) {
2461                                 tcpm_set_current_limit(port,
2462                                                        port->req_current_limit,
2463                                                        port->req_supply_voltage);
2464                                 port->explicit_contract = true;
2465                                 tcpm_set_auto_vbus_discharge_threshold(port,
2466                                                                        TYPEC_PWR_MODE_PD,
2467                                                                        port->pps_data.active,
2468                                                                        port->supply_voltage);
2469                                 /* Set VDM running flag ASAP */
2470                                 if (port->data_role == TYPEC_HOST &&
2471                                     port->send_discover)
2472                                         port->vdm_sm_running = true;
2473                                 tcpm_set_state(port, SNK_READY, 0);
2474                         } else {
2475                                 /*
2476                                  * Seen after power swap. Keep waiting for VBUS
2477                                  * in a transitional state.
2478                                  */
2479                                 tcpm_set_state(port,
2480                                                SNK_TRANSITION_SINK_VBUS, 0);
2481                         }
2482                         break;
2483                 case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
2484                         tcpm_set_state(port, PR_SWAP_SRC_SNK_SINK_ON, 0);
2485                         break;
2486                 case PR_SWAP_SNK_SRC_SINK_OFF:
2487                         tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON, 0);
2488                         break;
2489                 case VCONN_SWAP_WAIT_FOR_VCONN:
2490                         tcpm_set_state(port, VCONN_SWAP_TURN_OFF_VCONN, 0);
2491                         break;
2492                 case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
2493                         tcpm_set_state(port, FR_SWAP_SNK_SRC_NEW_SINK_READY, 0);
2494                         break;
2495                 default:
2496                         tcpm_pd_handle_state(port,
2497                                              port->pwr_role == TYPEC_SOURCE ?
2498                                              SRC_SOFT_RESET_WAIT_SNK_TX :
2499                                              SNK_SOFT_RESET,
2500                                              NONE_AMS, 0);
2501                         break;
2502                 }
2503                 break;
2504         case PD_CTRL_REJECT:
2505         case PD_CTRL_WAIT:
2506         case PD_CTRL_NOT_SUPP:
2507                 switch (port->state) {
2508                 case SNK_NEGOTIATE_CAPABILITIES:
2509                         /* USB PD specification, Figure 8-43 */
2510                         if (port->explicit_contract) {
2511                                 next_state = SNK_READY;
2512                                 if (port->data_role == TYPEC_HOST &&
2513                                     port->send_discover)
2514                                         port->vdm_sm_running = true;
2515                         } else {
2516                                 next_state = SNK_WAIT_CAPABILITIES;
2517                         }
2518                         tcpm_set_state(port, next_state, 0);
2519                         break;
2520                 case SNK_NEGOTIATE_PPS_CAPABILITIES:
2521                         /* Revert data back from any requested PPS updates */
2522                         port->pps_data.req_out_volt = port->supply_voltage;
2523                         port->pps_data.req_op_curr = port->current_limit;
2524                         port->pps_status = (type == PD_CTRL_WAIT ?
2525                                             -EAGAIN : -EOPNOTSUPP);
2526
2527                         if (port->data_role == TYPEC_HOST &&
2528                             port->send_discover)
2529                                 port->vdm_sm_running = true;
2530
2531                         tcpm_set_state(port, SNK_READY, 0);
2532                         break;
2533                 case DR_SWAP_SEND:
2534                         port->swap_status = (type == PD_CTRL_WAIT ?
2535                                              -EAGAIN : -EOPNOTSUPP);
2536                         tcpm_set_state(port, DR_SWAP_CANCEL, 0);
2537                         break;
2538                 case PR_SWAP_SEND:
2539                         port->swap_status = (type == PD_CTRL_WAIT ?
2540                                              -EAGAIN : -EOPNOTSUPP);
2541                         tcpm_set_state(port, PR_SWAP_CANCEL, 0);
2542                         break;
2543                 case VCONN_SWAP_SEND:
2544                         port->swap_status = (type == PD_CTRL_WAIT ?
2545                                              -EAGAIN : -EOPNOTSUPP);
2546                         tcpm_set_state(port, VCONN_SWAP_CANCEL, 0);
2547                         break;
2548                 case FR_SWAP_SEND:
2549                         tcpm_set_state(port, FR_SWAP_CANCEL, 0);
2550                         break;
2551                 case GET_SINK_CAP:
2552                         port->sink_cap_done = true;
2553                         tcpm_set_state(port, ready_state(port), 0);
2554                         break;
2555                 default:
2556                         tcpm_pd_handle_state(port,
2557                                              port->pwr_role == TYPEC_SOURCE ?
2558                                              SRC_SOFT_RESET_WAIT_SNK_TX :
2559                                              SNK_SOFT_RESET,
2560                                              NONE_AMS, 0);
2561                         break;
2562                 }
2563                 break;
2564         case PD_CTRL_ACCEPT:
2565                 switch (port->state) {
2566                 case SNK_NEGOTIATE_CAPABILITIES:
2567                         port->pps_data.active = false;
2568                         tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
2569                         break;
2570                 case SNK_NEGOTIATE_PPS_CAPABILITIES:
2571                         port->pps_data.active = true;
2572                         port->pps_data.min_volt = port->pps_data.req_min_volt;
2573                         port->pps_data.max_volt = port->pps_data.req_max_volt;
2574                         port->pps_data.max_curr = port->pps_data.req_max_curr;
2575                         port->req_supply_voltage = port->pps_data.req_out_volt;
2576                         port->req_current_limit = port->pps_data.req_op_curr;
2577                         power_supply_changed(port->psy);
2578                         tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
2579                         break;
2580                 case SOFT_RESET_SEND:
2581                         if (port->ams == SOFT_RESET_AMS)
2582                                 tcpm_ams_finish(port);
2583                         if (port->pwr_role == TYPEC_SOURCE) {
2584                                 port->upcoming_state = SRC_SEND_CAPABILITIES;
2585                                 tcpm_ams_start(port, POWER_NEGOTIATION);
2586                         } else {
2587                                 tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
2588                         }
2589                         break;
2590                 case DR_SWAP_SEND:
2591                         if (port->data_role == TYPEC_DEVICE &&
2592                             port->send_discover)
2593                                 port->vdm_sm_running = true;
2594
2595                         tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0);
2596                         break;
2597                 case PR_SWAP_SEND:
2598                         tcpm_set_state(port, PR_SWAP_START, 0);
2599                         break;
2600                 case VCONN_SWAP_SEND:
2601                         tcpm_set_state(port, VCONN_SWAP_START, 0);
2602                         break;
2603                 case FR_SWAP_SEND:
2604                         tcpm_set_state(port, FR_SWAP_SNK_SRC_TRANSITION_TO_OFF, 0);
2605                         break;
2606                 default:
2607                         tcpm_pd_handle_state(port,
2608                                              port->pwr_role == TYPEC_SOURCE ?
2609                                              SRC_SOFT_RESET_WAIT_SNK_TX :
2610                                              SNK_SOFT_RESET,
2611                                              NONE_AMS, 0);
2612                         break;
2613                 }
2614                 break;
2615         case PD_CTRL_SOFT_RESET:
2616                 port->ams = SOFT_RESET_AMS;
2617                 tcpm_set_state(port, SOFT_RESET, 0);
2618                 break;
2619         case PD_CTRL_DR_SWAP:
2620                 /*
2621                  * XXX
2622                  * 6.3.9: If an alternate mode is active, a request to swap
2623                  * alternate modes shall trigger a port reset.
2624                  */
2625                 if (port->typec_caps.data != TYPEC_PORT_DRD) {
2626                         tcpm_pd_handle_msg(port,
2627                                            port->negotiated_rev < PD_REV30 ?
2628                                            PD_MSG_CTRL_REJECT :
2629                                            PD_MSG_CTRL_NOT_SUPP,
2630                                            NONE_AMS);
2631                 } else {
2632                         if (port->vdm_sm_running) {
2633                                 tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
2634                                 break;
2635                         }
2636
2637                         tcpm_pd_handle_state(port, DR_SWAP_ACCEPT, DATA_ROLE_SWAP, 0);
2638                 }
2639                 break;
2640         case PD_CTRL_PR_SWAP:
2641                 if (port->port_type != TYPEC_PORT_DRP) {
2642                         tcpm_pd_handle_msg(port,
2643                                            port->negotiated_rev < PD_REV30 ?
2644                                            PD_MSG_CTRL_REJECT :
2645                                            PD_MSG_CTRL_NOT_SUPP,
2646                                            NONE_AMS);
2647                 } else {
2648                         if (port->vdm_sm_running) {
2649                                 tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
2650                                 break;
2651                         }
2652
2653                         tcpm_pd_handle_state(port, PR_SWAP_ACCEPT, POWER_ROLE_SWAP, 0);
2654                 }
2655                 break;
2656         case PD_CTRL_VCONN_SWAP:
2657                 if (port->vdm_sm_running) {
2658                         tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
2659                         break;
2660                 }
2661
2662                 tcpm_pd_handle_state(port, VCONN_SWAP_ACCEPT, VCONN_SWAP, 0);
2663                 break;
2664         case PD_CTRL_GET_SOURCE_CAP_EXT:
2665         case PD_CTRL_GET_STATUS:
2666         case PD_CTRL_FR_SWAP:
2667         case PD_CTRL_GET_PPS_STATUS:
2668         case PD_CTRL_GET_COUNTRY_CODES:
2669                 /* Currently not supported */
2670                 tcpm_pd_handle_msg(port,
2671                                    port->negotiated_rev < PD_REV30 ?
2672                                    PD_MSG_CTRL_REJECT :
2673                                    PD_MSG_CTRL_NOT_SUPP,
2674                                    NONE_AMS);
2675                 break;
2676         default:
2677                 tcpm_pd_handle_msg(port,
2678                                    port->negotiated_rev < PD_REV30 ?
2679                                    PD_MSG_CTRL_REJECT :
2680                                    PD_MSG_CTRL_NOT_SUPP,
2681                                    NONE_AMS);
2682                 tcpm_log(port, "Unrecognized ctrl message type %#x", type);
2683                 break;
2684         }
2685 }
2686
2687 static void tcpm_pd_ext_msg_request(struct tcpm_port *port,
2688                                     const struct pd_message *msg)
2689 {
2690         enum pd_ext_msg_type type = pd_header_type_le(msg->header);
2691         unsigned int data_size = pd_ext_header_data_size_le(msg->ext_msg.header);
2692
2693         if (!(msg->ext_msg.header & PD_EXT_HDR_CHUNKED)) {
2694                 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
2695                 tcpm_log(port, "Unchunked extended messages unsupported");
2696                 return;
2697         }
2698
2699         if (data_size > PD_EXT_MAX_CHUNK_DATA) {
2700                 tcpm_pd_handle_state(port, CHUNK_NOT_SUPP, NONE_AMS, PD_T_CHUNK_NOT_SUPP);
2701                 tcpm_log(port, "Chunk handling not yet supported");
2702                 return;
2703         }
2704
2705         switch (type) {
2706         case PD_EXT_STATUS:
2707                 /*
2708                  * If PPS related events raised then get PPS status to clear
2709                  * (see USB PD 3.0 Spec, 6.5.2.4)
2710                  */
2711                 if (msg->ext_msg.data[USB_PD_EXT_SDB_EVENT_FLAGS] &
2712                     USB_PD_EXT_SDB_PPS_EVENTS)
2713                         tcpm_pd_handle_state(port, GET_PPS_STATUS_SEND,
2714                                              GETTING_SOURCE_SINK_STATUS, 0);
2715
2716                 else
2717                         tcpm_pd_handle_state(port, ready_state(port), NONE_AMS, 0);
2718                 break;
2719         case PD_EXT_PPS_STATUS:
2720                 /*
2721                  * For now the PPS status message is used to clear events
2722                  * and nothing more.
2723                  */
2724                 tcpm_pd_handle_state(port, ready_state(port), NONE_AMS, 0);
2725                 break;
2726         case PD_EXT_SOURCE_CAP_EXT:
2727         case PD_EXT_GET_BATT_CAP:
2728         case PD_EXT_GET_BATT_STATUS:
2729         case PD_EXT_BATT_CAP:
2730         case PD_EXT_GET_MANUFACTURER_INFO:
2731         case PD_EXT_MANUFACTURER_INFO:
2732         case PD_EXT_SECURITY_REQUEST:
2733         case PD_EXT_SECURITY_RESPONSE:
2734         case PD_EXT_FW_UPDATE_REQUEST:
2735         case PD_EXT_FW_UPDATE_RESPONSE:
2736         case PD_EXT_COUNTRY_INFO:
2737         case PD_EXT_COUNTRY_CODES:
2738                 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
2739                 break;
2740         default:
2741                 tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
2742                 tcpm_log(port, "Unrecognized extended message type %#x", type);
2743                 break;
2744         }
2745 }
2746
2747 static void tcpm_pd_rx_handler(struct kthread_work *work)
2748 {
2749         struct pd_rx_event *event = container_of(work,
2750                                                  struct pd_rx_event, work);
2751         const struct pd_message *msg = &event->msg;
2752         unsigned int cnt = pd_header_cnt_le(msg->header);
2753         struct tcpm_port *port = event->port;
2754
2755         mutex_lock(&port->lock);
2756
2757         tcpm_log(port, "PD RX, header: %#x [%d]", le16_to_cpu(msg->header),
2758                  port->attached);
2759
2760         if (port->attached) {
2761                 enum pd_ctrl_msg_type type = pd_header_type_le(msg->header);
2762                 unsigned int msgid = pd_header_msgid_le(msg->header);
2763
2764                 /*
2765                  * USB PD standard, 6.6.1.2:
2766                  * "... if MessageID value in a received Message is the
2767                  * same as the stored value, the receiver shall return a
2768                  * GoodCRC Message with that MessageID value and drop
2769                  * the Message (this is a retry of an already received
2770                  * Message). Note: this shall not apply to the Soft_Reset
2771                  * Message which always has a MessageID value of zero."
2772                  */
2773                 if (msgid == port->rx_msgid && type != PD_CTRL_SOFT_RESET)
2774                         goto done;
2775                 port->rx_msgid = msgid;
2776
2777                 /*
2778                  * If both ends believe to be DFP/host, we have a data role
2779                  * mismatch.
2780                  */
2781                 if (!!(le16_to_cpu(msg->header) & PD_HEADER_DATA_ROLE) ==
2782                     (port->data_role == TYPEC_HOST)) {
2783                         tcpm_log(port,
2784                                  "Data role mismatch, initiating error recovery");
2785                         tcpm_set_state(port, ERROR_RECOVERY, 0);
2786                 } else {
2787                         if (msg->header & PD_HEADER_EXT_HDR)
2788                                 tcpm_pd_ext_msg_request(port, msg);
2789                         else if (cnt)
2790                                 tcpm_pd_data_request(port, msg);
2791                         else
2792                                 tcpm_pd_ctrl_request(port, msg);
2793                 }
2794         }
2795
2796 done:
2797         mutex_unlock(&port->lock);
2798         kfree(event);
2799 }
2800
2801 void tcpm_pd_receive(struct tcpm_port *port, const struct pd_message *msg)
2802 {
2803         struct pd_rx_event *event;
2804
2805         event = kzalloc(sizeof(*event), GFP_ATOMIC);
2806         if (!event)
2807                 return;
2808
2809         kthread_init_work(&event->work, tcpm_pd_rx_handler);
2810         event->port = port;
2811         memcpy(&event->msg, msg, sizeof(*msg));
2812         kthread_queue_work(port->wq, &event->work);
2813 }
2814 EXPORT_SYMBOL_GPL(tcpm_pd_receive);
2815
2816 static int tcpm_pd_send_control(struct tcpm_port *port,
2817                                 enum pd_ctrl_msg_type type)
2818 {
2819         struct pd_message msg;
2820
2821         memset(&msg, 0, sizeof(msg));
2822         msg.header = PD_HEADER_LE(type, port->pwr_role,
2823                                   port->data_role,
2824                                   port->negotiated_rev,
2825                                   port->message_id, 0);
2826
2827         return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
2828 }
2829
2830 /*
2831  * Send queued message without affecting state.
2832  * Return true if state machine should go back to sleep,
2833  * false otherwise.
2834  */
2835 static bool tcpm_send_queued_message(struct tcpm_port *port)
2836 {
2837         enum pd_msg_request queued_message;
2838         int ret;
2839
2840         do {
2841                 queued_message = port->queued_message;
2842                 port->queued_message = PD_MSG_NONE;
2843
2844                 switch (queued_message) {
2845                 case PD_MSG_CTRL_WAIT:
2846                         tcpm_pd_send_control(port, PD_CTRL_WAIT);
2847                         break;
2848                 case PD_MSG_CTRL_REJECT:
2849                         tcpm_pd_send_control(port, PD_CTRL_REJECT);
2850                         break;
2851                 case PD_MSG_CTRL_NOT_SUPP:
2852                         tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP);
2853                         break;
2854                 case PD_MSG_DATA_SINK_CAP:
2855                         ret = tcpm_pd_send_sink_caps(port);
2856                         if (ret < 0) {
2857                                 tcpm_log(port, "Unable to send snk caps, ret=%d", ret);
2858                                 tcpm_set_state(port, SNK_SOFT_RESET, 0);
2859                         }
2860                         tcpm_ams_finish(port);
2861                         break;
2862                 case PD_MSG_DATA_SOURCE_CAP:
2863                         ret = tcpm_pd_send_source_caps(port);
2864                         if (ret < 0) {
2865                                 tcpm_log(port,
2866                                          "Unable to send src caps, ret=%d",
2867                                          ret);
2868                                 tcpm_set_state(port, SOFT_RESET_SEND, 0);
2869                         } else if (port->pwr_role == TYPEC_SOURCE) {
2870                                 tcpm_ams_finish(port);
2871                                 tcpm_set_state(port, HARD_RESET_SEND,
2872                                                PD_T_SENDER_RESPONSE);
2873                         } else {
2874                                 tcpm_ams_finish(port);
2875                         }
2876                         break;
2877                 default:
2878                         break;
2879                 }
2880         } while (port->queued_message != PD_MSG_NONE);
2881
2882         if (port->delayed_state != INVALID_STATE) {
2883                 if (ktime_after(port->delayed_runtime, ktime_get())) {
2884                         mod_tcpm_delayed_work(port, ktime_to_ms(ktime_sub(port->delayed_runtime,
2885                                                                           ktime_get())));
2886                         return true;
2887                 }
2888                 port->delayed_state = INVALID_STATE;
2889         }
2890         return false;
2891 }
2892
2893 static int tcpm_pd_check_request(struct tcpm_port *port)
2894 {
2895         u32 pdo, rdo = port->sink_request;
2896         unsigned int max, op, pdo_max, index;
2897         enum pd_pdo_type type;
2898
2899         index = rdo_index(rdo);
2900         if (!index || index > port->nr_src_pdo)
2901                 return -EINVAL;
2902
2903         pdo = port->src_pdo[index - 1];
2904         type = pdo_type(pdo);
2905         switch (type) {
2906         case PDO_TYPE_FIXED:
2907         case PDO_TYPE_VAR:
2908                 max = rdo_max_current(rdo);
2909                 op = rdo_op_current(rdo);
2910                 pdo_max = pdo_max_current(pdo);
2911
2912                 if (op > pdo_max)
2913                         return -EINVAL;
2914                 if (max > pdo_max && !(rdo & RDO_CAP_MISMATCH))
2915                         return -EINVAL;
2916
2917                 if (type == PDO_TYPE_FIXED)
2918                         tcpm_log(port,
2919                                  "Requested %u mV, %u mA for %u / %u mA",
2920                                  pdo_fixed_voltage(pdo), pdo_max, op, max);
2921                 else
2922                         tcpm_log(port,
2923                                  "Requested %u -> %u mV, %u mA for %u / %u mA",
2924                                  pdo_min_voltage(pdo), pdo_max_voltage(pdo),
2925                                  pdo_max, op, max);
2926                 break;
2927         case PDO_TYPE_BATT:
2928                 max = rdo_max_power(rdo);
2929                 op = rdo_op_power(rdo);
2930                 pdo_max = pdo_max_power(pdo);
2931
2932                 if (op > pdo_max)
2933                         return -EINVAL;
2934                 if (max > pdo_max && !(rdo & RDO_CAP_MISMATCH))
2935                         return -EINVAL;
2936                 tcpm_log(port,
2937                          "Requested %u -> %u mV, %u mW for %u / %u mW",
2938                          pdo_min_voltage(pdo), pdo_max_voltage(pdo),
2939                          pdo_max, op, max);
2940                 break;
2941         default:
2942                 return -EINVAL;
2943         }
2944
2945         port->op_vsafe5v = index == 1;
2946
2947         return 0;
2948 }
2949
2950 #define min_power(x, y) min(pdo_max_power(x), pdo_max_power(y))
2951 #define min_current(x, y) min(pdo_max_current(x), pdo_max_current(y))
2952
2953 static int tcpm_pd_select_pdo(struct tcpm_port *port, int *sink_pdo,
2954                               int *src_pdo)
2955 {
2956         unsigned int i, j, max_src_mv = 0, min_src_mv = 0, max_mw = 0,
2957                      max_mv = 0, src_mw = 0, src_ma = 0, max_snk_mv = 0,
2958                      min_snk_mv = 0;
2959         int ret = -EINVAL;
2960
2961         port->pps_data.supported = false;
2962         port->usb_type = POWER_SUPPLY_USB_TYPE_PD;
2963         power_supply_changed(port->psy);
2964
2965         /*
2966          * Select the source PDO providing the most power which has a
2967          * matchig sink cap.
2968          */
2969         for (i = 0; i < port->nr_source_caps; i++) {
2970                 u32 pdo = port->source_caps[i];
2971                 enum pd_pdo_type type = pdo_type(pdo);
2972
2973                 switch (type) {
2974                 case PDO_TYPE_FIXED:
2975                         max_src_mv = pdo_fixed_voltage(pdo);
2976                         min_src_mv = max_src_mv;
2977                         break;
2978                 case PDO_TYPE_BATT:
2979                 case PDO_TYPE_VAR:
2980                         max_src_mv = pdo_max_voltage(pdo);
2981                         min_src_mv = pdo_min_voltage(pdo);
2982                         break;
2983                 case PDO_TYPE_APDO:
2984                         if (pdo_apdo_type(pdo) == APDO_TYPE_PPS) {
2985                                 port->pps_data.supported = true;
2986                                 port->usb_type =
2987                                         POWER_SUPPLY_USB_TYPE_PD_PPS;
2988                                 power_supply_changed(port->psy);
2989                         }
2990                         continue;
2991                 default:
2992                         tcpm_log(port, "Invalid source PDO type, ignoring");
2993                         continue;
2994                 }
2995
2996                 switch (type) {
2997                 case PDO_TYPE_FIXED:
2998                 case PDO_TYPE_VAR:
2999                         src_ma = pdo_max_current(pdo);
3000                         src_mw = src_ma * min_src_mv / 1000;
3001                         break;
3002                 case PDO_TYPE_BATT:
3003                         src_mw = pdo_max_power(pdo);
3004                         break;
3005                 case PDO_TYPE_APDO:
3006                         continue;
3007                 default:
3008                         tcpm_log(port, "Invalid source PDO type, ignoring");
3009                         continue;
3010                 }
3011
3012                 for (j = 0; j < port->nr_snk_pdo; j++) {
3013                         pdo = port->snk_pdo[j];
3014
3015                         switch (pdo_type(pdo)) {
3016                         case PDO_TYPE_FIXED:
3017                                 max_snk_mv = pdo_fixed_voltage(pdo);
3018                                 min_snk_mv = max_snk_mv;
3019                                 break;
3020                         case PDO_TYPE_BATT:
3021                         case PDO_TYPE_VAR:
3022                                 max_snk_mv = pdo_max_voltage(pdo);
3023                                 min_snk_mv = pdo_min_voltage(pdo);
3024                                 break;
3025                         case PDO_TYPE_APDO:
3026                                 continue;
3027                         default:
3028                                 tcpm_log(port, "Invalid sink PDO type, ignoring");
3029                                 continue;
3030                         }
3031
3032                         if (max_src_mv <= max_snk_mv &&
3033                                 min_src_mv >= min_snk_mv) {
3034                                 /* Prefer higher voltages if available */
3035                                 if ((src_mw == max_mw && min_src_mv > max_mv) ||
3036                                                         src_mw > max_mw) {
3037                                         *src_pdo = i;
3038                                         *sink_pdo = j;
3039                                         max_mw = src_mw;
3040                                         max_mv = min_src_mv;
3041                                         ret = 0;
3042                                 }
3043                         }
3044                 }
3045         }
3046
3047         return ret;
3048 }
3049
3050 #define min_pps_apdo_current(x, y)      \
3051         min(pdo_pps_apdo_max_current(x), pdo_pps_apdo_max_current(y))
3052
3053 static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port)
3054 {
3055         unsigned int i, j, max_mw = 0, max_mv = 0;
3056         unsigned int min_src_mv, max_src_mv, src_ma, src_mw;
3057         unsigned int min_snk_mv, max_snk_mv;
3058         unsigned int max_op_mv;
3059         u32 pdo, src, snk;
3060         unsigned int src_pdo = 0, snk_pdo = 0;
3061
3062         /*
3063          * Select the source PPS APDO providing the most power while staying
3064          * within the board's limits. We skip the first PDO as this is always
3065          * 5V 3A.
3066          */
3067         for (i = 1; i < port->nr_source_caps; ++i) {
3068                 pdo = port->source_caps[i];
3069
3070                 switch (pdo_type(pdo)) {
3071                 case PDO_TYPE_APDO:
3072                         if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
3073                                 tcpm_log(port, "Not PPS APDO (source), ignoring");
3074                                 continue;
3075                         }
3076
3077                         min_src_mv = pdo_pps_apdo_min_voltage(pdo);
3078                         max_src_mv = pdo_pps_apdo_max_voltage(pdo);
3079                         src_ma = pdo_pps_apdo_max_current(pdo);
3080                         src_mw = (src_ma * max_src_mv) / 1000;
3081
3082                         /*
3083                          * Now search through the sink PDOs to find a matching
3084                          * PPS APDO. Again skip the first sink PDO as this will
3085                          * always be 5V 3A.
3086                          */
3087                         for (j = 1; j < port->nr_snk_pdo; j++) {
3088                                 pdo = port->snk_pdo[j];
3089
3090                                 switch (pdo_type(pdo)) {
3091                                 case PDO_TYPE_APDO:
3092                                         if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
3093                                                 tcpm_log(port,
3094                                                          "Not PPS APDO (sink), ignoring");
3095                                                 continue;
3096                                         }
3097
3098                                         min_snk_mv =
3099                                                 pdo_pps_apdo_min_voltage(pdo);
3100                                         max_snk_mv =
3101                                                 pdo_pps_apdo_max_voltage(pdo);
3102                                         break;
3103                                 default:
3104                                         tcpm_log(port,
3105                                                  "Not APDO type (sink), ignoring");
3106                                         continue;
3107                                 }
3108
3109                                 if (min_src_mv <= max_snk_mv &&
3110                                     max_src_mv >= min_snk_mv) {
3111                                         max_op_mv = min(max_src_mv, max_snk_mv);
3112                                         src_mw = (max_op_mv * src_ma) / 1000;
3113                                         /* Prefer higher voltages if available */
3114                                         if ((src_mw == max_mw &&
3115                                              max_op_mv > max_mv) ||
3116                                             src_mw > max_mw) {
3117                                                 src_pdo = i;
3118                                                 snk_pdo = j;
3119                                                 max_mw = src_mw;
3120                                                 max_mv = max_op_mv;
3121                                         }
3122                                 }
3123                         }
3124
3125                         break;
3126                 default:
3127                         tcpm_log(port, "Not APDO type (source), ignoring");
3128                         continue;
3129                 }
3130         }
3131
3132         if (src_pdo) {
3133                 src = port->source_caps[src_pdo];
3134                 snk = port->snk_pdo[snk_pdo];
3135
3136                 port->pps_data.req_min_volt = max(pdo_pps_apdo_min_voltage(src),
3137                                                   pdo_pps_apdo_min_voltage(snk));
3138                 port->pps_data.req_max_volt = min(pdo_pps_apdo_max_voltage(src),
3139                                                   pdo_pps_apdo_max_voltage(snk));
3140                 port->pps_data.req_max_curr = min_pps_apdo_current(src, snk);
3141                 port->pps_data.req_out_volt = min(port->pps_data.req_max_volt,
3142                                                   max(port->pps_data.req_min_volt,
3143                                                       port->pps_data.req_out_volt));
3144                 port->pps_data.req_op_curr = min(port->pps_data.req_max_curr,
3145                                                  port->pps_data.req_op_curr);
3146         }
3147
3148         return src_pdo;
3149 }
3150
3151 static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo)
3152 {
3153         unsigned int mv, ma, mw, flags;
3154         unsigned int max_ma, max_mw;
3155         enum pd_pdo_type type;
3156         u32 pdo, matching_snk_pdo;
3157         int src_pdo_index = 0;
3158         int snk_pdo_index = 0;
3159         int ret;
3160
3161         ret = tcpm_pd_select_pdo(port, &snk_pdo_index, &src_pdo_index);
3162         if (ret < 0)
3163                 return ret;
3164
3165         pdo = port->source_caps[src_pdo_index];
3166         matching_snk_pdo = port->snk_pdo[snk_pdo_index];
3167         type = pdo_type(pdo);
3168
3169         switch (type) {
3170         case PDO_TYPE_FIXED:
3171                 mv = pdo_fixed_voltage(pdo);
3172                 break;
3173         case PDO_TYPE_BATT:
3174         case PDO_TYPE_VAR:
3175                 mv = pdo_min_voltage(pdo);
3176                 break;
3177         default:
3178                 tcpm_log(port, "Invalid PDO selected!");
3179                 return -EINVAL;
3180         }
3181
3182         /* Select maximum available current within the sink pdo's limit */
3183         if (type == PDO_TYPE_BATT) {
3184                 mw = min_power(pdo, matching_snk_pdo);
3185                 ma = 1000 * mw / mv;
3186         } else {
3187                 ma = min_current(pdo, matching_snk_pdo);
3188                 mw = ma * mv / 1000;
3189         }
3190
3191         flags = RDO_USB_COMM | RDO_NO_SUSPEND;
3192
3193         /* Set mismatch bit if offered power is less than operating power */
3194         max_ma = ma;
3195         max_mw = mw;
3196         if (mw < port->operating_snk_mw) {
3197                 flags |= RDO_CAP_MISMATCH;
3198                 if (type == PDO_TYPE_BATT &&
3199                     (pdo_max_power(matching_snk_pdo) > pdo_max_power(pdo)))
3200                         max_mw = pdo_max_power(matching_snk_pdo);
3201                 else if (pdo_max_current(matching_snk_pdo) >
3202                          pdo_max_current(pdo))
3203                         max_ma = pdo_max_current(matching_snk_pdo);
3204         }
3205
3206         tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d",
3207                  port->cc_req, port->cc1, port->cc2, port->vbus_source,
3208                  port->vconn_role == TYPEC_SOURCE ? "source" : "sink",
3209                  port->polarity);
3210
3211         if (type == PDO_TYPE_BATT) {
3212                 *rdo = RDO_BATT(src_pdo_index + 1, mw, max_mw, flags);
3213
3214                 tcpm_log(port, "Requesting PDO %d: %u mV, %u mW%s",
3215                          src_pdo_index, mv, mw,
3216                          flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
3217         } else {
3218                 *rdo = RDO_FIXED(src_pdo_index + 1, ma, max_ma, flags);
3219
3220                 tcpm_log(port, "Requesting PDO %d: %u mV, %u mA%s",
3221                          src_pdo_index, mv, ma,
3222                          flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
3223         }
3224
3225         port->req_current_limit = ma;
3226         port->req_supply_voltage = mv;
3227
3228         return 0;
3229 }
3230
3231 static int tcpm_pd_send_request(struct tcpm_port *port)
3232 {
3233         struct pd_message msg;
3234         int ret;
3235         u32 rdo;
3236
3237         ret = tcpm_pd_build_request(port, &rdo);
3238         if (ret < 0)
3239                 return ret;
3240
3241         memset(&msg, 0, sizeof(msg));
3242         msg.header = PD_HEADER_LE(PD_DATA_REQUEST,
3243                                   port->pwr_role,
3244                                   port->data_role,
3245                                   port->negotiated_rev,
3246                                   port->message_id, 1);
3247         msg.payload[0] = cpu_to_le32(rdo);
3248
3249         return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
3250 }
3251
3252 static int tcpm_pd_build_pps_request(struct tcpm_port *port, u32 *rdo)
3253 {
3254         unsigned int out_mv, op_ma, op_mw, max_mv, max_ma, flags;
3255         enum pd_pdo_type type;
3256         unsigned int src_pdo_index;
3257         u32 pdo;
3258
3259         src_pdo_index = tcpm_pd_select_pps_apdo(port);
3260         if (!src_pdo_index)
3261                 return -EOPNOTSUPP;
3262
3263         pdo = port->source_caps[src_pdo_index];
3264         type = pdo_type(pdo);
3265
3266         switch (type) {
3267         case PDO_TYPE_APDO:
3268                 if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
3269                         tcpm_log(port, "Invalid APDO selected!");
3270                         return -EINVAL;
3271                 }
3272                 max_mv = port->pps_data.req_max_volt;
3273                 max_ma = port->pps_data.req_max_curr;
3274                 out_mv = port->pps_data.req_out_volt;
3275                 op_ma = port->pps_data.req_op_curr;
3276                 break;
3277         default:
3278                 tcpm_log(port, "Invalid PDO selected!");
3279                 return -EINVAL;
3280         }
3281
3282         flags = RDO_USB_COMM | RDO_NO_SUSPEND;
3283
3284         op_mw = (op_ma * out_mv) / 1000;
3285         if (op_mw < port->operating_snk_mw) {
3286                 /*
3287                  * Try raising current to meet power needs. If that's not enough
3288                  * then try upping the voltage. If that's still not enough
3289                  * then we've obviously chosen a PPS APDO which really isn't
3290                  * suitable so abandon ship.
3291                  */
3292                 op_ma = (port->operating_snk_mw * 1000) / out_mv;
3293                 if ((port->operating_snk_mw * 1000) % out_mv)
3294                         ++op_ma;
3295                 op_ma += RDO_PROG_CURR_MA_STEP - (op_ma % RDO_PROG_CURR_MA_STEP);
3296
3297                 if (op_ma > max_ma) {
3298                         op_ma = max_ma;
3299                         out_mv = (port->operating_snk_mw * 1000) / op_ma;
3300                         if ((port->operating_snk_mw * 1000) % op_ma)
3301                                 ++out_mv;
3302                         out_mv += RDO_PROG_VOLT_MV_STEP -
3303                                   (out_mv % RDO_PROG_VOLT_MV_STEP);
3304
3305                         if (out_mv > max_mv) {
3306                                 tcpm_log(port, "Invalid PPS APDO selected!");
3307                                 return -EINVAL;
3308                         }
3309                 }
3310         }
3311
3312         tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d",
3313                  port->cc_req, port->cc1, port->cc2, port->vbus_source,
3314                  port->vconn_role == TYPEC_SOURCE ? "source" : "sink",
3315                  port->polarity);
3316
3317         *rdo = RDO_PROG(src_pdo_index + 1, out_mv, op_ma, flags);
3318
3319         tcpm_log(port, "Requesting APDO %d: %u mV, %u mA",
3320                  src_pdo_index, out_mv, op_ma);
3321
3322         port->pps_data.req_op_curr = op_ma;
3323         port->pps_data.req_out_volt = out_mv;
3324
3325         return 0;
3326 }
3327
3328 static int tcpm_pd_send_pps_request(struct tcpm_port *port)
3329 {
3330         struct pd_message msg;
3331         int ret;
3332         u32 rdo;
3333
3334         ret = tcpm_pd_build_pps_request(port, &rdo);
3335         if (ret < 0)
3336                 return ret;
3337
3338         memset(&msg, 0, sizeof(msg));
3339         msg.header = PD_HEADER_LE(PD_DATA_REQUEST,
3340                                   port->pwr_role,
3341                                   port->data_role,
3342                                   port->negotiated_rev,
3343                                   port->message_id, 1);
3344         msg.payload[0] = cpu_to_le32(rdo);
3345
3346         return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
3347 }
3348
3349 static int tcpm_set_vbus(struct tcpm_port *port, bool enable)
3350 {
3351         int ret;
3352
3353         if (enable && port->vbus_charge)
3354                 return -EINVAL;
3355
3356         tcpm_log(port, "vbus:=%d charge=%d", enable, port->vbus_charge);
3357
3358         ret = port->tcpc->set_vbus(port->tcpc, enable, port->vbus_charge);
3359         if (ret < 0)
3360                 return ret;
3361
3362         port->vbus_source = enable;
3363         return 0;
3364 }
3365
3366 static int tcpm_set_charge(struct tcpm_port *port, bool charge)
3367 {
3368         int ret;
3369
3370         if (charge && port->vbus_source)
3371                 return -EINVAL;
3372
3373         if (charge != port->vbus_charge) {
3374                 tcpm_log(port, "vbus=%d charge:=%d", port->vbus_source, charge);
3375                 ret = port->tcpc->set_vbus(port->tcpc, port->vbus_source,
3376                                            charge);
3377                 if (ret < 0)
3378                         return ret;
3379         }
3380         port->vbus_charge = charge;
3381         power_supply_changed(port->psy);
3382         return 0;
3383 }
3384
3385 static bool tcpm_start_toggling(struct tcpm_port *port, enum typec_cc_status cc)
3386 {
3387         int ret;
3388
3389         if (!port->tcpc->start_toggling)
3390                 return false;
3391
3392         tcpm_log_force(port, "Start toggling");
3393         ret = port->tcpc->start_toggling(port->tcpc, port->port_type, cc);
3394         return ret == 0;
3395 }
3396
3397 static int tcpm_init_vbus(struct tcpm_port *port)
3398 {
3399         int ret;
3400
3401         ret = port->tcpc->set_vbus(port->tcpc, false, false);
3402         port->vbus_source = false;
3403         port->vbus_charge = false;
3404         return ret;
3405 }
3406
3407 static int tcpm_init_vconn(struct tcpm_port *port)
3408 {
3409         int ret;
3410
3411         ret = port->tcpc->set_vconn(port->tcpc, false);
3412         port->vconn_role = TYPEC_SINK;
3413         return ret;
3414 }
3415
3416 static void tcpm_typec_connect(struct tcpm_port *port)
3417 {
3418         if (!port->connected) {
3419                 /* Make sure we don't report stale identity information */
3420                 memset(&port->partner_ident, 0, sizeof(port->partner_ident));
3421                 port->partner_desc.usb_pd = port->pd_capable;
3422                 if (tcpm_port_is_debug(port))
3423                         port->partner_desc.accessory = TYPEC_ACCESSORY_DEBUG;
3424                 else if (tcpm_port_is_audio(port))
3425                         port->partner_desc.accessory = TYPEC_ACCESSORY_AUDIO;
3426                 else
3427                         port->partner_desc.accessory = TYPEC_ACCESSORY_NONE;
3428                 port->partner = typec_register_partner(port->typec_port,
3429                                                        &port->partner_desc);
3430                 port->connected = true;
3431         }
3432 }
3433
3434 static int tcpm_src_attach(struct tcpm_port *port)
3435 {
3436         enum typec_cc_polarity polarity =
3437                                 port->cc2 == TYPEC_CC_RD ? TYPEC_POLARITY_CC2
3438                                                          : TYPEC_POLARITY_CC1;
3439         int ret;
3440
3441         if (port->attached)
3442                 return 0;
3443
3444         ret = tcpm_set_polarity(port, polarity);
3445         if (ret < 0)
3446                 return ret;
3447
3448         if (port->tcpc->enable_auto_vbus_discharge) {
3449                 ret = port->tcpc->enable_auto_vbus_discharge(port->tcpc, true);
3450                 tcpm_log_force(port, "enable vbus discharge ret:%d", ret);
3451                 if (!ret)
3452                         port->auto_vbus_discharge_enabled = true;
3453         }
3454
3455         ret = tcpm_set_roles(port, true, TYPEC_SOURCE, tcpm_data_role_for_source(port));
3456         if (ret < 0)
3457                 return ret;
3458
3459         ret = port->tcpc->set_pd_rx(port->tcpc, true);
3460         if (ret < 0)
3461                 goto out_disable_mux;
3462
3463         /*
3464          * USB Type-C specification, version 1.2,
3465          * chapter 4.5.2.2.8.1 (Attached.SRC Requirements)
3466          * Enable VCONN only if the non-RD port is set to RA.
3467          */
3468         if ((polarity == TYPEC_POLARITY_CC1 && port->cc2 == TYPEC_CC_RA) ||
3469             (polarity == TYPEC_POLARITY_CC2 && port->cc1 == TYPEC_CC_RA)) {
3470                 ret = tcpm_set_vconn(port, true);
3471                 if (ret < 0)
3472                         goto out_disable_pd;
3473         }
3474
3475         ret = tcpm_set_vbus(port, true);
3476         if (ret < 0)
3477                 goto out_disable_vconn;
3478
3479         port->pd_capable = false;
3480
3481         port->partner = NULL;
3482
3483         port->attached = true;
3484         port->send_discover = true;
3485
3486         return 0;
3487
3488 out_disable_vconn:
3489         tcpm_set_vconn(port, false);
3490 out_disable_pd:
3491         port->tcpc->set_pd_rx(port->tcpc, false);
3492 out_disable_mux:
3493         tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,
3494                      TYPEC_ORIENTATION_NONE);
3495         return ret;
3496 }
3497
3498 static void tcpm_typec_disconnect(struct tcpm_port *port)
3499 {
3500         if (port->connected) {
3501                 typec_unregister_partner(port->partner);
3502                 port->partner = NULL;
3503                 port->connected = false;
3504         }
3505 }
3506
3507 static void tcpm_unregister_altmodes(struct tcpm_port *port)
3508 {
3509         struct pd_mode_data *modep = &port->mode_data;
3510         int i;
3511
3512         for (i = 0; i < modep->altmodes; i++) {
3513                 typec_unregister_altmode(port->partner_altmode[i]);
3514                 port->partner_altmode[i] = NULL;
3515         }
3516
3517         memset(modep, 0, sizeof(*modep));
3518 }
3519
3520 static void tcpm_set_partner_usb_comm_capable(struct tcpm_port *port, bool capable)
3521 {
3522         tcpm_log(port, "Setting usb_comm capable %s", capable ? "true" : "false");
3523
3524         if (port->tcpc->set_partner_usb_comm_capable)
3525                 port->tcpc->set_partner_usb_comm_capable(port->tcpc, capable);
3526 }
3527
3528 static void tcpm_reset_port(struct tcpm_port *port)
3529 {
3530         int ret;
3531
3532         if (port->tcpc->enable_auto_vbus_discharge) {
3533                 ret = port->tcpc->enable_auto_vbus_discharge(port->tcpc, false);
3534                 tcpm_log_force(port, "Disable vbus discharge ret:%d", ret);
3535                 if (!ret)
3536                         port->auto_vbus_discharge_enabled = false;
3537         }
3538         port->in_ams = false;
3539         port->ams = NONE_AMS;
3540         port->vdm_sm_running = false;
3541         tcpm_unregister_altmodes(port);
3542         tcpm_typec_disconnect(port);
3543         port->attached = false;
3544         port->pd_capable = false;
3545         port->pps_data.supported = false;
3546         tcpm_set_partner_usb_comm_capable(port, false);
3547
3548         /*
3549          * First Rx ID should be 0; set this to a sentinel of -1 so that
3550          * we can check tcpm_pd_rx_handler() if we had seen it before.
3551          */
3552         port->rx_msgid = -1;
3553
3554         port->tcpc->set_pd_rx(port->tcpc, false);
3555         tcpm_init_vbus(port);   /* also disables charging */
3556         tcpm_init_vconn(port);
3557         tcpm_set_current_limit(port, 0, 0);
3558         tcpm_set_polarity(port, TYPEC_POLARITY_CC1);
3559         tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,
3560                      TYPEC_ORIENTATION_NONE);
3561         tcpm_set_attached_state(port, false);
3562         port->try_src_count = 0;
3563         port->try_snk_count = 0;
3564         port->usb_type = POWER_SUPPLY_USB_TYPE_C;
3565         power_supply_changed(port->psy);
3566         port->nr_sink_caps = 0;
3567         port->sink_cap_done = false;
3568         if (port->tcpc->enable_frs)
3569                 port->tcpc->enable_frs(port->tcpc, false);
3570 }
3571
3572 static void tcpm_detach(struct tcpm_port *port)
3573 {
3574         if (tcpm_port_is_disconnected(port))
3575                 port->hard_reset_count = 0;
3576
3577         if (!port->attached)
3578                 return;
3579
3580         if (port->tcpc->set_bist_data) {
3581                 tcpm_log(port, "disable BIST MODE TESTDATA");
3582                 port->tcpc->set_bist_data(port->tcpc, false);
3583         }
3584
3585         tcpm_reset_port(port);
3586 }
3587
3588 static void tcpm_src_detach(struct tcpm_port *port)
3589 {
3590         tcpm_detach(port);
3591 }
3592
3593 static int tcpm_snk_attach(struct tcpm_port *port)
3594 {
3595         int ret;
3596
3597         if (port->attached)
3598                 return 0;
3599
3600         ret = tcpm_set_polarity(port, port->cc2 != TYPEC_CC_OPEN ?
3601                                 TYPEC_POLARITY_CC2 : TYPEC_POLARITY_CC1);
3602         if (ret < 0)
3603                 return ret;
3604
3605         if (port->tcpc->enable_auto_vbus_discharge) {
3606                 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, VSAFE5V);
3607                 ret = port->tcpc->enable_auto_vbus_discharge(port->tcpc, true);
3608                 tcpm_log_force(port, "enable vbus discharge ret:%d", ret);
3609                 if (!ret)
3610                         port->auto_vbus_discharge_enabled = true;
3611         }
3612
3613         ret = tcpm_set_roles(port, true, TYPEC_SINK, tcpm_data_role_for_sink(port));
3614         if (ret < 0)
3615                 return ret;
3616
3617         port->pd_capable = false;
3618
3619         port->partner = NULL;
3620
3621         port->attached = true;
3622         port->send_discover = true;
3623
3624         return 0;
3625 }
3626
3627 static void tcpm_snk_detach(struct tcpm_port *port)
3628 {
3629         tcpm_detach(port);
3630 }
3631
3632 static int tcpm_acc_attach(struct tcpm_port *port)
3633 {
3634         int ret;
3635
3636         if (port->attached)
3637                 return 0;
3638
3639         ret = tcpm_set_roles(port, true, TYPEC_SOURCE,
3640                              tcpm_data_role_for_source(port));
3641         if (ret < 0)
3642                 return ret;
3643
3644         port->partner = NULL;
3645
3646         tcpm_typec_connect(port);
3647
3648         port->attached = true;
3649
3650         return 0;
3651 }
3652
3653 static void tcpm_acc_detach(struct tcpm_port *port)
3654 {
3655         tcpm_detach(port);
3656 }
3657
3658 static inline enum tcpm_state hard_reset_state(struct tcpm_port *port)
3659 {
3660         if (port->hard_reset_count < PD_N_HARD_RESET_COUNT)
3661                 return HARD_RESET_SEND;
3662         if (port->pd_capable)
3663                 return ERROR_RECOVERY;
3664         if (port->pwr_role == TYPEC_SOURCE)
3665                 return SRC_UNATTACHED;
3666         if (port->state == SNK_WAIT_CAPABILITIES)
3667                 return SNK_READY;
3668         return SNK_UNATTACHED;
3669 }
3670
3671 static inline enum tcpm_state unattached_state(struct tcpm_port *port)
3672 {
3673         if (port->port_type == TYPEC_PORT_DRP) {
3674                 if (port->pwr_role == TYPEC_SOURCE)
3675                         return SRC_UNATTACHED;
3676                 else
3677                         return SNK_UNATTACHED;
3678         } else if (port->port_type == TYPEC_PORT_SRC) {
3679                 return SRC_UNATTACHED;
3680         }
3681
3682         return SNK_UNATTACHED;
3683 }
3684
3685 static void tcpm_check_send_discover(struct tcpm_port *port)
3686 {
3687         if ((port->data_role == TYPEC_HOST || port->negotiated_rev > PD_REV20) &&
3688             port->send_discover && port->pd_capable)
3689                 tcpm_send_vdm(port, USB_SID_PD, CMD_DISCOVER_IDENT, NULL, 0);
3690         port->send_discover = false;
3691 }
3692
3693 static void tcpm_swap_complete(struct tcpm_port *port, int result)
3694 {
3695         if (port->swap_pending) {
3696                 port->swap_status = result;
3697                 port->swap_pending = false;
3698                 port->non_pd_role_swap = false;
3699                 complete(&port->swap_complete);
3700         }
3701 }
3702
3703 static enum typec_pwr_opmode tcpm_get_pwr_opmode(enum typec_cc_status cc)
3704 {
3705         switch (cc) {
3706         case TYPEC_CC_RP_1_5:
3707                 return TYPEC_PWR_MODE_1_5A;
3708         case TYPEC_CC_RP_3_0:
3709                 return TYPEC_PWR_MODE_3_0A;
3710         case TYPEC_CC_RP_DEF:
3711         default:
3712                 return TYPEC_PWR_MODE_USB;
3713         }
3714 }
3715
3716 static void run_state_machine(struct tcpm_port *port)
3717 {
3718         int ret;
3719         enum typec_pwr_opmode opmode;
3720         unsigned int msecs;
3721         enum tcpm_state upcoming_state;
3722
3723         port->enter_state = port->state;
3724         switch (port->state) {
3725         case TOGGLING:
3726                 break;
3727         /* SRC states */
3728         case SRC_UNATTACHED:
3729                 if (!port->non_pd_role_swap)
3730                         tcpm_swap_complete(port, -ENOTCONN);
3731                 tcpm_src_detach(port);
3732                 if (tcpm_start_toggling(port, tcpm_rp_cc(port))) {
3733                         tcpm_set_state(port, TOGGLING, 0);
3734                         break;
3735                 }
3736                 tcpm_set_cc(port, tcpm_rp_cc(port));
3737                 if (port->port_type == TYPEC_PORT_DRP)
3738                         tcpm_set_state(port, SNK_UNATTACHED, PD_T_DRP_SNK);
3739                 break;
3740         case SRC_ATTACH_WAIT:
3741                 if (tcpm_port_is_debug(port))
3742                         tcpm_set_state(port, DEBUG_ACC_ATTACHED,
3743                                        PD_T_CC_DEBOUNCE);
3744                 else if (tcpm_port_is_audio(port))
3745                         tcpm_set_state(port, AUDIO_ACC_ATTACHED,
3746                                        PD_T_CC_DEBOUNCE);
3747                 else if (tcpm_port_is_source(port) && port->vbus_vsafe0v)
3748                         tcpm_set_state(port,
3749                                        tcpm_try_snk(port) ? SNK_TRY
3750                                                           : SRC_ATTACHED,
3751                                        PD_T_CC_DEBOUNCE);
3752                 break;
3753
3754         case SNK_TRY:
3755                 port->try_snk_count++;
3756                 /*
3757                  * Requirements:
3758                  * - Do not drive vconn or vbus
3759                  * - Terminate CC pins (both) to Rd
3760                  * Action:
3761                  * - Wait for tDRPTry (PD_T_DRP_TRY).
3762                  *   Until then, ignore any state changes.
3763                  */
3764                 tcpm_set_cc(port, TYPEC_CC_RD);
3765                 tcpm_set_state(port, SNK_TRY_WAIT, PD_T_DRP_TRY);
3766                 break;
3767         case SNK_TRY_WAIT:
3768                 if (tcpm_port_is_sink(port)) {
3769                         tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE, 0);
3770                 } else {
3771                         tcpm_set_state(port, SRC_TRYWAIT, 0);
3772                         port->max_wait = 0;
3773                 }
3774                 break;
3775         case SNK_TRY_WAIT_DEBOUNCE:
3776                 tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS,
3777                                PD_T_TRY_CC_DEBOUNCE);
3778                 break;
3779         case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
3780                 if (port->vbus_present && tcpm_port_is_sink(port))
3781                         tcpm_set_state(port, SNK_ATTACHED, 0);
3782                 else
3783                         port->max_wait = 0;
3784                 break;
3785         case SRC_TRYWAIT:
3786                 tcpm_set_cc(port, tcpm_rp_cc(port));
3787                 if (port->max_wait == 0) {
3788                         port->max_wait = jiffies +
3789                                          msecs_to_jiffies(PD_T_DRP_TRY);
3790                         tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED,
3791                                        PD_T_DRP_TRY);
3792                 } else {
3793                         if (time_is_after_jiffies(port->max_wait))
3794                                 tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED,
3795                                                jiffies_to_msecs(port->max_wait -
3796                                                                 jiffies));
3797                         else
3798                                 tcpm_set_state(port, SNK_UNATTACHED, 0);
3799                 }
3800                 break;
3801         case SRC_TRYWAIT_DEBOUNCE:
3802                 tcpm_set_state(port, SRC_ATTACHED, PD_T_CC_DEBOUNCE);
3803                 break;
3804         case SRC_TRYWAIT_UNATTACHED:
3805                 tcpm_set_state(port, SNK_UNATTACHED, 0);
3806                 break;
3807
3808         case SRC_ATTACHED:
3809                 ret = tcpm_src_attach(port);
3810                 tcpm_set_state(port, SRC_UNATTACHED,
3811                                ret < 0 ? 0 : PD_T_PS_SOURCE_ON);
3812                 break;
3813         case SRC_STARTUP:
3814                 opmode =  tcpm_get_pwr_opmode(tcpm_rp_cc(port));
3815                 typec_set_pwr_opmode(port->typec_port, opmode);
3816                 port->pwr_opmode = TYPEC_PWR_MODE_USB;
3817                 port->caps_count = 0;
3818                 port->negotiated_rev = PD_MAX_REV;
3819                 port->message_id = 0;
3820                 port->rx_msgid = -1;
3821                 port->explicit_contract = false;
3822                 /* SNK -> SRC POWER/FAST_ROLE_SWAP finished */
3823                 if (port->ams == POWER_ROLE_SWAP ||
3824                     port->ams == FAST_ROLE_SWAP)
3825                         tcpm_ams_finish(port);
3826                 port->upcoming_state = SRC_SEND_CAPABILITIES;
3827                 tcpm_ams_start(port, POWER_NEGOTIATION);
3828                 break;
3829         case SRC_SEND_CAPABILITIES:
3830                 port->caps_count++;
3831                 if (port->caps_count > PD_N_CAPS_COUNT) {
3832                         tcpm_set_state(port, SRC_READY, 0);
3833                         break;
3834                 }
3835                 ret = tcpm_pd_send_source_caps(port);
3836                 if (ret < 0) {
3837                         tcpm_set_state(port, SRC_SEND_CAPABILITIES,
3838                                        PD_T_SEND_SOURCE_CAP);
3839                 } else {
3840                         /*
3841                          * Per standard, we should clear the reset counter here.
3842                          * However, that can result in state machine hang-ups.
3843                          * Reset it only in READY state to improve stability.
3844                          */
3845                         /* port->hard_reset_count = 0; */
3846                         port->caps_count = 0;
3847                         port->pd_capable = true;
3848                         tcpm_set_state_cond(port, SRC_SEND_CAPABILITIES_TIMEOUT,
3849                                             PD_T_SEND_SOURCE_CAP);
3850                 }
3851                 break;
3852         case SRC_SEND_CAPABILITIES_TIMEOUT:
3853                 /*
3854                  * Error recovery for a PD_DATA_SOURCE_CAP reply timeout.
3855                  *
3856                  * PD 2.0 sinks are supposed to accept src-capabilities with a
3857                  * 3.0 header and simply ignore any src PDOs which the sink does
3858                  * not understand such as PPS but some 2.0 sinks instead ignore
3859                  * the entire PD_DATA_SOURCE_CAP message, causing contract
3860                  * negotiation to fail.
3861                  *
3862                  * After PD_N_HARD_RESET_COUNT hard-reset attempts, we try
3863                  * sending src-capabilities with a lower PD revision to
3864                  * make these broken sinks work.
3865                  */
3866                 if (port->hard_reset_count < PD_N_HARD_RESET_COUNT) {
3867                         tcpm_set_state(port, HARD_RESET_SEND, 0);
3868                 } else if (port->negotiated_rev > PD_REV20) {
3869                         port->negotiated_rev--;
3870                         port->hard_reset_count = 0;
3871                         tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
3872                 } else {
3873                         tcpm_set_state(port, hard_reset_state(port), 0);
3874                 }
3875                 break;
3876         case SRC_NEGOTIATE_CAPABILITIES:
3877                 ret = tcpm_pd_check_request(port);
3878                 if (ret < 0) {
3879                         tcpm_pd_send_control(port, PD_CTRL_REJECT);
3880                         if (!port->explicit_contract) {
3881                                 tcpm_set_state(port,
3882                                                SRC_WAIT_NEW_CAPABILITIES, 0);
3883                         } else {
3884                                 tcpm_set_state(port, SRC_READY, 0);
3885                         }
3886                 } else {
3887                         tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
3888                         tcpm_set_partner_usb_comm_capable(port,
3889                                                           !!(port->sink_request & RDO_USB_COMM));
3890                         tcpm_set_state(port, SRC_TRANSITION_SUPPLY,
3891                                        PD_T_SRC_TRANSITION);
3892                 }
3893                 break;
3894         case SRC_TRANSITION_SUPPLY:
3895                 /* XXX: regulator_set_voltage(vbus, ...) */
3896                 tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
3897                 port->explicit_contract = true;
3898                 typec_set_pwr_opmode(port->typec_port, TYPEC_PWR_MODE_PD);
3899                 port->pwr_opmode = TYPEC_PWR_MODE_PD;
3900                 tcpm_set_state_cond(port, SRC_READY, 0);
3901                 break;
3902         case SRC_READY:
3903 #if 1
3904                 port->hard_reset_count = 0;
3905 #endif
3906                 port->try_src_count = 0;
3907
3908                 tcpm_swap_complete(port, 0);
3909                 tcpm_typec_connect(port);
3910
3911                 if (port->ams != NONE_AMS)
3912                         tcpm_ams_finish(port);
3913                 if (port->next_ams != NONE_AMS) {
3914                         port->ams = port->next_ams;
3915                         port->next_ams = NONE_AMS;
3916                 }
3917
3918                 /*
3919                  * If previous AMS is interrupted, switch to the upcoming
3920                  * state.
3921                  */
3922                 if (port->upcoming_state != INVALID_STATE) {
3923                         upcoming_state = port->upcoming_state;
3924                         port->upcoming_state = INVALID_STATE;
3925                         tcpm_set_state(port, upcoming_state, 0);
3926                         break;
3927                 }
3928
3929                 tcpm_check_send_discover(port);
3930                 /*
3931                  * 6.3.5
3932                  * Sending ping messages is not necessary if
3933                  * - the source operates at vSafe5V
3934                  * or
3935                  * - The system is not operating in PD mode
3936                  * or
3937                  * - Both partners are connected using a Type-C connector
3938                  *
3939                  * There is no actual need to send PD messages since the local
3940                  * port type-c and the spec does not clearly say whether PD is
3941                  * possible when type-c is connected to Type-A/B
3942                  */
3943                 break;
3944         case SRC_WAIT_NEW_CAPABILITIES:
3945                 /* Nothing to do... */
3946                 break;
3947
3948         /* SNK states */
3949         case SNK_UNATTACHED:
3950                 if (!port->non_pd_role_swap)
3951                         tcpm_swap_complete(port, -ENOTCONN);
3952                 tcpm_pps_complete(port, -ENOTCONN);
3953                 tcpm_snk_detach(port);
3954                 if (tcpm_start_toggling(port, TYPEC_CC_RD)) {
3955                         tcpm_set_state(port, TOGGLING, 0);
3956                         break;
3957                 }
3958                 tcpm_set_cc(port, TYPEC_CC_RD);
3959                 if (port->port_type == TYPEC_PORT_DRP)
3960                         tcpm_set_state(port, SRC_UNATTACHED, PD_T_DRP_SRC);
3961                 break;
3962         case SNK_ATTACH_WAIT:
3963                 if ((port->cc1 == TYPEC_CC_OPEN &&
3964                      port->cc2 != TYPEC_CC_OPEN) ||
3965                     (port->cc1 != TYPEC_CC_OPEN &&
3966                      port->cc2 == TYPEC_CC_OPEN))
3967                         tcpm_set_state(port, SNK_DEBOUNCED,
3968                                        PD_T_CC_DEBOUNCE);
3969                 else if (tcpm_port_is_disconnected(port))
3970                         tcpm_set_state(port, SNK_UNATTACHED,
3971                                        PD_T_PD_DEBOUNCE);
3972                 break;
3973         case SNK_DEBOUNCED:
3974                 if (tcpm_port_is_disconnected(port))
3975                         tcpm_set_state(port, SNK_UNATTACHED,
3976                                        PD_T_PD_DEBOUNCE);
3977                 else if (port->vbus_present)
3978                         tcpm_set_state(port,
3979                                        tcpm_try_src(port) ? SRC_TRY
3980                                                           : SNK_ATTACHED,
3981                                        0);
3982                 else
3983                         /* Wait for VBUS, but not forever */
3984                         tcpm_set_state(port, PORT_RESET, PD_T_PS_SOURCE_ON);
3985                 break;
3986
3987         case SRC_TRY:
3988                 port->try_src_count++;
3989                 tcpm_set_cc(port, tcpm_rp_cc(port));
3990                 port->max_wait = 0;
3991                 tcpm_set_state(port, SRC_TRY_WAIT, 0);
3992                 break;
3993         case SRC_TRY_WAIT:
3994                 if (port->max_wait == 0) {
3995                         port->max_wait = jiffies +
3996                                          msecs_to_jiffies(PD_T_DRP_TRY);
3997                         msecs = PD_T_DRP_TRY;
3998                 } else {
3999                         if (time_is_after_jiffies(port->max_wait))
4000                                 msecs = jiffies_to_msecs(port->max_wait -
4001                                                          jiffies);
4002                         else
4003                                 msecs = 0;
4004                 }
4005                 tcpm_set_state(port, SNK_TRYWAIT, msecs);
4006                 break;
4007         case SRC_TRY_DEBOUNCE:
4008                 tcpm_set_state(port, SRC_ATTACHED, PD_T_PD_DEBOUNCE);
4009                 break;
4010         case SNK_TRYWAIT:
4011                 tcpm_set_cc(port, TYPEC_CC_RD);
4012                 tcpm_set_state(port, SNK_TRYWAIT_VBUS, PD_T_CC_DEBOUNCE);
4013                 break;
4014         case SNK_TRYWAIT_VBUS:
4015                 /*
4016                  * TCPM stays in this state indefinitely until VBUS
4017                  * is detected as long as Rp is not detected for
4018                  * more than a time period of tPDDebounce.
4019                  */
4020                 if (port->vbus_present && tcpm_port_is_sink(port)) {
4021                         tcpm_set_state(port, SNK_ATTACHED, 0);
4022                         break;
4023                 }
4024                 if (!tcpm_port_is_sink(port))
4025                         tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
4026                 break;
4027         case SNK_TRYWAIT_DEBOUNCE:
4028                 tcpm_set_state(port, SNK_UNATTACHED, PD_T_PD_DEBOUNCE);
4029                 break;
4030         case SNK_ATTACHED:
4031                 ret = tcpm_snk_attach(port);
4032                 if (ret < 0)
4033                         tcpm_set_state(port, SNK_UNATTACHED, 0);
4034                 else
4035                         tcpm_set_state(port, SNK_STARTUP, 0);
4036                 break;
4037         case SNK_STARTUP:
4038                 opmode =  tcpm_get_pwr_opmode(port->polarity ?
4039                                               port->cc2 : port->cc1);
4040                 typec_set_pwr_opmode(port->typec_port, opmode);
4041                 port->pwr_opmode = TYPEC_PWR_MODE_USB;
4042                 port->negotiated_rev = PD_MAX_REV;
4043                 port->message_id = 0;
4044                 port->rx_msgid = -1;
4045                 port->explicit_contract = false;
4046
4047                 if (port->ams == POWER_ROLE_SWAP ||
4048                     port->ams == FAST_ROLE_SWAP)
4049                         /* SRC -> SNK POWER/FAST_ROLE_SWAP finished */
4050                         tcpm_ams_finish(port);
4051
4052                 tcpm_set_state(port, SNK_DISCOVERY, 0);
4053                 break;
4054         case SNK_DISCOVERY:
4055                 if (port->vbus_present) {
4056                         u32 current_lim = tcpm_get_current_limit(port);
4057
4058                         if (port->slow_charger_loop || (current_lim > PD_P_SNK_STDBY_MW / 5))
4059                                 current_lim = PD_P_SNK_STDBY_MW / 5;
4060                         tcpm_set_current_limit(port, current_lim, 5000);
4061                         tcpm_set_charge(port, true);
4062                         tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
4063                         break;
4064                 }
4065                 /*
4066                  * For DRP, timeouts differ. Also, handling is supposed to be
4067                  * different and much more complex (dead battery detection;
4068                  * see USB power delivery specification, section 8.3.3.6.1.5.1).
4069                  */
4070                 tcpm_set_state(port, hard_reset_state(port),
4071                                port->port_type == TYPEC_PORT_DRP ?
4072                                         PD_T_DB_DETECT : PD_T_NO_RESPONSE);
4073                 break;
4074         case SNK_DISCOVERY_DEBOUNCE:
4075                 tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE_DONE,
4076                                PD_T_CC_DEBOUNCE);
4077                 break;
4078         case SNK_DISCOVERY_DEBOUNCE_DONE:
4079                 if (!tcpm_port_is_disconnected(port) &&
4080                     tcpm_port_is_sink(port) &&
4081                     ktime_after(port->delayed_runtime, ktime_get())) {
4082                         tcpm_set_state(port, SNK_DISCOVERY,
4083                                        ktime_to_ms(ktime_sub(port->delayed_runtime, ktime_get())));
4084                         break;
4085                 }
4086                 tcpm_set_state(port, unattached_state(port), 0);
4087                 break;
4088         case SNK_WAIT_CAPABILITIES:
4089                 ret = port->tcpc->set_pd_rx(port->tcpc, true);
4090                 if (ret < 0) {
4091                         tcpm_set_state(port, SNK_READY, 0);
4092                         break;
4093                 }
4094                 /*
4095                  * If VBUS has never been low, and we time out waiting
4096                  * for source cap, try a soft reset first, in case we
4097                  * were already in a stable contract before this boot.
4098                  * Do this only once.
4099                  */
4100                 if (port->vbus_never_low) {
4101                         port->vbus_never_low = false;
4102                         tcpm_set_state(port, SNK_SOFT_RESET,
4103                                        PD_T_SINK_WAIT_CAP);
4104                 } else {
4105                         tcpm_set_state(port, hard_reset_state(port),
4106                                        PD_T_SINK_WAIT_CAP);
4107                 }
4108                 break;
4109         case SNK_NEGOTIATE_CAPABILITIES:
4110                 port->pd_capable = true;
4111                 tcpm_set_partner_usb_comm_capable(port,
4112                                                   !!(port->source_caps[0] & PDO_FIXED_USB_COMM));
4113                 port->hard_reset_count = 0;
4114                 ret = tcpm_pd_send_request(port);
4115                 if (ret < 0) {
4116                         /* Let the Source send capabilities again. */
4117                         tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
4118                 } else {
4119                         tcpm_set_state_cond(port, hard_reset_state(port),
4120                                             PD_T_SENDER_RESPONSE);
4121                 }
4122                 break;
4123         case SNK_NEGOTIATE_PPS_CAPABILITIES:
4124                 ret = tcpm_pd_send_pps_request(port);
4125                 if (ret < 0) {
4126                         port->pps_status = ret;
4127                         /*
4128                          * If this was called due to updates to sink
4129                          * capabilities, and pps is no longer valid, we should
4130                          * safely fall back to a standard PDO.
4131                          */
4132                         if (port->update_sink_caps)
4133                                 tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
4134                         else
4135                                 tcpm_set_state(port, SNK_READY, 0);
4136                 } else {
4137                         tcpm_set_state_cond(port, hard_reset_state(port),
4138                                             PD_T_SENDER_RESPONSE);
4139                 }
4140                 break;
4141         case SNK_TRANSITION_SINK:
4142                 /* From the USB PD spec:
4143                  * "The Sink Shall transition to Sink Standby before a positive or
4144                  * negative voltage transition of VBUS. During Sink Standby
4145                  * the Sink Shall reduce its power draw to pSnkStdby."
4146                  *
4147                  * This is not applicable to PPS though as the port can continue
4148                  * to draw negotiated power without switching to standby.
4149                  */
4150                 if (port->supply_voltage != port->req_supply_voltage && !port->pps_data.active &&
4151                     port->current_limit * port->supply_voltage / 1000 > PD_P_SNK_STDBY_MW) {
4152                         u32 stdby_ma = PD_P_SNK_STDBY_MW * 1000 / port->supply_voltage;
4153
4154                         tcpm_log(port, "Setting standby current %u mV @ %u mA",
4155                                  port->supply_voltage, stdby_ma);
4156                         tcpm_set_current_limit(port, stdby_ma, port->supply_voltage);
4157                 }
4158                 fallthrough;
4159         case SNK_TRANSITION_SINK_VBUS:
4160                 tcpm_set_state(port, hard_reset_state(port),
4161                                PD_T_PS_TRANSITION);
4162                 break;
4163         case SNK_READY:
4164                 port->try_snk_count = 0;
4165                 port->update_sink_caps = false;
4166                 if (port->explicit_contract) {
4167                         typec_set_pwr_opmode(port->typec_port,
4168                                              TYPEC_PWR_MODE_PD);
4169                         port->pwr_opmode = TYPEC_PWR_MODE_PD;
4170                 }
4171
4172                 if (!port->pd_capable && port->slow_charger_loop)
4173                         tcpm_set_current_limit(port, tcpm_get_current_limit(port), 5000);
4174                 tcpm_swap_complete(port, 0);
4175                 tcpm_typec_connect(port);
4176                 mod_enable_frs_delayed_work(port, 0);
4177                 tcpm_pps_complete(port, port->pps_status);
4178
4179                 if (port->ams != NONE_AMS)
4180                         tcpm_ams_finish(port);
4181                 if (port->next_ams != NONE_AMS) {
4182                         port->ams = port->next_ams;
4183                         port->next_ams = NONE_AMS;
4184                 }
4185
4186                 /*
4187                  * If previous AMS is interrupted, switch to the upcoming
4188                  * state.
4189                  */
4190                 if (port->upcoming_state != INVALID_STATE) {
4191                         upcoming_state = port->upcoming_state;
4192                         port->upcoming_state = INVALID_STATE;
4193                         tcpm_set_state(port, upcoming_state, 0);
4194                         break;
4195                 }
4196
4197                 tcpm_check_send_discover(port);
4198                 power_supply_changed(port->psy);
4199                 break;
4200
4201         /* Accessory states */
4202         case ACC_UNATTACHED:
4203                 tcpm_acc_detach(port);
4204                 tcpm_set_state(port, SRC_UNATTACHED, 0);
4205                 break;
4206         case DEBUG_ACC_ATTACHED:
4207         case AUDIO_ACC_ATTACHED:
4208                 ret = tcpm_acc_attach(port);
4209                 if (ret < 0)
4210                         tcpm_set_state(port, ACC_UNATTACHED, 0);
4211                 break;
4212         case AUDIO_ACC_DEBOUNCE:
4213                 tcpm_set_state(port, ACC_UNATTACHED, PD_T_CC_DEBOUNCE);
4214                 break;
4215
4216         /* Hard_Reset states */
4217         case HARD_RESET_SEND:
4218                 if (port->ams != NONE_AMS)
4219                         tcpm_ams_finish(port);
4220                 /*
4221                  * State machine will be directed to HARD_RESET_START,
4222                  * thus set upcoming_state to INVALID_STATE.
4223                  */
4224                 port->upcoming_state = INVALID_STATE;
4225                 tcpm_ams_start(port, HARD_RESET);
4226                 break;
4227         case HARD_RESET_START:
4228                 port->sink_cap_done = false;
4229                 if (port->tcpc->enable_frs)
4230                         port->tcpc->enable_frs(port->tcpc, false);
4231                 port->hard_reset_count++;
4232                 port->tcpc->set_pd_rx(port->tcpc, false);
4233                 tcpm_unregister_altmodes(port);
4234                 port->nr_sink_caps = 0;
4235                 port->send_discover = true;
4236                 if (port->pwr_role == TYPEC_SOURCE)
4237                         tcpm_set_state(port, SRC_HARD_RESET_VBUS_OFF,
4238                                        PD_T_PS_HARD_RESET);
4239                 else
4240                         tcpm_set_state(port, SNK_HARD_RESET_SINK_OFF, 0);
4241                 break;
4242         case SRC_HARD_RESET_VBUS_OFF:
4243                 /*
4244                  * 7.1.5 Response to Hard Resets
4245                  * Hard Reset Signaling indicates a communication failure has occurred and the
4246                  * Source Shall stop driving VCONN, Shall remove Rp from the VCONN pin and Shall
4247                  * drive VBUS to vSafe0V as shown in Figure 7-9.
4248                  */
4249                 tcpm_set_vconn(port, false);
4250                 tcpm_set_vbus(port, false);
4251                 tcpm_set_roles(port, port->self_powered, TYPEC_SOURCE,
4252                                tcpm_data_role_for_source(port));
4253                 /*
4254                  * If tcpc fails to notify vbus off, TCPM will wait for PD_T_SAFE_0V +
4255                  * PD_T_SRC_RECOVER before turning vbus back on.
4256                  * From Table 7-12 Sequence Description for a Source Initiated Hard Reset:
4257                  * 4. Policy Engine waits tPSHardReset after sending Hard Reset Signaling and then
4258                  * tells the Device Policy Manager to instruct the power supply to perform a
4259                  * Hard Reset. The transition to vSafe0V Shall occur within tSafe0V (t2).
4260                  * 5. After tSrcRecover the Source applies power to VBUS in an attempt to
4261                  * re-establish communication with the Sink and resume USB Default Operation.
4262                  * The transition to vSafe5V Shall occur within tSrcTurnOn(t4).
4263                  */
4264                 tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SAFE_0V + PD_T_SRC_RECOVER);
4265                 break;
4266         case SRC_HARD_RESET_VBUS_ON:
4267                 tcpm_set_vconn(port, true);
4268                 tcpm_set_vbus(port, true);
4269                 if (port->ams == HARD_RESET)
4270                         tcpm_ams_finish(port);
4271                 port->tcpc->set_pd_rx(port->tcpc, true);
4272                 tcpm_set_attached_state(port, true);
4273                 tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON);
4274                 break;
4275         case SNK_HARD_RESET_SINK_OFF:
4276                 /* Do not discharge/disconnect during hard reseet */
4277                 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, 0);
4278                 memset(&port->pps_data, 0, sizeof(port->pps_data));
4279                 tcpm_set_vconn(port, false);
4280                 if (port->pd_capable)
4281                         tcpm_set_charge(port, false);
4282                 tcpm_set_roles(port, port->self_powered, TYPEC_SINK,
4283                                tcpm_data_role_for_sink(port));
4284                 /*
4285                  * VBUS may or may not toggle, depending on the adapter.
4286                  * If it doesn't toggle, transition to SNK_HARD_RESET_SINK_ON
4287                  * directly after timeout.
4288                  */
4289                 tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, PD_T_SAFE_0V);
4290                 break;
4291         case SNK_HARD_RESET_WAIT_VBUS:
4292                 if (port->ams == HARD_RESET)
4293                         tcpm_ams_finish(port);
4294                 /* Assume we're disconnected if VBUS doesn't come back. */
4295                 tcpm_set_state(port, SNK_UNATTACHED,
4296                                PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON);
4297                 break;
4298         case SNK_HARD_RESET_SINK_ON:
4299                 /* Note: There is no guarantee that VBUS is on in this state */
4300                 /*
4301                  * XXX:
4302                  * The specification suggests that dual mode ports in sink
4303                  * mode should transition to state PE_SRC_Transition_to_default.
4304                  * See USB power delivery specification chapter 8.3.3.6.1.3.
4305                  * This would mean to to
4306                  * - turn off VCONN, reset power supply
4307                  * - request hardware reset
4308                  * - turn on VCONN
4309                  * - Transition to state PE_Src_Startup
4310                  * SNK only ports shall transition to state Snk_Startup
4311                  * (see chapter 8.3.3.3.8).
4312                  * Similar, dual-mode ports in source mode should transition
4313                  * to PE_SNK_Transition_to_default.
4314                  */
4315                 if (port->pd_capable) {
4316                         tcpm_set_current_limit(port,
4317                                                tcpm_get_current_limit(port),
4318                                                5000);
4319                         tcpm_set_charge(port, true);
4320                 }
4321                 if (port->ams == HARD_RESET)
4322                         tcpm_ams_finish(port);
4323                 tcpm_set_attached_state(port, true);
4324                 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, VSAFE5V);
4325                 tcpm_set_state(port, SNK_STARTUP, 0);
4326                 break;
4327
4328         /* Soft_Reset states */
4329         case SOFT_RESET:
4330                 port->message_id = 0;
4331                 port->rx_msgid = -1;
4332                 tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
4333                 tcpm_ams_finish(port);
4334                 if (port->pwr_role == TYPEC_SOURCE) {
4335                         port->upcoming_state = SRC_SEND_CAPABILITIES;
4336                         tcpm_ams_start(port, POWER_NEGOTIATION);
4337                 } else {
4338                         tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
4339                 }
4340                 break;
4341         case SRC_SOFT_RESET_WAIT_SNK_TX:
4342         case SNK_SOFT_RESET:
4343                 if (port->ams != NONE_AMS)
4344                         tcpm_ams_finish(port);
4345                 port->upcoming_state = SOFT_RESET_SEND;
4346                 tcpm_ams_start(port, SOFT_RESET_AMS);
4347                 break;
4348         case SOFT_RESET_SEND:
4349                 port->message_id = 0;
4350                 port->rx_msgid = -1;
4351                 if (tcpm_pd_send_control(port, PD_CTRL_SOFT_RESET))
4352                         tcpm_set_state_cond(port, hard_reset_state(port), 0);
4353                 else
4354                         tcpm_set_state_cond(port, hard_reset_state(port),
4355                                             PD_T_SENDER_RESPONSE);
4356                 break;
4357
4358         /* DR_Swap states */
4359         case DR_SWAP_SEND:
4360                 tcpm_pd_send_control(port, PD_CTRL_DR_SWAP);
4361                 tcpm_set_state_cond(port, DR_SWAP_SEND_TIMEOUT,
4362                                     PD_T_SENDER_RESPONSE);
4363                 break;
4364         case DR_SWAP_ACCEPT:
4365                 tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
4366                 /* Set VDM state machine running flag ASAP */
4367                 if (port->data_role == TYPEC_DEVICE && port->send_discover)
4368                         port->vdm_sm_running = true;
4369                 tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0);
4370                 break;
4371         case DR_SWAP_SEND_TIMEOUT:
4372                 tcpm_swap_complete(port, -ETIMEDOUT);
4373                 tcpm_ams_finish(port);
4374                 tcpm_set_state(port, ready_state(port), 0);
4375                 break;
4376         case DR_SWAP_CHANGE_DR:
4377                 if (port->data_role == TYPEC_HOST) {
4378                         tcpm_unregister_altmodes(port);
4379                         tcpm_set_roles(port, true, port->pwr_role,
4380                                        TYPEC_DEVICE);
4381                 } else {
4382                         tcpm_set_roles(port, true, port->pwr_role,
4383                                        TYPEC_HOST);
4384                         port->send_discover = true;
4385                 }
4386                 tcpm_ams_finish(port);
4387                 tcpm_set_state(port, ready_state(port), 0);
4388                 break;
4389
4390         case FR_SWAP_SEND:
4391                 if (tcpm_pd_send_control(port, PD_CTRL_FR_SWAP)) {
4392                         tcpm_set_state(port, ERROR_RECOVERY, 0);
4393                         break;
4394                 }
4395                 tcpm_set_state_cond(port, FR_SWAP_SEND_TIMEOUT, PD_T_SENDER_RESPONSE);
4396                 break;
4397         case FR_SWAP_SEND_TIMEOUT:
4398                 tcpm_set_state(port, ERROR_RECOVERY, 0);
4399                 break;
4400         case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
4401                 tcpm_set_state(port, ERROR_RECOVERY, PD_T_PS_SOURCE_OFF);
4402                 break;
4403         case FR_SWAP_SNK_SRC_NEW_SINK_READY:
4404                 if (port->vbus_source)
4405                         tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0);
4406                 else
4407                         tcpm_set_state(port, ERROR_RECOVERY, PD_T_RECEIVER_RESPONSE);
4408                 break;
4409         case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
4410                 tcpm_set_pwr_role(port, TYPEC_SOURCE);
4411                 if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY)) {
4412                         tcpm_set_state(port, ERROR_RECOVERY, 0);
4413                         break;
4414                 }
4415                 tcpm_set_cc(port, tcpm_rp_cc(port));
4416                 tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START);
4417                 break;
4418
4419         /* PR_Swap states */
4420         case PR_SWAP_ACCEPT:
4421                 tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
4422                 tcpm_set_state(port, PR_SWAP_START, 0);
4423                 break;
4424         case PR_SWAP_SEND:
4425                 tcpm_pd_send_control(port, PD_CTRL_PR_SWAP);
4426                 tcpm_set_state_cond(port, PR_SWAP_SEND_TIMEOUT,
4427                                     PD_T_SENDER_RESPONSE);
4428                 break;
4429         case PR_SWAP_SEND_TIMEOUT:
4430                 tcpm_swap_complete(port, -ETIMEDOUT);
4431                 tcpm_set_state(port, ready_state(port), 0);
4432                 break;
4433         case PR_SWAP_START:
4434                 if (port->pwr_role == TYPEC_SOURCE)
4435                         tcpm_set_state(port, PR_SWAP_SRC_SNK_TRANSITION_OFF,
4436                                        PD_T_SRC_TRANSITION);
4437                 else
4438                         tcpm_set_state(port, PR_SWAP_SNK_SRC_SINK_OFF, 0);
4439                 break;
4440         case PR_SWAP_SRC_SNK_TRANSITION_OFF:
4441                 /*
4442                  * Prevent vbus discharge circuit from turning on during PR_SWAP
4443                  * as this is not a disconnect.
4444                  */
4445                 tcpm_set_vbus(port, false);
4446                 port->explicit_contract = false;
4447                 /* allow time for Vbus discharge, must be < tSrcSwapStdby */
4448                 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF,
4449                                PD_T_SRCSWAPSTDBY);
4450                 break;
4451         case PR_SWAP_SRC_SNK_SOURCE_OFF:
4452                 tcpm_set_cc(port, TYPEC_CC_RD);
4453                 /* allow CC debounce */
4454                 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED,
4455                                PD_T_CC_DEBOUNCE);
4456                 break;
4457         case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
4458                 /*
4459                  * USB-PD standard, 6.2.1.4, Port Power Role:
4460                  * "During the Power Role Swap Sequence, for the initial Source
4461                  * Port, the Port Power Role field shall be set to Sink in the
4462                  * PS_RDY Message indicating that the initial Source’s power
4463                  * supply is turned off"
4464                  */
4465                 tcpm_set_pwr_role(port, TYPEC_SINK);
4466                 if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY)) {
4467                         tcpm_set_state(port, ERROR_RECOVERY, 0);
4468                         break;
4469                 }
4470                 tcpm_set_state(port, ERROR_RECOVERY, PD_T_PS_SOURCE_ON_PRS);
4471                 break;
4472         case PR_SWAP_SRC_SNK_SINK_ON:
4473                 /* Set the vbus disconnect threshold for implicit contract */
4474                 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB, false, VSAFE5V);
4475                 tcpm_set_state(port, SNK_STARTUP, 0);
4476                 break;
4477         case PR_SWAP_SNK_SRC_SINK_OFF:
4478                 /*
4479                  * Prevent vbus discharge circuit from turning on during PR_SWAP
4480                  * as this is not a disconnect.
4481                  */
4482                 tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_USB,
4483                                                        port->pps_data.active, 0);
4484                 tcpm_set_charge(port, false);
4485                 tcpm_set_state(port, hard_reset_state(port),
4486                                PD_T_PS_SOURCE_OFF);
4487                 break;
4488         case PR_SWAP_SNK_SRC_SOURCE_ON:
4489                 tcpm_set_cc(port, tcpm_rp_cc(port));
4490                 tcpm_set_vbus(port, true);
4491                 /*
4492                  * allow time VBUS ramp-up, must be < tNewSrc
4493                  * Also, this window overlaps with CC debounce as well.
4494                  * So, Wait for the max of two which is PD_T_NEWSRC
4495                  */
4496                 tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP,
4497                                PD_T_NEWSRC);
4498                 break;
4499         case PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP:
4500                 /*
4501                  * USB PD standard, 6.2.1.4:
4502                  * "Subsequent Messages initiated by the Policy Engine,
4503                  * such as the PS_RDY Message sent to indicate that Vbus
4504                  * is ready, will have the Port Power Role field set to
4505                  * Source."
4506                  */
4507                 tcpm_set_pwr_role(port, TYPEC_SOURCE);
4508                 tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
4509                 tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START);
4510                 break;
4511
4512         case VCONN_SWAP_ACCEPT:
4513                 tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
4514                 tcpm_ams_finish(port);
4515                 tcpm_set_state(port, VCONN_SWAP_START, 0);
4516                 break;
4517         case VCONN_SWAP_SEND:
4518                 tcpm_pd_send_control(port, PD_CTRL_VCONN_SWAP);
4519                 tcpm_set_state(port, VCONN_SWAP_SEND_TIMEOUT,
4520                                PD_T_SENDER_RESPONSE);
4521                 break;
4522         case VCONN_SWAP_SEND_TIMEOUT:
4523                 tcpm_swap_complete(port, -ETIMEDOUT);
4524                 if (port->data_role == TYPEC_HOST && port->send_discover)
4525                         port->vdm_sm_running = true;
4526                 tcpm_set_state(port, ready_state(port), 0);
4527                 break;
4528         case VCONN_SWAP_START:
4529                 if (port->vconn_role == TYPEC_SOURCE)
4530                         tcpm_set_state(port, VCONN_SWAP_WAIT_FOR_VCONN, 0);
4531                 else
4532                         tcpm_set_state(port, VCONN_SWAP_TURN_ON_VCONN, 0);
4533                 break;
4534         case VCONN_SWAP_WAIT_FOR_VCONN:
4535                 tcpm_set_state(port, hard_reset_state(port),
4536                                PD_T_VCONN_SOURCE_ON);
4537                 break;
4538         case VCONN_SWAP_TURN_ON_VCONN:
4539                 tcpm_set_vconn(port, true);
4540                 tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
4541                 if (port->data_role == TYPEC_HOST && port->send_discover)
4542                         port->vdm_sm_running = true;
4543                 tcpm_set_state(port, ready_state(port), 0);
4544                 break;
4545         case VCONN_SWAP_TURN_OFF_VCONN:
4546                 tcpm_set_vconn(port, false);
4547                 if (port->data_role == TYPEC_HOST && port->send_discover)
4548                         port->vdm_sm_running = true;
4549                 tcpm_set_state(port, ready_state(port), 0);
4550                 break;
4551
4552         case DR_SWAP_CANCEL:
4553         case PR_SWAP_CANCEL:
4554         case VCONN_SWAP_CANCEL:
4555                 tcpm_swap_complete(port, port->swap_status);
4556                 if (port->data_role == TYPEC_HOST && port->send_discover)
4557                         port->vdm_sm_running = true;
4558                 if (port->pwr_role == TYPEC_SOURCE)
4559                         tcpm_set_state(port, SRC_READY, 0);
4560                 else
4561                         tcpm_set_state(port, SNK_READY, 0);
4562                 break;
4563         case FR_SWAP_CANCEL:
4564                 if (port->pwr_role == TYPEC_SOURCE)
4565                         tcpm_set_state(port, SRC_READY, 0);
4566                 else
4567                         tcpm_set_state(port, SNK_READY, 0);
4568                 break;
4569
4570         case BIST_RX:
4571                 switch (BDO_MODE_MASK(port->bist_request)) {
4572                 case BDO_MODE_CARRIER2:
4573                         tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL);
4574                         tcpm_set_state(port, unattached_state(port),
4575                                        PD_T_BIST_CONT_MODE);
4576                         break;
4577                 case BDO_MODE_TESTDATA:
4578                         if (port->tcpc->set_bist_data) {
4579                                 tcpm_log(port, "Enable BIST MODE TESTDATA");
4580                                 port->tcpc->set_bist_data(port->tcpc, true);
4581                         }
4582                         break;
4583                 default:
4584                         break;
4585                 }
4586                 break;
4587         case GET_STATUS_SEND:
4588                 tcpm_pd_send_control(port, PD_CTRL_GET_STATUS);
4589                 tcpm_set_state(port, GET_STATUS_SEND_TIMEOUT,
4590                                PD_T_SENDER_RESPONSE);
4591                 break;
4592         case GET_STATUS_SEND_TIMEOUT:
4593                 tcpm_set_state(port, ready_state(port), 0);
4594                 break;
4595         case GET_PPS_STATUS_SEND:
4596                 tcpm_pd_send_control(port, PD_CTRL_GET_PPS_STATUS);
4597                 tcpm_set_state(port, GET_PPS_STATUS_SEND_TIMEOUT,
4598                                PD_T_SENDER_RESPONSE);
4599                 break;
4600         case GET_PPS_STATUS_SEND_TIMEOUT:
4601                 tcpm_set_state(port, ready_state(port), 0);
4602                 break;
4603         case GET_SINK_CAP:
4604                 tcpm_pd_send_control(port, PD_CTRL_GET_SINK_CAP);
4605                 tcpm_set_state(port, GET_SINK_CAP_TIMEOUT, PD_T_SENDER_RESPONSE);
4606                 break;
4607         case GET_SINK_CAP_TIMEOUT:
4608                 port->sink_cap_done = true;
4609                 tcpm_set_state(port, ready_state(port), 0);
4610                 break;
4611         case ERROR_RECOVERY:
4612                 tcpm_swap_complete(port, -EPROTO);
4613                 tcpm_pps_complete(port, -EPROTO);
4614                 tcpm_set_state(port, PORT_RESET, 0);
4615                 break;
4616         case PORT_RESET:
4617                 tcpm_reset_port(port);
4618                 tcpm_set_cc(port, TYPEC_CC_OPEN);
4619                 tcpm_set_state(port, PORT_RESET_WAIT_OFF,
4620                                PD_T_ERROR_RECOVERY);
4621                 break;
4622         case PORT_RESET_WAIT_OFF:
4623                 tcpm_set_state(port,
4624                                tcpm_default_state(port),
4625                                port->vbus_present ? PD_T_PS_SOURCE_OFF : 0);
4626                 break;
4627
4628         /* AMS intermediate state */
4629         case AMS_START:
4630                 if (port->upcoming_state == INVALID_STATE) {
4631                         tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ?
4632                                        SRC_READY : SNK_READY, 0);
4633                         break;
4634                 }
4635
4636                 upcoming_state = port->upcoming_state;
4637                 port->upcoming_state = INVALID_STATE;
4638                 tcpm_set_state(port, upcoming_state, 0);
4639                 break;
4640
4641         /* Chunk state */
4642         case CHUNK_NOT_SUPP:
4643                 tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP);
4644                 tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ? SRC_READY : SNK_READY, 0);
4645                 break;
4646         default:
4647                 WARN(1, "Unexpected port state %d\n", port->state);
4648                 break;
4649         }
4650 }
4651
4652 static void tcpm_state_machine_work(struct kthread_work *work)
4653 {
4654         struct tcpm_port *port = container_of(work, struct tcpm_port, state_machine);
4655         enum tcpm_state prev_state;
4656
4657         mutex_lock(&port->lock);
4658         port->state_machine_running = true;
4659
4660         if (port->queued_message && tcpm_send_queued_message(port))
4661                 goto done;
4662
4663         /* If we were queued due to a delayed state change, update it now */
4664         if (port->delayed_state) {
4665                 tcpm_log(port, "state change %s -> %s [delayed %ld ms]",
4666                          tcpm_states[port->state],
4667                          tcpm_states[port->delayed_state], port->delay_ms);
4668                 port->prev_state = port->state;
4669                 port->state = port->delayed_state;
4670                 port->delayed_state = INVALID_STATE;
4671         }
4672
4673         /*
4674          * Continue running as long as we have (non-delayed) state changes
4675          * to make.
4676          */
4677         do {
4678                 prev_state = port->state;
4679                 run_state_machine(port);
4680                 if (port->queued_message)
4681                         tcpm_send_queued_message(port);
4682         } while (port->state != prev_state && !port->delayed_state);
4683
4684 done:
4685         port->state_machine_running = false;
4686         mutex_unlock(&port->lock);
4687 }
4688
4689 static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
4690                             enum typec_cc_status cc2)
4691 {
4692         enum typec_cc_status old_cc1, old_cc2;
4693         enum tcpm_state new_state;
4694
4695         old_cc1 = port->cc1;
4696         old_cc2 = port->cc2;
4697         port->cc1 = cc1;
4698         port->cc2 = cc2;
4699
4700         tcpm_log_force(port,
4701                        "CC1: %u -> %u, CC2: %u -> %u [state %s, polarity %d, %s]",
4702                        old_cc1, cc1, old_cc2, cc2, tcpm_states[port->state],
4703                        port->polarity,
4704                        tcpm_port_is_disconnected(port) ? "disconnected"
4705                                                        : "connected");
4706
4707         switch (port->state) {
4708         case TOGGLING:
4709                 if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) ||
4710                     tcpm_port_is_source(port))
4711                         tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
4712                 else if (tcpm_port_is_sink(port))
4713                         tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
4714                 break;
4715         case SRC_UNATTACHED:
4716         case ACC_UNATTACHED:
4717                 if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) ||
4718                     tcpm_port_is_source(port))
4719                         tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
4720                 break;
4721         case SRC_ATTACH_WAIT:
4722                 if (tcpm_port_is_disconnected(port) ||
4723                     tcpm_port_is_audio_detached(port))
4724                         tcpm_set_state(port, SRC_UNATTACHED, 0);
4725                 else if (cc1 != old_cc1 || cc2 != old_cc2)
4726                         tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
4727                 break;
4728         case SRC_ATTACHED:
4729         case SRC_SEND_CAPABILITIES:
4730         case SRC_READY:
4731                 if (tcpm_port_is_disconnected(port) ||
4732                     !tcpm_port_is_source(port)) {
4733                         if (port->port_type == TYPEC_PORT_SRC)
4734                                 tcpm_set_state(port, SRC_UNATTACHED, tcpm_wait_for_discharge(port));
4735                         else
4736                                 tcpm_set_state(port, SNK_UNATTACHED, tcpm_wait_for_discharge(port));
4737                 }
4738                 break;
4739         case SNK_UNATTACHED:
4740                 if (tcpm_port_is_sink(port))
4741                         tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
4742                 break;
4743         case SNK_ATTACH_WAIT:
4744                 if ((port->cc1 == TYPEC_CC_OPEN &&
4745                      port->cc2 != TYPEC_CC_OPEN) ||
4746                     (port->cc1 != TYPEC_CC_OPEN &&
4747                      port->cc2 == TYPEC_CC_OPEN))
4748                         new_state = SNK_DEBOUNCED;
4749                 else if (tcpm_port_is_disconnected(port))
4750                         new_state = SNK_UNATTACHED;
4751                 else
4752                         break;
4753                 if (new_state != port->delayed_state)
4754                         tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
4755                 break;
4756         case SNK_DEBOUNCED:
4757                 if (tcpm_port_is_disconnected(port))
4758                         new_state = SNK_UNATTACHED;
4759                 else if (port->vbus_present)
4760                         new_state = tcpm_try_src(port) ? SRC_TRY : SNK_ATTACHED;
4761                 else
4762                         new_state = SNK_UNATTACHED;
4763                 if (new_state != port->delayed_state)
4764                         tcpm_set_state(port, SNK_DEBOUNCED, 0);
4765                 break;
4766         case SNK_READY:
4767                 /*
4768                  * EXIT condition is based primarily on vbus disconnect and CC is secondary.
4769                  * "A port that has entered into USB PD communications with the Source and
4770                  * has seen the CC voltage exceed vRd-USB may monitor the CC pin to detect
4771                  * cable disconnect in addition to monitoring VBUS.
4772                  *
4773                  * A port that is monitoring the CC voltage for disconnect (but is not in
4774                  * the process of a USB PD PR_Swap or USB PD FR_Swap) shall transition to
4775                  * Unattached.SNK within tSinkDisconnect after the CC voltage remains below
4776                  * vRd-USB for tPDDebounce."
4777                  *
4778                  * When set_auto_vbus_discharge_threshold is enabled, CC pins go
4779                  * away before vbus decays to disconnect threshold. Allow
4780                  * disconnect to be driven by vbus disconnect when auto vbus
4781                  * discharge is enabled.
4782                  */
4783                 if (!port->auto_vbus_discharge_enabled && tcpm_port_is_disconnected(port))
4784                         tcpm_set_state(port, unattached_state(port), 0);
4785                 else if (!port->pd_capable &&
4786                          (cc1 != old_cc1 || cc2 != old_cc2))
4787                         tcpm_set_current_limit(port,
4788                                                tcpm_get_current_limit(port),
4789                                                5000);
4790                 break;
4791
4792         case AUDIO_ACC_ATTACHED:
4793                 if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
4794                         tcpm_set_state(port, AUDIO_ACC_DEBOUNCE, 0);
4795                 break;
4796         case AUDIO_ACC_DEBOUNCE:
4797                 if (tcpm_port_is_audio(port))
4798                         tcpm_set_state(port, AUDIO_ACC_ATTACHED, 0);
4799                 break;
4800
4801         case DEBUG_ACC_ATTACHED:
4802                 if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
4803                         tcpm_set_state(port, ACC_UNATTACHED, 0);
4804                 break;
4805
4806         case SNK_TRY:
4807                 /* Do nothing, waiting for timeout */
4808                 break;
4809
4810         case SNK_DISCOVERY:
4811                 /* CC line is unstable, wait for debounce */
4812                 if (tcpm_port_is_disconnected(port))
4813                         tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE, 0);
4814                 break;
4815         case SNK_DISCOVERY_DEBOUNCE:
4816                 break;
4817
4818         case SRC_TRYWAIT:
4819                 /* Hand over to state machine if needed */
4820                 if (!port->vbus_present && tcpm_port_is_source(port))
4821                         tcpm_set_state(port, SRC_TRYWAIT_DEBOUNCE, 0);
4822                 break;
4823         case SRC_TRYWAIT_DEBOUNCE:
4824                 if (port->vbus_present || !tcpm_port_is_source(port))
4825                         tcpm_set_state(port, SRC_TRYWAIT, 0);
4826                 break;
4827         case SNK_TRY_WAIT_DEBOUNCE:
4828                 if (!tcpm_port_is_sink(port)) {
4829                         port->max_wait = 0;
4830                         tcpm_set_state(port, SRC_TRYWAIT, 0);
4831                 }
4832                 break;
4833         case SRC_TRY_WAIT:
4834                 if (tcpm_port_is_source(port))
4835                         tcpm_set_state(port, SRC_TRY_DEBOUNCE, 0);
4836                 break;
4837         case SRC_TRY_DEBOUNCE:
4838                 tcpm_set_state(port, SRC_TRY_WAIT, 0);
4839                 break;
4840         case SNK_TRYWAIT_DEBOUNCE:
4841                 if (tcpm_port_is_sink(port))
4842                         tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
4843                 break;
4844         case SNK_TRYWAIT_VBUS:
4845                 if (!tcpm_port_is_sink(port))
4846                         tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
4847                 break;
4848         case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
4849                 if (!tcpm_port_is_sink(port))
4850                         tcpm_set_state(port, SRC_TRYWAIT, PD_T_TRY_CC_DEBOUNCE);
4851                 else
4852                         tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS, 0);
4853                 break;
4854         case SNK_TRYWAIT:
4855                 /* Do nothing, waiting for tCCDebounce */
4856                 break;
4857         case PR_SWAP_SNK_SRC_SINK_OFF:
4858         case PR_SWAP_SRC_SNK_TRANSITION_OFF:
4859         case PR_SWAP_SRC_SNK_SOURCE_OFF:
4860         case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
4861         case PR_SWAP_SNK_SRC_SOURCE_ON:
4862                 /*
4863                  * CC state change is expected in PR_SWAP
4864                  * Ignore it.
4865                  */
4866                 break;
4867         case FR_SWAP_SEND:
4868         case FR_SWAP_SEND_TIMEOUT:
4869         case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
4870         case FR_SWAP_SNK_SRC_NEW_SINK_READY:
4871         case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
4872                 /* Do nothing, CC change expected */
4873                 break;
4874
4875         case PORT_RESET:
4876         case PORT_RESET_WAIT_OFF:
4877                 /*
4878                  * State set back to default mode once the timer completes.
4879                  * Ignore CC changes here.
4880                  */
4881                 break;
4882         default:
4883                 /*
4884                  * While acting as sink and auto vbus discharge is enabled, Allow disconnect
4885                  * to be driven by vbus disconnect.
4886                  */
4887                 if (tcpm_port_is_disconnected(port) && !(port->pwr_role == TYPEC_SINK &&
4888                                                          port->auto_vbus_discharge_enabled))
4889                         tcpm_set_state(port, unattached_state(port), 0);
4890                 break;
4891         }
4892 }
4893
4894 static void _tcpm_pd_vbus_on(struct tcpm_port *port)
4895 {
4896         tcpm_log_force(port, "VBUS on");
4897         port->vbus_present = true;
4898         /*
4899          * When vbus_present is true i.e. Voltage at VBUS is greater than VSAFE5V implicitly
4900          * states that vbus is not at VSAFE0V, hence clear the vbus_vsafe0v flag here.
4901          */
4902         port->vbus_vsafe0v = false;
4903
4904         switch (port->state) {
4905         case SNK_TRANSITION_SINK_VBUS:
4906                 port->explicit_contract = true;
4907                 /* Set the VDM flag ASAP */
4908                 if (port->data_role == TYPEC_HOST && port->send_discover)
4909                         port->vdm_sm_running = true;
4910                 tcpm_set_state(port, SNK_READY, 0);
4911                 break;
4912         case SNK_DISCOVERY:
4913                 tcpm_set_state(port, SNK_DISCOVERY, 0);
4914                 break;
4915
4916         case SNK_DEBOUNCED:
4917                 tcpm_set_state(port, tcpm_try_src(port) ? SRC_TRY
4918                                                         : SNK_ATTACHED,
4919                                        0);
4920                 break;
4921         case SNK_HARD_RESET_WAIT_VBUS:
4922                 tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, 0);
4923                 break;
4924         case SRC_ATTACHED:
4925                 tcpm_set_state(port, SRC_STARTUP, 0);
4926                 break;
4927         case SRC_HARD_RESET_VBUS_ON:
4928                 tcpm_set_state(port, SRC_STARTUP, 0);
4929                 break;
4930
4931         case SNK_TRY:
4932                 /* Do nothing, waiting for timeout */
4933                 break;
4934         case SRC_TRYWAIT:
4935                 /* Do nothing, Waiting for Rd to be detected */
4936                 break;
4937         case SRC_TRYWAIT_DEBOUNCE:
4938                 tcpm_set_state(port, SRC_TRYWAIT, 0);
4939                 break;
4940         case SNK_TRY_WAIT_DEBOUNCE:
4941                 /* Do nothing, waiting for PD_DEBOUNCE to do be done */
4942                 break;
4943         case SNK_TRYWAIT:
4944                 /* Do nothing, waiting for tCCDebounce */
4945                 break;
4946         case SNK_TRYWAIT_VBUS:
4947                 if (tcpm_port_is_sink(port))
4948                         tcpm_set_state(port, SNK_ATTACHED, 0);
4949                 break;
4950         case SNK_TRYWAIT_DEBOUNCE:
4951                 /* Do nothing, waiting for Rp */
4952                 break;
4953         case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
4954                 if (port->vbus_present && tcpm_port_is_sink(port))
4955                         tcpm_set_state(port, SNK_ATTACHED, 0);
4956                 break;
4957         case SRC_TRY_WAIT:
4958         case SRC_TRY_DEBOUNCE:
4959                 /* Do nothing, waiting for sink detection */
4960                 break;
4961         case FR_SWAP_SEND:
4962         case FR_SWAP_SEND_TIMEOUT:
4963         case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
4964         case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
4965                 if (port->tcpc->frs_sourcing_vbus)
4966                         port->tcpc->frs_sourcing_vbus(port->tcpc);
4967                 break;
4968         case FR_SWAP_SNK_SRC_NEW_SINK_READY:
4969                 if (port->tcpc->frs_sourcing_vbus)
4970                         port->tcpc->frs_sourcing_vbus(port->tcpc);
4971                 tcpm_set_state(port, FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED, 0);
4972                 break;
4973
4974         case PORT_RESET:
4975         case PORT_RESET_WAIT_OFF:
4976                 /*
4977                  * State set back to default mode once the timer completes.
4978                  * Ignore vbus changes here.
4979                  */
4980                 break;
4981
4982         default:
4983                 break;
4984         }
4985 }
4986
4987 static void _tcpm_pd_vbus_off(struct tcpm_port *port)
4988 {
4989         tcpm_log_force(port, "VBUS off");
4990         port->vbus_present = false;
4991         port->vbus_never_low = false;
4992         switch (port->state) {
4993         case SNK_HARD_RESET_SINK_OFF:
4994                 tcpm_set_state(port, SNK_HARD_RESET_WAIT_VBUS, 0);
4995                 break;
4996         case HARD_RESET_SEND:
4997                 break;
4998         case SNK_TRY:
4999                 /* Do nothing, waiting for timeout */
5000                 break;
5001         case SRC_TRYWAIT:
5002                 /* Hand over to state machine if needed */
5003                 if (tcpm_port_is_source(port))
5004                         tcpm_set_state(port, SRC_TRYWAIT_DEBOUNCE, 0);
5005                 break;
5006         case SNK_TRY_WAIT_DEBOUNCE:
5007                 /* Do nothing, waiting for PD_DEBOUNCE to do be done */
5008                 break;
5009         case SNK_TRYWAIT:
5010         case SNK_TRYWAIT_VBUS:
5011         case SNK_TRYWAIT_DEBOUNCE:
5012                 break;
5013         case SNK_ATTACH_WAIT:
5014                 tcpm_set_state(port, SNK_UNATTACHED, 0);
5015                 break;
5016
5017         case SNK_NEGOTIATE_CAPABILITIES:
5018                 break;
5019
5020         case PR_SWAP_SRC_SNK_TRANSITION_OFF:
5021                 tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, 0);
5022                 break;
5023
5024         case PR_SWAP_SNK_SRC_SINK_OFF:
5025                 /* Do nothing, expected */
5026                 break;
5027
5028         case PR_SWAP_SNK_SRC_SOURCE_ON:
5029                 /*
5030                  * Do nothing when vbus off notification is received.
5031                  * TCPM can wait for PD_T_NEWSRC in PR_SWAP_SNK_SRC_SOURCE_ON
5032                  * for the vbus source to ramp up.
5033                  */
5034                 break;
5035
5036         case PORT_RESET_WAIT_OFF:
5037                 tcpm_set_state(port, tcpm_default_state(port), 0);
5038                 break;
5039
5040         case SRC_TRY_WAIT:
5041         case SRC_TRY_DEBOUNCE:
5042                 /* Do nothing, waiting for sink detection */
5043                 break;
5044
5045         case SRC_STARTUP:
5046         case SRC_SEND_CAPABILITIES:
5047         case SRC_SEND_CAPABILITIES_TIMEOUT:
5048         case SRC_NEGOTIATE_CAPABILITIES:
5049         case SRC_TRANSITION_SUPPLY:
5050         case SRC_READY:
5051         case SRC_WAIT_NEW_CAPABILITIES:
5052                 /*
5053                  * Force to unattached state to re-initiate connection.
5054                  * DRP port should move to Unattached.SNK instead of Unattached.SRC if
5055                  * sink removed. Although sink removal here is due to source's vbus collapse,
5056                  * treat it the same way for consistency.
5057                  */
5058                 if (port->port_type == TYPEC_PORT_SRC)
5059                         tcpm_set_state(port, SRC_UNATTACHED, tcpm_wait_for_discharge(port));
5060                 else
5061                         tcpm_set_state(port, SNK_UNATTACHED, tcpm_wait_for_discharge(port));
5062                 break;
5063
5064         case PORT_RESET:
5065                 /*
5066                  * State set back to default mode once the timer completes.
5067                  * Ignore vbus changes here.
5068                  */
5069                 break;
5070
5071         case FR_SWAP_SEND:
5072         case FR_SWAP_SEND_TIMEOUT:
5073         case FR_SWAP_SNK_SRC_TRANSITION_TO_OFF:
5074         case FR_SWAP_SNK_SRC_NEW_SINK_READY:
5075         case FR_SWAP_SNK_SRC_SOURCE_VBUS_APPLIED:
5076                 /* Do nothing, vbus drop expected */
5077                 break;
5078
5079         default:
5080                 if (port->pwr_role == TYPEC_SINK && port->attached)
5081                         tcpm_set_state(port, SNK_UNATTACHED, tcpm_wait_for_discharge(port));
5082                 break;
5083         }
5084 }
5085
5086 static void _tcpm_pd_vbus_vsafe0v(struct tcpm_port *port)
5087 {
5088         tcpm_log_force(port, "VBUS VSAFE0V");
5089         port->vbus_vsafe0v = true;
5090         switch (port->state) {
5091         case SRC_HARD_RESET_VBUS_OFF:
5092                 /*
5093                  * After establishing the vSafe0V voltage condition on VBUS, the Source Shall wait
5094                  * tSrcRecover before re-applying VCONN and restoring VBUS to vSafe5V.
5095                  */
5096                 tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SRC_RECOVER);
5097                 break;
5098         case SRC_ATTACH_WAIT:
5099                 if (tcpm_port_is_source(port))
5100                         tcpm_set_state(port, tcpm_try_snk(port) ? SNK_TRY : SRC_ATTACHED,
5101                                        PD_T_CC_DEBOUNCE);
5102                 break;
5103         case SRC_STARTUP:
5104         case SRC_SEND_CAPABILITIES:
5105         case SRC_SEND_CAPABILITIES_TIMEOUT:
5106         case SRC_NEGOTIATE_CAPABILITIES:
5107         case SRC_TRANSITION_SUPPLY:
5108         case SRC_READY:
5109         case SRC_WAIT_NEW_CAPABILITIES:
5110                 if (port->auto_vbus_discharge_enabled) {
5111                         if (port->port_type == TYPEC_PORT_SRC)
5112                                 tcpm_set_state(port, SRC_UNATTACHED, 0);
5113                         else
5114                                 tcpm_set_state(port, SNK_UNATTACHED, 0);
5115                 }
5116                 break;
5117         default:
5118                 if (port->pwr_role == TYPEC_SINK && port->auto_vbus_discharge_enabled)
5119                         tcpm_set_state(port, SNK_UNATTACHED, 0);
5120                 break;
5121         }
5122 }
5123
5124 static void _tcpm_pd_hard_reset(struct tcpm_port *port)
5125 {
5126         tcpm_log_force(port, "Received hard reset");
5127         if (port->bist_request == BDO_MODE_TESTDATA && port->tcpc->set_bist_data)
5128                 port->tcpc->set_bist_data(port->tcpc, false);
5129
5130         if (port->ams != NONE_AMS)
5131                 port->ams = NONE_AMS;
5132         if (port->hard_reset_count < PD_N_HARD_RESET_COUNT)
5133                 port->ams = HARD_RESET;
5134         /*
5135          * If we keep receiving hard reset requests, executing the hard reset
5136          * must have failed. Revert to error recovery if that happens.
5137          */
5138         tcpm_set_state(port,
5139                        port->hard_reset_count < PD_N_HARD_RESET_COUNT ?
5140                                 HARD_RESET_START : ERROR_RECOVERY,
5141                        0);
5142 }
5143
5144 static void tcpm_pd_event_handler(struct kthread_work *work)
5145 {
5146         struct tcpm_port *port = container_of(work, struct tcpm_port,
5147                                               event_work);
5148         u32 events;
5149
5150         mutex_lock(&port->lock);
5151
5152         spin_lock(&port->pd_event_lock);
5153         while (port->pd_events) {
5154                 events = port->pd_events;
5155                 port->pd_events = 0;
5156                 spin_unlock(&port->pd_event_lock);
5157                 if (events & TCPM_RESET_EVENT)
5158                         _tcpm_pd_hard_reset(port);
5159                 if (events & TCPM_VBUS_EVENT) {
5160                         bool vbus;
5161
5162                         vbus = port->tcpc->get_vbus(port->tcpc);
5163                         if (vbus) {
5164                                 _tcpm_pd_vbus_on(port);
5165                         } else {
5166                                 _tcpm_pd_vbus_off(port);
5167                                 /*
5168                                  * When TCPC does not support detecting vsafe0v voltage level,
5169                                  * treat vbus absent as vsafe0v. Else invoke is_vbus_vsafe0v
5170                                  * to see if vbus has discharge to VSAFE0V.
5171                                  */
5172                                 if (!port->tcpc->is_vbus_vsafe0v ||
5173                                     port->tcpc->is_vbus_vsafe0v(port->tcpc))
5174                                         _tcpm_pd_vbus_vsafe0v(port);
5175                         }
5176                 }
5177                 if (events & TCPM_CC_EVENT) {
5178                         enum typec_cc_status cc1, cc2;
5179
5180                         if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
5181                                 _tcpm_cc_change(port, cc1, cc2);
5182                 }
5183                 if (events & TCPM_FRS_EVENT) {
5184                         if (port->state == SNK_READY) {
5185                                 int ret;
5186
5187                                 port->upcoming_state = FR_SWAP_SEND;
5188                                 ret = tcpm_ams_start(port, FAST_ROLE_SWAP);
5189                                 if (ret == -EAGAIN)
5190                                         port->upcoming_state = INVALID_STATE;
5191                         } else {
5192                                 tcpm_log(port, "Discarding FRS_SIGNAL! Not in sink ready");
5193                         }
5194                 }
5195                 if (events & TCPM_SOURCING_VBUS) {
5196                         tcpm_log(port, "sourcing vbus");
5197                         /*
5198                          * In fast role swap case TCPC autonomously sources vbus. Set vbus_source
5199                          * true as TCPM wouldn't have called tcpm_set_vbus.
5200                          *
5201                          * When vbus is sourced on the command on TCPM i.e. TCPM called
5202                          * tcpm_set_vbus to source vbus, vbus_source would already be true.
5203                          */
5204                         port->vbus_source = true;
5205                         _tcpm_pd_vbus_on(port);
5206                 }
5207
5208                 spin_lock(&port->pd_event_lock);
5209         }
5210         spin_unlock(&port->pd_event_lock);
5211         mutex_unlock(&port->lock);
5212 }
5213
5214 void tcpm_cc_change(struct tcpm_port *port)
5215 {
5216         spin_lock(&port->pd_event_lock);
5217         port->pd_events |= TCPM_CC_EVENT;
5218         spin_unlock(&port->pd_event_lock);
5219         kthread_queue_work(port->wq, &port->event_work);
5220 }
5221 EXPORT_SYMBOL_GPL(tcpm_cc_change);
5222
5223 void tcpm_vbus_change(struct tcpm_port *port)
5224 {
5225         spin_lock(&port->pd_event_lock);
5226         port->pd_events |= TCPM_VBUS_EVENT;
5227         spin_unlock(&port->pd_event_lock);
5228         kthread_queue_work(port->wq, &port->event_work);
5229 }
5230 EXPORT_SYMBOL_GPL(tcpm_vbus_change);
5231
5232 void tcpm_pd_hard_reset(struct tcpm_port *port)
5233 {
5234         spin_lock(&port->pd_event_lock);
5235         port->pd_events = TCPM_RESET_EVENT;
5236         spin_unlock(&port->pd_event_lock);
5237         kthread_queue_work(port->wq, &port->event_work);
5238 }
5239 EXPORT_SYMBOL_GPL(tcpm_pd_hard_reset);
5240
5241 void tcpm_sink_frs(struct tcpm_port *port)
5242 {
5243         spin_lock(&port->pd_event_lock);
5244         port->pd_events = TCPM_FRS_EVENT;
5245         spin_unlock(&port->pd_event_lock);
5246         kthread_queue_work(port->wq, &port->event_work);
5247 }
5248 EXPORT_SYMBOL_GPL(tcpm_sink_frs);
5249
5250 void tcpm_sourcing_vbus(struct tcpm_port *port)
5251 {
5252         spin_lock(&port->pd_event_lock);
5253         port->pd_events = TCPM_SOURCING_VBUS;
5254         spin_unlock(&port->pd_event_lock);
5255         kthread_queue_work(port->wq, &port->event_work);
5256 }
5257 EXPORT_SYMBOL_GPL(tcpm_sourcing_vbus);
5258
5259 static void tcpm_enable_frs_work(struct kthread_work *work)
5260 {
5261         struct tcpm_port *port = container_of(work, struct tcpm_port, enable_frs);
5262         int ret;
5263
5264         mutex_lock(&port->lock);
5265         /* Not FRS capable */
5266         if (!port->connected || port->port_type != TYPEC_PORT_DRP ||
5267             port->pwr_opmode != TYPEC_PWR_MODE_PD ||
5268             !port->tcpc->enable_frs ||
5269             /* Sink caps queried */
5270             port->sink_cap_done || port->negotiated_rev < PD_REV30)
5271                 goto unlock;
5272
5273         /* Send when the state machine is idle */
5274         if (port->state != SNK_READY || port->vdm_sm_running || port->send_discover)
5275                 goto resched;
5276
5277         port->upcoming_state = GET_SINK_CAP;
5278         ret = tcpm_ams_start(port, GET_SINK_CAPABILITIES);
5279         if (ret == -EAGAIN) {
5280                 port->upcoming_state = INVALID_STATE;
5281         } else {
5282                 port->sink_cap_done = true;
5283                 goto unlock;
5284         }
5285 resched:
5286         mod_enable_frs_delayed_work(port, GET_SINK_CAP_RETRY_MS);
5287 unlock:
5288         mutex_unlock(&port->lock);
5289 }
5290
5291 static int tcpm_dr_set(struct typec_port *p, enum typec_data_role data)
5292 {
5293         struct tcpm_port *port = typec_get_drvdata(p);
5294         int ret;
5295
5296         mutex_lock(&port->swap_lock);
5297         mutex_lock(&port->lock);
5298
5299         if (port->typec_caps.data != TYPEC_PORT_DRD) {
5300                 ret = -EINVAL;
5301                 goto port_unlock;
5302         }
5303         if (port->state != SRC_READY && port->state != SNK_READY) {
5304                 ret = -EAGAIN;
5305                 goto port_unlock;
5306         }
5307
5308         if (port->data_role == data) {
5309                 ret = 0;
5310                 goto port_unlock;
5311         }
5312
5313         /*
5314          * XXX
5315          * 6.3.9: If an alternate mode is active, a request to swap
5316          * alternate modes shall trigger a port reset.
5317          * Reject data role swap request in this case.
5318          */
5319
5320         if (!port->pd_capable) {
5321                 /*
5322                  * If the partner is not PD capable, reset the port to
5323                  * trigger a role change. This can only work if a preferred
5324                  * role is configured, and if it matches the requested role.
5325                  */
5326                 if (port->try_role == TYPEC_NO_PREFERRED_ROLE ||
5327                     port->try_role == port->pwr_role) {
5328                         ret = -EINVAL;
5329                         goto port_unlock;
5330                 }
5331                 port->non_pd_role_swap = true;
5332                 tcpm_set_state(port, PORT_RESET, 0);
5333         } else {
5334                 port->upcoming_state = DR_SWAP_SEND;
5335                 ret = tcpm_ams_start(port, DATA_ROLE_SWAP);
5336                 if (ret == -EAGAIN) {
5337                         port->upcoming_state = INVALID_STATE;
5338                         goto port_unlock;
5339                 }
5340         }
5341
5342         port->swap_status = 0;
5343         port->swap_pending = true;
5344         reinit_completion(&port->swap_complete);
5345         mutex_unlock(&port->lock);
5346
5347         if (!wait_for_completion_timeout(&port->swap_complete,
5348                                 msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
5349                 ret = -ETIMEDOUT;
5350         else
5351                 ret = port->swap_status;
5352
5353         port->non_pd_role_swap = false;
5354         goto swap_unlock;
5355
5356 port_unlock:
5357         mutex_unlock(&port->lock);
5358 swap_unlock:
5359         mutex_unlock(&port->swap_lock);
5360         return ret;
5361 }
5362
5363 static int tcpm_pr_set(struct typec_port *p, enum typec_role role)
5364 {
5365         struct tcpm_port *port = typec_get_drvdata(p);
5366         int ret;
5367
5368         mutex_lock(&port->swap_lock);
5369         mutex_lock(&port->lock);
5370
5371         if (port->port_type != TYPEC_PORT_DRP) {
5372                 ret = -EINVAL;
5373                 goto port_unlock;
5374         }
5375         if (port->state != SRC_READY && port->state != SNK_READY) {
5376                 ret = -EAGAIN;
5377                 goto port_unlock;
5378         }
5379
5380         if (role == port->pwr_role) {
5381                 ret = 0;
5382                 goto port_unlock;
5383         }
5384
5385         port->upcoming_state = PR_SWAP_SEND;
5386         ret = tcpm_ams_start(port, POWER_ROLE_SWAP);
5387         if (ret == -EAGAIN) {
5388                 port->upcoming_state = INVALID_STATE;
5389                 goto port_unlock;
5390         }
5391
5392         port->swap_status = 0;
5393         port->swap_pending = true;
5394         reinit_completion(&port->swap_complete);
5395         mutex_unlock(&port->lock);
5396
5397         if (!wait_for_completion_timeout(&port->swap_complete,
5398                                 msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
5399                 ret = -ETIMEDOUT;
5400         else
5401                 ret = port->swap_status;
5402
5403         goto swap_unlock;
5404
5405 port_unlock:
5406         mutex_unlock(&port->lock);
5407 swap_unlock:
5408         mutex_unlock(&port->swap_lock);
5409         return ret;
5410 }
5411
5412 static int tcpm_vconn_set(struct typec_port *p, enum typec_role role)
5413 {
5414         struct tcpm_port *port = typec_get_drvdata(p);
5415         int ret;
5416
5417         mutex_lock(&port->swap_lock);
5418         mutex_lock(&port->lock);
5419
5420         if (port->state != SRC_READY && port->state != SNK_READY) {
5421                 ret = -EAGAIN;
5422                 goto port_unlock;
5423         }
5424
5425         if (role == port->vconn_role) {
5426                 ret = 0;
5427                 goto port_unlock;
5428         }
5429
5430         port->upcoming_state = VCONN_SWAP_SEND;
5431         ret = tcpm_ams_start(port, VCONN_SWAP);
5432         if (ret == -EAGAIN) {
5433                 port->upcoming_state = INVALID_STATE;
5434                 goto port_unlock;
5435         }
5436
5437         port->swap_status = 0;
5438         port->swap_pending = true;
5439         reinit_completion(&port->swap_complete);
5440         mutex_unlock(&port->lock);
5441
5442         if (!wait_for_completion_timeout(&port->swap_complete,
5443                                 msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
5444                 ret = -ETIMEDOUT;
5445         else
5446                 ret = port->swap_status;
5447
5448         goto swap_unlock;
5449
5450 port_unlock:
5451         mutex_unlock(&port->lock);
5452 swap_unlock:
5453         mutex_unlock(&port->swap_lock);
5454         return ret;
5455 }
5456
5457 static int tcpm_try_role(struct typec_port *p, int role)
5458 {
5459         struct tcpm_port *port = typec_get_drvdata(p);
5460         struct tcpc_dev *tcpc = port->tcpc;
5461         int ret = 0;
5462
5463         mutex_lock(&port->lock);
5464         if (tcpc->try_role)
5465                 ret = tcpc->try_role(tcpc, role);
5466         if (!ret)
5467                 port->try_role = role;
5468         port->try_src_count = 0;
5469         port->try_snk_count = 0;
5470         mutex_unlock(&port->lock);
5471
5472         return ret;
5473 }
5474
5475 static int tcpm_pps_set_op_curr(struct tcpm_port *port, u16 req_op_curr)
5476 {
5477         unsigned int target_mw;
5478         int ret;
5479
5480         mutex_lock(&port->swap_lock);
5481         mutex_lock(&port->lock);
5482
5483         if (!port->pps_data.active) {
5484                 ret = -EOPNOTSUPP;
5485                 goto port_unlock;
5486         }
5487
5488         if (port->state != SNK_READY) {
5489                 ret = -EAGAIN;
5490                 goto port_unlock;
5491         }
5492
5493         if (req_op_curr > port->pps_data.max_curr) {
5494                 ret = -EINVAL;
5495                 goto port_unlock;
5496         }
5497
5498         target_mw = (req_op_curr * port->supply_voltage) / 1000;
5499         if (target_mw < port->operating_snk_mw) {
5500                 ret = -EINVAL;
5501                 goto port_unlock;
5502         }
5503
5504         port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
5505         ret = tcpm_ams_start(port, POWER_NEGOTIATION);
5506         if (ret == -EAGAIN) {
5507                 port->upcoming_state = INVALID_STATE;
5508                 goto port_unlock;
5509         }
5510
5511         /* Round down operating current to align with PPS valid steps */
5512         req_op_curr = req_op_curr - (req_op_curr % RDO_PROG_CURR_MA_STEP);
5513
5514         reinit_completion(&port->pps_complete);
5515         port->pps_data.req_op_curr = req_op_curr;
5516         port->pps_status = 0;
5517         port->pps_pending = true;
5518         mutex_unlock(&port->lock);
5519
5520         if (!wait_for_completion_timeout(&port->pps_complete,
5521                                 msecs_to_jiffies(PD_PPS_CTRL_TIMEOUT)))
5522                 ret = -ETIMEDOUT;
5523         else
5524                 ret = port->pps_status;
5525
5526         goto swap_unlock;
5527
5528 port_unlock:
5529         mutex_unlock(&port->lock);
5530 swap_unlock:
5531         mutex_unlock(&port->swap_lock);
5532
5533         return ret;
5534 }
5535
5536 static int tcpm_pps_set_out_volt(struct tcpm_port *port, u16 req_out_volt)
5537 {
5538         unsigned int target_mw;
5539         int ret;
5540
5541         mutex_lock(&port->swap_lock);
5542         mutex_lock(&port->lock);
5543
5544         if (!port->pps_data.active) {
5545                 ret = -EOPNOTSUPP;
5546                 goto port_unlock;
5547         }
5548
5549         if (port->state != SNK_READY) {
5550                 ret = -EAGAIN;
5551                 goto port_unlock;
5552         }
5553
5554         if (req_out_volt < port->pps_data.min_volt ||
5555             req_out_volt > port->pps_data.max_volt) {
5556                 ret = -EINVAL;
5557                 goto port_unlock;
5558         }
5559
5560         target_mw = (port->current_limit * req_out_volt) / 1000;
5561         if (target_mw < port->operating_snk_mw) {
5562                 ret = -EINVAL;
5563                 goto port_unlock;
5564         }
5565
5566         port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
5567         ret = tcpm_ams_start(port, POWER_NEGOTIATION);
5568         if (ret == -EAGAIN) {
5569                 port->upcoming_state = INVALID_STATE;
5570                 goto port_unlock;
5571         }
5572
5573         /* Round down output voltage to align with PPS valid steps */
5574         req_out_volt = req_out_volt - (req_out_volt % RDO_PROG_VOLT_MV_STEP);
5575
5576         reinit_completion(&port->pps_complete);
5577         port->pps_data.req_out_volt = req_out_volt;
5578         port->pps_status = 0;
5579         port->pps_pending = true;
5580         mutex_unlock(&port->lock);
5581
5582         if (!wait_for_completion_timeout(&port->pps_complete,
5583                                 msecs_to_jiffies(PD_PPS_CTRL_TIMEOUT)))
5584                 ret = -ETIMEDOUT;
5585         else
5586                 ret = port->pps_status;
5587
5588         goto swap_unlock;
5589
5590 port_unlock:
5591         mutex_unlock(&port->lock);
5592 swap_unlock:
5593         mutex_unlock(&port->swap_lock);
5594
5595         return ret;
5596 }
5597
5598 static int tcpm_pps_activate(struct tcpm_port *port, bool activate)
5599 {
5600         int ret = 0;
5601
5602         mutex_lock(&port->swap_lock);
5603         mutex_lock(&port->lock);
5604
5605         if (!port->pps_data.supported) {
5606                 ret = -EOPNOTSUPP;
5607                 goto port_unlock;
5608         }
5609
5610         /* Trying to deactivate PPS when already deactivated so just bail */
5611         if (!port->pps_data.active && !activate)
5612                 goto port_unlock;
5613
5614         if (port->state != SNK_READY) {
5615                 ret = -EAGAIN;
5616                 goto port_unlock;
5617         }
5618
5619         if (activate)
5620                 port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES;
5621         else
5622                 port->upcoming_state = SNK_NEGOTIATE_CAPABILITIES;
5623         ret = tcpm_ams_start(port, POWER_NEGOTIATION);
5624         if (ret == -EAGAIN) {
5625                 port->upcoming_state = INVALID_STATE;
5626                 goto port_unlock;
5627         }
5628
5629         reinit_completion(&port->pps_complete);
5630         port->pps_status = 0;
5631         port->pps_pending = true;
5632
5633         /* Trigger PPS request or move back to standard PDO contract */
5634         if (activate) {
5635                 port->pps_data.req_out_volt = port->supply_voltage;
5636                 port->pps_data.req_op_curr = port->current_limit;
5637         }
5638         mutex_unlock(&port->lock);
5639
5640         if (!wait_for_completion_timeout(&port->pps_complete,
5641                                 msecs_to_jiffies(PD_PPS_CTRL_TIMEOUT)))
5642                 ret = -ETIMEDOUT;
5643         else
5644                 ret = port->pps_status;
5645
5646         goto swap_unlock;
5647
5648 port_unlock:
5649         mutex_unlock(&port->lock);
5650 swap_unlock:
5651         mutex_unlock(&port->swap_lock);
5652
5653         return ret;
5654 }
5655
5656 static void tcpm_init(struct tcpm_port *port)
5657 {
5658         enum typec_cc_status cc1, cc2;
5659
5660         port->tcpc->init(port->tcpc);
5661
5662         tcpm_reset_port(port);
5663
5664         /*
5665          * XXX
5666          * Should possibly wait for VBUS to settle if it was enabled locally
5667          * since tcpm_reset_port() will disable VBUS.
5668          */
5669         port->vbus_present = port->tcpc->get_vbus(port->tcpc);
5670         if (port->vbus_present)
5671                 port->vbus_never_low = true;
5672
5673         /*
5674          * 1. When vbus_present is true, voltage on VBUS is already at VSAFE5V.
5675          * So implicitly vbus_vsafe0v = false.
5676          *
5677          * 2. When vbus_present is false and TCPC does NOT support querying
5678          * vsafe0v status, then, it's best to assume vbus is at VSAFE0V i.e.
5679          * vbus_vsafe0v is true.
5680          *
5681          * 3. When vbus_present is false and TCPC does support querying vsafe0v,
5682          * then, query tcpc for vsafe0v status.
5683          */
5684         if (port->vbus_present)
5685                 port->vbus_vsafe0v = false;
5686         else if (!port->tcpc->is_vbus_vsafe0v)
5687                 port->vbus_vsafe0v = true;
5688         else
5689                 port->vbus_vsafe0v = port->tcpc->is_vbus_vsafe0v(port->tcpc);
5690
5691         tcpm_set_state(port, tcpm_default_state(port), 0);
5692
5693         if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
5694                 _tcpm_cc_change(port, cc1, cc2);
5695
5696         /*
5697          * Some adapters need a clean slate at startup, and won't recover
5698          * otherwise. So do not try to be fancy and force a clean disconnect.
5699          */
5700         tcpm_set_state(port, PORT_RESET, 0);
5701 }
5702
5703 static int tcpm_port_type_set(struct typec_port *p, enum typec_port_type type)
5704 {
5705         struct tcpm_port *port = typec_get_drvdata(p);
5706
5707         mutex_lock(&port->lock);
5708         if (type == port->port_type)
5709                 goto port_unlock;
5710
5711         port->port_type = type;
5712
5713         if (!port->connected) {
5714                 tcpm_set_state(port, PORT_RESET, 0);
5715         } else if (type == TYPEC_PORT_SNK) {
5716                 if (!(port->pwr_role == TYPEC_SINK &&
5717                       port->data_role == TYPEC_DEVICE))
5718                         tcpm_set_state(port, PORT_RESET, 0);
5719         } else if (type == TYPEC_PORT_SRC) {
5720                 if (!(port->pwr_role == TYPEC_SOURCE &&
5721                       port->data_role == TYPEC_HOST))
5722                         tcpm_set_state(port, PORT_RESET, 0);
5723         }
5724
5725 port_unlock:
5726         mutex_unlock(&port->lock);
5727         return 0;
5728 }
5729
5730 static const struct typec_operations tcpm_ops = {
5731         .try_role = tcpm_try_role,
5732         .dr_set = tcpm_dr_set,
5733         .pr_set = tcpm_pr_set,
5734         .vconn_set = tcpm_vconn_set,
5735         .port_type_set = tcpm_port_type_set
5736 };
5737
5738 void tcpm_tcpc_reset(struct tcpm_port *port)
5739 {
5740         mutex_lock(&port->lock);
5741         /* XXX: Maintain PD connection if possible? */
5742         tcpm_init(port);
5743         mutex_unlock(&port->lock);
5744 }
5745 EXPORT_SYMBOL_GPL(tcpm_tcpc_reset);
5746
5747 static int tcpm_fw_get_caps(struct tcpm_port *port,
5748                             struct fwnode_handle *fwnode)
5749 {
5750         const char *cap_str;
5751         int ret;
5752         u32 mw, frs_current;
5753
5754         if (!fwnode)
5755                 return -EINVAL;
5756
5757         /* USB data support is optional */
5758         ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
5759         if (ret == 0) {
5760                 ret = typec_find_port_data_role(cap_str);
5761                 if (ret < 0)
5762                         return ret;
5763                 port->typec_caps.data = ret;
5764         }
5765
5766         ret = fwnode_property_read_string(fwnode, "power-role", &cap_str);
5767         if (ret < 0)
5768                 return ret;
5769
5770         ret = typec_find_port_power_role(cap_str);
5771         if (ret < 0)
5772                 return ret;
5773         port->typec_caps.type = ret;
5774         port->port_type = port->typec_caps.type;
5775
5776         port->slow_charger_loop = fwnode_property_read_bool(fwnode, "slow-charger-loop");
5777         if (port->port_type == TYPEC_PORT_SNK)
5778                 goto sink;
5779
5780         /* Get source pdos */
5781         ret = fwnode_property_count_u32(fwnode, "source-pdos");
5782         if (ret <= 0)
5783                 return -EINVAL;
5784
5785         port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS);
5786         ret = fwnode_property_read_u32_array(fwnode, "source-pdos",
5787                                              port->src_pdo, port->nr_src_pdo);
5788         if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo,
5789                                             port->nr_src_pdo))
5790                 return -EINVAL;
5791
5792         if (port->port_type == TYPEC_PORT_SRC)
5793                 return 0;
5794
5795         /* Get the preferred power role for DRP */
5796         ret = fwnode_property_read_string(fwnode, "try-power-role", &cap_str);
5797         if (ret < 0)
5798                 return ret;
5799
5800         port->typec_caps.prefer_role = typec_find_power_role(cap_str);
5801         if (port->typec_caps.prefer_role < 0)
5802                 return -EINVAL;
5803 sink:
5804         /* Get sink pdos */
5805         ret = fwnode_property_count_u32(fwnode, "sink-pdos");
5806         if (ret <= 0)
5807                 return -EINVAL;
5808
5809         port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS);
5810         ret = fwnode_property_read_u32_array(fwnode, "sink-pdos",
5811                                              port->snk_pdo, port->nr_snk_pdo);
5812         if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo,
5813                                             port->nr_snk_pdo))
5814                 return -EINVAL;
5815
5816         if (fwnode_property_read_u32(fwnode, "op-sink-microwatt", &mw) < 0)
5817                 return -EINVAL;
5818         port->operating_snk_mw = mw / 1000;
5819
5820         port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");
5821
5822         /* FRS can only be supported byb DRP ports */
5823         if (port->port_type == TYPEC_PORT_DRP) {
5824                 ret = fwnode_property_read_u32(fwnode, "new-source-frs-typec-current",
5825                                                &frs_current);
5826                 if (ret >= 0 && frs_current <= FRS_5V_3A)
5827                         port->new_source_frs_current = frs_current;
5828         }
5829
5830         /* sink-vdos is optional */
5831         ret = fwnode_property_count_u32(fwnode, "sink-vdos");
5832         if (ret < 0)
5833                 ret = 0;
5834
5835         port->nr_snk_vdo = min(ret, VDO_MAX_OBJECTS);
5836         if (port->nr_snk_vdo) {
5837                 ret = fwnode_property_read_u32_array(fwnode, "sink-vdos",
5838                                                      port->snk_vdo,
5839                                                      port->nr_snk_vdo);
5840                 if (ret < 0)
5841                         return ret;
5842         }
5843
5844         return 0;
5845 }
5846
5847 /* Power Supply access to expose source power information */
5848 enum tcpm_psy_online_states {
5849         TCPM_PSY_OFFLINE = 0,
5850         TCPM_PSY_FIXED_ONLINE,
5851         TCPM_PSY_PROG_ONLINE,
5852 };
5853
5854 static enum power_supply_property tcpm_psy_props[] = {
5855         POWER_SUPPLY_PROP_USB_TYPE,
5856         POWER_SUPPLY_PROP_ONLINE,
5857         POWER_SUPPLY_PROP_VOLTAGE_MIN,
5858         POWER_SUPPLY_PROP_VOLTAGE_MAX,
5859         POWER_SUPPLY_PROP_VOLTAGE_NOW,
5860         POWER_SUPPLY_PROP_CURRENT_MAX,
5861         POWER_SUPPLY_PROP_CURRENT_NOW,
5862 };
5863
5864 static int tcpm_psy_get_online(struct tcpm_port *port,
5865                                union power_supply_propval *val)
5866 {
5867         if (port->vbus_charge) {
5868                 if (port->pps_data.active)
5869                         val->intval = TCPM_PSY_PROG_ONLINE;
5870                 else
5871                         val->intval = TCPM_PSY_FIXED_ONLINE;
5872         } else {
5873                 val->intval = TCPM_PSY_OFFLINE;
5874         }
5875
5876         return 0;
5877 }
5878
5879 static int tcpm_psy_get_voltage_min(struct tcpm_port *port,
5880                                     union power_supply_propval *val)
5881 {
5882         if (port->pps_data.active)
5883                 val->intval = port->pps_data.min_volt * 1000;
5884         else
5885                 val->intval = port->supply_voltage * 1000;
5886
5887         return 0;
5888 }
5889
5890 static int tcpm_psy_get_voltage_max(struct tcpm_port *port,
5891                                     union power_supply_propval *val)
5892 {
5893         if (port->pps_data.active)
5894                 val->intval = port->pps_data.max_volt * 1000;
5895         else
5896                 val->intval = port->supply_voltage * 1000;
5897
5898         return 0;
5899 }
5900
5901 static int tcpm_psy_get_voltage_now(struct tcpm_port *port,
5902                                     union power_supply_propval *val)
5903 {
5904         val->intval = port->supply_voltage * 1000;
5905
5906         return 0;
5907 }
5908
5909 static int tcpm_psy_get_current_max(struct tcpm_port *port,
5910                                     union power_supply_propval *val)
5911 {
5912         if (port->pps_data.active)
5913                 val->intval = port->pps_data.max_curr * 1000;
5914         else
5915                 val->intval = port->current_limit * 1000;
5916
5917         return 0;
5918 }
5919
5920 static int tcpm_psy_get_current_now(struct tcpm_port *port,
5921                                     union power_supply_propval *val)
5922 {
5923         val->intval = port->current_limit * 1000;
5924
5925         return 0;
5926 }
5927
5928 static int tcpm_psy_get_prop(struct power_supply *psy,
5929                              enum power_supply_property psp,
5930                              union power_supply_propval *val)
5931 {
5932         struct tcpm_port *port = power_supply_get_drvdata(psy);
5933         int ret = 0;
5934
5935         switch (psp) {
5936         case POWER_SUPPLY_PROP_USB_TYPE:
5937                 val->intval = port->usb_type;
5938                 break;
5939         case POWER_SUPPLY_PROP_ONLINE:
5940                 ret = tcpm_psy_get_online(port, val);
5941                 break;
5942         case POWER_SUPPLY_PROP_VOLTAGE_MIN:
5943                 ret = tcpm_psy_get_voltage_min(port, val);
5944                 break;
5945         case POWER_SUPPLY_PROP_VOLTAGE_MAX:
5946                 ret = tcpm_psy_get_voltage_max(port, val);
5947                 break;
5948         case POWER_SUPPLY_PROP_VOLTAGE_NOW:
5949                 ret = tcpm_psy_get_voltage_now(port, val);
5950                 break;
5951         case POWER_SUPPLY_PROP_CURRENT_MAX:
5952                 ret = tcpm_psy_get_current_max(port, val);
5953                 break;
5954         case POWER_SUPPLY_PROP_CURRENT_NOW:
5955                 ret = tcpm_psy_get_current_now(port, val);
5956                 break;
5957         default:
5958                 ret = -EINVAL;
5959                 break;
5960         }
5961
5962         return ret;
5963 }
5964
5965 static int tcpm_psy_set_online(struct tcpm_port *port,
5966                                const union power_supply_propval *val)
5967 {
5968         int ret;
5969
5970         switch (val->intval) {
5971         case TCPM_PSY_FIXED_ONLINE:
5972                 ret = tcpm_pps_activate(port, false);
5973                 break;
5974         case TCPM_PSY_PROG_ONLINE:
5975                 ret = tcpm_pps_activate(port, true);
5976                 break;
5977         default:
5978                 ret = -EINVAL;
5979                 break;
5980         }
5981
5982         return ret;
5983 }
5984
5985 static int tcpm_psy_set_prop(struct power_supply *psy,
5986                              enum power_supply_property psp,
5987                              const union power_supply_propval *val)
5988 {
5989         struct tcpm_port *port = power_supply_get_drvdata(psy);
5990         int ret;
5991
5992         switch (psp) {
5993         case POWER_SUPPLY_PROP_ONLINE:
5994                 ret = tcpm_psy_set_online(port, val);
5995                 break;
5996         case POWER_SUPPLY_PROP_VOLTAGE_NOW:
5997                 if (val->intval < port->pps_data.min_volt * 1000 ||
5998                     val->intval > port->pps_data.max_volt * 1000)
5999                         ret = -EINVAL;
6000                 else
6001                         ret = tcpm_pps_set_out_volt(port, val->intval / 1000);
6002                 break;
6003         case POWER_SUPPLY_PROP_CURRENT_NOW:
6004                 if (val->intval > port->pps_data.max_curr * 1000)
6005                         ret = -EINVAL;
6006                 else
6007                         ret = tcpm_pps_set_op_curr(port, val->intval / 1000);
6008                 break;
6009         default:
6010                 ret = -EINVAL;
6011                 break;
6012         }
6013         power_supply_changed(port->psy);
6014         return ret;
6015 }
6016
6017 static int tcpm_psy_prop_writeable(struct power_supply *psy,
6018                                    enum power_supply_property psp)
6019 {
6020         switch (psp) {
6021         case POWER_SUPPLY_PROP_ONLINE:
6022         case POWER_SUPPLY_PROP_VOLTAGE_NOW:
6023         case POWER_SUPPLY_PROP_CURRENT_NOW:
6024                 return 1;
6025         default:
6026                 return 0;
6027         }
6028 }
6029
6030 static enum power_supply_usb_type tcpm_psy_usb_types[] = {
6031         POWER_SUPPLY_USB_TYPE_C,
6032         POWER_SUPPLY_USB_TYPE_PD,
6033         POWER_SUPPLY_USB_TYPE_PD_PPS,
6034 };
6035
6036 static const char *tcpm_psy_name_prefix = "tcpm-source-psy-";
6037
6038 static int devm_tcpm_psy_register(struct tcpm_port *port)
6039 {
6040         struct power_supply_config psy_cfg = {};
6041         const char *port_dev_name = dev_name(port->dev);
6042         size_t psy_name_len = strlen(tcpm_psy_name_prefix) +
6043                                      strlen(port_dev_name) + 1;
6044         char *psy_name;
6045
6046         psy_cfg.drv_data = port;
6047         psy_cfg.fwnode = dev_fwnode(port->dev);
6048         psy_name = devm_kzalloc(port->dev, psy_name_len, GFP_KERNEL);
6049         if (!psy_name)
6050                 return -ENOMEM;
6051
6052         snprintf(psy_name, psy_name_len, "%s%s", tcpm_psy_name_prefix,
6053                  port_dev_name);
6054         port->psy_desc.name = psy_name;
6055         port->psy_desc.type = POWER_SUPPLY_TYPE_USB;
6056         port->psy_desc.usb_types = tcpm_psy_usb_types;
6057         port->psy_desc.num_usb_types = ARRAY_SIZE(tcpm_psy_usb_types);
6058         port->psy_desc.properties = tcpm_psy_props;
6059         port->psy_desc.num_properties = ARRAY_SIZE(tcpm_psy_props);
6060         port->psy_desc.get_property = tcpm_psy_get_prop;
6061         port->psy_desc.set_property = tcpm_psy_set_prop;
6062         port->psy_desc.property_is_writeable = tcpm_psy_prop_writeable;
6063
6064         port->usb_type = POWER_SUPPLY_USB_TYPE_C;
6065
6066         port->psy = devm_power_supply_register(port->dev, &port->psy_desc,
6067                                                &psy_cfg);
6068
6069         return PTR_ERR_OR_ZERO(port->psy);
6070 }
6071
6072 static enum hrtimer_restart state_machine_timer_handler(struct hrtimer *timer)
6073 {
6074         struct tcpm_port *port = container_of(timer, struct tcpm_port, state_machine_timer);
6075
6076         kthread_queue_work(port->wq, &port->state_machine);
6077         return HRTIMER_NORESTART;
6078 }
6079
6080 static enum hrtimer_restart vdm_state_machine_timer_handler(struct hrtimer *timer)
6081 {
6082         struct tcpm_port *port = container_of(timer, struct tcpm_port, vdm_state_machine_timer);
6083
6084         kthread_queue_work(port->wq, &port->vdm_state_machine);
6085         return HRTIMER_NORESTART;
6086 }
6087
6088 static enum hrtimer_restart enable_frs_timer_handler(struct hrtimer *timer)
6089 {
6090         struct tcpm_port *port = container_of(timer, struct tcpm_port, enable_frs_timer);
6091
6092         kthread_queue_work(port->wq, &port->enable_frs);
6093         return HRTIMER_NORESTART;
6094 }
6095
6096 struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
6097 {
6098         struct tcpm_port *port;
6099         int err;
6100
6101         if (!dev || !tcpc ||
6102             !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
6103             !tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus ||
6104             !tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit)
6105                 return ERR_PTR(-EINVAL);
6106
6107         port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
6108         if (!port)
6109                 return ERR_PTR(-ENOMEM);
6110
6111         port->dev = dev;
6112         port->tcpc = tcpc;
6113
6114         mutex_init(&port->lock);
6115         mutex_init(&port->swap_lock);
6116
6117         port->wq = kthread_create_worker(0, dev_name(dev));
6118         if (IS_ERR(port->wq))
6119                 return ERR_CAST(port->wq);
6120         sched_set_fifo(port->wq->task);
6121
6122         kthread_init_work(&port->state_machine, tcpm_state_machine_work);
6123         kthread_init_work(&port->vdm_state_machine, vdm_state_machine_work);
6124         kthread_init_work(&port->event_work, tcpm_pd_event_handler);
6125         kthread_init_work(&port->enable_frs, tcpm_enable_frs_work);
6126         hrtimer_init(&port->state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
6127         port->state_machine_timer.function = state_machine_timer_handler;
6128         hrtimer_init(&port->vdm_state_machine_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
6129         port->vdm_state_machine_timer.function = vdm_state_machine_timer_handler;
6130         hrtimer_init(&port->enable_frs_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
6131         port->enable_frs_timer.function = enable_frs_timer_handler;
6132
6133         spin_lock_init(&port->pd_event_lock);
6134
6135         init_completion(&port->tx_complete);
6136         init_completion(&port->swap_complete);
6137         init_completion(&port->pps_complete);
6138         tcpm_debugfs_init(port);
6139
6140         err = tcpm_fw_get_caps(port, tcpc->fwnode);
6141         if (err < 0)
6142                 goto out_destroy_wq;
6143
6144         port->try_role = port->typec_caps.prefer_role;
6145
6146         port->typec_caps.fwnode = tcpc->fwnode;
6147         port->typec_caps.revision = 0x0120;     /* Type-C spec release 1.2 */
6148         port->typec_caps.pd_revision = 0x0300;  /* USB-PD spec release 3.0 */
6149         port->typec_caps.svdm_version = SVDM_VER_2_0;
6150         port->typec_caps.driver_data = port;
6151         port->typec_caps.ops = &tcpm_ops;
6152         port->typec_caps.orientation_aware = 1;
6153
6154         port->partner_desc.identity = &port->partner_ident;
6155         port->port_type = port->typec_caps.type;
6156
6157         port->role_sw = usb_role_switch_get(port->dev);
6158         if (IS_ERR(port->role_sw)) {
6159                 err = PTR_ERR(port->role_sw);
6160                 goto out_destroy_wq;
6161         }
6162
6163         err = devm_tcpm_psy_register(port);
6164         if (err)
6165                 goto out_role_sw_put;
6166         power_supply_changed(port->psy);
6167
6168         port->typec_port = typec_register_port(port->dev, &port->typec_caps);
6169         if (IS_ERR(port->typec_port)) {
6170                 err = PTR_ERR(port->typec_port);
6171                 goto out_role_sw_put;
6172         }
6173
6174         typec_port_register_altmodes(port->typec_port,
6175                                      &tcpm_altmode_ops, port,
6176                                      port->port_altmode, ALTMODE_DISCOVERY_MAX);
6177
6178         mutex_lock(&port->lock);
6179         tcpm_init(port);
6180         mutex_unlock(&port->lock);
6181
6182         tcpm_log(port, "%s: registered", dev_name(dev));
6183         return port;
6184
6185 out_role_sw_put:
6186         usb_role_switch_put(port->role_sw);
6187 out_destroy_wq:
6188         tcpm_debugfs_exit(port);
6189         kthread_destroy_worker(port->wq);
6190         return ERR_PTR(err);
6191 }
6192 EXPORT_SYMBOL_GPL(tcpm_register_port);
6193
6194 void tcpm_unregister_port(struct tcpm_port *port)
6195 {
6196         int i;
6197
6198         tcpm_reset_port(port);
6199         for (i = 0; i < ARRAY_SIZE(port->port_altmode); i++)
6200                 typec_unregister_altmode(port->port_altmode[i]);
6201         typec_unregister_port(port->typec_port);
6202         usb_role_switch_put(port->role_sw);
6203         tcpm_debugfs_exit(port);
6204         kthread_destroy_worker(port->wq);
6205 }
6206 EXPORT_SYMBOL_GPL(tcpm_unregister_port);
6207
6208 MODULE_AUTHOR("Guenter Roeck <[email protected]>");
6209 MODULE_DESCRIPTION("USB Type-C Port Manager");
6210 MODULE_LICENSE("GPL");
This page took 0.402921 seconds and 4 git commands to generate.