linux/drivers/usb/typec/tcpm/tcpm.c
<<
>>
Prefs
   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/jiffies.h>
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/mutex.h>
  15#include <linux/power_supply.h>
  16#include <linux/proc_fs.h>
  17#include <linux/property.h>
  18#include <linux/sched/clock.h>
  19#include <linux/seq_file.h>
  20#include <linux/slab.h>
  21#include <linux/spinlock.h>
  22#include <linux/usb.h>
  23#include <linux/usb/pd.h>
  24#include <linux/usb/pd_ado.h>
  25#include <linux/usb/pd_bdo.h>
  26#include <linux/usb/pd_ext_sdb.h>
  27#include <linux/usb/pd_vdo.h>
  28#include <linux/usb/role.h>
  29#include <linux/usb/tcpm.h>
  30#include <linux/usb/typec_altmode.h>
  31#include <linux/workqueue.h>
  32
  33#define FOREACH_STATE(S)                        \
  34        S(INVALID_STATE),                       \
  35        S(TOGGLING),                    \
  36        S(SRC_UNATTACHED),                      \
  37        S(SRC_ATTACH_WAIT),                     \
  38        S(SRC_ATTACHED),                        \
  39        S(SRC_STARTUP),                         \
  40        S(SRC_SEND_CAPABILITIES),               \
  41        S(SRC_SEND_CAPABILITIES_TIMEOUT),       \
  42        S(SRC_NEGOTIATE_CAPABILITIES),          \
  43        S(SRC_TRANSITION_SUPPLY),               \
  44        S(SRC_READY),                           \
  45        S(SRC_WAIT_NEW_CAPABILITIES),           \
  46                                                \
  47        S(SNK_UNATTACHED),                      \
  48        S(SNK_ATTACH_WAIT),                     \
  49        S(SNK_DEBOUNCED),                       \
  50        S(SNK_ATTACHED),                        \
  51        S(SNK_STARTUP),                         \
  52        S(SNK_DISCOVERY),                       \
  53        S(SNK_DISCOVERY_DEBOUNCE),              \
  54        S(SNK_DISCOVERY_DEBOUNCE_DONE),         \
  55        S(SNK_WAIT_CAPABILITIES),               \
  56        S(SNK_NEGOTIATE_CAPABILITIES),          \
  57        S(SNK_NEGOTIATE_PPS_CAPABILITIES),      \
  58        S(SNK_TRANSITION_SINK),                 \
  59        S(SNK_TRANSITION_SINK_VBUS),            \
  60        S(SNK_READY),                           \
  61                                                \
  62        S(ACC_UNATTACHED),                      \
  63        S(DEBUG_ACC_ATTACHED),                  \
  64        S(AUDIO_ACC_ATTACHED),                  \
  65        S(AUDIO_ACC_DEBOUNCE),                  \
  66                                                \
  67        S(HARD_RESET_SEND),                     \
  68        S(HARD_RESET_START),                    \
  69        S(SRC_HARD_RESET_VBUS_OFF),             \
  70        S(SRC_HARD_RESET_VBUS_ON),              \
  71        S(SNK_HARD_RESET_SINK_OFF),             \
  72        S(SNK_HARD_RESET_WAIT_VBUS),            \
  73        S(SNK_HARD_RESET_SINK_ON),              \
  74                                                \
  75        S(SOFT_RESET),                          \
  76        S(SOFT_RESET_SEND),                     \
  77                                                \
  78        S(DR_SWAP_ACCEPT),                      \
  79        S(DR_SWAP_SEND),                        \
  80        S(DR_SWAP_SEND_TIMEOUT),                \
  81        S(DR_SWAP_CANCEL),                      \
  82        S(DR_SWAP_CHANGE_DR),                   \
  83                                                \
  84        S(PR_SWAP_ACCEPT),                      \
  85        S(PR_SWAP_SEND),                        \
  86        S(PR_SWAP_SEND_TIMEOUT),                \
  87        S(PR_SWAP_CANCEL),                      \
  88        S(PR_SWAP_START),                       \
  89        S(PR_SWAP_SRC_SNK_TRANSITION_OFF),      \
  90        S(PR_SWAP_SRC_SNK_SOURCE_OFF),          \
  91        S(PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED), \
  92        S(PR_SWAP_SRC_SNK_SINK_ON),             \
  93        S(PR_SWAP_SNK_SRC_SINK_OFF),            \
  94        S(PR_SWAP_SNK_SRC_SOURCE_ON),           \
  95        S(PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP),    \
  96                                                \
  97        S(VCONN_SWAP_ACCEPT),                   \
  98        S(VCONN_SWAP_SEND),                     \
  99        S(VCONN_SWAP_SEND_TIMEOUT),             \
 100        S(VCONN_SWAP_CANCEL),                   \
 101        S(VCONN_SWAP_START),                    \
 102        S(VCONN_SWAP_WAIT_FOR_VCONN),           \
 103        S(VCONN_SWAP_TURN_ON_VCONN),            \
 104        S(VCONN_SWAP_TURN_OFF_VCONN),           \
 105                                                \
 106        S(SNK_TRY),                             \
 107        S(SNK_TRY_WAIT),                        \
 108        S(SNK_TRY_WAIT_DEBOUNCE),               \
 109        S(SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS),    \
 110        S(SRC_TRYWAIT),                         \
 111        S(SRC_TRYWAIT_DEBOUNCE),                \
 112        S(SRC_TRYWAIT_UNATTACHED),              \
 113                                                \
 114        S(SRC_TRY),                             \
 115        S(SRC_TRY_WAIT),                        \
 116        S(SRC_TRY_DEBOUNCE),                    \
 117        S(SNK_TRYWAIT),                         \
 118        S(SNK_TRYWAIT_DEBOUNCE),                \
 119        S(SNK_TRYWAIT_VBUS),                    \
 120        S(BIST_RX),                             \
 121                                                \
 122        S(GET_STATUS_SEND),                     \
 123        S(GET_STATUS_SEND_TIMEOUT),             \
 124        S(GET_PPS_STATUS_SEND),                 \
 125        S(GET_PPS_STATUS_SEND_TIMEOUT),         \
 126                                                \
 127        S(ERROR_RECOVERY),                      \
 128        S(PORT_RESET),                          \
 129        S(PORT_RESET_WAIT_OFF)
 130
 131#define GENERATE_ENUM(e)        e
 132#define GENERATE_STRING(s)      #s
 133
 134enum tcpm_state {
 135        FOREACH_STATE(GENERATE_ENUM)
 136};
 137
 138static const char * const tcpm_states[] = {
 139        FOREACH_STATE(GENERATE_STRING)
 140};
 141
 142enum vdm_states {
 143        VDM_STATE_ERR_BUSY = -3,
 144        VDM_STATE_ERR_SEND = -2,
 145        VDM_STATE_ERR_TMOUT = -1,
 146        VDM_STATE_DONE = 0,
 147        /* Anything >0 represents an active state */
 148        VDM_STATE_READY = 1,
 149        VDM_STATE_BUSY = 2,
 150        VDM_STATE_WAIT_RSP_BUSY = 3,
 151};
 152
 153enum pd_msg_request {
 154        PD_MSG_NONE = 0,
 155        PD_MSG_CTRL_REJECT,
 156        PD_MSG_CTRL_WAIT,
 157        PD_MSG_CTRL_NOT_SUPP,
 158        PD_MSG_DATA_SINK_CAP,
 159        PD_MSG_DATA_SOURCE_CAP,
 160};
 161
 162/* Events from low level driver */
 163
 164#define TCPM_CC_EVENT           BIT(0)
 165#define TCPM_VBUS_EVENT         BIT(1)
 166#define TCPM_RESET_EVENT        BIT(2)
 167
 168#define LOG_BUFFER_ENTRIES      1024
 169#define LOG_BUFFER_ENTRY_SIZE   128
 170
 171/* Alternate mode support */
 172
 173#define SVID_DISCOVERY_MAX      16
 174#define ALTMODE_DISCOVERY_MAX   (SVID_DISCOVERY_MAX * MODE_DISCOVERY_MAX)
 175
 176struct pd_mode_data {
 177        int svid_index;         /* current SVID index           */
 178        int nsvids;
 179        u16 svids[SVID_DISCOVERY_MAX];
 180        int altmodes;           /* number of alternate modes    */
 181        struct typec_altmode_desc altmode_desc[ALTMODE_DISCOVERY_MAX];
 182};
 183
 184struct pd_pps_data {
 185        u32 min_volt;
 186        u32 max_volt;
 187        u32 max_curr;
 188        u32 out_volt;
 189        u32 op_curr;
 190        bool supported;
 191        bool active;
 192};
 193
 194struct tcpm_port {
 195        struct device *dev;
 196
 197        struct mutex lock;              /* tcpm state machine lock */
 198        struct workqueue_struct *wq;
 199
 200        struct typec_capability typec_caps;
 201        struct typec_port *typec_port;
 202
 203        struct tcpc_dev *tcpc;
 204        struct usb_role_switch *role_sw;
 205
 206        enum typec_role vconn_role;
 207        enum typec_role pwr_role;
 208        enum typec_data_role data_role;
 209        enum typec_pwr_opmode pwr_opmode;
 210
 211        struct usb_pd_identity partner_ident;
 212        struct typec_partner_desc partner_desc;
 213        struct typec_partner *partner;
 214
 215        enum typec_cc_status cc_req;
 216
 217        enum typec_cc_status cc1;
 218        enum typec_cc_status cc2;
 219        enum typec_cc_polarity polarity;
 220
 221        bool attached;
 222        bool connected;
 223        enum typec_port_type port_type;
 224        bool vbus_present;
 225        bool vbus_never_low;
 226        bool vbus_source;
 227        bool vbus_charge;
 228
 229        bool send_discover;
 230        bool op_vsafe5v;
 231
 232        int try_role;
 233        int try_snk_count;
 234        int try_src_count;
 235
 236        enum pd_msg_request queued_message;
 237
 238        enum tcpm_state enter_state;
 239        enum tcpm_state prev_state;
 240        enum tcpm_state state;
 241        enum tcpm_state delayed_state;
 242        unsigned long delayed_runtime;
 243        unsigned long delay_ms;
 244
 245        spinlock_t pd_event_lock;
 246        u32 pd_events;
 247
 248        struct work_struct event_work;
 249        struct delayed_work state_machine;
 250        struct delayed_work vdm_state_machine;
 251        bool state_machine_running;
 252
 253        struct completion tx_complete;
 254        enum tcpm_transmit_status tx_status;
 255
 256        struct mutex swap_lock;         /* swap command lock */
 257        bool swap_pending;
 258        bool non_pd_role_swap;
 259        struct completion swap_complete;
 260        int swap_status;
 261
 262        unsigned int negotiated_rev;
 263        unsigned int message_id;
 264        unsigned int caps_count;
 265        unsigned int hard_reset_count;
 266        bool pd_capable;
 267        bool explicit_contract;
 268        unsigned int rx_msgid;
 269
 270        /* Partner capabilities/requests */
 271        u32 sink_request;
 272        u32 source_caps[PDO_MAX_OBJECTS];
 273        unsigned int nr_source_caps;
 274        u32 sink_caps[PDO_MAX_OBJECTS];
 275        unsigned int nr_sink_caps;
 276
 277        /* Local capabilities */
 278        u32 src_pdo[PDO_MAX_OBJECTS];
 279        unsigned int nr_src_pdo;
 280        u32 snk_pdo[PDO_MAX_OBJECTS];
 281        unsigned int nr_snk_pdo;
 282        u32 snk_vdo[VDO_MAX_OBJECTS];
 283        unsigned int nr_snk_vdo;
 284
 285        unsigned int operating_snk_mw;
 286        bool update_sink_caps;
 287
 288        /* Requested current / voltage */
 289        u32 current_limit;
 290        u32 supply_voltage;
 291
 292        /* Used to export TA voltage and current */
 293        struct power_supply *psy;
 294        struct power_supply_desc psy_desc;
 295        enum power_supply_usb_type usb_type;
 296
 297        u32 bist_request;
 298
 299        /* PD state for Vendor Defined Messages */
 300        enum vdm_states vdm_state;
 301        u32 vdm_retries;
 302        /* next Vendor Defined Message to send */
 303        u32 vdo_data[VDO_MAX_SIZE];
 304        u8 vdo_count;
 305        /* VDO to retry if UFP responder replied busy */
 306        u32 vdo_retry;
 307
 308        /* PPS */
 309        struct pd_pps_data pps_data;
 310        struct completion pps_complete;
 311        bool pps_pending;
 312        int pps_status;
 313
 314        /* Alternate mode data */
 315        struct pd_mode_data mode_data;
 316        struct typec_altmode *partner_altmode[ALTMODE_DISCOVERY_MAX];
 317        struct typec_altmode *port_altmode[ALTMODE_DISCOVERY_MAX];
 318
 319        /* Deadline in jiffies to exit src_try_wait state */
 320        unsigned long max_wait;
 321
 322        /* port belongs to a self powered device */
 323        bool self_powered;
 324
 325#ifdef CONFIG_DEBUG_FS
 326        struct dentry *dentry;
 327        struct mutex logbuffer_lock;    /* log buffer access lock */
 328        int logbuffer_head;
 329        int logbuffer_tail;
 330        u8 *logbuffer[LOG_BUFFER_ENTRIES];
 331#endif
 332};
 333
 334struct pd_rx_event {
 335        struct work_struct work;
 336        struct tcpm_port *port;
 337        struct pd_message msg;
 338};
 339
 340#define tcpm_cc_is_sink(cc) \
 341        ((cc) == TYPEC_CC_RP_DEF || (cc) == TYPEC_CC_RP_1_5 || \
 342         (cc) == TYPEC_CC_RP_3_0)
 343
 344#define tcpm_port_is_sink(port) \
 345        ((tcpm_cc_is_sink((port)->cc1) && !tcpm_cc_is_sink((port)->cc2)) || \
 346         (tcpm_cc_is_sink((port)->cc2) && !tcpm_cc_is_sink((port)->cc1)))
 347
 348#define tcpm_cc_is_source(cc) ((cc) == TYPEC_CC_RD)
 349#define tcpm_cc_is_audio(cc) ((cc) == TYPEC_CC_RA)
 350#define tcpm_cc_is_open(cc) ((cc) == TYPEC_CC_OPEN)
 351
 352#define tcpm_port_is_source(port) \
 353        ((tcpm_cc_is_source((port)->cc1) && \
 354         !tcpm_cc_is_source((port)->cc2)) || \
 355         (tcpm_cc_is_source((port)->cc2) && \
 356          !tcpm_cc_is_source((port)->cc1)))
 357
 358#define tcpm_port_is_debug(port) \
 359        (tcpm_cc_is_source((port)->cc1) && tcpm_cc_is_source((port)->cc2))
 360
 361#define tcpm_port_is_audio(port) \
 362        (tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_audio((port)->cc2))
 363
 364#define tcpm_port_is_audio_detached(port) \
 365        ((tcpm_cc_is_audio((port)->cc1) && tcpm_cc_is_open((port)->cc2)) || \
 366         (tcpm_cc_is_audio((port)->cc2) && tcpm_cc_is_open((port)->cc1)))
 367
 368#define tcpm_try_snk(port) \
 369        ((port)->try_snk_count == 0 && (port)->try_role == TYPEC_SINK && \
 370        (port)->port_type == TYPEC_PORT_DRP)
 371
 372#define tcpm_try_src(port) \
 373        ((port)->try_src_count == 0 && (port)->try_role == TYPEC_SOURCE && \
 374        (port)->port_type == TYPEC_PORT_DRP)
 375
 376static enum tcpm_state tcpm_default_state(struct tcpm_port *port)
 377{
 378        if (port->port_type == TYPEC_PORT_DRP) {
 379                if (port->try_role == TYPEC_SINK)
 380                        return SNK_UNATTACHED;
 381                else if (port->try_role == TYPEC_SOURCE)
 382                        return SRC_UNATTACHED;
 383                /* Fall through to return SRC_UNATTACHED */
 384        } else if (port->port_type == TYPEC_PORT_SNK) {
 385                return SNK_UNATTACHED;
 386        }
 387        return SRC_UNATTACHED;
 388}
 389
 390static bool tcpm_port_is_disconnected(struct tcpm_port *port)
 391{
 392        return (!port->attached && port->cc1 == TYPEC_CC_OPEN &&
 393                port->cc2 == TYPEC_CC_OPEN) ||
 394               (port->attached && ((port->polarity == TYPEC_POLARITY_CC1 &&
 395                                    port->cc1 == TYPEC_CC_OPEN) ||
 396                                   (port->polarity == TYPEC_POLARITY_CC2 &&
 397                                    port->cc2 == TYPEC_CC_OPEN)));
 398}
 399
 400/*
 401 * Logging
 402 */
 403
 404#ifdef CONFIG_DEBUG_FS
 405
 406static bool tcpm_log_full(struct tcpm_port *port)
 407{
 408        return port->logbuffer_tail ==
 409                (port->logbuffer_head + 1) % LOG_BUFFER_ENTRIES;
 410}
 411
 412__printf(2, 0)
 413static void _tcpm_log(struct tcpm_port *port, const char *fmt, va_list args)
 414{
 415        char tmpbuffer[LOG_BUFFER_ENTRY_SIZE];
 416        u64 ts_nsec = local_clock();
 417        unsigned long rem_nsec;
 418
 419        mutex_lock(&port->logbuffer_lock);
 420        if (!port->logbuffer[port->logbuffer_head]) {
 421                port->logbuffer[port->logbuffer_head] =
 422                                kzalloc(LOG_BUFFER_ENTRY_SIZE, GFP_KERNEL);
 423                if (!port->logbuffer[port->logbuffer_head]) {
 424                        mutex_unlock(&port->logbuffer_lock);
 425                        return;
 426                }
 427        }
 428
 429        vsnprintf(tmpbuffer, sizeof(tmpbuffer), fmt, args);
 430
 431        if (tcpm_log_full(port)) {
 432                port->logbuffer_head = max(port->logbuffer_head - 1, 0);
 433                strcpy(tmpbuffer, "overflow");
 434        }
 435
 436        if (port->logbuffer_head < 0 ||
 437            port->logbuffer_head >= LOG_BUFFER_ENTRIES) {
 438                dev_warn(port->dev,
 439                         "Bad log buffer index %d\n", port->logbuffer_head);
 440                goto abort;
 441        }
 442
 443        if (!port->logbuffer[port->logbuffer_head]) {
 444                dev_warn(port->dev,
 445                         "Log buffer index %d is NULL\n", port->logbuffer_head);
 446                goto abort;
 447        }
 448
 449        rem_nsec = do_div(ts_nsec, 1000000000);
 450        scnprintf(port->logbuffer[port->logbuffer_head],
 451                  LOG_BUFFER_ENTRY_SIZE, "[%5lu.%06lu] %s",
 452                  (unsigned long)ts_nsec, rem_nsec / 1000,
 453                  tmpbuffer);
 454        port->logbuffer_head = (port->logbuffer_head + 1) % LOG_BUFFER_ENTRIES;
 455
 456abort:
 457        mutex_unlock(&port->logbuffer_lock);
 458}
 459
 460__printf(2, 3)
 461static void tcpm_log(struct tcpm_port *port, const char *fmt, ...)
 462{
 463        va_list args;
 464
 465        /* Do not log while disconnected and unattached */
 466        if (tcpm_port_is_disconnected(port) &&
 467            (port->state == SRC_UNATTACHED || port->state == SNK_UNATTACHED ||
 468             port->state == TOGGLING))
 469                return;
 470
 471        va_start(args, fmt);
 472        _tcpm_log(port, fmt, args);
 473        va_end(args);
 474}
 475
 476__printf(2, 3)
 477static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...)
 478{
 479        va_list args;
 480
 481        va_start(args, fmt);
 482        _tcpm_log(port, fmt, args);
 483        va_end(args);
 484}
 485
 486static void tcpm_log_source_caps(struct tcpm_port *port)
 487{
 488        int i;
 489
 490        for (i = 0; i < port->nr_source_caps; i++) {
 491                u32 pdo = port->source_caps[i];
 492                enum pd_pdo_type type = pdo_type(pdo);
 493                char msg[64];
 494
 495                switch (type) {
 496                case PDO_TYPE_FIXED:
 497                        scnprintf(msg, sizeof(msg),
 498                                  "%u mV, %u mA [%s%s%s%s%s%s]",
 499                                  pdo_fixed_voltage(pdo),
 500                                  pdo_max_current(pdo),
 501                                  (pdo & PDO_FIXED_DUAL_ROLE) ?
 502                                                        "R" : "",
 503                                  (pdo & PDO_FIXED_SUSPEND) ?
 504                                                        "S" : "",
 505                                  (pdo & PDO_FIXED_HIGHER_CAP) ?
 506                                                        "H" : "",
 507                                  (pdo & PDO_FIXED_USB_COMM) ?
 508                                                        "U" : "",
 509                                  (pdo & PDO_FIXED_DATA_SWAP) ?
 510                                                        "D" : "",
 511                                  (pdo & PDO_FIXED_EXTPOWER) ?
 512                                                        "E" : "");
 513                        break;
 514                case PDO_TYPE_VAR:
 515                        scnprintf(msg, sizeof(msg),
 516                                  "%u-%u mV, %u mA",
 517                                  pdo_min_voltage(pdo),
 518                                  pdo_max_voltage(pdo),
 519                                  pdo_max_current(pdo));
 520                        break;
 521                case PDO_TYPE_BATT:
 522                        scnprintf(msg, sizeof(msg),
 523                                  "%u-%u mV, %u mW",
 524                                  pdo_min_voltage(pdo),
 525                                  pdo_max_voltage(pdo),
 526                                  pdo_max_power(pdo));
 527                        break;
 528                case PDO_TYPE_APDO:
 529                        if (pdo_apdo_type(pdo) == APDO_TYPE_PPS)
 530                                scnprintf(msg, sizeof(msg),
 531                                          "%u-%u mV, %u mA",
 532                                          pdo_pps_apdo_min_voltage(pdo),
 533                                          pdo_pps_apdo_max_voltage(pdo),
 534                                          pdo_pps_apdo_max_current(pdo));
 535                        else
 536                                strcpy(msg, "undefined APDO");
 537                        break;
 538                default:
 539                        strcpy(msg, "undefined");
 540                        break;
 541                }
 542                tcpm_log(port, " PDO %d: type %d, %s",
 543                         i, type, msg);
 544        }
 545}
 546
 547static int tcpm_debug_show(struct seq_file *s, void *v)
 548{
 549        struct tcpm_port *port = (struct tcpm_port *)s->private;
 550        int tail;
 551
 552        mutex_lock(&port->logbuffer_lock);
 553        tail = port->logbuffer_tail;
 554        while (tail != port->logbuffer_head) {
 555                seq_printf(s, "%s\n", port->logbuffer[tail]);
 556                tail = (tail + 1) % LOG_BUFFER_ENTRIES;
 557        }
 558        if (!seq_has_overflowed(s))
 559                port->logbuffer_tail = tail;
 560        mutex_unlock(&port->logbuffer_lock);
 561
 562        return 0;
 563}
 564DEFINE_SHOW_ATTRIBUTE(tcpm_debug);
 565
 566static void tcpm_debugfs_init(struct tcpm_port *port)
 567{
 568        char name[NAME_MAX];
 569
 570        mutex_init(&port->logbuffer_lock);
 571        snprintf(name, NAME_MAX, "tcpm-%s", dev_name(port->dev));
 572        port->dentry = debugfs_create_file(name, S_IFREG | 0444, usb_debug_root,
 573                                           port, &tcpm_debug_fops);
 574}
 575
 576static void tcpm_debugfs_exit(struct tcpm_port *port)
 577{
 578        int i;
 579
 580        mutex_lock(&port->logbuffer_lock);
 581        for (i = 0; i < LOG_BUFFER_ENTRIES; i++) {
 582                kfree(port->logbuffer[i]);
 583                port->logbuffer[i] = NULL;
 584        }
 585        mutex_unlock(&port->logbuffer_lock);
 586
 587        debugfs_remove(port->dentry);
 588}
 589
 590#else
 591
 592__printf(2, 3)
 593static void tcpm_log(const struct tcpm_port *port, const char *fmt, ...) { }
 594__printf(2, 3)
 595static void tcpm_log_force(struct tcpm_port *port, const char *fmt, ...) { }
 596static void tcpm_log_source_caps(struct tcpm_port *port) { }
 597static void tcpm_debugfs_init(const struct tcpm_port *port) { }
 598static void tcpm_debugfs_exit(const struct tcpm_port *port) { }
 599
 600#endif
 601
 602static int tcpm_pd_transmit(struct tcpm_port *port,
 603                            enum tcpm_transmit_type type,
 604                            const struct pd_message *msg)
 605{
 606        unsigned long timeout;
 607        int ret;
 608
 609        if (msg)
 610                tcpm_log(port, "PD TX, header: %#x", le16_to_cpu(msg->header));
 611        else
 612                tcpm_log(port, "PD TX, type: %#x", type);
 613
 614        reinit_completion(&port->tx_complete);
 615        ret = port->tcpc->pd_transmit(port->tcpc, type, msg);
 616        if (ret < 0)
 617                return ret;
 618
 619        mutex_unlock(&port->lock);
 620        timeout = wait_for_completion_timeout(&port->tx_complete,
 621                                msecs_to_jiffies(PD_T_TCPC_TX_TIMEOUT));
 622        mutex_lock(&port->lock);
 623        if (!timeout)
 624                return -ETIMEDOUT;
 625
 626        switch (port->tx_status) {
 627        case TCPC_TX_SUCCESS:
 628                port->message_id = (port->message_id + 1) & PD_HEADER_ID_MASK;
 629                return 0;
 630        case TCPC_TX_DISCARDED:
 631                return -EAGAIN;
 632        case TCPC_TX_FAILED:
 633        default:
 634                return -EIO;
 635        }
 636}
 637
 638void tcpm_pd_transmit_complete(struct tcpm_port *port,
 639                               enum tcpm_transmit_status status)
 640{
 641        tcpm_log(port, "PD TX complete, status: %u", status);
 642        port->tx_status = status;
 643        complete(&port->tx_complete);
 644}
 645EXPORT_SYMBOL_GPL(tcpm_pd_transmit_complete);
 646
 647static int tcpm_mux_set(struct tcpm_port *port, int state,
 648                        enum usb_role usb_role,
 649                        enum typec_orientation orientation)
 650{
 651        int ret;
 652
 653        tcpm_log(port, "Requesting mux state %d, usb-role %d, orientation %d",
 654                 state, usb_role, orientation);
 655
 656        ret = typec_set_orientation(port->typec_port, orientation);
 657        if (ret)
 658                return ret;
 659
 660        if (port->role_sw) {
 661                ret = usb_role_switch_set_role(port->role_sw, usb_role);
 662                if (ret)
 663                        return ret;
 664        }
 665
 666        return typec_set_mode(port->typec_port, state);
 667}
 668
 669static int tcpm_set_polarity(struct tcpm_port *port,
 670                             enum typec_cc_polarity polarity)
 671{
 672        int ret;
 673
 674        tcpm_log(port, "polarity %d", polarity);
 675
 676        ret = port->tcpc->set_polarity(port->tcpc, polarity);
 677        if (ret < 0)
 678                return ret;
 679
 680        port->polarity = polarity;
 681
 682        return 0;
 683}
 684
 685static int tcpm_set_vconn(struct tcpm_port *port, bool enable)
 686{
 687        int ret;
 688
 689        tcpm_log(port, "vconn:=%d", enable);
 690
 691        ret = port->tcpc->set_vconn(port->tcpc, enable);
 692        if (!ret) {
 693                port->vconn_role = enable ? TYPEC_SOURCE : TYPEC_SINK;
 694                typec_set_vconn_role(port->typec_port, port->vconn_role);
 695        }
 696
 697        return ret;
 698}
 699
 700static u32 tcpm_get_current_limit(struct tcpm_port *port)
 701{
 702        enum typec_cc_status cc;
 703        u32 limit;
 704
 705        cc = port->polarity ? port->cc2 : port->cc1;
 706        switch (cc) {
 707        case TYPEC_CC_RP_1_5:
 708                limit = 1500;
 709                break;
 710        case TYPEC_CC_RP_3_0:
 711                limit = 3000;
 712                break;
 713        case TYPEC_CC_RP_DEF:
 714        default:
 715                if (port->tcpc->get_current_limit)
 716                        limit = port->tcpc->get_current_limit(port->tcpc);
 717                else
 718                        limit = 0;
 719                break;
 720        }
 721
 722        return limit;
 723}
 724
 725static int tcpm_set_current_limit(struct tcpm_port *port, u32 max_ma, u32 mv)
 726{
 727        int ret = -EOPNOTSUPP;
 728
 729        tcpm_log(port, "Setting voltage/current limit %u mV %u mA", mv, max_ma);
 730
 731        port->supply_voltage = mv;
 732        port->current_limit = max_ma;
 733
 734        if (port->tcpc->set_current_limit)
 735                ret = port->tcpc->set_current_limit(port->tcpc, max_ma, mv);
 736
 737        return ret;
 738}
 739
 740/*
 741 * Determine RP value to set based on maximum current supported
 742 * by a port if configured as source.
 743 * Returns CC value to report to link partner.
 744 */
 745static enum typec_cc_status tcpm_rp_cc(struct tcpm_port *port)
 746{
 747        const u32 *src_pdo = port->src_pdo;
 748        int nr_pdo = port->nr_src_pdo;
 749        int i;
 750
 751        /*
 752         * Search for first entry with matching voltage.
 753         * It should report the maximum supported current.
 754         */
 755        for (i = 0; i < nr_pdo; i++) {
 756                const u32 pdo = src_pdo[i];
 757
 758                if (pdo_type(pdo) == PDO_TYPE_FIXED &&
 759                    pdo_fixed_voltage(pdo) == 5000) {
 760                        unsigned int curr = pdo_max_current(pdo);
 761
 762                        if (curr >= 3000)
 763                                return TYPEC_CC_RP_3_0;
 764                        else if (curr >= 1500)
 765                                return TYPEC_CC_RP_1_5;
 766                        return TYPEC_CC_RP_DEF;
 767                }
 768        }
 769
 770        return TYPEC_CC_RP_DEF;
 771}
 772
 773static int tcpm_set_attached_state(struct tcpm_port *port, bool attached)
 774{
 775        return port->tcpc->set_roles(port->tcpc, attached, port->pwr_role,
 776                                     port->data_role);
 777}
 778
 779static int tcpm_set_roles(struct tcpm_port *port, bool attached,
 780                          enum typec_role role, enum typec_data_role data)
 781{
 782        enum typec_orientation orientation;
 783        enum usb_role usb_role;
 784        int ret;
 785
 786        if (port->polarity == TYPEC_POLARITY_CC1)
 787                orientation = TYPEC_ORIENTATION_NORMAL;
 788        else
 789                orientation = TYPEC_ORIENTATION_REVERSE;
 790
 791        if (data == TYPEC_HOST)
 792                usb_role = USB_ROLE_HOST;
 793        else
 794                usb_role = USB_ROLE_DEVICE;
 795
 796        ret = tcpm_mux_set(port, TYPEC_STATE_USB, usb_role, orientation);
 797        if (ret < 0)
 798                return ret;
 799
 800        ret = port->tcpc->set_roles(port->tcpc, attached, role, data);
 801        if (ret < 0)
 802                return ret;
 803
 804        port->pwr_role = role;
 805        port->data_role = data;
 806        typec_set_data_role(port->typec_port, data);
 807        typec_set_pwr_role(port->typec_port, role);
 808
 809        return 0;
 810}
 811
 812static int tcpm_set_pwr_role(struct tcpm_port *port, enum typec_role role)
 813{
 814        int ret;
 815
 816        ret = port->tcpc->set_roles(port->tcpc, true, role,
 817                                    port->data_role);
 818        if (ret < 0)
 819                return ret;
 820
 821        port->pwr_role = role;
 822        typec_set_pwr_role(port->typec_port, role);
 823
 824        return 0;
 825}
 826
 827static int tcpm_pd_send_source_caps(struct tcpm_port *port)
 828{
 829        struct pd_message msg;
 830        int i;
 831
 832        memset(&msg, 0, sizeof(msg));
 833        if (!port->nr_src_pdo) {
 834                /* No source capabilities defined, sink only */
 835                msg.header = PD_HEADER_LE(PD_CTRL_REJECT,
 836                                          port->pwr_role,
 837                                          port->data_role,
 838                                          port->negotiated_rev,
 839                                          port->message_id, 0);
 840        } else {
 841                msg.header = PD_HEADER_LE(PD_DATA_SOURCE_CAP,
 842                                          port->pwr_role,
 843                                          port->data_role,
 844                                          port->negotiated_rev,
 845                                          port->message_id,
 846                                          port->nr_src_pdo);
 847        }
 848        for (i = 0; i < port->nr_src_pdo; i++)
 849                msg.payload[i] = cpu_to_le32(port->src_pdo[i]);
 850
 851        return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
 852}
 853
 854static int tcpm_pd_send_sink_caps(struct tcpm_port *port)
 855{
 856        struct pd_message msg;
 857        int i;
 858
 859        memset(&msg, 0, sizeof(msg));
 860        if (!port->nr_snk_pdo) {
 861                /* No sink capabilities defined, source only */
 862                msg.header = PD_HEADER_LE(PD_CTRL_REJECT,
 863                                          port->pwr_role,
 864                                          port->data_role,
 865                                          port->negotiated_rev,
 866                                          port->message_id, 0);
 867        } else {
 868                msg.header = PD_HEADER_LE(PD_DATA_SINK_CAP,
 869                                          port->pwr_role,
 870                                          port->data_role,
 871                                          port->negotiated_rev,
 872                                          port->message_id,
 873                                          port->nr_snk_pdo);
 874        }
 875        for (i = 0; i < port->nr_snk_pdo; i++)
 876                msg.payload[i] = cpu_to_le32(port->snk_pdo[i]);
 877
 878        return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
 879}
 880
 881static void tcpm_set_state(struct tcpm_port *port, enum tcpm_state state,
 882                           unsigned int delay_ms)
 883{
 884        if (delay_ms) {
 885                tcpm_log(port, "pending state change %s -> %s @ %u ms",
 886                         tcpm_states[port->state], tcpm_states[state],
 887                         delay_ms);
 888                port->delayed_state = state;
 889                mod_delayed_work(port->wq, &port->state_machine,
 890                                 msecs_to_jiffies(delay_ms));
 891                port->delayed_runtime = jiffies + msecs_to_jiffies(delay_ms);
 892                port->delay_ms = delay_ms;
 893        } else {
 894                tcpm_log(port, "state change %s -> %s",
 895                         tcpm_states[port->state], tcpm_states[state]);
 896                port->delayed_state = INVALID_STATE;
 897                port->prev_state = port->state;
 898                port->state = state;
 899                /*
 900                 * Don't re-queue the state machine work item if we're currently
 901                 * in the state machine and we're immediately changing states.
 902                 * tcpm_state_machine_work() will continue running the state
 903                 * machine.
 904                 */
 905                if (!port->state_machine_running)
 906                        mod_delayed_work(port->wq, &port->state_machine, 0);
 907        }
 908}
 909
 910static void tcpm_set_state_cond(struct tcpm_port *port, enum tcpm_state state,
 911                                unsigned int delay_ms)
 912{
 913        if (port->enter_state == port->state)
 914                tcpm_set_state(port, state, delay_ms);
 915        else
 916                tcpm_log(port,
 917                         "skipped %sstate change %s -> %s [%u ms], context state %s",
 918                         delay_ms ? "delayed " : "",
 919                         tcpm_states[port->state], tcpm_states[state],
 920                         delay_ms, tcpm_states[port->enter_state]);
 921}
 922
 923static void tcpm_queue_message(struct tcpm_port *port,
 924                               enum pd_msg_request message)
 925{
 926        port->queued_message = message;
 927        mod_delayed_work(port->wq, &port->state_machine, 0);
 928}
 929
 930/*
 931 * VDM/VDO handling functions
 932 */
 933static void tcpm_queue_vdm(struct tcpm_port *port, const u32 header,
 934                           const u32 *data, int cnt)
 935{
 936        port->vdo_count = cnt + 1;
 937        port->vdo_data[0] = header;
 938        memcpy(&port->vdo_data[1], data, sizeof(u32) * cnt);
 939        /* Set ready, vdm state machine will actually send */
 940        port->vdm_retries = 0;
 941        port->vdm_state = VDM_STATE_READY;
 942}
 943
 944static void svdm_consume_identity(struct tcpm_port *port, const __le32 *payload,
 945                                  int cnt)
 946{
 947        u32 vdo = le32_to_cpu(payload[VDO_INDEX_IDH]);
 948        u32 product = le32_to_cpu(payload[VDO_INDEX_PRODUCT]);
 949
 950        memset(&port->mode_data, 0, sizeof(port->mode_data));
 951
 952        port->partner_ident.id_header = vdo;
 953        port->partner_ident.cert_stat = le32_to_cpu(payload[VDO_INDEX_CSTAT]);
 954        port->partner_ident.product = product;
 955
 956        typec_partner_set_identity(port->partner);
 957
 958        tcpm_log(port, "Identity: %04x:%04x.%04x",
 959                 PD_IDH_VID(vdo),
 960                 PD_PRODUCT_PID(product), product & 0xffff);
 961}
 962
 963static bool svdm_consume_svids(struct tcpm_port *port, const __le32 *payload,
 964                               int cnt)
 965{
 966        struct pd_mode_data *pmdata = &port->mode_data;
 967        int i;
 968
 969        for (i = 1; i < cnt; i++) {
 970                u32 p = le32_to_cpu(payload[i]);
 971                u16 svid;
 972
 973                svid = (p >> 16) & 0xffff;
 974                if (!svid)
 975                        return false;
 976
 977                if (pmdata->nsvids >= SVID_DISCOVERY_MAX)
 978                        goto abort;
 979
 980                pmdata->svids[pmdata->nsvids++] = svid;
 981                tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
 982
 983                svid = p & 0xffff;
 984                if (!svid)
 985                        return false;
 986
 987                if (pmdata->nsvids >= SVID_DISCOVERY_MAX)
 988                        goto abort;
 989
 990                pmdata->svids[pmdata->nsvids++] = svid;
 991                tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
 992        }
 993        return true;
 994abort:
 995        tcpm_log(port, "SVID_DISCOVERY_MAX(%d) too low!", SVID_DISCOVERY_MAX);
 996        return false;
 997}
 998
 999static void svdm_consume_modes(struct tcpm_port *port, const __le32 *payload,
1000                               int cnt)
1001{
1002        struct pd_mode_data *pmdata = &port->mode_data;
1003        struct typec_altmode_desc *paltmode;
1004        int i;
1005
1006        if (pmdata->altmodes >= ARRAY_SIZE(port->partner_altmode)) {
1007                /* Already logged in svdm_consume_svids() */
1008                return;
1009        }
1010
1011        for (i = 1; i < cnt; i++) {
1012                paltmode = &pmdata->altmode_desc[pmdata->altmodes];
1013                memset(paltmode, 0, sizeof(*paltmode));
1014
1015                paltmode->svid = pmdata->svids[pmdata->svid_index];
1016                paltmode->mode = i;
1017                paltmode->vdo = le32_to_cpu(payload[i]);
1018
1019                tcpm_log(port, " Alternate mode %d: SVID 0x%04x, VDO %d: 0x%08x",
1020                         pmdata->altmodes, paltmode->svid,
1021                         paltmode->mode, paltmode->vdo);
1022
1023                pmdata->altmodes++;
1024        }
1025}
1026
1027static void tcpm_register_partner_altmodes(struct tcpm_port *port)
1028{
1029        struct pd_mode_data *modep = &port->mode_data;
1030        struct typec_altmode *altmode;
1031        int i;
1032
1033        for (i = 0; i < modep->altmodes; i++) {
1034                altmode = typec_partner_register_altmode(port->partner,
1035                                                &modep->altmode_desc[i]);
1036                if (!altmode)
1037                        tcpm_log(port, "Failed to register partner SVID 0x%04x",
1038                                 modep->altmode_desc[i].svid);
1039                port->partner_altmode[i] = altmode;
1040        }
1041}
1042
1043#define supports_modal(port)    PD_IDH_MODAL_SUPP((port)->partner_ident.id_header)
1044
1045static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
1046                        u32 *response)
1047{
1048        struct typec_altmode *adev;
1049        struct typec_altmode *pdev;
1050        struct pd_mode_data *modep;
1051        u32 p[PD_MAX_PAYLOAD];
1052        int rlen = 0;
1053        int cmd_type;
1054        int cmd;
1055        int i;
1056
1057        for (i = 0; i < cnt; i++)
1058                p[i] = le32_to_cpu(payload[i]);
1059
1060        cmd_type = PD_VDO_CMDT(p[0]);
1061        cmd = PD_VDO_CMD(p[0]);
1062
1063        tcpm_log(port, "Rx VDM cmd 0x%x type %d cmd %d len %d",
1064                 p[0], cmd_type, cmd, cnt);
1065
1066        modep = &port->mode_data;
1067
1068        adev = typec_match_altmode(port->port_altmode, ALTMODE_DISCOVERY_MAX,
1069                                   PD_VDO_VID(p[0]), PD_VDO_OPOS(p[0]));
1070
1071        pdev = typec_match_altmode(port->partner_altmode, ALTMODE_DISCOVERY_MAX,
1072                                   PD_VDO_VID(p[0]), PD_VDO_OPOS(p[0]));
1073
1074        switch (cmd_type) {
1075        case CMDT_INIT:
1076                switch (cmd) {
1077                case CMD_DISCOVER_IDENT:
1078                        /* 6.4.4.3.1: Only respond as UFP (device) */
1079                        if (port->data_role == TYPEC_DEVICE &&
1080                            port->nr_snk_vdo) {
1081                                for (i = 0; i <  port->nr_snk_vdo; i++)
1082                                        response[i + 1] = port->snk_vdo[i];
1083                                rlen = port->nr_snk_vdo + 1;
1084                        }
1085                        break;
1086                case CMD_DISCOVER_SVID:
1087                        break;
1088                case CMD_DISCOVER_MODES:
1089                        break;
1090                case CMD_ENTER_MODE:
1091                        break;
1092                case CMD_EXIT_MODE:
1093                        break;
1094                case CMD_ATTENTION:
1095                        /* Attention command does not have response */
1096                        if (adev)
1097                                typec_altmode_attention(adev, p[1]);
1098                        return 0;
1099                default:
1100                        break;
1101                }
1102                if (rlen >= 1) {
1103                        response[0] = p[0] | VDO_CMDT(CMDT_RSP_ACK);
1104                } else if (rlen == 0) {
1105                        response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
1106                        rlen = 1;
1107                } else {
1108                        response[0] = p[0] | VDO_CMDT(CMDT_RSP_BUSY);
1109                        rlen = 1;
1110                }
1111                break;
1112        case CMDT_RSP_ACK:
1113                /* silently drop message if we are not connected */
1114                if (IS_ERR_OR_NULL(port->partner))
1115                        break;
1116
1117                switch (cmd) {
1118                case CMD_DISCOVER_IDENT:
1119                        /* 6.4.4.3.1 */
1120                        svdm_consume_identity(port, payload, cnt);
1121                        response[0] = VDO(USB_SID_PD, 1, CMD_DISCOVER_SVID);
1122                        rlen = 1;
1123                        break;
1124                case CMD_DISCOVER_SVID:
1125                        /* 6.4.4.3.2 */
1126                        if (svdm_consume_svids(port, payload, cnt)) {
1127                                response[0] = VDO(USB_SID_PD, 1,
1128                                                  CMD_DISCOVER_SVID);
1129                                rlen = 1;
1130                        } else if (modep->nsvids && supports_modal(port)) {
1131                                response[0] = VDO(modep->svids[0], 1,
1132                                                  CMD_DISCOVER_MODES);
1133                                rlen = 1;
1134                        }
1135                        break;
1136                case CMD_DISCOVER_MODES:
1137                        /* 6.4.4.3.3 */
1138                        svdm_consume_modes(port, payload, cnt);
1139                        modep->svid_index++;
1140                        if (modep->svid_index < modep->nsvids) {
1141                                u16 svid = modep->svids[modep->svid_index];
1142                                response[0] = VDO(svid, 1, CMD_DISCOVER_MODES);
1143                                rlen = 1;
1144                        } else {
1145                                tcpm_register_partner_altmodes(port);
1146                        }
1147                        break;
1148                case CMD_ENTER_MODE:
1149                        if (adev && pdev) {
1150                                typec_altmode_update_active(pdev, true);
1151
1152                                if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) {
1153                                        response[0] = VDO(adev->svid, 1,
1154                                                          CMD_EXIT_MODE);
1155                                        response[0] |= VDO_OPOS(adev->mode);
1156                                        return 1;
1157                                }
1158                        }
1159                        return 0;
1160                case CMD_EXIT_MODE:
1161                        if (adev && pdev) {
1162                                typec_altmode_update_active(pdev, false);
1163
1164                                /* Back to USB Operation */
1165                                WARN_ON(typec_altmode_notify(adev,
1166                                                             TYPEC_STATE_USB,
1167                                                             NULL));
1168                        }
1169                        break;
1170                default:
1171                        break;
1172                }
1173                break;
1174        case CMDT_RSP_NAK:
1175                switch (cmd) {
1176                case CMD_ENTER_MODE:
1177                        /* Back to USB Operation */
1178                        if (adev)
1179                                WARN_ON(typec_altmode_notify(adev,
1180                                                             TYPEC_STATE_USB,
1181                                                             NULL));
1182                        break;
1183                default:
1184                        break;
1185                }
1186                break;
1187        default:
1188                break;
1189        }
1190
1191        /* Informing the alternate mode drivers about everything */
1192        if (adev)
1193                typec_altmode_vdm(adev, p[0], &p[1], cnt);
1194
1195        return rlen;
1196}
1197
1198static void tcpm_handle_vdm_request(struct tcpm_port *port,
1199                                    const __le32 *payload, int cnt)
1200{
1201        int rlen = 0;
1202        u32 response[8] = { };
1203        u32 p0 = le32_to_cpu(payload[0]);
1204
1205        if (port->vdm_state == VDM_STATE_BUSY) {
1206                /* If UFP responded busy retry after timeout */
1207                if (PD_VDO_CMDT(p0) == CMDT_RSP_BUSY) {
1208                        port->vdm_state = VDM_STATE_WAIT_RSP_BUSY;
1209                        port->vdo_retry = (p0 & ~VDO_CMDT_MASK) |
1210                                CMDT_INIT;
1211                        mod_delayed_work(port->wq, &port->vdm_state_machine,
1212                                         msecs_to_jiffies(PD_T_VDM_BUSY));
1213                        return;
1214                }
1215                port->vdm_state = VDM_STATE_DONE;
1216        }
1217
1218        if (PD_VDO_SVDM(p0))
1219                rlen = tcpm_pd_svdm(port, payload, cnt, response);
1220
1221        if (rlen > 0) {
1222                tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);
1223                mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
1224        }
1225}
1226
1227static void tcpm_send_vdm(struct tcpm_port *port, u32 vid, int cmd,
1228                          const u32 *data, int count)
1229{
1230        u32 header;
1231
1232        if (WARN_ON(count > VDO_MAX_SIZE - 1))
1233                count = VDO_MAX_SIZE - 1;
1234
1235        /* set VDM header with VID & CMD */
1236        header = VDO(vid, ((vid & USB_SID_PD) == USB_SID_PD) ?
1237                        1 : (PD_VDO_CMD(cmd) <= CMD_ATTENTION), cmd);
1238        tcpm_queue_vdm(port, header, data, count);
1239
1240        mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
1241}
1242
1243static unsigned int vdm_ready_timeout(u32 vdm_hdr)
1244{
1245        unsigned int timeout;
1246        int cmd = PD_VDO_CMD(vdm_hdr);
1247
1248        /* its not a structured VDM command */
1249        if (!PD_VDO_SVDM(vdm_hdr))
1250                return PD_T_VDM_UNSTRUCTURED;
1251
1252        switch (PD_VDO_CMDT(vdm_hdr)) {
1253        case CMDT_INIT:
1254                if (cmd == CMD_ENTER_MODE || cmd == CMD_EXIT_MODE)
1255                        timeout = PD_T_VDM_WAIT_MODE_E;
1256                else
1257                        timeout = PD_T_VDM_SNDR_RSP;
1258                break;
1259        default:
1260                if (cmd == CMD_ENTER_MODE || cmd == CMD_EXIT_MODE)
1261                        timeout = PD_T_VDM_E_MODE;
1262                else
1263                        timeout = PD_T_VDM_RCVR_RSP;
1264                break;
1265        }
1266        return timeout;
1267}
1268
1269static void vdm_run_state_machine(struct tcpm_port *port)
1270{
1271        struct pd_message msg;
1272        int i, res;
1273
1274        switch (port->vdm_state) {
1275        case VDM_STATE_READY:
1276                /* Only transmit VDM if attached */
1277                if (!port->attached) {
1278                        port->vdm_state = VDM_STATE_ERR_BUSY;
1279                        break;
1280                }
1281
1282                /*
1283                 * if there's traffic or we're not in PDO ready state don't send
1284                 * a VDM.
1285                 */
1286                if (port->state != SRC_READY && port->state != SNK_READY)
1287                        break;
1288
1289                /* Prepare and send VDM */
1290                memset(&msg, 0, sizeof(msg));
1291                msg.header = PD_HEADER_LE(PD_DATA_VENDOR_DEF,
1292                                          port->pwr_role,
1293                                          port->data_role,
1294                                          port->negotiated_rev,
1295                                          port->message_id, port->vdo_count);
1296                for (i = 0; i < port->vdo_count; i++)
1297                        msg.payload[i] = cpu_to_le32(port->vdo_data[i]);
1298                res = tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
1299                if (res < 0) {
1300                        port->vdm_state = VDM_STATE_ERR_SEND;
1301                } else {
1302                        unsigned long timeout;
1303
1304                        port->vdm_retries = 0;
1305                        port->vdm_state = VDM_STATE_BUSY;
1306                        timeout = vdm_ready_timeout(port->vdo_data[0]);
1307                        mod_delayed_work(port->wq, &port->vdm_state_machine,
1308                                         timeout);
1309                }
1310                break;
1311        case VDM_STATE_WAIT_RSP_BUSY:
1312                port->vdo_data[0] = port->vdo_retry;
1313                port->vdo_count = 1;
1314                port->vdm_state = VDM_STATE_READY;
1315                break;
1316        case VDM_STATE_BUSY:
1317                port->vdm_state = VDM_STATE_ERR_TMOUT;
1318                break;
1319        case VDM_STATE_ERR_SEND:
1320                /*
1321                 * A partner which does not support USB PD will not reply,
1322                 * so this is not a fatal error. At the same time, some
1323                 * devices may not return GoodCRC under some circumstances,
1324                 * so we need to retry.
1325                 */
1326                if (port->vdm_retries < 3) {
1327                        tcpm_log(port, "VDM Tx error, retry");
1328                        port->vdm_retries++;
1329                        port->vdm_state = VDM_STATE_READY;
1330                }
1331                break;
1332        default:
1333                break;
1334        }
1335}
1336
1337static void vdm_state_machine_work(struct work_struct *work)
1338{
1339        struct tcpm_port *port = container_of(work, struct tcpm_port,
1340                                              vdm_state_machine.work);
1341        enum vdm_states prev_state;
1342
1343        mutex_lock(&port->lock);
1344
1345        /*
1346         * Continue running as long as the port is not busy and there was
1347         * a state change.
1348         */
1349        do {
1350                prev_state = port->vdm_state;
1351                vdm_run_state_machine(port);
1352        } while (port->vdm_state != prev_state &&
1353                 port->vdm_state != VDM_STATE_BUSY);
1354
1355        mutex_unlock(&port->lock);
1356}
1357
1358enum pdo_err {
1359        PDO_NO_ERR,
1360        PDO_ERR_NO_VSAFE5V,
1361        PDO_ERR_VSAFE5V_NOT_FIRST,
1362        PDO_ERR_PDO_TYPE_NOT_IN_ORDER,
1363        PDO_ERR_FIXED_NOT_SORTED,
1364        PDO_ERR_VARIABLE_BATT_NOT_SORTED,
1365        PDO_ERR_DUPE_PDO,
1366        PDO_ERR_PPS_APDO_NOT_SORTED,
1367        PDO_ERR_DUPE_PPS_APDO,
1368};
1369
1370static const char * const pdo_err_msg[] = {
1371        [PDO_ERR_NO_VSAFE5V] =
1372        " err: source/sink caps should atleast have vSafe5V",
1373        [PDO_ERR_VSAFE5V_NOT_FIRST] =
1374        " err: vSafe5V Fixed Supply Object Shall always be the first object",
1375        [PDO_ERR_PDO_TYPE_NOT_IN_ORDER] =
1376        " err: PDOs should be in the following order: Fixed; Battery; Variable",
1377        [PDO_ERR_FIXED_NOT_SORTED] =
1378        " err: Fixed supply pdos should be in increasing order of their fixed voltage",
1379        [PDO_ERR_VARIABLE_BATT_NOT_SORTED] =
1380        " err: Variable/Battery supply pdos should be in increasing order of their minimum voltage",
1381        [PDO_ERR_DUPE_PDO] =
1382        " err: Variable/Batt supply pdos cannot have same min/max voltage",
1383        [PDO_ERR_PPS_APDO_NOT_SORTED] =
1384        " err: Programmable power supply apdos should be in increasing order of their maximum voltage",
1385        [PDO_ERR_DUPE_PPS_APDO] =
1386        " err: Programmable power supply apdos cannot have same min/max voltage and max current",
1387};
1388
1389static enum pdo_err tcpm_caps_err(struct tcpm_port *port, const u32 *pdo,
1390                                  unsigned int nr_pdo)
1391{
1392        unsigned int i;
1393
1394        /* Should at least contain vSafe5v */
1395        if (nr_pdo < 1)
1396                return PDO_ERR_NO_VSAFE5V;
1397
1398        /* The vSafe5V Fixed Supply Object Shall always be the first object */
1399        if (pdo_type(pdo[0]) != PDO_TYPE_FIXED ||
1400            pdo_fixed_voltage(pdo[0]) != VSAFE5V)
1401                return PDO_ERR_VSAFE5V_NOT_FIRST;
1402
1403        for (i = 1; i < nr_pdo; i++) {
1404                if (pdo_type(pdo[i]) < pdo_type(pdo[i - 1])) {
1405                        return PDO_ERR_PDO_TYPE_NOT_IN_ORDER;
1406                } else if (pdo_type(pdo[i]) == pdo_type(pdo[i - 1])) {
1407                        enum pd_pdo_type type = pdo_type(pdo[i]);
1408
1409                        switch (type) {
1410                        /*
1411                         * The remaining Fixed Supply Objects, if
1412                         * present, shall be sent in voltage order;
1413                         * lowest to highest.
1414                         */
1415                        case PDO_TYPE_FIXED:
1416                                if (pdo_fixed_voltage(pdo[i]) <=
1417                                    pdo_fixed_voltage(pdo[i - 1]))
1418                                        return PDO_ERR_FIXED_NOT_SORTED;
1419                                break;
1420                        /*
1421                         * The Battery Supply Objects and Variable
1422                         * supply, if present shall be sent in Minimum
1423                         * Voltage order; lowest to highest.
1424                         */
1425                        case PDO_TYPE_VAR:
1426                        case PDO_TYPE_BATT:
1427                                if (pdo_min_voltage(pdo[i]) <
1428                                    pdo_min_voltage(pdo[i - 1]))
1429                                        return PDO_ERR_VARIABLE_BATT_NOT_SORTED;
1430                                else if ((pdo_min_voltage(pdo[i]) ==
1431                                          pdo_min_voltage(pdo[i - 1])) &&
1432                                         (pdo_max_voltage(pdo[i]) ==
1433                                          pdo_max_voltage(pdo[i - 1])))
1434                                        return PDO_ERR_DUPE_PDO;
1435                                break;
1436                        /*
1437                         * The Programmable Power Supply APDOs, if present,
1438                         * shall be sent in Maximum Voltage order;
1439                         * lowest to highest.
1440                         */
1441                        case PDO_TYPE_APDO:
1442                                if (pdo_apdo_type(pdo[i]) != APDO_TYPE_PPS)
1443                                        break;
1444
1445                                if (pdo_pps_apdo_max_voltage(pdo[i]) <
1446                                    pdo_pps_apdo_max_voltage(pdo[i - 1]))
1447                                        return PDO_ERR_PPS_APDO_NOT_SORTED;
1448                                else if (pdo_pps_apdo_min_voltage(pdo[i]) ==
1449                                          pdo_pps_apdo_min_voltage(pdo[i - 1]) &&
1450                                         pdo_pps_apdo_max_voltage(pdo[i]) ==
1451                                          pdo_pps_apdo_max_voltage(pdo[i - 1]) &&
1452                                         pdo_pps_apdo_max_current(pdo[i]) ==
1453                                          pdo_pps_apdo_max_current(pdo[i - 1]))
1454                                        return PDO_ERR_DUPE_PPS_APDO;
1455                                break;
1456                        default:
1457                                tcpm_log_force(port, " Unknown pdo type");
1458                        }
1459                }
1460        }
1461
1462        return PDO_NO_ERR;
1463}
1464
1465static int tcpm_validate_caps(struct tcpm_port *port, const u32 *pdo,
1466                              unsigned int nr_pdo)
1467{
1468        enum pdo_err err_index = tcpm_caps_err(port, pdo, nr_pdo);
1469
1470        if (err_index != PDO_NO_ERR) {
1471                tcpm_log_force(port, " %s", pdo_err_msg[err_index]);
1472                return -EINVAL;
1473        }
1474
1475        return 0;
1476}
1477
1478static int tcpm_altmode_enter(struct typec_altmode *altmode, u32 *vdo)
1479{
1480        struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
1481        u32 header;
1482
1483        mutex_lock(&port->lock);
1484        header = VDO(altmode->svid, vdo ? 2 : 1, CMD_ENTER_MODE);
1485        header |= VDO_OPOS(altmode->mode);
1486
1487        tcpm_queue_vdm(port, header, vdo, vdo ? 1 : 0);
1488        mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
1489        mutex_unlock(&port->lock);
1490
1491        return 0;
1492}
1493
1494static int tcpm_altmode_exit(struct typec_altmode *altmode)
1495{
1496        struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
1497        u32 header;
1498
1499        mutex_lock(&port->lock);
1500        header = VDO(altmode->svid, 1, CMD_EXIT_MODE);
1501        header |= VDO_OPOS(altmode->mode);
1502
1503        tcpm_queue_vdm(port, header, NULL, 0);
1504        mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
1505        mutex_unlock(&port->lock);
1506
1507        return 0;
1508}
1509
1510static int tcpm_altmode_vdm(struct typec_altmode *altmode,
1511                            u32 header, const u32 *data, int count)
1512{
1513        struct tcpm_port *port = typec_altmode_get_drvdata(altmode);
1514
1515        mutex_lock(&port->lock);
1516        tcpm_queue_vdm(port, header, data, count - 1);
1517        mod_delayed_work(port->wq, &port->vdm_state_machine, 0);
1518        mutex_unlock(&port->lock);
1519
1520        return 0;
1521}
1522
1523static const struct typec_altmode_ops tcpm_altmode_ops = {
1524        .enter = tcpm_altmode_enter,
1525        .exit = tcpm_altmode_exit,
1526        .vdm = tcpm_altmode_vdm,
1527};
1528
1529/*
1530 * PD (data, control) command handling functions
1531 */
1532static inline enum tcpm_state ready_state(struct tcpm_port *port)
1533{
1534        if (port->pwr_role == TYPEC_SOURCE)
1535                return SRC_READY;
1536        else
1537                return SNK_READY;
1538}
1539
1540static int tcpm_pd_send_control(struct tcpm_port *port,
1541                                enum pd_ctrl_msg_type type);
1542
1543static void tcpm_handle_alert(struct tcpm_port *port, const __le32 *payload,
1544                              int cnt)
1545{
1546        u32 p0 = le32_to_cpu(payload[0]);
1547        unsigned int type = usb_pd_ado_type(p0);
1548
1549        if (!type) {
1550                tcpm_log(port, "Alert message received with no type");
1551                return;
1552        }
1553
1554        /* Just handling non-battery alerts for now */
1555        if (!(type & USB_PD_ADO_TYPE_BATT_STATUS_CHANGE)) {
1556                switch (port->state) {
1557                case SRC_READY:
1558                case SNK_READY:
1559                        tcpm_set_state(port, GET_STATUS_SEND, 0);
1560                        break;
1561                default:
1562                        tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
1563                        break;
1564                }
1565        }
1566}
1567
1568static void tcpm_pd_data_request(struct tcpm_port *port,
1569                                 const struct pd_message *msg)
1570{
1571        enum pd_data_msg_type type = pd_header_type_le(msg->header);
1572        unsigned int cnt = pd_header_cnt_le(msg->header);
1573        unsigned int rev = pd_header_rev_le(msg->header);
1574        unsigned int i;
1575
1576        switch (type) {
1577        case PD_DATA_SOURCE_CAP:
1578                if (port->pwr_role != TYPEC_SINK)
1579                        break;
1580
1581                for (i = 0; i < cnt; i++)
1582                        port->source_caps[i] = le32_to_cpu(msg->payload[i]);
1583
1584                port->nr_source_caps = cnt;
1585
1586                tcpm_log_source_caps(port);
1587
1588                tcpm_validate_caps(port, port->source_caps,
1589                                   port->nr_source_caps);
1590
1591                /*
1592                 * Adjust revision in subsequent message headers, as required,
1593                 * to comply with 6.2.1.1.5 of the USB PD 3.0 spec. We don't
1594                 * support Rev 1.0 so just do nothing in that scenario.
1595                 */
1596                if (rev == PD_REV10)
1597                        break;
1598
1599                if (rev < PD_MAX_REV)
1600                        port->negotiated_rev = rev;
1601
1602                /*
1603                 * This message may be received even if VBUS is not
1604                 * present. This is quite unexpected; see USB PD
1605                 * specification, sections 8.3.3.6.3.1 and 8.3.3.6.3.2.
1606                 * However, at the same time, we must be ready to
1607                 * receive this message and respond to it 15ms after
1608                 * receiving PS_RDY during power swap operations, no matter
1609                 * if VBUS is available or not (USB PD specification,
1610                 * section 6.5.9.2).
1611                 * So we need to accept the message either way,
1612                 * but be prepared to keep waiting for VBUS after it was
1613                 * handled.
1614                 */
1615                tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
1616                break;
1617        case PD_DATA_REQUEST:
1618                if (port->pwr_role != TYPEC_SOURCE ||
1619                    cnt != 1) {
1620                        tcpm_queue_message(port, PD_MSG_CTRL_REJECT);
1621                        break;
1622                }
1623
1624                /*
1625                 * Adjust revision in subsequent message headers, as required,
1626                 * to comply with 6.2.1.1.5 of the USB PD 3.0 spec. We don't
1627                 * support Rev 1.0 so just reject in that scenario.
1628                 */
1629                if (rev == PD_REV10) {
1630                        tcpm_queue_message(port, PD_MSG_CTRL_REJECT);
1631                        break;
1632                }
1633
1634                if (rev < PD_MAX_REV)
1635                        port->negotiated_rev = rev;
1636
1637                port->sink_request = le32_to_cpu(msg->payload[0]);
1638                tcpm_set_state(port, SRC_NEGOTIATE_CAPABILITIES, 0);
1639                break;
1640        case PD_DATA_SINK_CAP:
1641                /* We don't do anything with this at the moment... */
1642                for (i = 0; i < cnt; i++)
1643                        port->sink_caps[i] = le32_to_cpu(msg->payload[i]);
1644                port->nr_sink_caps = cnt;
1645                break;
1646        case PD_DATA_VENDOR_DEF:
1647                tcpm_handle_vdm_request(port, msg->payload, cnt);
1648                break;
1649        case PD_DATA_BIST:
1650                if (port->state == SRC_READY || port->state == SNK_READY) {
1651                        port->bist_request = le32_to_cpu(msg->payload[0]);
1652                        tcpm_set_state(port, BIST_RX, 0);
1653                }
1654                break;
1655        case PD_DATA_ALERT:
1656                tcpm_handle_alert(port, msg->payload, cnt);
1657                break;
1658        case PD_DATA_BATT_STATUS:
1659        case PD_DATA_GET_COUNTRY_INFO:
1660                /* Currently unsupported */
1661                tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP);
1662                break;
1663        default:
1664                tcpm_log(port, "Unhandled data message type %#x", type);
1665                break;
1666        }
1667}
1668
1669static void tcpm_pps_complete(struct tcpm_port *port, int result)
1670{
1671        if (port->pps_pending) {
1672                port->pps_status = result;
1673                port->pps_pending = false;
1674                complete(&port->pps_complete);
1675        }
1676}
1677
1678static void tcpm_pd_ctrl_request(struct tcpm_port *port,
1679                                 const struct pd_message *msg)
1680{
1681        enum pd_ctrl_msg_type type = pd_header_type_le(msg->header);
1682        enum tcpm_state next_state;
1683
1684        switch (type) {
1685        case PD_CTRL_GOOD_CRC:
1686        case PD_CTRL_PING:
1687                break;
1688        case PD_CTRL_GET_SOURCE_CAP:
1689                switch (port->state) {
1690                case SRC_READY:
1691                case SNK_READY:
1692                        tcpm_queue_message(port, PD_MSG_DATA_SOURCE_CAP);
1693                        break;
1694                default:
1695                        tcpm_queue_message(port, PD_MSG_CTRL_REJECT);
1696                        break;
1697                }
1698                break;
1699        case PD_CTRL_GET_SINK_CAP:
1700                switch (port->state) {
1701                case SRC_READY:
1702                case SNK_READY:
1703                        tcpm_queue_message(port, PD_MSG_DATA_SINK_CAP);
1704                        break;
1705                default:
1706                        tcpm_queue_message(port, PD_MSG_CTRL_REJECT);
1707                        break;
1708                }
1709                break;
1710        case PD_CTRL_GOTO_MIN:
1711                break;
1712        case PD_CTRL_PS_RDY:
1713                switch (port->state) {
1714                case SNK_TRANSITION_SINK:
1715                        if (port->vbus_present) {
1716                                tcpm_set_current_limit(port,
1717                                                       port->current_limit,
1718                                                       port->supply_voltage);
1719                                port->explicit_contract = true;
1720                                tcpm_set_state(port, SNK_READY, 0);
1721                        } else {
1722                                /*
1723                                 * Seen after power swap. Keep waiting for VBUS
1724                                 * in a transitional state.
1725                                 */
1726                                tcpm_set_state(port,
1727                                               SNK_TRANSITION_SINK_VBUS, 0);
1728                        }
1729                        break;
1730                case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
1731                        tcpm_set_state(port, PR_SWAP_SRC_SNK_SINK_ON, 0);
1732                        break;
1733                case PR_SWAP_SNK_SRC_SINK_OFF:
1734                        tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON, 0);
1735                        break;
1736                case VCONN_SWAP_WAIT_FOR_VCONN:
1737                        tcpm_set_state(port, VCONN_SWAP_TURN_OFF_VCONN, 0);
1738                        break;
1739                default:
1740                        break;
1741                }
1742                break;
1743        case PD_CTRL_REJECT:
1744        case PD_CTRL_WAIT:
1745        case PD_CTRL_NOT_SUPP:
1746                switch (port->state) {
1747                case SNK_NEGOTIATE_CAPABILITIES:
1748                        /* USB PD specification, Figure 8-43 */
1749                        if (port->explicit_contract)
1750                                next_state = SNK_READY;
1751                        else
1752                                next_state = SNK_WAIT_CAPABILITIES;
1753                        tcpm_set_state(port, next_state, 0);
1754                        break;
1755                case SNK_NEGOTIATE_PPS_CAPABILITIES:
1756                        /* Revert data back from any requested PPS updates */
1757                        port->pps_data.out_volt = port->supply_voltage;
1758                        port->pps_data.op_curr = port->current_limit;
1759                        port->pps_status = (type == PD_CTRL_WAIT ?
1760                                            -EAGAIN : -EOPNOTSUPP);
1761                        tcpm_set_state(port, SNK_READY, 0);
1762                        break;
1763                case DR_SWAP_SEND:
1764                        port->swap_status = (type == PD_CTRL_WAIT ?
1765                                             -EAGAIN : -EOPNOTSUPP);
1766                        tcpm_set_state(port, DR_SWAP_CANCEL, 0);
1767                        break;
1768                case PR_SWAP_SEND:
1769                        port->swap_status = (type == PD_CTRL_WAIT ?
1770                                             -EAGAIN : -EOPNOTSUPP);
1771                        tcpm_set_state(port, PR_SWAP_CANCEL, 0);
1772                        break;
1773                case VCONN_SWAP_SEND:
1774                        port->swap_status = (type == PD_CTRL_WAIT ?
1775                                             -EAGAIN : -EOPNOTSUPP);
1776                        tcpm_set_state(port, VCONN_SWAP_CANCEL, 0);
1777                        break;
1778                default:
1779                        break;
1780                }
1781                break;
1782        case PD_CTRL_ACCEPT:
1783                switch (port->state) {
1784                case SNK_NEGOTIATE_CAPABILITIES:
1785                        port->pps_data.active = false;
1786                        tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
1787                        break;
1788                case SNK_NEGOTIATE_PPS_CAPABILITIES:
1789                        port->pps_data.active = true;
1790                        port->supply_voltage = port->pps_data.out_volt;
1791                        port->current_limit = port->pps_data.op_curr;
1792                        tcpm_set_state(port, SNK_TRANSITION_SINK, 0);
1793                        break;
1794                case SOFT_RESET_SEND:
1795                        port->message_id = 0;
1796                        port->rx_msgid = -1;
1797                        if (port->pwr_role == TYPEC_SOURCE)
1798                                next_state = SRC_SEND_CAPABILITIES;
1799                        else
1800                                next_state = SNK_WAIT_CAPABILITIES;
1801                        tcpm_set_state(port, next_state, 0);
1802                        break;
1803                case DR_SWAP_SEND:
1804                        tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0);
1805                        break;
1806                case PR_SWAP_SEND:
1807                        tcpm_set_state(port, PR_SWAP_START, 0);
1808                        break;
1809                case VCONN_SWAP_SEND:
1810                        tcpm_set_state(port, VCONN_SWAP_START, 0);
1811                        break;
1812                default:
1813                        break;
1814                }
1815                break;
1816        case PD_CTRL_SOFT_RESET:
1817                tcpm_set_state(port, SOFT_RESET, 0);
1818                break;
1819        case PD_CTRL_DR_SWAP:
1820                if (port->port_type != TYPEC_PORT_DRP) {
1821                        tcpm_queue_message(port, PD_MSG_CTRL_REJECT);
1822                        break;
1823                }
1824                /*
1825                 * XXX
1826                 * 6.3.9: If an alternate mode is active, a request to swap
1827                 * alternate modes shall trigger a port reset.
1828                 */
1829                switch (port->state) {
1830                case SRC_READY:
1831                case SNK_READY:
1832                        tcpm_set_state(port, DR_SWAP_ACCEPT, 0);
1833                        break;
1834                default:
1835                        tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
1836                        break;
1837                }
1838                break;
1839        case PD_CTRL_PR_SWAP:
1840                if (port->port_type != TYPEC_PORT_DRP) {
1841                        tcpm_queue_message(port, PD_MSG_CTRL_REJECT);
1842                        break;
1843                }
1844                switch (port->state) {
1845                case SRC_READY:
1846                case SNK_READY:
1847                        tcpm_set_state(port, PR_SWAP_ACCEPT, 0);
1848                        break;
1849                default:
1850                        tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
1851                        break;
1852                }
1853                break;
1854        case PD_CTRL_VCONN_SWAP:
1855                switch (port->state) {
1856                case SRC_READY:
1857                case SNK_READY:
1858                        tcpm_set_state(port, VCONN_SWAP_ACCEPT, 0);
1859                        break;
1860                default:
1861                        tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
1862                        break;
1863                }
1864                break;
1865        case PD_CTRL_GET_SOURCE_CAP_EXT:
1866        case PD_CTRL_GET_STATUS:
1867        case PD_CTRL_FR_SWAP:
1868        case PD_CTRL_GET_PPS_STATUS:
1869        case PD_CTRL_GET_COUNTRY_CODES:
1870                /* Currently not supported */
1871                tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP);
1872                break;
1873        default:
1874                tcpm_log(port, "Unhandled ctrl message type %#x", type);
1875                break;
1876        }
1877}
1878
1879static void tcpm_pd_ext_msg_request(struct tcpm_port *port,
1880                                    const struct pd_message *msg)
1881{
1882        enum pd_ext_msg_type type = pd_header_type_le(msg->header);
1883        unsigned int data_size = pd_ext_header_data_size_le(msg->ext_msg.header);
1884
1885        if (!(msg->ext_msg.header & PD_EXT_HDR_CHUNKED)) {
1886                tcpm_log(port, "Unchunked extended messages unsupported");
1887                return;
1888        }
1889
1890        if (data_size > PD_EXT_MAX_CHUNK_DATA) {
1891                tcpm_log(port, "Chunk handling not yet supported");
1892                return;
1893        }
1894
1895        switch (type) {
1896        case PD_EXT_STATUS:
1897                /*
1898                 * If PPS related events raised then get PPS status to clear
1899                 * (see USB PD 3.0 Spec, 6.5.2.4)
1900                 */
1901                if (msg->ext_msg.data[USB_PD_EXT_SDB_EVENT_FLAGS] &
1902                    USB_PD_EXT_SDB_PPS_EVENTS)
1903                        tcpm_set_state(port, GET_PPS_STATUS_SEND, 0);
1904                else
1905                        tcpm_set_state(port, ready_state(port), 0);
1906                break;
1907        case PD_EXT_PPS_STATUS:
1908                /*
1909                 * For now the PPS status message is used to clear events
1910                 * and nothing more.
1911                 */
1912                tcpm_set_state(port, ready_state(port), 0);
1913                break;
1914        case PD_EXT_SOURCE_CAP_EXT:
1915        case PD_EXT_GET_BATT_CAP:
1916        case PD_EXT_GET_BATT_STATUS:
1917        case PD_EXT_BATT_CAP:
1918        case PD_EXT_GET_MANUFACTURER_INFO:
1919        case PD_EXT_MANUFACTURER_INFO:
1920        case PD_EXT_SECURITY_REQUEST:
1921        case PD_EXT_SECURITY_RESPONSE:
1922        case PD_EXT_FW_UPDATE_REQUEST:
1923        case PD_EXT_FW_UPDATE_RESPONSE:
1924        case PD_EXT_COUNTRY_INFO:
1925        case PD_EXT_COUNTRY_CODES:
1926                tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP);
1927                break;
1928        default:
1929                tcpm_log(port, "Unhandled extended message type %#x", type);
1930                break;
1931        }
1932}
1933
1934static void tcpm_pd_rx_handler(struct work_struct *work)
1935{
1936        struct pd_rx_event *event = container_of(work,
1937                                                 struct pd_rx_event, work);
1938        const struct pd_message *msg = &event->msg;
1939        unsigned int cnt = pd_header_cnt_le(msg->header);
1940        struct tcpm_port *port = event->port;
1941
1942        mutex_lock(&port->lock);
1943
1944        tcpm_log(port, "PD RX, header: %#x [%d]", le16_to_cpu(msg->header),
1945                 port->attached);
1946
1947        if (port->attached) {
1948                enum pd_ctrl_msg_type type = pd_header_type_le(msg->header);
1949                unsigned int msgid = pd_header_msgid_le(msg->header);
1950
1951                /*
1952                 * USB PD standard, 6.6.1.2:
1953                 * "... if MessageID value in a received Message is the
1954                 * same as the stored value, the receiver shall return a
1955                 * GoodCRC Message with that MessageID value and drop
1956                 * the Message (this is a retry of an already received
1957                 * Message). Note: this shall not apply to the Soft_Reset
1958                 * Message which always has a MessageID value of zero."
1959                 */
1960                if (msgid == port->rx_msgid && type != PD_CTRL_SOFT_RESET)
1961                        goto done;
1962                port->rx_msgid = msgid;
1963
1964                /*
1965                 * If both ends believe to be DFP/host, we have a data role
1966                 * mismatch.
1967                 */
1968                if (!!(le16_to_cpu(msg->header) & PD_HEADER_DATA_ROLE) ==
1969                    (port->data_role == TYPEC_HOST)) {
1970                        tcpm_log(port,
1971                                 "Data role mismatch, initiating error recovery");
1972                        tcpm_set_state(port, ERROR_RECOVERY, 0);
1973                } else {
1974                        if (msg->header & PD_HEADER_EXT_HDR)
1975                                tcpm_pd_ext_msg_request(port, msg);
1976                        else if (cnt)
1977                                tcpm_pd_data_request(port, msg);
1978                        else
1979                                tcpm_pd_ctrl_request(port, msg);
1980                }
1981        }
1982
1983done:
1984        mutex_unlock(&port->lock);
1985        kfree(event);
1986}
1987
1988void tcpm_pd_receive(struct tcpm_port *port, const struct pd_message *msg)
1989{
1990        struct pd_rx_event *event;
1991
1992        event = kzalloc(sizeof(*event), GFP_ATOMIC);
1993        if (!event)
1994                return;
1995
1996        INIT_WORK(&event->work, tcpm_pd_rx_handler);
1997        event->port = port;
1998        memcpy(&event->msg, msg, sizeof(*msg));
1999        queue_work(port->wq, &event->work);
2000}
2001EXPORT_SYMBOL_GPL(tcpm_pd_receive);
2002
2003static int tcpm_pd_send_control(struct tcpm_port *port,
2004                                enum pd_ctrl_msg_type type)
2005{
2006        struct pd_message msg;
2007
2008        memset(&msg, 0, sizeof(msg));
2009        msg.header = PD_HEADER_LE(type, port->pwr_role,
2010                                  port->data_role,
2011                                  port->negotiated_rev,
2012                                  port->message_id, 0);
2013
2014        return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
2015}
2016
2017/*
2018 * Send queued message without affecting state.
2019 * Return true if state machine should go back to sleep,
2020 * false otherwise.
2021 */
2022static bool tcpm_send_queued_message(struct tcpm_port *port)
2023{
2024        enum pd_msg_request queued_message;
2025
2026        do {
2027                queued_message = port->queued_message;
2028                port->queued_message = PD_MSG_NONE;
2029
2030                switch (queued_message) {
2031                case PD_MSG_CTRL_WAIT:
2032                        tcpm_pd_send_control(port, PD_CTRL_WAIT);
2033                        break;
2034                case PD_MSG_CTRL_REJECT:
2035                        tcpm_pd_send_control(port, PD_CTRL_REJECT);
2036                        break;
2037                case PD_MSG_CTRL_NOT_SUPP:
2038                        tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP);
2039                        break;
2040                case PD_MSG_DATA_SINK_CAP:
2041                        tcpm_pd_send_sink_caps(port);
2042                        break;
2043                case PD_MSG_DATA_SOURCE_CAP:
2044                        tcpm_pd_send_source_caps(port);
2045                        break;
2046                default:
2047                        break;
2048                }
2049        } while (port->queued_message != PD_MSG_NONE);
2050
2051        if (port->delayed_state != INVALID_STATE) {
2052                if (time_is_after_jiffies(port->delayed_runtime)) {
2053                        mod_delayed_work(port->wq, &port->state_machine,
2054                                         port->delayed_runtime - jiffies);
2055                        return true;
2056                }
2057                port->delayed_state = INVALID_STATE;
2058        }
2059        return false;
2060}
2061
2062static int tcpm_pd_check_request(struct tcpm_port *port)
2063{
2064        u32 pdo, rdo = port->sink_request;
2065        unsigned int max, op, pdo_max, index;
2066        enum pd_pdo_type type;
2067
2068        index = rdo_index(rdo);
2069        if (!index || index > port->nr_src_pdo)
2070                return -EINVAL;
2071
2072        pdo = port->src_pdo[index - 1];
2073        type = pdo_type(pdo);
2074        switch (type) {
2075        case PDO_TYPE_FIXED:
2076        case PDO_TYPE_VAR:
2077                max = rdo_max_current(rdo);
2078                op = rdo_op_current(rdo);
2079                pdo_max = pdo_max_current(pdo);
2080
2081                if (op > pdo_max)
2082                        return -EINVAL;
2083                if (max > pdo_max && !(rdo & RDO_CAP_MISMATCH))
2084                        return -EINVAL;
2085
2086                if (type == PDO_TYPE_FIXED)
2087                        tcpm_log(port,
2088                                 "Requested %u mV, %u mA for %u / %u mA",
2089                                 pdo_fixed_voltage(pdo), pdo_max, op, max);
2090                else
2091                        tcpm_log(port,
2092                                 "Requested %u -> %u mV, %u mA for %u / %u mA",
2093                                 pdo_min_voltage(pdo), pdo_max_voltage(pdo),
2094                                 pdo_max, op, max);
2095                break;
2096        case PDO_TYPE_BATT:
2097                max = rdo_max_power(rdo);
2098                op = rdo_op_power(rdo);
2099                pdo_max = pdo_max_power(pdo);
2100
2101                if (op > pdo_max)
2102                        return -EINVAL;
2103                if (max > pdo_max && !(rdo & RDO_CAP_MISMATCH))
2104                        return -EINVAL;
2105                tcpm_log(port,
2106                         "Requested %u -> %u mV, %u mW for %u / %u mW",
2107                         pdo_min_voltage(pdo), pdo_max_voltage(pdo),
2108                         pdo_max, op, max);
2109                break;
2110        default:
2111                return -EINVAL;
2112        }
2113
2114        port->op_vsafe5v = index == 1;
2115
2116        return 0;
2117}
2118
2119#define min_power(x, y) min(pdo_max_power(x), pdo_max_power(y))
2120#define min_current(x, y) min(pdo_max_current(x), pdo_max_current(y))
2121
2122static int tcpm_pd_select_pdo(struct tcpm_port *port, int *sink_pdo,
2123                              int *src_pdo)
2124{
2125        unsigned int i, j, max_src_mv = 0, min_src_mv = 0, max_mw = 0,
2126                     max_mv = 0, src_mw = 0, src_ma = 0, max_snk_mv = 0,
2127                     min_snk_mv = 0;
2128        int ret = -EINVAL;
2129
2130        port->pps_data.supported = false;
2131        port->usb_type = POWER_SUPPLY_USB_TYPE_PD;
2132
2133        /*
2134         * Select the source PDO providing the most power which has a
2135         * matchig sink cap.
2136         */
2137        for (i = 0; i < port->nr_source_caps; i++) {
2138                u32 pdo = port->source_caps[i];
2139                enum pd_pdo_type type = pdo_type(pdo);
2140
2141                switch (type) {
2142                case PDO_TYPE_FIXED:
2143                        max_src_mv = pdo_fixed_voltage(pdo);
2144                        min_src_mv = max_src_mv;
2145                        break;
2146                case PDO_TYPE_BATT:
2147                case PDO_TYPE_VAR:
2148                        max_src_mv = pdo_max_voltage(pdo);
2149                        min_src_mv = pdo_min_voltage(pdo);
2150                        break;
2151                case PDO_TYPE_APDO:
2152                        if (pdo_apdo_type(pdo) == APDO_TYPE_PPS) {
2153                                port->pps_data.supported = true;
2154                                port->usb_type =
2155                                        POWER_SUPPLY_USB_TYPE_PD_PPS;
2156                        }
2157                        continue;
2158                default:
2159                        tcpm_log(port, "Invalid source PDO type, ignoring");
2160                        continue;
2161                }
2162
2163                switch (type) {
2164                case PDO_TYPE_FIXED:
2165                case PDO_TYPE_VAR:
2166                        src_ma = pdo_max_current(pdo);
2167                        src_mw = src_ma * min_src_mv / 1000;
2168                        break;
2169                case PDO_TYPE_BATT:
2170                        src_mw = pdo_max_power(pdo);
2171                        break;
2172                case PDO_TYPE_APDO:
2173                        continue;
2174                default:
2175                        tcpm_log(port, "Invalid source PDO type, ignoring");
2176                        continue;
2177                }
2178
2179                for (j = 0; j < port->nr_snk_pdo; j++) {
2180                        pdo = port->snk_pdo[j];
2181
2182                        switch (pdo_type(pdo)) {
2183                        case PDO_TYPE_FIXED:
2184                                max_snk_mv = pdo_fixed_voltage(pdo);
2185                                min_snk_mv = max_snk_mv;
2186                                break;
2187                        case PDO_TYPE_BATT:
2188                        case PDO_TYPE_VAR:
2189                                max_snk_mv = pdo_max_voltage(pdo);
2190                                min_snk_mv = pdo_min_voltage(pdo);
2191                                break;
2192                        case PDO_TYPE_APDO:
2193                                continue;
2194                        default:
2195                                tcpm_log(port, "Invalid sink PDO type, ignoring");
2196                                continue;
2197                        }
2198
2199                        if (max_src_mv <= max_snk_mv &&
2200                                min_src_mv >= min_snk_mv) {
2201                                /* Prefer higher voltages if available */
2202                                if ((src_mw == max_mw && min_src_mv > max_mv) ||
2203                                                        src_mw > max_mw) {
2204                                        *src_pdo = i;
2205                                        *sink_pdo = j;
2206                                        max_mw = src_mw;
2207                                        max_mv = min_src_mv;
2208                                        ret = 0;
2209                                }
2210                        }
2211                }
2212        }
2213
2214        return ret;
2215}
2216
2217#define min_pps_apdo_current(x, y)      \
2218        min(pdo_pps_apdo_max_current(x), pdo_pps_apdo_max_current(y))
2219
2220static unsigned int tcpm_pd_select_pps_apdo(struct tcpm_port *port)
2221{
2222        unsigned int i, j, max_mw = 0, max_mv = 0;
2223        unsigned int min_src_mv, max_src_mv, src_ma, src_mw;
2224        unsigned int min_snk_mv, max_snk_mv;
2225        unsigned int max_op_mv;
2226        u32 pdo, src, snk;
2227        unsigned int src_pdo = 0, snk_pdo = 0;
2228
2229        /*
2230         * Select the source PPS APDO providing the most power while staying
2231         * within the board's limits. We skip the first PDO as this is always
2232         * 5V 3A.
2233         */
2234        for (i = 1; i < port->nr_source_caps; ++i) {
2235                pdo = port->source_caps[i];
2236
2237                switch (pdo_type(pdo)) {
2238                case PDO_TYPE_APDO:
2239                        if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
2240                                tcpm_log(port, "Not PPS APDO (source), ignoring");
2241                                continue;
2242                        }
2243
2244                        min_src_mv = pdo_pps_apdo_min_voltage(pdo);
2245                        max_src_mv = pdo_pps_apdo_max_voltage(pdo);
2246                        src_ma = pdo_pps_apdo_max_current(pdo);
2247                        src_mw = (src_ma * max_src_mv) / 1000;
2248
2249                        /*
2250                         * Now search through the sink PDOs to find a matching
2251                         * PPS APDO. Again skip the first sink PDO as this will
2252                         * always be 5V 3A.
2253                         */
2254                        for (j = 1; j < port->nr_snk_pdo; j++) {
2255                                pdo = port->snk_pdo[j];
2256
2257                                switch (pdo_type(pdo)) {
2258                                case PDO_TYPE_APDO:
2259                                        if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
2260                                                tcpm_log(port,
2261                                                         "Not PPS APDO (sink), ignoring");
2262                                                continue;
2263                                        }
2264
2265                                        min_snk_mv =
2266                                                pdo_pps_apdo_min_voltage(pdo);
2267                                        max_snk_mv =
2268                                                pdo_pps_apdo_max_voltage(pdo);
2269                                        break;
2270                                default:
2271                                        tcpm_log(port,
2272                                                 "Not APDO type (sink), ignoring");
2273                                        continue;
2274                                }
2275
2276                                if (min_src_mv <= max_snk_mv &&
2277                                    max_src_mv >= min_snk_mv) {
2278                                        max_op_mv = min(max_src_mv, max_snk_mv);
2279                                        src_mw = (max_op_mv * src_ma) / 1000;
2280                                        /* Prefer higher voltages if available */
2281                                        if ((src_mw == max_mw &&
2282                                             max_op_mv > max_mv) ||
2283                                            src_mw > max_mw) {
2284                                                src_pdo = i;
2285                                                snk_pdo = j;
2286                                                max_mw = src_mw;
2287                                                max_mv = max_op_mv;
2288                                        }
2289                                }
2290                        }
2291
2292                        break;
2293                default:
2294                        tcpm_log(port, "Not APDO type (source), ignoring");
2295                        continue;
2296                }
2297        }
2298
2299        if (src_pdo) {
2300                src = port->source_caps[src_pdo];
2301                snk = port->snk_pdo[snk_pdo];
2302
2303                port->pps_data.min_volt = max(pdo_pps_apdo_min_voltage(src),
2304                                              pdo_pps_apdo_min_voltage(snk));
2305                port->pps_data.max_volt = min(pdo_pps_apdo_max_voltage(src),
2306                                              pdo_pps_apdo_max_voltage(snk));
2307                port->pps_data.max_curr = min_pps_apdo_current(src, snk);
2308                port->pps_data.out_volt = min(port->pps_data.max_volt,
2309                                              max(port->pps_data.min_volt,
2310                                                  port->pps_data.out_volt));
2311                port->pps_data.op_curr = min(port->pps_data.max_curr,
2312                                             port->pps_data.op_curr);
2313        }
2314
2315        return src_pdo;
2316}
2317
2318static int tcpm_pd_build_request(struct tcpm_port *port, u32 *rdo)
2319{
2320        unsigned int mv, ma, mw, flags;
2321        unsigned int max_ma, max_mw;
2322        enum pd_pdo_type type;
2323        u32 pdo, matching_snk_pdo;
2324        int src_pdo_index = 0;
2325        int snk_pdo_index = 0;
2326        int ret;
2327
2328        ret = tcpm_pd_select_pdo(port, &snk_pdo_index, &src_pdo_index);
2329        if (ret < 0)
2330                return ret;
2331
2332        pdo = port->source_caps[src_pdo_index];
2333        matching_snk_pdo = port->snk_pdo[snk_pdo_index];
2334        type = pdo_type(pdo);
2335
2336        switch (type) {
2337        case PDO_TYPE_FIXED:
2338                mv = pdo_fixed_voltage(pdo);
2339                break;
2340        case PDO_TYPE_BATT:
2341        case PDO_TYPE_VAR:
2342                mv = pdo_min_voltage(pdo);
2343                break;
2344        default:
2345                tcpm_log(port, "Invalid PDO selected!");
2346                return -EINVAL;
2347        }
2348
2349        /* Select maximum available current within the sink pdo's limit */
2350        if (type == PDO_TYPE_BATT) {
2351                mw = min_power(pdo, matching_snk_pdo);
2352                ma = 1000 * mw / mv;
2353        } else {
2354                ma = min_current(pdo, matching_snk_pdo);
2355                mw = ma * mv / 1000;
2356        }
2357
2358        flags = RDO_USB_COMM | RDO_NO_SUSPEND;
2359
2360        /* Set mismatch bit if offered power is less than operating power */
2361        max_ma = ma;
2362        max_mw = mw;
2363        if (mw < port->operating_snk_mw) {
2364                flags |= RDO_CAP_MISMATCH;
2365                if (type == PDO_TYPE_BATT &&
2366                    (pdo_max_power(matching_snk_pdo) > pdo_max_power(pdo)))
2367                        max_mw = pdo_max_power(matching_snk_pdo);
2368                else if (pdo_max_current(matching_snk_pdo) >
2369                         pdo_max_current(pdo))
2370                        max_ma = pdo_max_current(matching_snk_pdo);
2371        }
2372
2373        tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d",
2374                 port->cc_req, port->cc1, port->cc2, port->vbus_source,
2375                 port->vconn_role == TYPEC_SOURCE ? "source" : "sink",
2376                 port->polarity);
2377
2378        if (type == PDO_TYPE_BATT) {
2379                *rdo = RDO_BATT(src_pdo_index + 1, mw, max_mw, flags);
2380
2381                tcpm_log(port, "Requesting PDO %d: %u mV, %u mW%s",
2382                         src_pdo_index, mv, mw,
2383                         flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
2384        } else {
2385                *rdo = RDO_FIXED(src_pdo_index + 1, ma, max_ma, flags);
2386
2387                tcpm_log(port, "Requesting PDO %d: %u mV, %u mA%s",
2388                         src_pdo_index, mv, ma,
2389                         flags & RDO_CAP_MISMATCH ? " [mismatch]" : "");
2390        }
2391
2392        port->current_limit = ma;
2393        port->supply_voltage = mv;
2394
2395        return 0;
2396}
2397
2398static int tcpm_pd_send_request(struct tcpm_port *port)
2399{
2400        struct pd_message msg;
2401        int ret;
2402        u32 rdo;
2403
2404        ret = tcpm_pd_build_request(port, &rdo);
2405        if (ret < 0)
2406                return ret;
2407
2408        memset(&msg, 0, sizeof(msg));
2409        msg.header = PD_HEADER_LE(PD_DATA_REQUEST,
2410                                  port->pwr_role,
2411                                  port->data_role,
2412                                  port->negotiated_rev,
2413                                  port->message_id, 1);
2414        msg.payload[0] = cpu_to_le32(rdo);
2415
2416        return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
2417}
2418
2419static int tcpm_pd_build_pps_request(struct tcpm_port *port, u32 *rdo)
2420{
2421        unsigned int out_mv, op_ma, op_mw, max_mv, max_ma, flags;
2422        enum pd_pdo_type type;
2423        unsigned int src_pdo_index;
2424        u32 pdo;
2425
2426        src_pdo_index = tcpm_pd_select_pps_apdo(port);
2427        if (!src_pdo_index)
2428                return -EOPNOTSUPP;
2429
2430        pdo = port->source_caps[src_pdo_index];
2431        type = pdo_type(pdo);
2432
2433        switch (type) {
2434        case PDO_TYPE_APDO:
2435                if (pdo_apdo_type(pdo) != APDO_TYPE_PPS) {
2436                        tcpm_log(port, "Invalid APDO selected!");
2437                        return -EINVAL;
2438                }
2439                max_mv = port->pps_data.max_volt;
2440                max_ma = port->pps_data.max_curr;
2441                out_mv = port->pps_data.out_volt;
2442                op_ma = port->pps_data.op_curr;
2443                break;
2444        default:
2445                tcpm_log(port, "Invalid PDO selected!");
2446                return -EINVAL;
2447        }
2448
2449        flags = RDO_USB_COMM | RDO_NO_SUSPEND;
2450
2451        op_mw = (op_ma * out_mv) / 1000;
2452        if (op_mw < port->operating_snk_mw) {
2453                /*
2454                 * Try raising current to meet power needs. If that's not enough
2455                 * then try upping the voltage. If that's still not enough
2456                 * then we've obviously chosen a PPS APDO which really isn't
2457                 * suitable so abandon ship.
2458                 */
2459                op_ma = (port->operating_snk_mw * 1000) / out_mv;
2460                if ((port->operating_snk_mw * 1000) % out_mv)
2461                        ++op_ma;
2462                op_ma += RDO_PROG_CURR_MA_STEP - (op_ma % RDO_PROG_CURR_MA_STEP);
2463
2464                if (op_ma > max_ma) {
2465                        op_ma = max_ma;
2466                        out_mv = (port->operating_snk_mw * 1000) / op_ma;
2467                        if ((port->operating_snk_mw * 1000) % op_ma)
2468                                ++out_mv;
2469                        out_mv += RDO_PROG_VOLT_MV_STEP -
2470                                  (out_mv % RDO_PROG_VOLT_MV_STEP);
2471
2472                        if (out_mv > max_mv) {
2473                                tcpm_log(port, "Invalid PPS APDO selected!");
2474                                return -EINVAL;
2475                        }
2476                }
2477        }
2478
2479        tcpm_log(port, "cc=%d cc1=%d cc2=%d vbus=%d vconn=%s polarity=%d",
2480                 port->cc_req, port->cc1, port->cc2, port->vbus_source,
2481                 port->vconn_role == TYPEC_SOURCE ? "source" : "sink",
2482                 port->polarity);
2483
2484        *rdo = RDO_PROG(src_pdo_index + 1, out_mv, op_ma, flags);
2485
2486        tcpm_log(port, "Requesting APDO %d: %u mV, %u mA",
2487                 src_pdo_index, out_mv, op_ma);
2488
2489        port->pps_data.op_curr = op_ma;
2490        port->pps_data.out_volt = out_mv;
2491
2492        return 0;
2493}
2494
2495static int tcpm_pd_send_pps_request(struct tcpm_port *port)
2496{
2497        struct pd_message msg;
2498        int ret;
2499        u32 rdo;
2500
2501        ret = tcpm_pd_build_pps_request(port, &rdo);
2502        if (ret < 0)
2503                return ret;
2504
2505        memset(&msg, 0, sizeof(msg));
2506        msg.header = PD_HEADER_LE(PD_DATA_REQUEST,
2507                                  port->pwr_role,
2508                                  port->data_role,
2509                                  port->negotiated_rev,
2510                                  port->message_id, 1);
2511        msg.payload[0] = cpu_to_le32(rdo);
2512
2513        return tcpm_pd_transmit(port, TCPC_TX_SOP, &msg);
2514}
2515
2516static int tcpm_set_vbus(struct tcpm_port *port, bool enable)
2517{
2518        int ret;
2519
2520        if (enable && port->vbus_charge)
2521                return -EINVAL;
2522
2523        tcpm_log(port, "vbus:=%d charge=%d", enable, port->vbus_charge);
2524
2525        ret = port->tcpc->set_vbus(port->tcpc, enable, port->vbus_charge);
2526        if (ret < 0)
2527                return ret;
2528
2529        port->vbus_source = enable;
2530        return 0;
2531}
2532
2533static int tcpm_set_charge(struct tcpm_port *port, bool charge)
2534{
2535        int ret;
2536
2537        if (charge && port->vbus_source)
2538                return -EINVAL;
2539
2540        if (charge != port->vbus_charge) {
2541                tcpm_log(port, "vbus=%d charge:=%d", port->vbus_source, charge);
2542                ret = port->tcpc->set_vbus(port->tcpc, port->vbus_source,
2543                                           charge);
2544                if (ret < 0)
2545                        return ret;
2546        }
2547        port->vbus_charge = charge;
2548        return 0;
2549}
2550
2551static bool tcpm_start_toggling(struct tcpm_port *port, enum typec_cc_status cc)
2552{
2553        int ret;
2554
2555        if (!port->tcpc->start_toggling)
2556                return false;
2557
2558        tcpm_log_force(port, "Start toggling");
2559        ret = port->tcpc->start_toggling(port->tcpc, port->port_type, cc);
2560        return ret == 0;
2561}
2562
2563static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
2564{
2565        tcpm_log(port, "cc:=%d", cc);
2566        port->cc_req = cc;
2567        port->tcpc->set_cc(port->tcpc, cc);
2568}
2569
2570static int tcpm_init_vbus(struct tcpm_port *port)
2571{
2572        int ret;
2573
2574        ret = port->tcpc->set_vbus(port->tcpc, false, false);
2575        port->vbus_source = false;
2576        port->vbus_charge = false;
2577        return ret;
2578}
2579
2580static int tcpm_init_vconn(struct tcpm_port *port)
2581{
2582        int ret;
2583
2584        ret = port->tcpc->set_vconn(port->tcpc, false);
2585        port->vconn_role = TYPEC_SINK;
2586        return ret;
2587}
2588
2589static void tcpm_typec_connect(struct tcpm_port *port)
2590{
2591        if (!port->connected) {
2592                /* Make sure we don't report stale identity information */
2593                memset(&port->partner_ident, 0, sizeof(port->partner_ident));
2594                port->partner_desc.usb_pd = port->pd_capable;
2595                if (tcpm_port_is_debug(port))
2596                        port->partner_desc.accessory = TYPEC_ACCESSORY_DEBUG;
2597                else if (tcpm_port_is_audio(port))
2598                        port->partner_desc.accessory = TYPEC_ACCESSORY_AUDIO;
2599                else
2600                        port->partner_desc.accessory = TYPEC_ACCESSORY_NONE;
2601                port->partner = typec_register_partner(port->typec_port,
2602                                                       &port->partner_desc);
2603                port->connected = true;
2604        }
2605}
2606
2607static int tcpm_src_attach(struct tcpm_port *port)
2608{
2609        enum typec_cc_polarity polarity =
2610                                port->cc2 == TYPEC_CC_RD ? TYPEC_POLARITY_CC2
2611                                                         : TYPEC_POLARITY_CC1;
2612        int ret;
2613
2614        if (port->attached)
2615                return 0;
2616
2617        ret = tcpm_set_polarity(port, polarity);
2618        if (ret < 0)
2619                return ret;
2620
2621        ret = tcpm_set_roles(port, true, TYPEC_SOURCE, TYPEC_HOST);
2622        if (ret < 0)
2623                return ret;
2624
2625        ret = port->tcpc->set_pd_rx(port->tcpc, true);
2626        if (ret < 0)
2627                goto out_disable_mux;
2628
2629        /*
2630         * USB Type-C specification, version 1.2,
2631         * chapter 4.5.2.2.8.1 (Attached.SRC Requirements)
2632         * Enable VCONN only if the non-RD port is set to RA.
2633         */
2634        if ((polarity == TYPEC_POLARITY_CC1 && port->cc2 == TYPEC_CC_RA) ||
2635            (polarity == TYPEC_POLARITY_CC2 && port->cc1 == TYPEC_CC_RA)) {
2636                ret = tcpm_set_vconn(port, true);
2637                if (ret < 0)
2638                        goto out_disable_pd;
2639        }
2640
2641        ret = tcpm_set_vbus(port, true);
2642        if (ret < 0)
2643                goto out_disable_vconn;
2644
2645        port->pd_capable = false;
2646
2647        port->partner = NULL;
2648
2649        port->attached = true;
2650        port->send_discover = true;
2651
2652        return 0;
2653
2654out_disable_vconn:
2655        tcpm_set_vconn(port, false);
2656out_disable_pd:
2657        port->tcpc->set_pd_rx(port->tcpc, false);
2658out_disable_mux:
2659        tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,
2660                     TYPEC_ORIENTATION_NONE);
2661        return ret;
2662}
2663
2664static void tcpm_typec_disconnect(struct tcpm_port *port)
2665{
2666        if (port->connected) {
2667                typec_unregister_partner(port->partner);
2668                port->partner = NULL;
2669                port->connected = false;
2670        }
2671}
2672
2673static void tcpm_unregister_altmodes(struct tcpm_port *port)
2674{
2675        struct pd_mode_data *modep = &port->mode_data;
2676        int i;
2677
2678        for (i = 0; i < modep->altmodes; i++) {
2679                typec_unregister_altmode(port->partner_altmode[i]);
2680                port->partner_altmode[i] = NULL;
2681        }
2682
2683        memset(modep, 0, sizeof(*modep));
2684}
2685
2686static void tcpm_reset_port(struct tcpm_port *port)
2687{
2688        tcpm_unregister_altmodes(port);
2689        tcpm_typec_disconnect(port);
2690        port->attached = false;
2691        port->pd_capable = false;
2692        port->pps_data.supported = false;
2693
2694        /*
2695         * First Rx ID should be 0; set this to a sentinel of -1 so that
2696         * we can check tcpm_pd_rx_handler() if we had seen it before.
2697         */
2698        port->rx_msgid = -1;
2699
2700        port->tcpc->set_pd_rx(port->tcpc, false);
2701        tcpm_init_vbus(port);   /* also disables charging */
2702        tcpm_init_vconn(port);
2703        tcpm_set_current_limit(port, 0, 0);
2704        tcpm_set_polarity(port, TYPEC_POLARITY_CC1);
2705        tcpm_mux_set(port, TYPEC_STATE_SAFE, USB_ROLE_NONE,
2706                     TYPEC_ORIENTATION_NONE);
2707        tcpm_set_attached_state(port, false);
2708        port->try_src_count = 0;
2709        port->try_snk_count = 0;
2710        port->usb_type = POWER_SUPPLY_USB_TYPE_C;
2711
2712        power_supply_changed(port->psy);
2713}
2714
2715static void tcpm_detach(struct tcpm_port *port)
2716{
2717        if (!port->attached)
2718                return;
2719
2720        if (tcpm_port_is_disconnected(port))
2721                port->hard_reset_count = 0;
2722
2723        tcpm_reset_port(port);
2724}
2725
2726static void tcpm_src_detach(struct tcpm_port *port)
2727{
2728        tcpm_detach(port);
2729}
2730
2731static int tcpm_snk_attach(struct tcpm_port *port)
2732{
2733        int ret;
2734
2735        if (port->attached)
2736                return 0;
2737
2738        ret = tcpm_set_polarity(port, port->cc2 != TYPEC_CC_OPEN ?
2739                                TYPEC_POLARITY_CC2 : TYPEC_POLARITY_CC1);
2740        if (ret < 0)
2741                return ret;
2742
2743        ret = tcpm_set_roles(port, true, TYPEC_SINK, TYPEC_DEVICE);
2744        if (ret < 0)
2745                return ret;
2746
2747        port->pd_capable = false;
2748
2749        port->partner = NULL;
2750
2751        port->attached = true;
2752        port->send_discover = true;
2753
2754        return 0;
2755}
2756
2757static void tcpm_snk_detach(struct tcpm_port *port)
2758{
2759        tcpm_detach(port);
2760}
2761
2762static int tcpm_acc_attach(struct tcpm_port *port)
2763{
2764        int ret;
2765
2766        if (port->attached)
2767                return 0;
2768
2769        ret = tcpm_set_roles(port, true, TYPEC_SOURCE, TYPEC_HOST);
2770        if (ret < 0)
2771                return ret;
2772
2773        port->partner = NULL;
2774
2775        tcpm_typec_connect(port);
2776
2777        port->attached = true;
2778
2779        return 0;
2780}
2781
2782static void tcpm_acc_detach(struct tcpm_port *port)
2783{
2784        tcpm_detach(port);
2785}
2786
2787static inline enum tcpm_state hard_reset_state(struct tcpm_port *port)
2788{
2789        if (port->hard_reset_count < PD_N_HARD_RESET_COUNT)
2790                return HARD_RESET_SEND;
2791        if (port->pd_capable)
2792                return ERROR_RECOVERY;
2793        if (port->pwr_role == TYPEC_SOURCE)
2794                return SRC_UNATTACHED;
2795        if (port->state == SNK_WAIT_CAPABILITIES)
2796                return SNK_READY;
2797        return SNK_UNATTACHED;
2798}
2799
2800static inline enum tcpm_state unattached_state(struct tcpm_port *port)
2801{
2802        if (port->port_type == TYPEC_PORT_DRP) {
2803                if (port->pwr_role == TYPEC_SOURCE)
2804                        return SRC_UNATTACHED;
2805                else
2806                        return SNK_UNATTACHED;
2807        } else if (port->port_type == TYPEC_PORT_SRC) {
2808                return SRC_UNATTACHED;
2809        }
2810
2811        return SNK_UNATTACHED;
2812}
2813
2814static void tcpm_check_send_discover(struct tcpm_port *port)
2815{
2816        if (port->data_role == TYPEC_HOST && port->send_discover &&
2817            port->pd_capable) {
2818                tcpm_send_vdm(port, USB_SID_PD, CMD_DISCOVER_IDENT, NULL, 0);
2819                port->send_discover = false;
2820        }
2821}
2822
2823static void tcpm_swap_complete(struct tcpm_port *port, int result)
2824{
2825        if (port->swap_pending) {
2826                port->swap_status = result;
2827                port->swap_pending = false;
2828                port->non_pd_role_swap = false;
2829                complete(&port->swap_complete);
2830        }
2831}
2832
2833static enum typec_pwr_opmode tcpm_get_pwr_opmode(enum typec_cc_status cc)
2834{
2835        switch (cc) {
2836        case TYPEC_CC_RP_1_5:
2837                return TYPEC_PWR_MODE_1_5A;
2838        case TYPEC_CC_RP_3_0:
2839                return TYPEC_PWR_MODE_3_0A;
2840        case TYPEC_CC_RP_DEF:
2841        default:
2842                return TYPEC_PWR_MODE_USB;
2843        }
2844}
2845
2846static void run_state_machine(struct tcpm_port *port)
2847{
2848        int ret;
2849        enum typec_pwr_opmode opmode;
2850        unsigned int msecs;
2851
2852        port->enter_state = port->state;
2853        switch (port->state) {
2854        case TOGGLING:
2855                break;
2856        /* SRC states */
2857        case SRC_UNATTACHED:
2858                if (!port->non_pd_role_swap)
2859                        tcpm_swap_complete(port, -ENOTCONN);
2860                tcpm_src_detach(port);
2861                if (tcpm_start_toggling(port, tcpm_rp_cc(port))) {
2862                        tcpm_set_state(port, TOGGLING, 0);
2863                        break;
2864                }
2865                tcpm_set_cc(port, tcpm_rp_cc(port));
2866                if (port->port_type == TYPEC_PORT_DRP)
2867                        tcpm_set_state(port, SNK_UNATTACHED, PD_T_DRP_SNK);
2868                break;
2869        case SRC_ATTACH_WAIT:
2870                if (tcpm_port_is_debug(port))
2871                        tcpm_set_state(port, DEBUG_ACC_ATTACHED,
2872                                       PD_T_CC_DEBOUNCE);
2873                else if (tcpm_port_is_audio(port))
2874                        tcpm_set_state(port, AUDIO_ACC_ATTACHED,
2875                                       PD_T_CC_DEBOUNCE);
2876                else if (tcpm_port_is_source(port))
2877                        tcpm_set_state(port,
2878                                       tcpm_try_snk(port) ? SNK_TRY
2879                                                          : SRC_ATTACHED,
2880                                       PD_T_CC_DEBOUNCE);
2881                break;
2882
2883        case SNK_TRY:
2884                port->try_snk_count++;
2885                /*
2886                 * Requirements:
2887                 * - Do not drive vconn or vbus
2888                 * - Terminate CC pins (both) to Rd
2889                 * Action:
2890                 * - Wait for tDRPTry (PD_T_DRP_TRY).
2891                 *   Until then, ignore any state changes.
2892                 */
2893                tcpm_set_cc(port, TYPEC_CC_RD);
2894                tcpm_set_state(port, SNK_TRY_WAIT, PD_T_DRP_TRY);
2895                break;
2896        case SNK_TRY_WAIT:
2897                if (tcpm_port_is_sink(port)) {
2898                        tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE, 0);
2899                } else {
2900                        tcpm_set_state(port, SRC_TRYWAIT, 0);
2901                        port->max_wait = 0;
2902                }
2903                break;
2904        case SNK_TRY_WAIT_DEBOUNCE:
2905                tcpm_set_state(port, SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS,
2906                               PD_T_PD_DEBOUNCE);
2907                break;
2908        case SNK_TRY_WAIT_DEBOUNCE_CHECK_VBUS:
2909                if (port->vbus_present && tcpm_port_is_sink(port)) {
2910                        tcpm_set_state(port, SNK_ATTACHED, 0);
2911                } else {
2912                        tcpm_set_state(port, SRC_TRYWAIT, 0);
2913                        port->max_wait = 0;
2914                }
2915                break;
2916        case SRC_TRYWAIT:
2917                tcpm_set_cc(port, tcpm_rp_cc(port));
2918                if (port->max_wait == 0) {
2919                        port->max_wait = jiffies +
2920                                         msecs_to_jiffies(PD_T_DRP_TRY);
2921                        tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED,
2922                                       PD_T_DRP_TRY);
2923                } else {
2924                        if (time_is_after_jiffies(port->max_wait))
2925                                tcpm_set_state(port, SRC_TRYWAIT_UNATTACHED,
2926                                               jiffies_to_msecs(port->max_wait -
2927                                                                jiffies));
2928                        else
2929                                tcpm_set_state(port, SNK_UNATTACHED, 0);
2930                }
2931                break;
2932        case SRC_TRYWAIT_DEBOUNCE:
2933                tcpm_set_state(port, SRC_ATTACHED, PD_T_CC_DEBOUNCE);
2934                break;
2935        case SRC_TRYWAIT_UNATTACHED:
2936                tcpm_set_state(port, SNK_UNATTACHED, 0);
2937                break;
2938
2939        case SRC_ATTACHED:
2940                ret = tcpm_src_attach(port);
2941                tcpm_set_state(port, SRC_UNATTACHED,
2942                               ret < 0 ? 0 : PD_T_PS_SOURCE_ON);
2943                break;
2944        case SRC_STARTUP:
2945                opmode =  tcpm_get_pwr_opmode(tcpm_rp_cc(port));
2946                typec_set_pwr_opmode(port->typec_port, opmode);
2947                port->pwr_opmode = TYPEC_PWR_MODE_USB;
2948                port->caps_count = 0;
2949                port->negotiated_rev = PD_MAX_REV;
2950                port->message_id = 0;
2951                port->rx_msgid = -1;
2952                port->explicit_contract = false;
2953                tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
2954                break;
2955        case SRC_SEND_CAPABILITIES:
2956                port->caps_count++;
2957                if (port->caps_count > PD_N_CAPS_COUNT) {
2958                        tcpm_set_state(port, SRC_READY, 0);
2959                        break;
2960                }
2961                ret = tcpm_pd_send_source_caps(port);
2962                if (ret < 0) {
2963                        tcpm_set_state(port, SRC_SEND_CAPABILITIES,
2964                                       PD_T_SEND_SOURCE_CAP);
2965                } else {
2966                        /*
2967                         * Per standard, we should clear the reset counter here.
2968                         * However, that can result in state machine hang-ups.
2969                         * Reset it only in READY state to improve stability.
2970                         */
2971                        /* port->hard_reset_count = 0; */
2972                        port->caps_count = 0;
2973                        port->pd_capable = true;
2974                        tcpm_set_state_cond(port, SRC_SEND_CAPABILITIES_TIMEOUT,
2975                                            PD_T_SEND_SOURCE_CAP);
2976                }
2977                break;
2978        case SRC_SEND_CAPABILITIES_TIMEOUT:
2979                /*
2980                 * Error recovery for a PD_DATA_SOURCE_CAP reply timeout.
2981                 *
2982                 * PD 2.0 sinks are supposed to accept src-capabilities with a
2983                 * 3.0 header and simply ignore any src PDOs which the sink does
2984                 * not understand such as PPS but some 2.0 sinks instead ignore
2985                 * the entire PD_DATA_SOURCE_CAP message, causing contract
2986                 * negotiation to fail.
2987                 *
2988                 * After PD_N_HARD_RESET_COUNT hard-reset attempts, we try
2989                 * sending src-capabilities with a lower PD revision to
2990                 * make these broken sinks work.
2991                 */
2992                if (port->hard_reset_count < PD_N_HARD_RESET_COUNT) {
2993                        tcpm_set_state(port, HARD_RESET_SEND, 0);
2994                } else if (port->negotiated_rev > PD_REV20) {
2995                        port->negotiated_rev--;
2996                        port->hard_reset_count = 0;
2997                        tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
2998                } else {
2999                        tcpm_set_state(port, hard_reset_state(port), 0);
3000                }
3001                break;
3002        case SRC_NEGOTIATE_CAPABILITIES:
3003                ret = tcpm_pd_check_request(port);
3004                if (ret < 0) {
3005                        tcpm_pd_send_control(port, PD_CTRL_REJECT);
3006                        if (!port->explicit_contract) {
3007                                tcpm_set_state(port,
3008                                               SRC_WAIT_NEW_CAPABILITIES, 0);
3009                        } else {
3010                                tcpm_set_state(port, SRC_READY, 0);
3011                        }
3012                } else {
3013                        tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
3014                        tcpm_set_state(port, SRC_TRANSITION_SUPPLY,
3015                                       PD_T_SRC_TRANSITION);
3016                }
3017                break;
3018        case SRC_TRANSITION_SUPPLY:
3019                /* XXX: regulator_set_voltage(vbus, ...) */
3020                tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
3021                port->explicit_contract = true;
3022                typec_set_pwr_opmode(port->typec_port, TYPEC_PWR_MODE_PD);
3023                port->pwr_opmode = TYPEC_PWR_MODE_PD;
3024                tcpm_set_state_cond(port, SRC_READY, 0);
3025                break;
3026        case SRC_READY:
3027#if 1
3028                port->hard_reset_count = 0;
3029#endif
3030                port->try_src_count = 0;
3031
3032                tcpm_swap_complete(port, 0);
3033                tcpm_typec_connect(port);
3034
3035                tcpm_check_send_discover(port);
3036                /*
3037                 * 6.3.5
3038                 * Sending ping messages is not necessary if
3039                 * - the source operates at vSafe5V
3040                 * or
3041                 * - The system is not operating in PD mode
3042                 * or
3043                 * - Both partners are connected using a Type-C connector
3044                 *
3045                 * There is no actual need to send PD messages since the local
3046                 * port type-c and the spec does not clearly say whether PD is
3047                 * possible when type-c is connected to Type-A/B
3048                 */
3049                break;
3050        case SRC_WAIT_NEW_CAPABILITIES:
3051                /* Nothing to do... */
3052                break;
3053
3054        /* SNK states */
3055        case SNK_UNATTACHED:
3056                if (!port->non_pd_role_swap)
3057                        tcpm_swap_complete(port, -ENOTCONN);
3058                tcpm_pps_complete(port, -ENOTCONN);
3059                tcpm_snk_detach(port);
3060                if (tcpm_start_toggling(port, TYPEC_CC_RD)) {
3061                        tcpm_set_state(port, TOGGLING, 0);
3062                        break;
3063                }
3064                tcpm_set_cc(port, TYPEC_CC_RD);
3065                if (port->port_type == TYPEC_PORT_DRP)
3066                        tcpm_set_state(port, SRC_UNATTACHED, PD_T_DRP_SRC);
3067                break;
3068        case SNK_ATTACH_WAIT:
3069                if ((port->cc1 == TYPEC_CC_OPEN &&
3070                     port->cc2 != TYPEC_CC_OPEN) ||
3071                    (port->cc1 != TYPEC_CC_OPEN &&
3072                     port->cc2 == TYPEC_CC_OPEN))
3073                        tcpm_set_state(port, SNK_DEBOUNCED,
3074                                       PD_T_CC_DEBOUNCE);
3075                else if (tcpm_port_is_disconnected(port))
3076                        tcpm_set_state(port, SNK_UNATTACHED,
3077                                       PD_T_PD_DEBOUNCE);
3078                break;
3079        case SNK_DEBOUNCED:
3080                if (tcpm_port_is_disconnected(port))
3081                        tcpm_set_state(port, SNK_UNATTACHED,
3082                                       PD_T_PD_DEBOUNCE);
3083                else if (port->vbus_present)
3084                        tcpm_set_state(port,
3085                                       tcpm_try_src(port) ? SRC_TRY
3086                                                          : SNK_ATTACHED,
3087                                       0);
3088                else
3089                        /* Wait for VBUS, but not forever */
3090                        tcpm_set_state(port, PORT_RESET, PD_T_PS_SOURCE_ON);
3091                break;
3092
3093        case SRC_TRY:
3094                port->try_src_count++;
3095                tcpm_set_cc(port, tcpm_rp_cc(port));
3096                port->max_wait = 0;
3097                tcpm_set_state(port, SRC_TRY_WAIT, 0);
3098                break;
3099        case SRC_TRY_WAIT:
3100                if (port->max_wait == 0) {
3101                        port->max_wait = jiffies +
3102                                         msecs_to_jiffies(PD_T_DRP_TRY);
3103                        msecs = PD_T_DRP_TRY;
3104                } else {
3105                        if (time_is_after_jiffies(port->max_wait))
3106                                msecs = jiffies_to_msecs(port->max_wait -
3107                                                         jiffies);
3108                        else
3109                                msecs = 0;
3110                }
3111                tcpm_set_state(port, SNK_TRYWAIT, msecs);
3112                break;
3113        case SRC_TRY_DEBOUNCE:
3114                tcpm_set_state(port, SRC_ATTACHED, PD_T_PD_DEBOUNCE);
3115                break;
3116        case SNK_TRYWAIT:
3117                tcpm_set_cc(port, TYPEC_CC_RD);
3118                tcpm_set_state(port, SNK_TRYWAIT_VBUS, PD_T_CC_DEBOUNCE);
3119                break;
3120        case SNK_TRYWAIT_VBUS:
3121                /*
3122                 * TCPM stays in this state indefinitely until VBUS
3123                 * is detected as long as Rp is not detected for
3124                 * more than a time period of tPDDebounce.
3125                 */
3126                if (port->vbus_present && tcpm_port_is_sink(port)) {
3127                        tcpm_set_state(port, SNK_ATTACHED, 0);
3128                        break;
3129                }
3130                if (!tcpm_port_is_sink(port))
3131                        tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
3132                break;
3133        case SNK_TRYWAIT_DEBOUNCE:
3134                tcpm_set_state(port, SNK_UNATTACHED, PD_T_PD_DEBOUNCE);
3135                break;
3136        case SNK_ATTACHED:
3137                ret = tcpm_snk_attach(port);
3138                if (ret < 0)
3139                        tcpm_set_state(port, SNK_UNATTACHED, 0);
3140                else
3141                        tcpm_set_state(port, SNK_STARTUP, 0);
3142                break;
3143        case SNK_STARTUP:
3144                opmode =  tcpm_get_pwr_opmode(port->polarity ?
3145                                              port->cc2 : port->cc1);
3146                typec_set_pwr_opmode(port->typec_port, opmode);
3147                port->pwr_opmode = TYPEC_PWR_MODE_USB;
3148                port->negotiated_rev = PD_MAX_REV;
3149                port->message_id = 0;
3150                port->rx_msgid = -1;
3151                port->explicit_contract = false;
3152                tcpm_set_state(port, SNK_DISCOVERY, 0);
3153                break;
3154        case SNK_DISCOVERY:
3155                if (port->vbus_present) {
3156                        tcpm_set_current_limit(port,
3157                                               tcpm_get_current_limit(port),
3158                                               5000);
3159                        tcpm_set_charge(port, true);
3160                        tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
3161                        break;
3162                }
3163                /*
3164                 * For DRP, timeouts differ. Also, handling is supposed to be
3165                 * different and much more complex (dead battery detection;
3166                 * see USB power delivery specification, section 8.3.3.6.1.5.1).
3167                 */
3168                tcpm_set_state(port, hard_reset_state(port),
3169                               port->port_type == TYPEC_PORT_DRP ?
3170                                        PD_T_DB_DETECT : PD_T_NO_RESPONSE);
3171                break;
3172        case SNK_DISCOVERY_DEBOUNCE:
3173                tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE_DONE,
3174                               PD_T_CC_DEBOUNCE);
3175                break;
3176        case SNK_DISCOVERY_DEBOUNCE_DONE:
3177                if (!tcpm_port_is_disconnected(port) &&
3178                    tcpm_port_is_sink(port) &&
3179                    time_is_after_jiffies(port->delayed_runtime)) {
3180                        tcpm_set_state(port, SNK_DISCOVERY,
3181                                       jiffies_to_msecs(port->delayed_runtime -
3182                                                        jiffies));
3183                        break;
3184                }
3185                tcpm_set_state(port, unattached_state(port), 0);
3186                break;
3187        case SNK_WAIT_CAPABILITIES:
3188                ret = port->tcpc->set_pd_rx(port->tcpc, true);
3189                if (ret < 0) {
3190                        tcpm_set_state(port, SNK_READY, 0);
3191                        break;
3192                }
3193                /*
3194                 * If VBUS has never been low, and we time out waiting
3195                 * for source cap, try a soft reset first, in case we
3196                 * were already in a stable contract before this boot.
3197                 * Do this only once.
3198                 */
3199                if (port->vbus_never_low) {
3200                        port->vbus_never_low = false;
3201                        tcpm_set_state(port, SOFT_RESET_SEND,
3202                                       PD_T_SINK_WAIT_CAP);
3203                } else {
3204                        tcpm_set_state(port, hard_reset_state(port),
3205                                       PD_T_SINK_WAIT_CAP);
3206                }
3207                break;
3208        case SNK_NEGOTIATE_CAPABILITIES:
3209                port->pd_capable = true;
3210                port->hard_reset_count = 0;
3211                ret = tcpm_pd_send_request(port);
3212                if (ret < 0) {
3213                        /* Let the Source send capabilities again. */
3214                        tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
3215                } else {
3216                        tcpm_set_state_cond(port, hard_reset_state(port),
3217                                            PD_T_SENDER_RESPONSE);
3218                }
3219                break;
3220        case SNK_NEGOTIATE_PPS_CAPABILITIES:
3221                ret = tcpm_pd_send_pps_request(port);
3222                if (ret < 0) {
3223                        port->pps_status = ret;
3224                        /*
3225                         * If this was called due to updates to sink
3226                         * capabilities, and pps is no longer valid, we should
3227                         * safely fall back to a standard PDO.
3228                         */
3229                        if (port->update_sink_caps)
3230                                tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
3231                        else
3232                                tcpm_set_state(port, SNK_READY, 0);
3233                } else {
3234                        tcpm_set_state_cond(port, hard_reset_state(port),
3235                                            PD_T_SENDER_RESPONSE);
3236                }
3237                break;
3238        case SNK_TRANSITION_SINK:
3239        case SNK_TRANSITION_SINK_VBUS:
3240                tcpm_set_state(port, hard_reset_state(port),
3241                               PD_T_PS_TRANSITION);
3242                break;
3243        case SNK_READY:
3244                port->try_snk_count = 0;
3245                port->update_sink_caps = false;
3246                if (port->explicit_contract) {
3247                        typec_set_pwr_opmode(port->typec_port,
3248                                             TYPEC_PWR_MODE_PD);
3249                        port->pwr_opmode = TYPEC_PWR_MODE_PD;
3250                }
3251
3252                tcpm_swap_complete(port, 0);
3253                tcpm_typec_connect(port);
3254                tcpm_check_send_discover(port);
3255                tcpm_pps_complete(port, port->pps_status);
3256
3257                power_supply_changed(port->psy);
3258
3259                break;
3260
3261        /* Accessory states */
3262        case ACC_UNATTACHED:
3263                tcpm_acc_detach(port);
3264                tcpm_set_state(port, SRC_UNATTACHED, 0);
3265                break;
3266        case DEBUG_ACC_ATTACHED:
3267        case AUDIO_ACC_ATTACHED:
3268                ret = tcpm_acc_attach(port);
3269                if (ret < 0)
3270                        tcpm_set_state(port, ACC_UNATTACHED, 0);
3271                break;
3272        case AUDIO_ACC_DEBOUNCE:
3273                tcpm_set_state(port, ACC_UNATTACHED, PD_T_CC_DEBOUNCE);
3274                break;
3275
3276        /* Hard_Reset states */
3277        case HARD_RESET_SEND:
3278                tcpm_pd_transmit(port, TCPC_TX_HARD_RESET, NULL);
3279                tcpm_set_state(port, HARD_RESET_START, 0);
3280                break;
3281        case HARD_RESET_START:
3282                port->hard_reset_count++;
3283                port->tcpc->set_pd_rx(port->tcpc, false);
3284                tcpm_unregister_altmodes(port);
3285                port->send_discover = true;
3286                if (port->pwr_role == TYPEC_SOURCE)
3287                        tcpm_set_state(port, SRC_HARD_RESET_VBUS_OFF,
3288                                       PD_T_PS_HARD_RESET);
3289                else
3290                        tcpm_set_state(port, SNK_HARD_RESET_SINK_OFF, 0);
3291                break;
3292        case SRC_HARD_RESET_VBUS_OFF:
3293                tcpm_set_vconn(port, true);
3294                tcpm_set_vbus(port, false);
3295                tcpm_set_roles(port, port->self_powered, TYPEC_SOURCE,
3296                               TYPEC_HOST);
3297                tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, PD_T_SRC_RECOVER);
3298                break;
3299        case SRC_HARD_RESET_VBUS_ON:
3300                tcpm_set_vbus(port, true);
3301                port->tcpc->set_pd_rx(port->tcpc, true);
3302                tcpm_set_attached_state(port, true);
3303                tcpm_set_state(port, SRC_UNATTACHED, PD_T_PS_SOURCE_ON);
3304                break;
3305        case SNK_HARD_RESET_SINK_OFF:
3306                memset(&port->pps_data, 0, sizeof(port->pps_data));
3307                tcpm_set_vconn(port, false);
3308                if (port->pd_capable)
3309                        tcpm_set_charge(port, false);
3310                tcpm_set_roles(port, port->self_powered, TYPEC_SINK,
3311                               TYPEC_DEVICE);
3312                /*
3313                 * VBUS may or may not toggle, depending on the adapter.
3314                 * If it doesn't toggle, transition to SNK_HARD_RESET_SINK_ON
3315                 * directly after timeout.
3316                 */
3317                tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, PD_T_SAFE_0V);
3318                break;
3319        case SNK_HARD_RESET_WAIT_VBUS:
3320                /* Assume we're disconnected if VBUS doesn't come back. */
3321                tcpm_set_state(port, SNK_UNATTACHED,
3322                               PD_T_SRC_RECOVER_MAX + PD_T_SRC_TURN_ON);
3323                break;
3324        case SNK_HARD_RESET_SINK_ON:
3325                /* Note: There is no guarantee that VBUS is on in this state */
3326                /*
3327                 * XXX:
3328                 * The specification suggests that dual mode ports in sink
3329                 * mode should transition to state PE_SRC_Transition_to_default.
3330                 * See USB power delivery specification chapter 8.3.3.6.1.3.
3331                 * This would mean to to
3332                 * - turn off VCONN, reset power supply
3333                 * - request hardware reset
3334                 * - turn on VCONN
3335                 * - Transition to state PE_Src_Startup
3336                 * SNK only ports shall transition to state Snk_Startup
3337                 * (see chapter 8.3.3.3.8).
3338                 * Similar, dual-mode ports in source mode should transition
3339                 * to PE_SNK_Transition_to_default.
3340                 */
3341                if (port->pd_capable) {
3342                        tcpm_set_current_limit(port,
3343                                               tcpm_get_current_limit(port),
3344                                               5000);
3345                        tcpm_set_charge(port, true);
3346                }
3347                tcpm_set_attached_state(port, true);
3348                tcpm_set_state(port, SNK_STARTUP, 0);
3349                break;
3350
3351        /* Soft_Reset states */
3352        case SOFT_RESET:
3353                port->message_id = 0;
3354                port->rx_msgid = -1;
3355                tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
3356                if (port->pwr_role == TYPEC_SOURCE)
3357                        tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
3358                else
3359                        tcpm_set_state(port, SNK_WAIT_CAPABILITIES, 0);
3360                break;
3361        case SOFT_RESET_SEND:
3362                port->message_id = 0;
3363                port->rx_msgid = -1;
3364                if (tcpm_pd_send_control(port, PD_CTRL_SOFT_RESET))
3365                        tcpm_set_state_cond(port, hard_reset_state(port), 0);
3366                else
3367                        tcpm_set_state_cond(port, hard_reset_state(port),
3368                                            PD_T_SENDER_RESPONSE);
3369                break;
3370
3371        /* DR_Swap states */
3372        case DR_SWAP_SEND:
3373                tcpm_pd_send_control(port, PD_CTRL_DR_SWAP);
3374                tcpm_set_state_cond(port, DR_SWAP_SEND_TIMEOUT,
3375                                    PD_T_SENDER_RESPONSE);
3376                break;
3377        case DR_SWAP_ACCEPT:
3378                tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
3379                tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0);
3380                break;
3381        case DR_SWAP_SEND_TIMEOUT:
3382                tcpm_swap_complete(port, -ETIMEDOUT);
3383                tcpm_set_state(port, ready_state(port), 0);
3384                break;
3385        case DR_SWAP_CHANGE_DR:
3386                if (port->data_role == TYPEC_HOST) {
3387                        tcpm_unregister_altmodes(port);
3388                        tcpm_set_roles(port, true, port->pwr_role,
3389                                       TYPEC_DEVICE);
3390                } else {
3391                        tcpm_set_roles(port, true, port->pwr_role,
3392                                       TYPEC_HOST);
3393                        port->send_discover = true;
3394                }
3395                tcpm_set_state(port, ready_state(port), 0);
3396                break;
3397
3398        /* PR_Swap states */
3399        case PR_SWAP_ACCEPT:
3400                tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
3401                tcpm_set_state(port, PR_SWAP_START, 0);
3402                break;
3403        case PR_SWAP_SEND:
3404                tcpm_pd_send_control(port, PD_CTRL_PR_SWAP);
3405                tcpm_set_state_cond(port, PR_SWAP_SEND_TIMEOUT,
3406                                    PD_T_SENDER_RESPONSE);
3407                break;
3408        case PR_SWAP_SEND_TIMEOUT:
3409                tcpm_swap_complete(port, -ETIMEDOUT);
3410                tcpm_set_state(port, ready_state(port), 0);
3411                break;
3412        case PR_SWAP_START:
3413                if (port->pwr_role == TYPEC_SOURCE)
3414                        tcpm_set_state(port, PR_SWAP_SRC_SNK_TRANSITION_OFF,
3415                                       PD_T_SRC_TRANSITION);
3416                else
3417                        tcpm_set_state(port, PR_SWAP_SNK_SRC_SINK_OFF, 0);
3418                break;
3419        case PR_SWAP_SRC_SNK_TRANSITION_OFF:
3420                tcpm_set_vbus(port, false);
3421                port->explicit_contract = false;
3422                /* allow time for Vbus discharge, must be < tSrcSwapStdby */
3423                tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF,
3424                               PD_T_SRCSWAPSTDBY);
3425                break;
3426        case PR_SWAP_SRC_SNK_SOURCE_OFF:
3427                tcpm_set_cc(port, TYPEC_CC_RD);
3428                /* allow CC debounce */
3429                tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED,
3430                               PD_T_CC_DEBOUNCE);
3431                break;
3432        case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
3433                /*
3434                 * USB-PD standard, 6.2.1.4, Port Power Role:
3435                 * "During the Power Role Swap Sequence, for the initial Source
3436                 * Port, the Port Power Role field shall be set to Sink in the
3437                 * PS_RDY Message indicating that the initial Source’s power
3438                 * supply is turned off"
3439                 */
3440                tcpm_set_pwr_role(port, TYPEC_SINK);
3441                if (tcpm_pd_send_control(port, PD_CTRL_PS_RDY)) {
3442                        tcpm_set_state(port, ERROR_RECOVERY, 0);
3443                        break;
3444                }
3445                tcpm_set_state_cond(port, SNK_UNATTACHED, PD_T_PS_SOURCE_ON);
3446                break;
3447        case PR_SWAP_SRC_SNK_SINK_ON:
3448                tcpm_set_state(port, SNK_STARTUP, 0);
3449                break;
3450        case PR_SWAP_SNK_SRC_SINK_OFF:
3451                tcpm_set_charge(port, false);
3452                tcpm_set_state(port, hard_reset_state(port),
3453                               PD_T_PS_SOURCE_OFF);
3454                break;
3455        case PR_SWAP_SNK_SRC_SOURCE_ON:
3456                tcpm_set_cc(port, tcpm_rp_cc(port));
3457                tcpm_set_vbus(port, true);
3458                /*
3459                 * allow time VBUS ramp-up, must be < tNewSrc
3460                 * Also, this window overlaps with CC debounce as well.
3461                 * So, Wait for the max of two which is PD_T_NEWSRC
3462                 */
3463                tcpm_set_state(port, PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP,
3464                               PD_T_NEWSRC);
3465                break;
3466        case PR_SWAP_SNK_SRC_SOURCE_ON_VBUS_RAMPED_UP:
3467                /*
3468                 * USB PD standard, 6.2.1.4:
3469                 * "Subsequent Messages initiated by the Policy Engine,
3470                 * such as the PS_RDY Message sent to indicate that Vbus
3471                 * is ready, will have the Port Power Role field set to
3472                 * Source."
3473                 */
3474                tcpm_set_pwr_role(port, TYPEC_SOURCE);
3475                tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
3476                tcpm_set_state(port, SRC_STARTUP, 0);
3477                break;
3478
3479        case VCONN_SWAP_ACCEPT:
3480                tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
3481                tcpm_set_state(port, VCONN_SWAP_START, 0);
3482                break;
3483        case VCONN_SWAP_SEND:
3484                tcpm_pd_send_control(port, PD_CTRL_VCONN_SWAP);
3485                tcpm_set_state(port, VCONN_SWAP_SEND_TIMEOUT,
3486                               PD_T_SENDER_RESPONSE);
3487                break;
3488        case VCONN_SWAP_SEND_TIMEOUT:
3489                tcpm_swap_complete(port, -ETIMEDOUT);
3490                tcpm_set_state(port, ready_state(port), 0);
3491                break;
3492        case VCONN_SWAP_START:
3493                if (port->vconn_role == TYPEC_SOURCE)
3494                        tcpm_set_state(port, VCONN_SWAP_WAIT_FOR_VCONN, 0);
3495                else
3496                        tcpm_set_state(port, VCONN_SWAP_TURN_ON_VCONN, 0);
3497                break;
3498        case VCONN_SWAP_WAIT_FOR_VCONN:
3499                tcpm_set_state(port, hard_reset_state(port),
3500                               PD_T_VCONN_SOURCE_ON);
3501                break;
3502        case VCONN_SWAP_TURN_ON_VCONN:
3503                tcpm_set_vconn(port, true);
3504                tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
3505                tcpm_set_state(port, ready_state(port), 0);
3506                break;
3507        case VCONN_SWAP_TURN_OFF_VCONN:
3508                tcpm_set_vconn(port, false);
3509                tcpm_set_state(port, ready_state(port), 0);
3510                break;
3511
3512        case DR_SWAP_CANCEL:
3513        case PR_SWAP_CANCEL:
3514        case VCONN_SWAP_CANCEL:
3515                tcpm_swap_complete(port, port->swap_status);
3516                if (port->pwr_role == TYPEC_SOURCE)
3517                        tcpm_set_state(port, SRC_READY, 0);
3518                else
3519                        tcpm_set_state(port, SNK_READY, 0);
3520                break;
3521
3522        case BIST_RX:
3523                switch (BDO_MODE_MASK(port->bist_request)) {
3524                case BDO_MODE_CARRIER2:
3525                        tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL);
3526                        break;
3527                default:
3528                        break;
3529                }
3530                /* Always switch to unattached state */
3531                tcpm_set_state(port, unattached_state(port), 0);
3532                break;
3533        case GET_STATUS_SEND:
3534                tcpm_pd_send_control(port, PD_CTRL_GET_STATUS);
3535                tcpm_set_state(port, GET_STATUS_SEND_TIMEOUT,
3536                               PD_T_SENDER_RESPONSE);
3537                break;
3538        case GET_STATUS_SEND_TIMEOUT:
3539                tcpm_set_state(port, ready_state(port), 0);
3540                break;
3541        case GET_PPS_STATUS_SEND:
3542                tcpm_pd_send_control(port, PD_CTRL_GET_PPS_STATUS);
3543                tcpm_set_state(port, GET_PPS_STATUS_SEND_TIMEOUT,
3544                               PD_T_SENDER_RESPONSE);
3545                break;
3546        case GET_PPS_STATUS_SEND_TIMEOUT:
3547                tcpm_set_state(port, ready_state(port), 0);
3548                break;
3549        case ERROR_RECOVERY:
3550                tcpm_swap_complete(port, -EPROTO);
3551                tcpm_pps_complete(port, -EPROTO);
3552                tcpm_set_state(port, PORT_RESET, 0);
3553                break;
3554        case PORT_RESET:
3555                tcpm_reset_port(port);
3556                tcpm_set_cc(port, TYPEC_CC_OPEN);
3557                tcpm_set_state(port, PORT_RESET_WAIT_OFF,
3558                               PD_T_ERROR_RECOVERY);
3559                break;
3560        case PORT_RESET_WAIT_OFF:
3561                tcpm_set_state(port,
3562                               tcpm_default_state(port),
3563                               port->vbus_present ? PD_T_PS_SOURCE_OFF : 0);
3564                break;
3565        default:
3566                WARN(1, "Unexpected port state %d\n", port->state);
3567                break;
3568        }
3569}
3570
3571static void tcpm_state_machine_work(struct work_struct *work)
3572{
3573        struct tcpm_port *port = container_of(work, struct tcpm_port,
3574                                              state_machine.work);
3575        enum tcpm_state prev_state;
3576
3577        mutex_lock(&port->lock);
3578        port->state_machine_running = true;
3579
3580        if (port->queued_message && tcpm_send_queued_message(port))
3581                goto done;
3582
3583        /* If we were queued due to a delayed state change, update it now */
3584        if (port->delayed_state) {
3585                tcpm_log(port, "state change %s -> %s [delayed %ld ms]",
3586                         tcpm_states[port->state],
3587                         tcpm_states[port->delayed_state], port->delay_ms);
3588                port->prev_state = port->state;
3589                port->state = port->delayed_state;
3590                port->delayed_state = INVALID_STATE;
3591        }
3592
3593        /*
3594         * Continue running as long as we have (non-delayed) state changes
3595         * to make.
3596         */
3597        do {
3598                prev_state = port->state;
3599                run_state_machine(port);
3600                if (port->queued_message)
3601                        tcpm_send_queued_message(port);
3602        } while (port->state != prev_state && !port->delayed_state);
3603
3604done:
3605        port->state_machine_running = false;
3606        mutex_unlock(&port->lock);
3607}
3608
3609static void _tcpm_cc_change(struct tcpm_port *port, enum typec_cc_status cc1,
3610                            enum typec_cc_status cc2)
3611{
3612        enum typec_cc_status old_cc1, old_cc2;
3613        enum tcpm_state new_state;
3614
3615        old_cc1 = port->cc1;
3616        old_cc2 = port->cc2;
3617        port->cc1 = cc1;
3618        port->cc2 = cc2;
3619
3620        tcpm_log_force(port,
3621                       "CC1: %u -> %u, CC2: %u -> %u [state %s, polarity %d, %s]",
3622                       old_cc1, cc1, old_cc2, cc2, tcpm_states[port->state],
3623                       port->polarity,
3624                       tcpm_port_is_disconnected(port) ? "disconnected"
3625                                                       : "connected");
3626
3627        switch (port->state) {
3628        case TOGGLING:
3629                if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) ||
3630                    tcpm_port_is_source(port))
3631                        tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
3632                else if (tcpm_port_is_sink(port))
3633                        tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
3634                break;
3635        case SRC_UNATTACHED:
3636        case ACC_UNATTACHED:
3637                if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) ||
3638                    tcpm_port_is_source(port))
3639                        tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
3640                break;
3641        case SRC_ATTACH_WAIT:
3642                if (tcpm_port_is_disconnected(port) ||
3643                    tcpm_port_is_audio_detached(port))
3644                        tcpm_set_state(port, SRC_UNATTACHED, 0);
3645                else if (cc1 != old_cc1 || cc2 != old_cc2)
3646                        tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
3647                break;
3648        case SRC_ATTACHED:
3649        case SRC_SEND_CAPABILITIES:
3650        case SRC_READY:
3651                if (tcpm_port_is_disconnected(port) ||
3652                    !tcpm_port_is_source(port))
3653                        tcpm_set_state(port, SRC_UNATTACHED, 0);
3654                break;
3655        case SNK_UNATTACHED:
3656                if (tcpm_port_is_sink(port))
3657                        tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
3658                break;
3659        case SNK_ATTACH_WAIT:
3660                if ((port->cc1 == TYPEC_CC_OPEN &&
3661                     port->cc2 != TYPEC_CC_OPEN) ||
3662                    (port->cc1 != TYPEC_CC_OPEN &&
3663                     port->cc2 == TYPEC_CC_OPEN))
3664                        new_state = SNK_DEBOUNCED;
3665                else if (tcpm_port_is_disconnected(port))
3666                        new_state = SNK_UNATTACHED;
3667                else
3668                        break;
3669                if (new_state != port->delayed_state)
3670                        tcpm_set_state(port, SNK_ATTACH_WAIT, 0);
3671                break;
3672        case SNK_DEBOUNCED:
3673                if (tcpm_port_is_disconnected(port))
3674                        new_state = SNK_UNATTACHED;
3675                else if (port->vbus_present)
3676                        new_state = tcpm_try_src(port) ? SRC_TRY : SNK_ATTACHED;
3677                else
3678                        new_state = SNK_UNATTACHED;
3679                if (new_state != port->delayed_state)
3680                        tcpm_set_state(port, SNK_DEBOUNCED, 0);
3681                break;
3682        case SNK_READY:
3683                if (tcpm_port_is_disconnected(port))
3684                        tcpm_set_state(port, unattached_state(port), 0);
3685                else if (!port->pd_capable &&
3686                         (cc1 != old_cc1 || cc2 != old_cc2))
3687                        tcpm_set_current_limit(port,
3688                                               tcpm_get_current_limit(port),
3689                                               5000);
3690                break;
3691
3692        case AUDIO_ACC_ATTACHED:
3693                if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
3694                        tcpm_set_state(port, AUDIO_ACC_DEBOUNCE, 0);
3695                break;
3696        case AUDIO_ACC_DEBOUNCE:
3697                if (tcpm_port_is_audio(port))
3698                        tcpm_set_state(port, AUDIO_ACC_ATTACHED, 0);
3699                break;
3700
3701        case DEBUG_ACC_ATTACHED:
3702                if (cc1 == TYPEC_CC_OPEN || cc2 == TYPEC_CC_OPEN)
3703                        tcpm_set_state(port, ACC_UNATTACHED, 0);
3704                break;
3705
3706        case SNK_TRY:
3707                /* Do nothing, waiting for timeout */
3708                break;
3709
3710        case SNK_DISCOVERY:
3711                /* CC line is unstable, wait for debounce */
3712                if (tcpm_port_is_disconnected(port))
3713                        tcpm_set_state(port, SNK_DISCOVERY_DEBOUNCE, 0);
3714                break;
3715        case SNK_DISCOVERY_DEBOUNCE:
3716                break;
3717
3718        case SRC_TRYWAIT:
3719                /* Hand over to state machine if needed */
3720                if (!port->vbus_present && tcpm_port_is_source(port))
3721                        tcpm_set_state(port, SRC_TRYWAIT_DEBOUNCE, 0);
3722                break;
3723        case SRC_TRYWAIT_DEBOUNCE:
3724                if (port->vbus_present || !tcpm_port_is_source(port))
3725                        tcpm_set_state(port, SRC_TRYWAIT, 0);
3726                break;
3727        case SNK_TRY_WAIT_DEBOUNCE:
3728                if (!tcpm_port_is_sink(port)) {
3729                        port->max_wait = 0;
3730                        tcpm_set_state(port, SRC_TRYWAIT, 0);
3731                }
3732                break;
3733        case SRC_TRY_WAIT:
3734                if (tcpm_port_is_source(port))
3735                        tcpm_set_state(port, SRC_TRY_DEBOUNCE, 0);
3736                break;
3737        case SRC_TRY_DEBOUNCE:
3738                tcpm_set_state(port, SRC_TRY_WAIT, 0);
3739                break;
3740        case SNK_TRYWAIT_DEBOUNCE:
3741                if (tcpm_port_is_sink(port))
3742                        tcpm_set_state(port, SNK_TRYWAIT_VBUS, 0);
3743                break;
3744        case SNK_TRYWAIT_VBUS:
3745                if (!tcpm_port_is_sink(port))
3746                        tcpm_set_state(port, SNK_TRYWAIT_DEBOUNCE, 0);
3747                break;
3748        case SNK_TRYWAIT:
3749                /* Do nothing, waiting for tCCDebounce */
3750                break;
3751        case PR_SWAP_SNK_SRC_SINK_OFF:
3752        case PR_SWAP_SRC_SNK_TRANSITION_OFF:
3753        case PR_SWAP_SRC_SNK_SOURCE_OFF:
3754        case PR_SWAP_SRC_SNK_SOURCE_OFF_CC_DEBOUNCED:
3755        case PR_SWAP_SNK_SRC_SOURCE_ON:
3756                /*
3757                 * CC state change is expected in PR_SWAP
3758                 * Ignore it.
3759                 */
3760                break;
3761
3762        default:
3763                if (tcpm_port_is_disconnected(port))
3764                        tcpm_set_state(port, unattached_state(port), 0);
3765                break;
3766        }
3767}
3768
3769static void _tcpm_pd_vbus_on(struct tcpm_port *port)
3770{
3771        tcpm_log_force(port, "VBUS on");
3772        port->vbus_present = true;
3773        switch (port->state) {
3774        case SNK_TRANSITION_SINK_VBUS:
3775                port->explicit_contract = true;
3776                tcpm_set_state(port, SNK_READY, 0);
3777                break;
3778        case SNK_DISCOVERY:
3779                tcpm_set_state(port, SNK_DISCOVERY, 0);
3780                break;
3781
3782        case SNK_DEBOUNCED:
3783                tcpm_set_state(port, tcpm_try_src(port) ? SRC_TRY
3784                                                        : SNK_ATTACHED,
3785                                       0);
3786                break;
3787        case SNK_HARD_RESET_WAIT_VBUS:
3788                tcpm_set_state(port, SNK_HARD_RESET_SINK_ON, 0);
3789                break;
3790        case SRC_ATTACHED:
3791                tcpm_set_state(port, SRC_STARTUP, 0);
3792                break;
3793        case SRC_HARD_RESET_VBUS_ON:
3794                tcpm_set_state(port, SRC_STARTUP, 0);
3795                break;
3796
3797        case SNK_TRY:
3798                /* Do nothing, waiting for timeout */
3799                break;
3800        case SRC_TRYWAIT:
3801                /* Do nothing, Waiting for Rd to be detected */
3802                break;
3803        case SRC_TRYWAIT_DEBOUNCE:
3804                tcpm_set_state(port, SRC_TRYWAIT, 0);
3805                break;
3806        case SNK_TRY_WAIT_DEBOUNCE:
3807                /* Do nothing, waiting for PD_DEBOUNCE to do be done */
3808                break;
3809        case SNK_TRYWAIT:
3810                /* Do nothing, waiting for tCCDebounce */
3811                break;
3812        case SNK_TRYWAIT_VBUS:
3813                if (tcpm_port_is_sink(port))
3814                        tcpm_set_state(port, SNK_ATTACHED, 0);
3815                break;
3816        case SNK_TRYWAIT_DEBOUNCE:
3817                /* Do nothing, waiting for Rp */
3818                break;
3819        case SRC_TRY_WAIT:
3820        case SRC_TRY_DEBOUNCE:
3821                /* Do nothing, waiting for sink detection */
3822                break;
3823        default:
3824                break;
3825        }
3826}
3827
3828static void _tcpm_pd_vbus_off(struct tcpm_port *port)
3829{
3830        tcpm_log_force(port, "VBUS off");
3831        port->vbus_present = false;
3832        port->vbus_never_low = false;
3833        switch (port->state) {
3834        case SNK_HARD_RESET_SINK_OFF:
3835                tcpm_set_state(port, SNK_HARD_RESET_WAIT_VBUS, 0);
3836                break;
3837        case SRC_HARD_RESET_VBUS_OFF:
3838                tcpm_set_state(port, SRC_HARD_RESET_VBUS_ON, 0);
3839                break;
3840        case HARD_RESET_SEND:
3841                break;
3842
3843        case SNK_TRY:
3844                /* Do nothing, waiting for timeout */
3845                break;
3846        case SRC_TRYWAIT:
3847                /* Hand over to state machine if needed */
3848                if (tcpm_port_is_source(port))
3849                        tcpm_set_state(port, SRC_TRYWAIT_DEBOUNCE, 0);
3850                break;
3851        case SNK_TRY_WAIT_DEBOUNCE:
3852                /* Do nothing, waiting for PD_DEBOUNCE to do be done */
3853                break;
3854        case SNK_TRYWAIT:
3855        case SNK_TRYWAIT_VBUS:
3856        case SNK_TRYWAIT_DEBOUNCE:
3857                break;
3858        case SNK_ATTACH_WAIT:
3859                tcpm_set_state(port, SNK_UNATTACHED, 0);
3860                break;
3861
3862        case SNK_NEGOTIATE_CAPABILITIES:
3863                break;
3864
3865        case PR_SWAP_SRC_SNK_TRANSITION_OFF:
3866                tcpm_set_state(port, PR_SWAP_SRC_SNK_SOURCE_OFF, 0);
3867                break;
3868
3869        case PR_SWAP_SNK_SRC_SINK_OFF:
3870                /* Do nothing, expected */
3871                break;
3872
3873        case PORT_RESET_WAIT_OFF:
3874                tcpm_set_state(port, tcpm_default_state(port), 0);
3875                break;
3876        case SRC_TRY_WAIT:
3877        case SRC_TRY_DEBOUNCE:
3878                /* Do nothing, waiting for sink detection */
3879                break;
3880        default:
3881                if (port->pwr_role == TYPEC_SINK &&
3882                    port->attached)
3883                        tcpm_set_state(port, SNK_UNATTACHED, 0);
3884                break;
3885        }
3886}
3887
3888static void _tcpm_pd_hard_reset(struct tcpm_port *port)
3889{
3890        tcpm_log_force(port, "Received hard reset");
3891        /*
3892         * If we keep receiving hard reset requests, executing the hard reset
3893         * must have failed. Revert to error recovery if that happens.
3894         */
3895        tcpm_set_state(port,
3896                       port->hard_reset_count < PD_N_HARD_RESET_COUNT ?
3897                                HARD_RESET_START : ERROR_RECOVERY,
3898                       0);
3899}
3900
3901static void tcpm_pd_event_handler(struct work_struct *work)
3902{
3903        struct tcpm_port *port = container_of(work, struct tcpm_port,
3904                                              event_work);
3905        u32 events;
3906
3907        mutex_lock(&port->lock);
3908
3909        spin_lock(&port->pd_event_lock);
3910        while (port->pd_events) {
3911                events = port->pd_events;
3912                port->pd_events = 0;
3913                spin_unlock(&port->pd_event_lock);
3914                if (events & TCPM_RESET_EVENT)
3915                        _tcpm_pd_hard_reset(port);
3916                if (events & TCPM_VBUS_EVENT) {
3917                        bool vbus;
3918
3919                        vbus = port->tcpc->get_vbus(port->tcpc);
3920                        if (vbus)
3921                                _tcpm_pd_vbus_on(port);
3922                        else
3923                                _tcpm_pd_vbus_off(port);
3924                }
3925                if (events & TCPM_CC_EVENT) {
3926                        enum typec_cc_status cc1, cc2;
3927
3928                        if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
3929                                _tcpm_cc_change(port, cc1, cc2);
3930                }
3931                spin_lock(&port->pd_event_lock);
3932        }
3933        spin_unlock(&port->pd_event_lock);
3934        mutex_unlock(&port->lock);
3935}
3936
3937void tcpm_cc_change(struct tcpm_port *port)
3938{
3939        spin_lock(&port->pd_event_lock);
3940        port->pd_events |= TCPM_CC_EVENT;
3941        spin_unlock(&port->pd_event_lock);
3942        queue_work(port->wq, &port->event_work);
3943}
3944EXPORT_SYMBOL_GPL(tcpm_cc_change);
3945
3946void tcpm_vbus_change(struct tcpm_port *port)
3947{
3948        spin_lock(&port->pd_event_lock);
3949        port->pd_events |= TCPM_VBUS_EVENT;
3950        spin_unlock(&port->pd_event_lock);
3951        queue_work(port->wq, &port->event_work);
3952}
3953EXPORT_SYMBOL_GPL(tcpm_vbus_change);
3954
3955void tcpm_pd_hard_reset(struct tcpm_port *port)
3956{
3957        spin_lock(&port->pd_event_lock);
3958        port->pd_events = TCPM_RESET_EVENT;
3959        spin_unlock(&port->pd_event_lock);
3960        queue_work(port->wq, &port->event_work);
3961}
3962EXPORT_SYMBOL_GPL(tcpm_pd_hard_reset);
3963
3964static int tcpm_dr_set(struct typec_port *p, enum typec_data_role data)
3965{
3966        struct tcpm_port *port = typec_get_drvdata(p);
3967        int ret;
3968
3969        mutex_lock(&port->swap_lock);
3970        mutex_lock(&port->lock);
3971
3972        if (port->port_type != TYPEC_PORT_DRP) {
3973                ret = -EINVAL;
3974                goto port_unlock;
3975        }
3976        if (port->state != SRC_READY && port->state != SNK_READY) {
3977                ret = -EAGAIN;
3978                goto port_unlock;
3979        }
3980
3981        if (port->data_role == data) {
3982                ret = 0;
3983                goto port_unlock;
3984        }
3985
3986        /*
3987         * XXX
3988         * 6.3.9: If an alternate mode is active, a request to swap
3989         * alternate modes shall trigger a port reset.
3990         * Reject data role swap request in this case.
3991         */
3992
3993        if (!port->pd_capable) {
3994                /*
3995                 * If the partner is not PD capable, reset the port to
3996                 * trigger a role change. This can only work if a preferred
3997                 * role is configured, and if it matches the requested role.
3998                 */
3999                if (port->try_role == TYPEC_NO_PREFERRED_ROLE ||
4000                    port->try_role == port->pwr_role) {
4001                        ret = -EINVAL;
4002                        goto port_unlock;
4003                }
4004                port->non_pd_role_swap = true;
4005                tcpm_set_state(port, PORT_RESET, 0);
4006        } else {
4007                tcpm_set_state(port, DR_SWAP_SEND, 0);
4008        }
4009
4010        port->swap_status = 0;
4011        port->swap_pending = true;
4012        reinit_completion(&port->swap_complete);
4013        mutex_unlock(&port->lock);
4014
4015        if (!wait_for_completion_timeout(&port->swap_complete,
4016                                msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
4017                ret = -ETIMEDOUT;
4018        else
4019                ret = port->swap_status;
4020
4021        port->non_pd_role_swap = false;
4022        goto swap_unlock;
4023
4024port_unlock:
4025        mutex_unlock(&port->lock);
4026swap_unlock:
4027        mutex_unlock(&port->swap_lock);
4028        return ret;
4029}
4030
4031static int tcpm_pr_set(struct typec_port *p, enum typec_role role)
4032{
4033        struct tcpm_port *port = typec_get_drvdata(p);
4034        int ret;
4035
4036        mutex_lock(&port->swap_lock);
4037        mutex_lock(&port->lock);
4038
4039        if (port->port_type != TYPEC_PORT_DRP) {
4040                ret = -EINVAL;
4041                goto port_unlock;
4042        }
4043        if (port->state != SRC_READY && port->state != SNK_READY) {
4044                ret = -EAGAIN;
4045                goto port_unlock;
4046        }
4047
4048        if (role == port->pwr_role) {
4049                ret = 0;
4050                goto port_unlock;
4051        }
4052
4053        port->swap_status = 0;
4054        port->swap_pending = true;
4055        reinit_completion(&port->swap_complete);
4056        tcpm_set_state(port, PR_SWAP_SEND, 0);
4057        mutex_unlock(&port->lock);
4058
4059        if (!wait_for_completion_timeout(&port->swap_complete,
4060                                msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
4061                ret = -ETIMEDOUT;
4062        else
4063                ret = port->swap_status;
4064
4065        goto swap_unlock;
4066
4067port_unlock:
4068        mutex_unlock(&port->lock);
4069swap_unlock:
4070        mutex_unlock(&port->swap_lock);
4071        return ret;
4072}
4073
4074static int tcpm_vconn_set(struct typec_port *p, enum typec_role role)
4075{
4076        struct tcpm_port *port = typec_get_drvdata(p);
4077        int ret;
4078
4079        mutex_lock(&port->swap_lock);
4080        mutex_lock(&port->lock);
4081
4082        if (port->state != SRC_READY && port->state != SNK_READY) {
4083                ret = -EAGAIN;
4084                goto port_unlock;
4085        }
4086
4087        if (role == port->vconn_role) {
4088                ret = 0;
4089                goto port_unlock;
4090        }
4091
4092        port->swap_status = 0;
4093        port->swap_pending = true;
4094        reinit_completion(&port->swap_complete);
4095        tcpm_set_state(port, VCONN_SWAP_SEND, 0);
4096        mutex_unlock(&port->lock);
4097
4098        if (!wait_for_completion_timeout(&port->swap_complete,
4099                                msecs_to_jiffies(PD_ROLE_SWAP_TIMEOUT)))
4100                ret = -ETIMEDOUT;
4101        else
4102                ret = port->swap_status;
4103
4104        goto swap_unlock;
4105
4106port_unlock:
4107        mutex_unlock(&port->lock);
4108swap_unlock:
4109        mutex_unlock(&port->swap_lock);
4110        return ret;
4111}
4112
4113static int tcpm_try_role(struct typec_port *p, int role)
4114{
4115        struct tcpm_port *port = typec_get_drvdata(p);
4116        struct tcpc_dev *tcpc = port->tcpc;
4117        int ret = 0;
4118
4119        mutex_lock(&port->lock);
4120        if (tcpc->try_role)
4121                ret = tcpc->try_role(tcpc, role);
4122        if (!ret)
4123                port->try_role = role;
4124        port->try_src_count = 0;
4125        port->try_snk_count = 0;
4126        mutex_unlock(&port->lock);
4127
4128        return ret;
4129}
4130
4131static int tcpm_pps_set_op_curr(struct tcpm_port *port, u16 op_curr)
4132{
4133        unsigned int target_mw;
4134        int ret;
4135
4136        mutex_lock(&port->swap_lock);
4137        mutex_lock(&port->lock);
4138
4139        if (!port->pps_data.active) {
4140                ret = -EOPNOTSUPP;
4141                goto port_unlock;
4142        }
4143
4144        if (port->state != SNK_READY) {
4145                ret = -EAGAIN;
4146                goto port_unlock;
4147        }
4148
4149        if (op_curr > port->pps_data.max_curr) {
4150                ret = -EINVAL;
4151                goto port_unlock;
4152        }
4153
4154        target_mw = (op_curr * port->pps_data.out_volt) / 1000;
4155        if (target_mw < port->operating_snk_mw) {
4156                ret = -EINVAL;
4157                goto port_unlock;
4158        }
4159
4160        /* Round down operating current to align with PPS valid steps */
4161        op_curr = op_curr - (op_curr % RDO_PROG_CURR_MA_STEP);
4162
4163        reinit_completion(&port->pps_complete);
4164        port->pps_data.op_curr = op_curr;
4165        port->pps_status = 0;
4166        port->pps_pending = true;
4167        tcpm_set_state(port, SNK_NEGOTIATE_PPS_CAPABILITIES, 0);
4168        mutex_unlock(&port->lock);
4169
4170        if (!wait_for_completion_timeout(&port->pps_complete,
4171                                msecs_to_jiffies(PD_PPS_CTRL_TIMEOUT)))
4172                ret = -ETIMEDOUT;
4173        else
4174                ret = port->pps_status;
4175
4176        goto swap_unlock;
4177
4178port_unlock:
4179        mutex_unlock(&port->lock);
4180swap_unlock:
4181        mutex_unlock(&port->swap_lock);
4182
4183        return ret;
4184}
4185
4186static int tcpm_pps_set_out_volt(struct tcpm_port *port, u16 out_volt)
4187{
4188        unsigned int target_mw;
4189        int ret;
4190
4191        mutex_lock(&port->swap_lock);
4192        mutex_lock(&port->lock);
4193
4194        if (!port->pps_data.active) {
4195                ret = -EOPNOTSUPP;
4196                goto port_unlock;
4197        }
4198
4199        if (port->state != SNK_READY) {
4200                ret = -EAGAIN;
4201                goto port_unlock;
4202        }
4203
4204        if (out_volt < port->pps_data.min_volt ||
4205            out_volt > port->pps_data.max_volt) {
4206                ret = -EINVAL;
4207                goto port_unlock;
4208        }
4209
4210        target_mw = (port->pps_data.op_curr * out_volt) / 1000;
4211        if (target_mw < port->operating_snk_mw) {
4212                ret = -EINVAL;
4213                goto port_unlock;
4214        }
4215
4216        /* Round down output voltage to align with PPS valid steps */
4217        out_volt = out_volt - (out_volt % RDO_PROG_VOLT_MV_STEP);
4218
4219        reinit_completion(&port->pps_complete);
4220        port->pps_data.out_volt = out_volt;
4221        port->pps_status = 0;
4222        port->pps_pending = true;
4223        tcpm_set_state(port, SNK_NEGOTIATE_PPS_CAPABILITIES, 0);
4224        mutex_unlock(&port->lock);
4225
4226        if (!wait_for_completion_timeout(&port->pps_complete,
4227                                msecs_to_jiffies(PD_PPS_CTRL_TIMEOUT)))
4228                ret = -ETIMEDOUT;
4229        else
4230                ret = port->pps_status;
4231
4232        goto swap_unlock;
4233
4234port_unlock:
4235        mutex_unlock(&port->lock);
4236swap_unlock:
4237        mutex_unlock(&port->swap_lock);
4238
4239        return ret;
4240}
4241
4242static int tcpm_pps_activate(struct tcpm_port *port, bool activate)
4243{
4244        int ret = 0;
4245
4246        mutex_lock(&port->swap_lock);
4247        mutex_lock(&port->lock);
4248
4249        if (!port->pps_data.supported) {
4250                ret = -EOPNOTSUPP;
4251                goto port_unlock;
4252        }
4253
4254        /* Trying to deactivate PPS when already deactivated so just bail */
4255        if (!port->pps_data.active && !activate)
4256                goto port_unlock;
4257
4258        if (port->state != SNK_READY) {
4259                ret = -EAGAIN;
4260                goto port_unlock;
4261        }
4262
4263        reinit_completion(&port->pps_complete);
4264        port->pps_status = 0;
4265        port->pps_pending = true;
4266
4267        /* Trigger PPS request or move back to standard PDO contract */
4268        if (activate) {
4269                port->pps_data.out_volt = port->supply_voltage;
4270                port->pps_data.op_curr = port->current_limit;
4271                tcpm_set_state(port, SNK_NEGOTIATE_PPS_CAPABILITIES, 0);
4272        } else {
4273                tcpm_set_state(port, SNK_NEGOTIATE_CAPABILITIES, 0);
4274        }
4275        mutex_unlock(&port->lock);
4276
4277        if (!wait_for_completion_timeout(&port->pps_complete,
4278                                msecs_to_jiffies(PD_PPS_CTRL_TIMEOUT)))
4279                ret = -ETIMEDOUT;
4280        else
4281                ret = port->pps_status;
4282
4283        goto swap_unlock;
4284
4285port_unlock:
4286        mutex_unlock(&port->lock);
4287swap_unlock:
4288        mutex_unlock(&port->swap_lock);
4289
4290        return ret;
4291}
4292
4293static void tcpm_init(struct tcpm_port *port)
4294{
4295        enum typec_cc_status cc1, cc2;
4296
4297        port->tcpc->init(port->tcpc);
4298
4299        tcpm_reset_port(port);
4300
4301        /*
4302         * XXX
4303         * Should possibly wait for VBUS to settle if it was enabled locally
4304         * since tcpm_reset_port() will disable VBUS.
4305         */
4306        port->vbus_present = port->tcpc->get_vbus(port->tcpc);
4307        if (port->vbus_present)
4308                port->vbus_never_low = true;
4309
4310        tcpm_set_state(port, tcpm_default_state(port), 0);
4311
4312        if (port->tcpc->get_cc(port->tcpc, &cc1, &cc2) == 0)
4313                _tcpm_cc_change(port, cc1, cc2);
4314
4315        /*
4316         * Some adapters need a clean slate at startup, and won't recover
4317         * otherwise. So do not try to be fancy and force a clean disconnect.
4318         */
4319        tcpm_set_state(port, PORT_RESET, 0);
4320}
4321
4322static int tcpm_port_type_set(struct typec_port *p, enum typec_port_type type)
4323{
4324        struct tcpm_port *port = typec_get_drvdata(p);
4325
4326        mutex_lock(&port->lock);
4327        if (type == port->port_type)
4328                goto port_unlock;
4329
4330        port->port_type = type;
4331
4332        if (!port->connected) {
4333                tcpm_set_state(port, PORT_RESET, 0);
4334        } else if (type == TYPEC_PORT_SNK) {
4335                if (!(port->pwr_role == TYPEC_SINK &&
4336                      port->data_role == TYPEC_DEVICE))
4337                        tcpm_set_state(port, PORT_RESET, 0);
4338        } else if (type == TYPEC_PORT_SRC) {
4339                if (!(port->pwr_role == TYPEC_SOURCE &&
4340                      port->data_role == TYPEC_HOST))
4341                        tcpm_set_state(port, PORT_RESET, 0);
4342        }
4343
4344port_unlock:
4345        mutex_unlock(&port->lock);
4346        return 0;
4347}
4348
4349static const struct typec_operations tcpm_ops = {
4350        .try_role = tcpm_try_role,
4351        .dr_set = tcpm_dr_set,
4352        .pr_set = tcpm_pr_set,
4353        .vconn_set = tcpm_vconn_set,
4354        .port_type_set = tcpm_port_type_set
4355};
4356
4357void tcpm_tcpc_reset(struct tcpm_port *port)
4358{
4359        mutex_lock(&port->lock);
4360        /* XXX: Maintain PD connection if possible? */
4361        tcpm_init(port);
4362        mutex_unlock(&port->lock);
4363}
4364EXPORT_SYMBOL_GPL(tcpm_tcpc_reset);
4365
4366static int tcpm_fw_get_caps(struct tcpm_port *port,
4367                            struct fwnode_handle *fwnode)
4368{
4369        const char *cap_str;
4370        int ret;
4371        u32 mw;
4372
4373        if (!fwnode)
4374                return -EINVAL;
4375
4376        /* USB data support is optional */
4377        ret = fwnode_property_read_string(fwnode, "data-role", &cap_str);
4378        if (ret == 0) {
4379                ret = typec_find_port_data_role(cap_str);
4380                if (ret < 0)
4381                        return ret;
4382                port->typec_caps.data = ret;
4383        }
4384
4385        ret = fwnode_property_read_string(fwnode, "power-role", &cap_str);
4386        if (ret < 0)
4387                return ret;
4388
4389        ret = typec_find_port_power_role(cap_str);
4390        if (ret < 0)
4391                return ret;
4392        port->typec_caps.type = ret;
4393        port->port_type = port->typec_caps.type;
4394
4395        if (port->port_type == TYPEC_PORT_SNK)
4396                goto sink;
4397
4398        /* Get source pdos */
4399        ret = fwnode_property_count_u32(fwnode, "source-pdos");
4400        if (ret <= 0)
4401                return -EINVAL;
4402
4403        port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS);
4404        ret = fwnode_property_read_u32_array(fwnode, "source-pdos",
4405                                             port->src_pdo, port->nr_src_pdo);
4406        if ((ret < 0) || tcpm_validate_caps(port, port->src_pdo,
4407                                            port->nr_src_pdo))
4408                return -EINVAL;
4409
4410        if (port->port_type == TYPEC_PORT_SRC)
4411                return 0;
4412
4413        /* Get the preferred power role for DRP */
4414        ret = fwnode_property_read_string(fwnode, "try-power-role", &cap_str);
4415        if (ret < 0)
4416                return ret;
4417
4418        port->typec_caps.prefer_role = typec_find_power_role(cap_str);
4419        if (port->typec_caps.prefer_role < 0)
4420                return -EINVAL;
4421sink:
4422        /* Get sink pdos */
4423        ret = fwnode_property_count_u32(fwnode, "sink-pdos");
4424        if (ret <= 0)
4425                return -EINVAL;
4426
4427        port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS);
4428        ret = fwnode_property_read_u32_array(fwnode, "sink-pdos",
4429                                             port->snk_pdo, port->nr_snk_pdo);
4430        if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo,
4431                                            port->nr_snk_pdo))
4432                return -EINVAL;
4433
4434        if (fwnode_property_read_u32(fwnode, "op-sink-microwatt", &mw) < 0)
4435                return -EINVAL;
4436        port->operating_snk_mw = mw / 1000;
4437
4438        port->self_powered = fwnode_property_read_bool(fwnode, "self-powered");
4439
4440        return 0;
4441}
4442
4443/* Power Supply access to expose source power information */
4444enum tcpm_psy_online_states {
4445        TCPM_PSY_OFFLINE = 0,
4446        TCPM_PSY_FIXED_ONLINE,
4447        TCPM_PSY_PROG_ONLINE,
4448};
4449
4450static enum power_supply_property tcpm_psy_props[] = {
4451        POWER_SUPPLY_PROP_USB_TYPE,
4452        POWER_SUPPLY_PROP_ONLINE,
4453        POWER_SUPPLY_PROP_VOLTAGE_MIN,
4454        POWER_SUPPLY_PROP_VOLTAGE_MAX,
4455        POWER_SUPPLY_PROP_VOLTAGE_NOW,
4456        POWER_SUPPLY_PROP_CURRENT_MAX,
4457        POWER_SUPPLY_PROP_CURRENT_NOW,
4458};
4459
4460static int tcpm_psy_get_online(struct tcpm_port *port,
4461                               union power_supply_propval *val)
4462{
4463        if (port->vbus_charge) {
4464                if (port->pps_data.active)
4465                        val->intval = TCPM_PSY_PROG_ONLINE;
4466                else
4467                        val->intval = TCPM_PSY_FIXED_ONLINE;
4468        } else {
4469                val->intval = TCPM_PSY_OFFLINE;
4470        }
4471
4472        return 0;
4473}
4474
4475static int tcpm_psy_get_voltage_min(struct tcpm_port *port,
4476                                    union power_supply_propval *val)
4477{
4478        if (port->pps_data.active)
4479                val->intval = port->pps_data.min_volt * 1000;
4480        else
4481                val->intval = port->supply_voltage * 1000;
4482
4483        return 0;
4484}
4485
4486static int tcpm_psy_get_voltage_max(struct tcpm_port *port,
4487                                    union power_supply_propval *val)
4488{
4489        if (port->pps_data.active)
4490                val->intval = port->pps_data.max_volt * 1000;
4491        else
4492                val->intval = port->supply_voltage * 1000;
4493
4494        return 0;
4495}
4496
4497static int tcpm_psy_get_voltage_now(struct tcpm_port *port,
4498                                    union power_supply_propval *val)
4499{
4500        val->intval = port->supply_voltage * 1000;
4501
4502        return 0;
4503}
4504
4505static int tcpm_psy_get_current_max(struct tcpm_port *port,
4506                                    union power_supply_propval *val)
4507{
4508        if (port->pps_data.active)
4509                val->intval = port->pps_data.max_curr * 1000;
4510        else
4511                val->intval = port->current_limit * 1000;
4512
4513        return 0;
4514}
4515
4516static int tcpm_psy_get_current_now(struct tcpm_port *port,
4517                                    union power_supply_propval *val)
4518{
4519        val->intval = port->current_limit * 1000;
4520
4521        return 0;
4522}
4523
4524static int tcpm_psy_get_prop(struct power_supply *psy,
4525                             enum power_supply_property psp,
4526                             union power_supply_propval *val)
4527{
4528        struct tcpm_port *port = power_supply_get_drvdata(psy);
4529        int ret = 0;
4530
4531        switch (psp) {
4532        case POWER_SUPPLY_PROP_USB_TYPE:
4533                val->intval = port->usb_type;
4534                break;
4535        case POWER_SUPPLY_PROP_ONLINE:
4536                ret = tcpm_psy_get_online(port, val);
4537                break;
4538        case POWER_SUPPLY_PROP_VOLTAGE_MIN:
4539                ret = tcpm_psy_get_voltage_min(port, val);
4540                break;
4541        case POWER_SUPPLY_PROP_VOLTAGE_MAX:
4542                ret = tcpm_psy_get_voltage_max(port, val);
4543                break;
4544        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
4545                ret = tcpm_psy_get_voltage_now(port, val);
4546                break;
4547        case POWER_SUPPLY_PROP_CURRENT_MAX:
4548                ret = tcpm_psy_get_current_max(port, val);
4549                break;
4550        case POWER_SUPPLY_PROP_CURRENT_NOW:
4551                ret = tcpm_psy_get_current_now(port, val);
4552                break;
4553        default:
4554                ret = -EINVAL;
4555                break;
4556        }
4557
4558        return ret;
4559}
4560
4561static int tcpm_psy_set_online(struct tcpm_port *port,
4562                               const union power_supply_propval *val)
4563{
4564        int ret;
4565
4566        switch (val->intval) {
4567        case TCPM_PSY_FIXED_ONLINE:
4568                ret = tcpm_pps_activate(port, false);
4569                break;
4570        case TCPM_PSY_PROG_ONLINE:
4571                ret = tcpm_pps_activate(port, true);
4572                break;
4573        default:
4574                ret = -EINVAL;
4575                break;
4576        }
4577
4578        return ret;
4579}
4580
4581static int tcpm_psy_set_prop(struct power_supply *psy,
4582                             enum power_supply_property psp,
4583                             const union power_supply_propval *val)
4584{
4585        struct tcpm_port *port = power_supply_get_drvdata(psy);
4586        int ret;
4587
4588        switch (psp) {
4589        case POWER_SUPPLY_PROP_ONLINE:
4590                ret = tcpm_psy_set_online(port, val);
4591                break;
4592        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
4593                if (val->intval < port->pps_data.min_volt * 1000 ||
4594                    val->intval > port->pps_data.max_volt * 1000)
4595                        ret = -EINVAL;
4596                else
4597                        ret = tcpm_pps_set_out_volt(port, val->intval / 1000);
4598                break;
4599        case POWER_SUPPLY_PROP_CURRENT_NOW:
4600                if (val->intval > port->pps_data.max_curr * 1000)
4601                        ret = -EINVAL;
4602                else
4603                        ret = tcpm_pps_set_op_curr(port, val->intval / 1000);
4604                break;
4605        default:
4606                ret = -EINVAL;
4607                break;
4608        }
4609
4610        return ret;
4611}
4612
4613static int tcpm_psy_prop_writeable(struct power_supply *psy,
4614                                   enum power_supply_property psp)
4615{
4616        switch (psp) {
4617        case POWER_SUPPLY_PROP_ONLINE:
4618        case POWER_SUPPLY_PROP_VOLTAGE_NOW:
4619        case POWER_SUPPLY_PROP_CURRENT_NOW:
4620                return 1;
4621        default:
4622                return 0;
4623        }
4624}
4625
4626static enum power_supply_usb_type tcpm_psy_usb_types[] = {
4627        POWER_SUPPLY_USB_TYPE_C,
4628        POWER_SUPPLY_USB_TYPE_PD,
4629        POWER_SUPPLY_USB_TYPE_PD_PPS,
4630};
4631
4632static const char *tcpm_psy_name_prefix = "tcpm-source-psy-";
4633
4634static int devm_tcpm_psy_register(struct tcpm_port *port)
4635{
4636        struct power_supply_config psy_cfg = {};
4637        const char *port_dev_name = dev_name(port->dev);
4638        size_t psy_name_len = strlen(tcpm_psy_name_prefix) +
4639                                     strlen(port_dev_name) + 1;
4640        char *psy_name;
4641
4642        psy_cfg.drv_data = port;
4643        psy_cfg.fwnode = dev_fwnode(port->dev);
4644        psy_name = devm_kzalloc(port->dev, psy_name_len, GFP_KERNEL);
4645        if (!psy_name)
4646                return -ENOMEM;
4647
4648        snprintf(psy_name, psy_name_len, "%s%s", tcpm_psy_name_prefix,
4649                 port_dev_name);
4650        port->psy_desc.name = psy_name;
4651        port->psy_desc.type = POWER_SUPPLY_TYPE_USB,
4652        port->psy_desc.usb_types = tcpm_psy_usb_types;
4653        port->psy_desc.num_usb_types = ARRAY_SIZE(tcpm_psy_usb_types);
4654        port->psy_desc.properties = tcpm_psy_props,
4655        port->psy_desc.num_properties = ARRAY_SIZE(tcpm_psy_props),
4656        port->psy_desc.get_property = tcpm_psy_get_prop,
4657        port->psy_desc.set_property = tcpm_psy_set_prop,
4658        port->psy_desc.property_is_writeable = tcpm_psy_prop_writeable,
4659
4660        port->usb_type = POWER_SUPPLY_USB_TYPE_C;
4661
4662        port->psy = devm_power_supply_register(port->dev, &port->psy_desc,
4663                                               &psy_cfg);
4664
4665        return PTR_ERR_OR_ZERO(port->psy);
4666}
4667
4668struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc)
4669{
4670        struct tcpm_port *port;
4671        int err;
4672
4673        if (!dev || !tcpc ||
4674            !tcpc->get_vbus || !tcpc->set_cc || !tcpc->get_cc ||
4675            !tcpc->set_polarity || !tcpc->set_vconn || !tcpc->set_vbus ||
4676            !tcpc->set_pd_rx || !tcpc->set_roles || !tcpc->pd_transmit)
4677                return ERR_PTR(-EINVAL);
4678
4679        port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
4680        if (!port)
4681                return ERR_PTR(-ENOMEM);
4682
4683        port->dev = dev;
4684        port->tcpc = tcpc;
4685
4686        mutex_init(&port->lock);
4687        mutex_init(&port->swap_lock);
4688
4689        port->wq = create_singlethread_workqueue(dev_name(dev));
4690        if (!port->wq)
4691                return ERR_PTR(-ENOMEM);
4692        INIT_DELAYED_WORK(&port->state_machine, tcpm_state_machine_work);
4693        INIT_DELAYED_WORK(&port->vdm_state_machine, vdm_state_machine_work);
4694        INIT_WORK(&port->event_work, tcpm_pd_event_handler);
4695
4696        spin_lock_init(&port->pd_event_lock);
4697
4698        init_completion(&port->tx_complete);
4699        init_completion(&port->swap_complete);
4700        init_completion(&port->pps_complete);
4701        tcpm_debugfs_init(port);
4702
4703        err = tcpm_fw_get_caps(port, tcpc->fwnode);
4704        if (err < 0)
4705                goto out_destroy_wq;
4706
4707        port->try_role = port->typec_caps.prefer_role;
4708
4709        port->typec_caps.fwnode = tcpc->fwnode;
4710        port->typec_caps.revision = 0x0120;     /* Type-C spec release 1.2 */
4711        port->typec_caps.pd_revision = 0x0300;  /* USB-PD spec release 3.0 */
4712        port->typec_caps.driver_data = port;
4713        port->typec_caps.ops = &tcpm_ops;
4714
4715        port->partner_desc.identity = &port->partner_ident;
4716        port->port_type = port->typec_caps.type;
4717
4718        port->role_sw = usb_role_switch_get(port->dev);
4719        if (IS_ERR(port->role_sw)) {
4720                err = PTR_ERR(port->role_sw);
4721                goto out_destroy_wq;
4722        }
4723
4724        err = devm_tcpm_psy_register(port);
4725        if (err)
4726                goto out_role_sw_put;
4727
4728        port->typec_port = typec_register_port(port->dev, &port->typec_caps);
4729        if (IS_ERR(port->typec_port)) {
4730                err = PTR_ERR(port->typec_port);
4731                goto out_role_sw_put;
4732        }
4733
4734        mutex_lock(&port->lock);
4735        tcpm_init(port);
4736        mutex_unlock(&port->lock);
4737
4738        tcpm_log(port, "%s: registered", dev_name(dev));
4739        return port;
4740
4741out_role_sw_put:
4742        usb_role_switch_put(port->role_sw);
4743out_destroy_wq:
4744        tcpm_debugfs_exit(port);
4745        destroy_workqueue(port->wq);
4746        return ERR_PTR(err);
4747}
4748EXPORT_SYMBOL_GPL(tcpm_register_port);
4749
4750void tcpm_unregister_port(struct tcpm_port *port)
4751{
4752        int i;
4753
4754        tcpm_reset_port(port);
4755        for (i = 0; i < ARRAY_SIZE(port->port_altmode); i++)
4756                typec_unregister_altmode(port->port_altmode[i]);
4757        typec_unregister_port(port->typec_port);
4758        usb_role_switch_put(port->role_sw);
4759        tcpm_debugfs_exit(port);
4760        destroy_workqueue(port->wq);
4761}
4762EXPORT_SYMBOL_GPL(tcpm_unregister_port);
4763
4764MODULE_AUTHOR("Guenter Roeck <groeck@chromium.org>");
4765MODULE_DESCRIPTION("USB Type-C Port Manager");
4766MODULE_LICENSE("GPL");
4767