*
  * Returns role
  */
-static enum usb_role cdns3_role_get(struct device *dev)
+static enum usb_role cdns3_role_get(struct usb_role_switch *sw)
 {
-       struct cdns3 *cdns = dev_get_drvdata(dev);
+       struct cdns3 *cdns = usb_role_switch_get_drvdata(sw);
 
        return cdns->role;
 }
  * - Role switch for dual-role devices
  * - USB_ROLE_GADGET <--> USB_ROLE_NONE for peripheral-only devices
  */
-static int cdns3_role_set(struct device *dev, enum usb_role role)
+static int cdns3_role_set(struct usb_role_switch *sw, enum usb_role role)
 {
-       struct cdns3 *cdns = dev_get_drvdata(dev);
+       struct cdns3 *cdns = usb_role_switch_get_drvdata(sw);
        int ret = 0;
 
        pm_runtime_get_sync(cdns->dev);
        return ret;
 }
 
-static const struct usb_role_switch_desc cdns3_switch_desc = {
-       .set = cdns3_role_set,
-       .get = cdns3_role_get,
-       .allow_userspace_control = true,
-};
-
 /**
  * cdns3_probe - probe for cdns3 core device
  * @pdev: Pointer to cdns3 core platform device
  */
 static int cdns3_probe(struct platform_device *pdev)
 {
+       struct usb_role_switch_desc sw_desc = { };
        struct device *dev = &pdev->dev;
        struct resource *res;
        struct cdns3 *cdns;
        if (ret)
                goto err3;
 
-       cdns->role_sw = usb_role_switch_register(dev, &cdns3_switch_desc);
+       sw_desc.set = cdns3_role_set;
+       sw_desc.get = cdns3_role_get;
+       sw_desc.allow_userspace_control = true;
+       sw_desc.driver_data = cdns;
+
+       cdns->role_sw = usb_role_switch_register(dev, &sw_desc);
        if (IS_ERR(cdns->role_sw)) {
                ret = PTR_ERR(cdns->role_sw);
                dev_warn(dev, "Unable to register Role Switch\n");
 
        return NOTIFY_DONE;
 }
 
-static enum usb_role ci_usb_role_switch_get(struct device *dev)
+static enum usb_role ci_usb_role_switch_get(struct usb_role_switch *sw)
 {
-       struct ci_hdrc *ci = dev_get_drvdata(dev);
+       struct ci_hdrc *ci = usb_role_switch_get_drvdata(sw);
        enum usb_role role;
        unsigned long flags;
 
        return role;
 }
 
-static int ci_usb_role_switch_set(struct device *dev, enum usb_role role)
+static int ci_usb_role_switch_set(struct usb_role_switch *sw,
+                                 enum usb_role role)
 {
-       struct ci_hdrc *ci = dev_get_drvdata(dev);
+       struct ci_hdrc *ci = usb_role_switch_get_drvdata(sw);
        struct ci_hdrc_cable *cable = NULL;
        enum usb_role current_role = ci_role_to_usb_role(ci);
        enum ci_role ci_role = usb_role_to_ci_role(role);
        }
 
        if (ci_role_switch.fwnode) {
+               ci_role_switch.driver_data = ci;
                ci->role_switch = usb_role_switch_register(dev,
                                        &ci_role_switch);
                if (IS_ERR(ci->role_switch)) {
 
        return 0;
 }
 
-static int dwc3_meson_g12a_role_set(struct device *dev, enum usb_role role)
+static int dwc3_meson_g12a_role_set(struct usb_role_switch *sw,
+                                   enum usb_role role)
 {
-       struct dwc3_meson_g12a *priv = dev_get_drvdata(dev);
+       struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw);
        enum phy_mode mode;
 
        if (role == USB_ROLE_NONE)
        return dwc3_meson_g12a_otg_mode_set(priv, mode);
 }
 
-static enum usb_role dwc3_meson_g12a_role_get(struct device *dev)
+static enum usb_role dwc3_meson_g12a_role_get(struct usb_role_switch *sw)
 {
-       struct dwc3_meson_g12a *priv = dev_get_drvdata(dev);
+       struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw);
 
        return priv->otg_phy_mode == PHY_MODE_USB_HOST ?
                USB_ROLE_HOST : USB_ROLE_DEVICE;
        priv->switch_desc.allow_userspace_control = true;
        priv->switch_desc.set = dwc3_meson_g12a_role_set;
        priv->switch_desc.get = dwc3_meson_g12a_role_get;
+       priv->switch_desc.driver_data = priv;
 
        priv->role_switch = usb_role_switch_register(dev, &priv->switch_desc);
        if (IS_ERR(priv->role_switch))
 
        .set_selfpowered        = renesas_usb3_set_selfpowered,
 };
 
