Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: roles: Provide the switch drivers handle to the switch in the API

The USB role callback functions had a parameter pointing to
the parent device (struct device) of the switch. The
assumption was that the switch parent is always the
controller. Firstly, that may not be true in every case, and
secondly, it prevents us from supporting devices that supply
multiple muxes.

Changing the first parameter of usb_role_switch_set_t and
usb_role_switch_get_t from struct device to struct
usb_role_switch.

Cc: Peter Chen <Peter.Chen@nxp.com>
Cc: Felipe Balbi <balbi@kernel.org>
Cc: Chunfeng Yun <chunfeng.yun@mediatek.com>
Cc: Bin Liu <b-liu@ti.com>
Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20200302135353.56659-6-heikki.krogerus@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Heikki Krogerus and committed by
Greg Kroah-Hartman
bce3052f 69af044a

+77 -59
+11 -11
drivers/usb/cdns3/core.c
··· 330 330 * 331 331 * Returns role 332 332 */ 333 - static enum usb_role cdns3_role_get(struct device *dev) 333 + static enum usb_role cdns3_role_get(struct usb_role_switch *sw) 334 334 { 335 - struct cdns3 *cdns = dev_get_drvdata(dev); 335 + struct cdns3 *cdns = usb_role_switch_get_drvdata(sw); 336 336 337 337 return cdns->role; 338 338 } ··· 346 346 * - Role switch for dual-role devices 347 347 * - USB_ROLE_GADGET <--> USB_ROLE_NONE for peripheral-only devices 348 348 */ 349 - static int cdns3_role_set(struct device *dev, enum usb_role role) 349 + static int cdns3_role_set(struct usb_role_switch *sw, enum usb_role role) 350 350 { 351 - struct cdns3 *cdns = dev_get_drvdata(dev); 351 + struct cdns3 *cdns = usb_role_switch_get_drvdata(sw); 352 352 int ret = 0; 353 353 354 354 pm_runtime_get_sync(cdns->dev); ··· 423 423 return ret; 424 424 } 425 425 426 - static const struct usb_role_switch_desc cdns3_switch_desc = { 427 - .set = cdns3_role_set, 428 - .get = cdns3_role_get, 429 - .allow_userspace_control = true, 430 - }; 431 - 432 426 /** 433 427 * cdns3_probe - probe for cdns3 core device 434 428 * @pdev: Pointer to cdns3 core platform device ··· 431 437 */ 432 438 static int cdns3_probe(struct platform_device *pdev) 433 439 { 440 + struct usb_role_switch_desc sw_desc = { }; 434 441 struct device *dev = &pdev->dev; 435 442 struct resource *res; 436 443 struct cdns3 *cdns; ··· 524 529 if (ret) 525 530 goto err3; 526 531 527 - cdns->role_sw = usb_role_switch_register(dev, &cdns3_switch_desc); 532 + sw_desc.set = cdns3_role_set; 533 + sw_desc.get = cdns3_role_get; 534 + sw_desc.allow_userspace_control = true; 535 + sw_desc.driver_data = cdns; 536 + 537 + cdns->role_sw = usb_role_switch_register(dev, &sw_desc); 528 538 if (IS_ERR(cdns->role_sw)) { 529 539 ret = PTR_ERR(cdns->role_sw); 530 540 dev_warn(dev, "Unable to register Role Switch\n");
+6 -4
drivers/usb/chipidea/core.c
··· 600 600 return NOTIFY_DONE; 601 601 } 602 602 603 - static enum usb_role ci_usb_role_switch_get(struct device *dev) 603 + static enum usb_role ci_usb_role_switch_get(struct usb_role_switch *sw) 604 604 { 605 - struct ci_hdrc *ci = dev_get_drvdata(dev); 605 + struct ci_hdrc *ci = usb_role_switch_get_drvdata(sw); 606 606 enum usb_role role; 607 607 unsigned long flags; 608 608 ··· 613 613 return role; 614 614 } 615 615 616 - static int ci_usb_role_switch_set(struct device *dev, enum usb_role role) 616 + static int ci_usb_role_switch_set(struct usb_role_switch *sw, 617 + enum usb_role role) 617 618 { 618 - struct ci_hdrc *ci = dev_get_drvdata(dev); 619 + struct ci_hdrc *ci = usb_role_switch_get_drvdata(sw); 619 620 struct ci_hdrc_cable *cable = NULL; 620 621 enum usb_role current_role = ci_role_to_usb_role(ci); 621 622 enum ci_role ci_role = usb_role_to_ci_role(role); ··· 1119 1118 } 1120 1119 1121 1120 if (ci_role_switch.fwnode) { 1121 + ci_role_switch.driver_data = ci; 1122 1122 ci->role_switch = usb_role_switch_register(dev, 1123 1123 &ci_role_switch); 1124 1124 if (IS_ERR(ci->role_switch)) {
+6 -4
drivers/usb/dwc3/dwc3-meson-g12a.c
··· 321 321 return 0; 322 322 } 323 323 324 - static int dwc3_meson_g12a_role_set(struct device *dev, enum usb_role role) 324 + static int dwc3_meson_g12a_role_set(struct usb_role_switch *sw, 325 + enum usb_role role) 325 326 { 326 - struct dwc3_meson_g12a *priv = dev_get_drvdata(dev); 327 + struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw); 327 328 enum phy_mode mode; 328 329 329 330 if (role == USB_ROLE_NONE) ··· 339 338 return dwc3_meson_g12a_otg_mode_set(priv, mode); 340 339 } 341 340 342 - static enum usb_role dwc3_meson_g12a_role_get(struct device *dev) 341 + static enum usb_role dwc3_meson_g12a_role_get(struct usb_role_switch *sw) 343 342 { 344 - struct dwc3_meson_g12a *priv = dev_get_drvdata(dev); 343 + struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw); 345 344 346 345 return priv->otg_phy_mode == PHY_MODE_USB_HOST ? 347 346 USB_ROLE_HOST : USB_ROLE_DEVICE; ··· 500 499 priv->switch_desc.allow_userspace_control = true; 501 500 priv->switch_desc.set = dwc3_meson_g12a_role_set; 502 501 priv->switch_desc.get = dwc3_meson_g12a_role_get; 502 + priv->switch_desc.driver_data = priv; 503 503 504 504 priv->role_switch = usb_role_switch_register(dev, &priv->switch_desc); 505 505 if (IS_ERR(priv->role_switch))
+14 -12
drivers/usb/gadget/udc/renesas_usb3.c
··· 2355 2355 .set_selfpowered = renesas_usb3_set_selfpowered, 2356 2356 }; 2357 2357 2358 - static enum usb_role renesas_usb3_role_switch_get(struct device *dev) 2358 + static enum usb_role renesas_usb3_role_switch_get(struct usb_role_switch *sw) 2359 2359 { 2360 - struct renesas_usb3 *usb3 = dev_get_drvdata(dev); 2360 + struct renesas_usb3 *usb3 = usb_role_switch_get_drvdata(sw); 2361 2361 enum usb_role cur_role; 2362 2362 2363 - pm_runtime_get_sync(dev); 2363 + pm_runtime_get_sync(usb3_to_dev(usb3)); 2364 2364 cur_role = usb3_is_host(usb3) ? USB_ROLE_HOST : USB_ROLE_DEVICE; 2365 - pm_runtime_put(dev); 2365 + pm_runtime_put(usb3_to_dev(usb3)); 2366 2366 2367 2367 return cur_role; 2368 2368 } ··· 2372 2372 { 2373 2373 struct renesas_usb3 *usb3 = dev_get_drvdata(dev); 2374 2374 struct device *host = usb3->host_dev; 2375 - enum usb_role cur_role = renesas_usb3_role_switch_get(dev); 2375 + enum usb_role cur_role = renesas_usb3_role_switch_get(usb3->role_sw); 2376 2376 2377 2377 switch (role) { 2378 2378 case USB_ROLE_NONE: ··· 2424 2424 { 2425 2425 struct renesas_usb3 *usb3 = dev_get_drvdata(dev); 2426 2426 struct device *host = usb3->host_dev; 2427 - enum usb_role cur_role = renesas_usb3_role_switch_get(dev); 2427 + enum usb_role cur_role = renesas_usb3_role_switch_get(usb3->role_sw); 2428 2428 2429 2429 if (cur_role == USB_ROLE_HOST && role == USB_ROLE_DEVICE) { 2430 2430 device_release_driver(host); ··· 2438 2438 } 2439 2439 } 2440 2440 2441 - static int renesas_usb3_role_switch_set(struct device *dev, 2441 + static int renesas_usb3_role_switch_set(struct usb_role_switch *sw, 2442 2442 enum usb_role role) 2443 2443 { 2444 - struct renesas_usb3 *usb3 = dev_get_drvdata(dev); 2444 + struct renesas_usb3 *usb3 = usb_role_switch_get_drvdata(sw); 2445 2445 2446 - pm_runtime_get_sync(dev); 2446 + pm_runtime_get_sync(usb3_to_dev(usb3)); 2447 2447 2448 2448 if (usb3->role_sw_by_connector) 2449 - handle_ext_role_switch_states(dev, role); 2449 + handle_ext_role_switch_states(usb3_to_dev(usb3), role); 2450 2450 else 2451 - handle_role_switch_states(dev, role); 2451 + handle_role_switch_states(usb3_to_dev(usb3), role); 2452 2452 2453 - pm_runtime_put(dev); 2453 + pm_runtime_put(usb3_to_dev(usb3)); 2454 2454 2455 2455 return 0; 2456 2456 } ··· 2830 2830 usb3->role_sw_by_connector = true; 2831 2831 renesas_usb3_role_switch_desc.fwnode = dev_fwnode(&pdev->dev); 2832 2832 } 2833 + 2834 + renesas_usb3_role_switch_desc.driver_data = usb3; 2833 2835 2834 2836 INIT_WORK(&usb3->role_work, renesas_usb3_role_work); 2835 2837 usb3->role_sw = usb_role_switch_register(&pdev->dev,
+5 -3
drivers/usb/gadget/udc/tegra-xudc.c
··· 676 676 677 677 } 678 678 679 - static int tegra_xudc_usb_role_sw_set(struct device *dev, enum usb_role role) 679 + static int tegra_xudc_usb_role_sw_set(struct usb_role_switch *sw, 680 + enum usb_role role) 680 681 { 681 - struct tegra_xudc *xudc = dev_get_drvdata(dev); 682 + struct tegra_xudc *xudc = usb_role_switch_get_drvdata(sw); 682 683 unsigned long flags; 683 684 684 - dev_dbg(dev, "%s role is %d\n", __func__, role); 685 + dev_dbg(xudc->dev, "%s role is %d\n", __func__, role); 685 686 686 687 spin_lock_irqsave(&xudc->lock, flags); 687 688 ··· 3591 3590 if (of_property_read_bool(xudc->dev->of_node, "usb-role-switch")) { 3592 3591 role_sx_desc.set = tegra_xudc_usb_role_sw_set; 3593 3592 role_sx_desc.fwnode = dev_fwnode(xudc->dev); 3593 + role_sx_desc.driver_data = xudc; 3594 3594 3595 3595 xudc->usb_role_sw = usb_role_switch_register(xudc->dev, 3596 3596 &role_sx_desc);
+5 -4
drivers/usb/mtu3/mtu3_dr.c
··· 320 320 mtu3_writel(ssusb->ippc_base, SSUSB_U2_CTRL(0), value); 321 321 } 322 322 323 - static int ssusb_role_sw_set(struct device *dev, enum usb_role role) 323 + static int ssusb_role_sw_set(struct usb_role_switch *sw, enum usb_role role) 324 324 { 325 - struct ssusb_mtk *ssusb = dev_get_drvdata(dev); 325 + struct ssusb_mtk *ssusb = usb_role_switch_get_drvdata(sw); 326 326 bool to_host = false; 327 327 328 328 if (role == USB_ROLE_HOST) ··· 334 334 return 0; 335 335 } 336 336 337 - static enum usb_role ssusb_role_sw_get(struct device *dev) 337 + static enum usb_role ssusb_role_sw_get(struct usb_role_switch *sw) 338 338 { 339 - struct ssusb_mtk *ssusb = dev_get_drvdata(dev); 339 + struct ssusb_mtk *ssusb = usb_role_switch_get_drvdata(sw); 340 340 enum usb_role role; 341 341 342 342 role = ssusb->is_host ? USB_ROLE_HOST : USB_ROLE_DEVICE; ··· 356 356 role_sx_desc.set = ssusb_role_sw_set; 357 357 role_sx_desc.get = ssusb_role_sw_get; 358 358 role_sx_desc.fwnode = dev_fwnode(ssusb->dev); 359 + role_sx_desc.driver_data = ssusb; 359 360 otg_sx->role_sw = usb_role_switch_register(ssusb->dev, &role_sx_desc); 360 361 361 362 return PTR_ERR_OR_ZERO(otg_sx->role_sw);
+10 -6
drivers/usb/musb/mediatek.c
··· 115 115 clk_disable_unprepare(glue->main); 116 116 } 117 117 118 - static int musb_usb_role_sx_set(struct device *dev, enum usb_role role) 118 + static int mtk_otg_switch_set(struct mtk_glue *glue, enum usb_role role) 119 119 { 120 - struct mtk_glue *glue = dev_get_drvdata(dev); 121 120 struct musb *musb = glue->musb; 122 121 u8 devctl = readb(musb->mregs + MUSB_DEVCTL); 123 122 enum usb_role new_role; ··· 167 168 return 0; 168 169 } 169 170 170 - static enum usb_role musb_usb_role_sx_get(struct device *dev) 171 + static int musb_usb_role_sx_set(struct usb_role_switch *sw, enum usb_role role) 171 172 { 172 - struct mtk_glue *glue = dev_get_drvdata(dev); 173 + return mtk_otg_switch_set(usb_role_switch_get_drvdata(sw), role); 174 + } 175 + 176 + static enum usb_role musb_usb_role_sx_get(struct usb_role_switch *sw) 177 + { 178 + struct mtk_glue *glue = usb_role_switch_get_drvdata(sw); 173 179 174 180 return glue->role; 175 181 } ··· 186 182 role_sx_desc.set = musb_usb_role_sx_set; 187 183 role_sx_desc.get = musb_usb_role_sx_get; 188 184 role_sx_desc.fwnode = dev_fwnode(glue->dev); 185 + role_sx_desc.driver_data = glue; 189 186 glue->role_sw = usb_role_switch_register(glue->dev, &role_sx_desc); 190 187 191 188 return PTR_ERR_OR_ZERO(glue->role_sw); ··· 293 288 return -EINVAL; 294 289 } 295 290 296 - glue->role = new_role; 297 - musb_usb_role_sx_set(dev, glue->role); 291 + mtk_otg_switch_set(glue, new_role); 298 292 return 0; 299 293 } 300 294
+2 -2
drivers/usb/roles/class.c
··· 48 48 49 49 mutex_lock(&sw->lock); 50 50 51 - ret = sw->set(sw->dev.parent, role); 51 + ret = sw->set(sw, role); 52 52 if (!ret) 53 53 sw->role = role; 54 54 ··· 75 75 mutex_lock(&sw->lock); 76 76 77 77 if (sw->get) 78 - role = sw->get(sw->dev.parent); 78 + role = sw->get(sw); 79 79 else 80 80 role = sw->role; 81 81
+15 -11
drivers/usb/roles/intel-xhci-usb-role-switch.c
··· 42 42 #define DRV_NAME "intel_xhci_usb_sw" 43 43 44 44 struct intel_xhci_usb_data { 45 + struct device *dev; 45 46 struct usb_role_switch *role_sw; 46 47 void __iomem *base; 47 48 bool enable_sw_switch; ··· 52 51 "intel-xhci-usb-sw", 53 52 }; 54 53 55 - static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role) 54 + static int intel_xhci_usb_set_role(struct usb_role_switch *sw, 55 + enum usb_role role) 56 56 { 57 - struct intel_xhci_usb_data *data = dev_get_drvdata(dev); 57 + struct intel_xhci_usb_data *data = usb_role_switch_get_drvdata(sw); 58 58 unsigned long timeout; 59 59 acpi_status status; 60 60 u32 glk, val; ··· 68 66 */ 69 67 status = acpi_acquire_global_lock(ACPI_WAIT_FOREVER, &glk); 70 68 if (ACPI_FAILURE(status) && status != AE_NOT_CONFIGURED) { 71 - dev_err(dev, "Error could not acquire lock\n"); 69 + dev_err(data->dev, "Error could not acquire lock\n"); 72 70 return -EIO; 73 71 } 74 72 75 - pm_runtime_get_sync(dev); 73 + pm_runtime_get_sync(data->dev); 76 74 77 75 /* 78 76 * Set idpin value as requested. ··· 114 112 do { 115 113 val = readl(data->base + DUAL_ROLE_CFG1); 116 114 if (!!(val & HOST_MODE) == (role == USB_ROLE_HOST)) { 117 - pm_runtime_put(dev); 115 + pm_runtime_put(data->dev); 118 116 return 0; 119 117 } 120 118 ··· 122 120 usleep_range(5000, 10000); 123 121 } while (time_before(jiffies, timeout)); 124 122 125 - pm_runtime_put(dev); 123 + pm_runtime_put(data->dev); 126 124 127 - dev_warn(dev, "Timeout waiting for role-switch\n"); 125 + dev_warn(data->dev, "Timeout waiting for role-switch\n"); 128 126 return -ETIMEDOUT; 129 127 } 130 128 131 - static enum usb_role intel_xhci_usb_get_role(struct device *dev) 129 + static enum usb_role intel_xhci_usb_get_role(struct usb_role_switch *sw) 132 130 { 133 - struct intel_xhci_usb_data *data = dev_get_drvdata(dev); 131 + struct intel_xhci_usb_data *data = usb_role_switch_get_drvdata(sw); 134 132 enum usb_role role; 135 133 u32 val; 136 134 137 - pm_runtime_get_sync(dev); 135 + pm_runtime_get_sync(data->dev); 138 136 val = readl(data->base + DUAL_ROLE_CFG0); 139 - pm_runtime_put(dev); 137 + pm_runtime_put(data->dev); 140 138 141 139 if (!(val & SW_IDPIN)) 142 140 role = USB_ROLE_HOST; ··· 177 175 sw_desc.get = intel_xhci_usb_get_role, 178 176 sw_desc.allow_userspace_control = true, 179 177 sw_desc.fwnode = software_node_fwnode(&intel_xhci_usb_node); 178 + sw_desc.driver_data = data; 180 179 180 + data->dev = dev; 181 181 data->enable_sw_switch = !device_property_read_bool(dev, 182 182 "sw_switch_disable"); 183 183
+3 -2
include/linux/usb/role.h
··· 13 13 USB_ROLE_DEVICE, 14 14 }; 15 15 16 - typedef int (*usb_role_switch_set_t)(struct device *dev, enum usb_role role); 17 - typedef enum usb_role (*usb_role_switch_get_t)(struct device *dev); 16 + typedef int (*usb_role_switch_set_t)(struct usb_role_switch *sw, 17 + enum usb_role role); 18 + typedef enum usb_role (*usb_role_switch_get_t)(struct usb_role_switch *sw); 18 19 19 20 /** 20 21 * struct usb_role_switch_desc - USB Role Switch Descriptor