Remove the unused (not implemented anywhere) tcpc_mux_dev abstraction
and replace it with calling the new typec_set_orientation,
usb_role_switch_set and typec_set_mode functions.

Reviewed-by: Heikki Krogerus <heikki.kroge...@linux.intel.com>
Reviewed-by: Guenter Roeck <li...@roeck-us.net>
Reviewed-by: Andy Shevchenko <andy.shevche...@gmail.com>
Signed-off-by: Hans de Goede <hdego...@redhat.com>
---
Changes in v4:
-Add Andy's Reviewed-by

Changes in v3:
-Add Guenter's Reviewed-by

Changes in v2:
-Added Heikki's Reviewed-by
---
 drivers/usb/typec/Kconfig           |  1 +
 drivers/usb/typec/fusb302/fusb302.c |  1 -
 drivers/usb/typec/tcpm.c            | 46 ++++++++++++++++++++++++++++---------
 include/linux/usb/tcpm.h            | 10 --------
 4 files changed, 36 insertions(+), 22 deletions(-)

diff --git a/drivers/usb/typec/Kconfig b/drivers/usb/typec/Kconfig
index bcb2744c5977..a2a0684e7c82 100644
--- a/drivers/usb/typec/Kconfig
+++ b/drivers/usb/typec/Kconfig
@@ -48,6 +48,7 @@ if TYPEC
 config TYPEC_TCPM
        tristate "USB Type-C Port Controller Manager"
        depends on USB
+       select USB_ROLE_SWITCH
        help
          The Type-C Port Controller Manager provides a USB PD and USB Type-C
          state machine for use with Type-C Port Controllers.
diff --git a/drivers/usb/typec/fusb302/fusb302.c 
b/drivers/usb/typec/fusb302/fusb302.c
index dcd8ef085b30..a7b06053a538 100644
--- a/drivers/usb/typec/fusb302/fusb302.c
+++ b/drivers/usb/typec/fusb302/fusb302.c
@@ -1249,7 +1249,6 @@ static void init_tcpc_dev(struct tcpc_dev 
*fusb302_tcpc_dev)
        fusb302_tcpc_dev->set_roles = tcpm_set_roles;
        fusb302_tcpc_dev->start_drp_toggling = tcpm_start_drp_toggling;
        fusb302_tcpc_dev->pd_transmit = tcpm_pd_transmit;