-static enum usb_role renesas_usb3_role_switch_get(struct device *dev)
+static enum usb_role renesas_usb3_role_switch_get(struct usb_role_switch *sw)
 {
-       struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
+       struct renesas_usb3 *usb3 = usb_role_switch_get_drvdata(sw);
        enum usb_role cur_role;
 
-       pm_runtime_get_sync(dev);
+       pm_runtime_get_sync(usb3_to_dev(usb3));
        cur_role = usb3_is_host(usb3) ? USB_ROLE_HOST : USB_ROLE_DEVICE;
-       pm_runtime_put(dev);
+       pm_runtime_put(usb3_to_dev(usb3));
 
        return cur_role;
 }
 {
        struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
        struct device *host = usb3->host_dev;
-       enum usb_role cur_role = renesas_usb3_role_switch_get(dev);
+       enum usb_role cur_role = renesas_usb3_role_switch_get(usb3->role_sw);
 
        switch (role) {
        case USB_ROLE_NONE:
 {
        struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
        struct device *host = usb3->host_dev;
-       enum usb_role cur_role = renesas_usb3_role_switch_get(dev);
+       enum usb_role cur_role = renesas_usb3_role_switch_get(usb3->role_sw);
 
        if (cur_role == USB_ROLE_HOST && role == USB_ROLE_DEVICE) {
                device_release_driver(host);
        }
 }
 
-static int renesas_usb3_role_switch_set(struct device *dev,
+static int renesas_usb3_role_switch_set(struct usb_role_switch *sw,
                                        enum usb_role role)
 {
-       struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
+       struct renesas_usb3 *usb3 = usb_role_switch_get_drvdata(sw);
 
-       pm_runtime_get_sync(dev);
+       pm_runtime_get_sync(usb3_to_dev(usb3));
 
        if (usb3->role_sw_by_connector)
-               handle_ext_role_switch_states(dev, role);
+               handle_ext_role_switch_states(usb3_to_dev(usb3), role);
        else
-               handle_role_switch_states(dev, role);
+               handle_role_switch_states(usb3_to_dev(usb3), role);
 
-       pm_runtime_put(dev);
+       pm_runtime_put(usb3_to_dev(usb3));
 
        return 0;
 }
                renesas_usb3_role_switch_desc.fwnode = dev_fwnode(&pdev->dev);
        }
 
+       renesas_usb3_role_switch_desc.driver_data = usb3;
+
        INIT_WORK(&usb3->role_work, renesas_usb3_role_work);
        usb3->role_sw = usb_role_switch_register(&pdev->dev,
                                        &renesas_usb3_role_switch_desc);
 
 
 }
 
-static int tegra_xudc_usb_role_sw_set(struct device *dev, enum usb_role role)
+static int tegra_xudc_usb_role_sw_set(struct usb_role_switch *sw,
+                                     enum usb_role role)
 {
-       struct tegra_xudc *xudc = dev_get_drvdata(dev);
+       struct tegra_xudc *xudc = usb_role_switch_get_drvdata(sw);
        unsigned long flags;
 
-       dev_dbg(dev, "%s role is %d\n", __func__, role);
+       dev_dbg(xudc->dev, "%s role is %d\n", __func__, role);
 
        spin_lock_irqsave(&xudc->lock, flags);
 
        if (of_property_read_bool(xudc->dev->of_node, "usb-role-switch")) {
                role_sx_desc.set = tegra_xudc_usb_role_sw_set;
                role_sx_desc.fwnode = dev_fwnode(xudc->dev);
+               role_sx_desc.driver_data = xudc;
 
                xudc->usb_role_sw = usb_role_switch_register(xudc->dev,
                                                        &role_sx_desc);
 
        mtu3_writel(ssusb->ippc_base, SSUSB_U2_CTRL(0), value);
 }
 
-static int ssusb_role_sw_set(struct device *dev, enum usb_role role)
+static int ssusb_role_sw_set(struct usb_role_switch *sw, enum usb_role role)
 {
-       struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
+       struct ssusb_mtk *ssusb = usb_role_switch_get_drvdata(sw);
        bool to_host = false;
 
        if (role == USB_ROLE_HOST)
        return 0;
 }
 
-static enum usb_role ssusb_role_sw_get(struct device *dev)
+static enum usb_role ssusb_role_sw_get(struct usb_role_switch *sw)
 {
-       struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
+       struct ssusb_mtk *ssusb = usb_role_switch_get_drvdata(sw);
        enum usb_role role;
 
        role = ssusb->is_host ? USB_ROLE_HOST : USB_ROLE_DEVICE;
        role_sx_desc.set = ssusb_role_sw_set;
        role_sx_desc.get = ssusb_role_sw_get;
        role_sx_desc.fwnode = dev_fwnode(ssusb->dev);
+       role_sx_desc.driver_data = ssusb;
        otg_sx->role_sw = usb_role_switch_register(ssusb->dev, &role_sx_desc);
 
        return PTR_ERR_OR_ZERO(otg_sx->role_sw);
 
        clk_disable_unprepare(glue->main);
 }
 
-static int musb_usb_role_sx_set(struct device *dev, enum usb_role role)
+static int mtk_otg_switch_set(struct mtk_glue *glue, enum usb_role role)
 {
-       struct mtk_glue *glue = dev_get_drvdata(dev);
        struct musb *musb = glue->musb;
        u8 devctl = readb(musb->mregs + MUSB_DEVCTL);
        enum usb_role new_role;
        return 0;
 }
 
-static enum usb_role musb_usb_role_sx_get(struct device *dev)
+static int musb_usb_role_sx_set(struct usb_role_switch *sw, enum usb_role role)
 {
-       struct mtk_glue *glue = dev_get_drvdata(dev);
+       return mtk_otg_switch_set(usb_role_switch_get_drvdata(sw), role);
+}
+
+static enum usb_role musb_usb_role_sx_get(struct usb_role_switch *sw)
+{
+       struct mtk_glue *glue = usb_role_switch_get_drvdata(sw);
 
        return glue->role;
 }
        role_sx_desc.set = musb_usb_role_sx_set;
        role_sx_desc.get = musb_usb_role_sx_get;
        role_sx_desc.fwnode = dev_fwnode(glue->dev);
+       role_sx_desc.driver_data = glue;
        glue->role_sw = usb_role_switch_register(glue->dev, &role_sx_desc);
 
        return PTR_ERR_OR_ZERO(glue->role_sw);
                return -EINVAL;
        }
 
-       glue->role = new_role;
-       musb_usb_role_sx_set(dev, glue->role);
+       mtk_otg_switch_set(glue, new_role);
        return 0;
 }
 
 
 
        mutex_lock(&sw->lock);
 
