return ret;
 }
 
-static int tcpm_start_drp_toggling(struct tcpc_dev *dev,
-                                  enum typec_cc_status cc)
+static int tcpm_start_toggling(struct tcpc_dev *dev,
+                              enum typec_port_type port_type,
+                              enum typec_cc_status cc)
 {
        struct fusb302_chip *chip = container_of(dev, struct fusb302_chip,
                                                 tcpc_dev);
        int ret = 0;
 
+       if (port_type != TYPEC_PORT_DRP)
+               return -EOPNOTSUPP;
+
        mutex_lock(&chip->lock);
        ret = fusb302_set_src_current(chip, cc_src_current[cc]);
        if (ret < 0) {
        fusb302_tcpc_dev->set_vbus = tcpm_set_vbus;
        fusb302_tcpc_dev->set_pd_rx = tcpm_set_pd_rx;
        fusb302_tcpc_dev->set_roles = tcpm_set_roles;
-       fusb302_tcpc_dev->start_drp_toggling = tcpm_start_drp_toggling;
+       fusb302_tcpc_dev->start_toggling = tcpm_start_toggling;
        fusb302_tcpc_dev->pd_transmit = tcpm_pd_transmit;
 }
 
 
        return 0;
 }
 
-static int tcpci_start_drp_toggling(struct tcpc_dev *tcpc,
-                                   enum typec_cc_status cc)
+static int tcpci_start_toggling(struct tcpc_dev *tcpc,
+                               enum typec_port_type port_type,
+                               enum typec_cc_status cc)
 {
        int ret;
        struct tcpci *tcpci = tcpc_to_tcpci(tcpc);
        unsigned int reg = TCPC_ROLE_CTRL_DRP;
 
+       if (port_type != TYPEC_PORT_DRP)
+               return -EOPNOTSUPP;
+
        /* Handle vendor drp toggling */
        if (tcpci->data->start_drp_toggling) {
                ret = tcpci->data->start_drp_toggling(tcpci, tcpci->data, cc);
        tcpci->tcpc.get_cc = tcpci_get_cc;
        tcpci->tcpc.set_polarity = tcpci_set_polarity;
        tcpci->tcpc.set_vconn = tcpci_set_vconn;
-       tcpci->tcpc.start_drp_toggling = tcpci_start_drp_toggling;
+       tcpci->tcpc.start_toggling = tcpci_start_toggling;
 
        tcpci->tcpc.set_pd_rx = tcpci_set_pd_rx;
        tcpci->tcpc.set_roles = tcpci_set_roles;
 
 
 #define FOREACH_STATE(S)                       \
        S(INVALID_STATE),                       \
-       S(DRP_TOGGLING),                        \
+       S(TOGGLING),                    \
        S(SRC_UNATTACHED),                      \
        S(SRC_ATTACH_WAIT),                     \
        S(SRC_ATTACHED),                        \
        /* Do not log while disconnected and unattached */
        if (tcpm_port_is_disconnected(port) &&
            (port->state == SRC_UNATTACHED || port->state == SNK_UNATTACHED ||
-            port->state == DRP_TOGGLING))
+            port->state == TOGGLING))
                return;
 
        va_start(args, fmt);
        return 0;
 }
 