-       fusb302_tcpc_dev->mux = NULL;
 }
 
 static const char * const cc_polarity_name[] = {
diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c
index 00ca2822432f..bfcaf6618a1f 100644
--- a/drivers/usb/typec/tcpm.c
+++ b/drivers/usb/typec/tcpm.c
@@ -20,6 +20,7 @@
 #include <linux/usb/pd.h>
 #include <linux/usb/pd_bdo.h>
 #include <linux/usb/pd_vdo.h>
+#include <linux/usb/role.h>
 #include <linux/usb/tcpm.h>
 #include <linux/usb/typec.h>
 #include <linux/workqueue.h>
@@ -176,6 +177,7 @@ struct tcpm_port {
        struct typec_port *typec_port;
 
        struct tcpc_dev *tcpc;
+       struct usb_role_switch *role_sw;
 
        enum typec_role vconn_role;
        enum typec_role pwr_role;
@@ -618,18 +620,25 @@ void tcpm_pd_transmit_complete(struct tcpm_port *port,
 EXPORT_SYMBOL_GPL(tcpm_pd_transmit_complete);
 
 static int tcpm_mux_set(struct tcpm_port *port, enum tcpc_mux_mode mode,
-                       enum usb_role usb_role)
+                       enum usb_role usb_role,
+                       enum typec_orientation orientation)
 {
-       int ret = 0;
+       int ret;
 
-       tcpm_log(port, "Requesting mux mode %d, usb-role %d, polarity %d",
-                mode, usb_role, port->polarity);
+       tcpm_log(port, "Requesting mux mode %d, usb-role %d, orientation %d",
+                mode, usb_role, orientation);
 
-       if (port->tcpc->mux)
-               ret = port->tcpc->mux->set(port->tcpc->mux, mode, usb_role,
-                                          port->polarity);
+       ret = typec_set_orientation(port->typec_port, orientation);
+       if (ret)
+               return ret;
 
-       return ret;
+       if (port->role_sw) {
+               ret = usb_role_switch_set_role(port->role_sw, usb_role);
+               if (ret)
+                       return ret;
+       }
+
+       return typec_set_mode(port->typec_port, mode);
 }
 
 static int tcpm_set_polarity(struct tcpm_port *port,
@@ -742,15 +751,21 @@ static int tcpm_set_attached_state(struct tcpm_port 
*port, bool attached)
 static int tcpm_set_roles(struct tcpm_port *port, bool attached,
                          enum typec_role role, enum typec_data_role data)
 {
+       enum typec_orientation orientation;
        enum usb_role usb_role;
        int ret;
 
+       if (port->polarity == TYPEC_POLARITY_CC1)
+               orientation = TYPEC_ORIENTATION_NORMAL;
+       else
+               orientation = TYPEC_ORIENTATION_REVERSE;
+
        if (data == TYPEC_HOST)
                usb_role = USB_ROLE_HOST;
        else
                usb_role = USB_ROLE_DEVICE;
 
-       ret = tcpm_mux_set(port, TYPEC_MUX_USB, usb_role);
+       ret = tcpm_mux_set(port, TYPEC_MUX_USB, usb_role, orientation);
        if (ret < 0)
                return ret;
 
@@ -2097,7 +2112,8 @@ static int tcpm_src_attach(struct tcpm_port *port)
 out_disable_pd:
        port->tcpc->set_pd_rx(port->tcpc, false);
 out_disable_mux:
-       tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE);
+       tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE,
+                    TYPEC_ORIENTATION_NONE);
        return ret;
 }
 
@@ -2141,7 +2157,8 @@ static void tcpm_reset_port(struct tcpm_port *port)
        tcpm_init_vconn(port);
        tcpm_set_current_limit(port, 0, 0);
        tcpm_set_polarity(port, TYPEC_POLARITY_CC1);
-       tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE);
+       tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE,
+                    TYPEC_ORIENTATION_NONE);
        tcpm_set_attached_state(port, false);
        port->try_src_count = 0;
        port->try_snk_count = 0;
@@ -3742,6 +3759,12 @@ struct tcpm_port *tcpm_register_port(struct device *dev, 
struct tcpc_dev *tcpc)
        port->partner_desc.identity = &port->partner_ident;
        port->port_type = tcpc->config->type;
 
+       port->role_sw = usb_role_switch_get(port->dev);
+       if (IS_ERR(port->role_sw)) {
+               err = PTR_ERR(port->role_sw);
+               goto out_destroy_wq;
+       }
+
        port->typec_port = typec_register_port(port->dev, &port->typec_caps);
        if (IS_ERR(port->typec_port)) {
                err = PTR_ERR(port->typec_port);
@@ -3777,6 +3800,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, 
struct tcpc_dev *tcpc)
        return port;
 
 out_destroy_wq:
+       usb_role_switch_put(port->role_sw);
        destroy_workqueue(port->wq);
        return ERR_PTR(err);
 }
diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h
index 268721bff2c1..fe3508e6e1df 100644
--- a/include/linux/usb/tcpm.h
+++ b/include/linux/usb/tcpm.h
@@ -16,7 +16,6 @@
 #define __LINUX_USB_TCPM_H
 
 #include <linux/bitops.h>
-#include <linux/usb/role.h>
 #include <linux/usb/typec.h>
 #include "pd.h"
 
@@ -112,14 +111,6 @@ enum tcpc_mux_mode {
                          TCPC_MUX_DP_ENABLED,
 };
 
-struct tcpc_mux_dev {
-       int (*set)(struct tcpc_mux_dev *dev, enum tcpc_mux_mode mux_mode,
-                  enum usb_role usb_role,
-                  enum typec_cc_polarity polarity);
-       bool dfp_only;
-       void *priv_data;
-};
-
 /**
  * struct tcpc_dev - Port configuration and callback functions
  * @config:    Pointer to port configuration
@@ -171,7 +162,6 @@ struct tcpc_dev {
        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);
-       struct tcpc_mux_dev *mux;
 };
 
 struct tcpm_port;
-- 
2.14.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to