-       ret = sw->set(sw->dev.parent, role);
+       ret = sw->set(sw, role);
        if (!ret)
                sw->role = role;
 
        mutex_lock(&sw->lock);
 
        if (sw->get)
-               role = sw->get(sw->dev.parent);
+               role = sw->get(sw);
        else
                role = sw->role;
 
 
 #define DRV_NAME                       "intel_xhci_usb_sw"
 
 struct intel_xhci_usb_data {
+       struct device *dev;
        struct usb_role_switch *role_sw;
        void __iomem *base;
        bool enable_sw_switch;
        "intel-xhci-usb-sw",
 };
 
-static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role)
+static int intel_xhci_usb_set_role(struct usb_role_switch *sw,
+                                  enum usb_role role)
 {
-       struct intel_xhci_usb_data *data = dev_get_drvdata(dev);
+       struct intel_xhci_usb_data *data = usb_role_switch_get_drvdata(sw);
        unsigned long timeout;
        acpi_status status;
        u32 glk, val;
         */
        status = acpi_acquire_global_lock(ACPI_WAIT_FOREVER, &glk);
        if (ACPI_FAILURE(status) && status != AE_NOT_CONFIGURED) {
-               dev_err(dev, "Error could not acquire lock\n");
+               dev_err(data->dev, "Error could not acquire lock\n");
                return -EIO;
        }
 
-       pm_runtime_get_sync(dev);
+       pm_runtime_get_sync(data->dev);
 
        /*
         * Set idpin value as requested.
        do {
                val = readl(data->base + DUAL_ROLE_CFG1);
                if (!!(val & HOST_MODE) == (role == USB_ROLE_HOST)) {
-                       pm_runtime_put(dev);
+                       pm_runtime_put(data->dev);
                        return 0;
                }
 
                usleep_range(5000, 10000);
        } while (time_before(jiffies, timeout));
 
-       pm_runtime_put(dev);
+       pm_runtime_put(data->dev);
 
-       dev_warn(dev, "Timeout waiting for role-switch\n");
+       dev_warn(data->dev, "Timeout waiting for role-switch\n");
        return -ETIMEDOUT;
 }
 
-static enum usb_role intel_xhci_usb_get_role(struct device *dev)
+static enum usb_role intel_xhci_usb_get_role(struct usb_role_switch *sw)
 {
-       struct intel_xhci_usb_data *data = dev_get_drvdata(dev);
+       struct intel_xhci_usb_data *data = usb_role_switch_get_drvdata(sw);
        enum usb_role role;
        u32 val;
 
-       pm_runtime_get_sync(dev);
+       pm_runtime_get_sync(data->dev);
        val = readl(data->base + DUAL_ROLE_CFG0);
-       pm_runtime_put(dev);
+       pm_runtime_put(data->dev);
 
        if (!(val & SW_IDPIN))
                role = USB_ROLE_HOST;
        sw_desc.get = intel_xhci_usb_get_role,
        sw_desc.allow_userspace_control = true,
        sw_desc.fwnode = software_node_fwnode(&intel_xhci_usb_node);
+       sw_desc.driver_data = data;
 
+       data->dev = dev;
        data->enable_sw_switch = !device_property_read_bool(dev,
                                                "sw_switch_disable");
 
 
        USB_ROLE_DEVICE,
 };
 
-typedef int (*usb_role_switch_set_t)(struct device *dev, enum usb_role role);
-typedef enum usb_role (*usb_role_switch_get_t)(struct device *dev);
+typedef int (*usb_role_switch_set_t)(struct usb_role_switch *sw,
+                                    enum usb_role role);
+typedef enum usb_role (*usb_role_switch_get_t)(struct usb_role_switch *sw);
 
 /**
  * struct usb_role_switch_desc - USB Role Switch Descriptor