-static bool tcpm_start_drp_toggling(struct tcpm_port *port,
-                                   enum typec_cc_status cc)
+static bool tcpm_start_toggling(struct tcpm_port *port, enum typec_cc_status cc)
 {
        int ret;
 
-       if (port->tcpc->start_drp_toggling &&
-           port->port_type == TYPEC_PORT_DRP) {
-               tcpm_log_force(port, "Start DRP toggling");
-               ret = port->tcpc->start_drp_toggling(port->tcpc, cc);
-               if (!ret)
-                       return true;
-       }
+       if (!port->tcpc->start_toggling)
+               return false;
 
-       return false;
+       tcpm_log_force(port, "Start toggling");
+       ret = port->tcpc->start_toggling(port->tcpc, port->port_type, cc);
+       return ret == 0;
 }
 
 static void tcpm_set_cc(struct tcpm_port *port, enum typec_cc_status cc)
 
        port->enter_state = port->state;
        switch (port->state) {
-       case DRP_TOGGLING:
+       case TOGGLING:
                break;
        /* SRC states */
        case SRC_UNATTACHED:
                if (!port->non_pd_role_swap)
                        tcpm_swap_complete(port, -ENOTCONN);
                tcpm_src_detach(port);
-               if (tcpm_start_drp_toggling(port, tcpm_rp_cc(port))) {
-                       tcpm_set_state(port, DRP_TOGGLING, 0);
+               if (tcpm_start_toggling(port, tcpm_rp_cc(port))) {
+                       tcpm_set_state(port, TOGGLING, 0);
                        break;
                }
                tcpm_set_cc(port, tcpm_rp_cc(port));
                        tcpm_swap_complete(port, -ENOTCONN);
                tcpm_pps_complete(port, -ENOTCONN);
                tcpm_snk_detach(port);
-               if (tcpm_start_drp_toggling(port, TYPEC_CC_RD)) {
-                       tcpm_set_state(port, DRP_TOGGLING, 0);
+               if (tcpm_start_toggling(port, TYPEC_CC_RD)) {
+                       tcpm_set_state(port, TOGGLING, 0);
                        break;
                }
                tcpm_set_cc(port, TYPEC_CC_RD);
                                                       : "connected");
 
        switch (port->state) {
-       case DRP_TOGGLING:
+       case TOGGLING:
                if (tcpm_port_is_debug(port) || tcpm_port_is_audio(port) ||
                    tcpm_port_is_source(port))
                        tcpm_set_state(port, SRC_ATTACH_WAIT, 0);
 
        return regmap_write(wcove->regmap, USBC_TXCMD, cmd | USBC_TXCMD_START);
 }
 
-static int wcove_start_drp_toggling(struct tcpc_dev *tcpc,
-                                   enum typec_cc_status cc)
+static int wcove_start_toggling(struct tcpc_dev *tcpc,
+                               enum typec_port_type port_type,
+                               enum typec_cc_status cc)
 {
        struct wcove_typec *wcove = tcpc_to_wcove(tcpc);
        unsigned int usbc_ctrl;
 
+       if (port_type != TYPEC_PORT_DRP)
+               return -EOPNOTSUPP;
+
        usbc_ctrl = USBC_CONTROL1_MODE_DRP | USBC_CONTROL1_DRPTOGGLE_RANDOM;
 
        switch (cc) {
        wcove->tcpc.set_polarity = wcove_set_polarity;
        wcove->tcpc.set_vconn = wcove_set_vconn;
        wcove->tcpc.set_current_limit = wcove_set_current_limit;
-       wcove->tcpc.start_drp_toggling = wcove_start_drp_toggling;
+       wcove->tcpc.start_toggling = wcove_start_toggling;
 
        wcove->tcpc.set_pd_rx = wcove_set_pd_rx;
        wcove->tcpc.set_roles = wcove_set_roles;
 
  *             with partner.
  * @set_pd_rx: Called to enable or disable reception of PD messages
  * @set_roles: Called to set power and data roles
- * @start_drp_toggling:
- *             Optional; if supported by hardware, called to start DRP
- *             toggling. DRP toggling is stopped automatically if
- *             a connection is established.
+ * @start_toggling:
+ *             Optional; if supported by hardware, called to start dual-role
+ *             toggling or single-role connection detection. Toggling stops
+ *             automatically if a connection is established.
  * @try_role:  Optional; called to set a preferred role
  * @pd_transmit:Called to transmit PD message
  * @mux:       Pointer to multiplexer data
        int (*set_pd_rx)(struct tcpc_dev *dev, bool on);
        int (*set_roles)(struct tcpc_dev *dev, bool attached,
                         enum typec_role role, enum typec_data_role data);
-       int (*start_drp_toggling)(struct tcpc_dev *dev,
-                                 enum typec_cc_status cc);
+       int (*start_toggling)(struct tcpc_dev *dev,
+                             enum typec_port_type port_type,
+                             enum typec_cc_status cc);
        int (*try_role)(struct tcpc_dev *dev, int role);
        int (*pd_transmit)(struct tcpc_dev *dev, enum tcpm_transmit_type type,
                           const struct pd_message *msg);