History

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.

Heikki Krogerus committed 6 years ago

Commit bce30521 parent 69af04410 files · +77 −59Browse files

Unified · Split

10 files
  1. drivers/usb/cdns3/core.c +11 −11
  2. drivers/usb/chipidea/core.c +6 −4
  3. drivers/usb/dwc3/dwc3-meson-g12a.c +6 −4
  4. drivers/usb/gadget/udc/renesas_usb3.c +14 −12
  5. drivers/usb/gadget/udc/tegra-xudc.c +5 −3
  6. drivers/usb/mtu3/mtu3_dr.c +5 −4
  7. drivers/usb/musb/mediatek.c +10 −6
  8. drivers/usb/roles/class.c +2 −2
  9. drivers/usb/roles/intel-xhci-usb-role-switch.c +15 −11
  10. include/linux/usb/role.h +3 −2
drivers/usb/cdns3/core.c+11−11
@@ -330,9 +330,9 @@ exit: · 329 unmodified lines
330330 *
331331 * Returns role
332332 */
333−static enum usb_role cdns3_role_get(struct device *dev)
333+static enum usb_role cdns3_role_get(struct usb_role_switch *sw)
334334 {
335− struct cdns3 *cdns = dev_get_drvdata(dev);
335+ struct cdns3 *cdns = usb_role_switch_get_drvdata(sw);
336336
337337 return cdns->role;
338338 }
@@ -346,9 +346,9 @@ static enum usb_role cdns3_role_get(struct device *dev) · 7 unmodified lines
346346 * - Role switch for dual-role devices
347347 * - USB_ROLE_GADGET <--> USB_ROLE_NONE for peripheral-only devices
348348 */
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)
350350 {
351− struct cdns3 *cdns = dev_get_drvdata(dev);
351+ struct cdns3 *cdns = usb_role_switch_get_drvdata(sw);
352352 int ret = 0;
353353
354354 pm_runtime_get_sync(cdns->dev);
@@ -423,12 +423,6 @@ pm_put: · 68 unmodified lines
423423 return ret;
424424 }
425425
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−
432426 /**
433427 * cdns3_probe - probe for cdns3 core device
434428 * @pdev: Pointer to cdns3 core platform device
@@ -437,6 +431,7 @@ static const struct usb_role_switch_desc cdns3_switch_desc = { · 2 unmodified lines
437431 */
438432 static int cdns3_probe(struct platform_device *pdev)
439433 {
434+ struct usb_role_switch_desc sw_desc = { };
440435 struct device *dev = &pdev->dev;
441436 struct resource *res;
442437 struct cdns3 *cdns;
@@ -529,7 +524,12 @@ static int cdns3_probe(struct platform_device *pdev) · 86 unmodified lines
529524 if (ret)
530525 goto err3;
531526
532− cdns->role_sw = usb_role_switch_register(dev, &cdns3_switch_desc);
527+ sw_desc.set = cdns3_role_set;
528+ sw_desc.get = cdns3_role_get;
529+ sw_desc.allow_userspace_control = true;
530+ sw_desc.driver_data = cdns;
531+
532+ cdns->role_sw = usb_role_switch_register(dev, &sw_desc);
533533 if (IS_ERR(cdns->role_sw)) {
534534 ret = PTR_ERR(cdns->role_sw);
535535 dev_warn(dev, "Unable to register Role Switch\n");
drivers/usb/chipidea/core.c+6−4
@@ -600,9 +600,9 @@ static int ci_cable_notifier(struct notifier_block *nb, unsigned long event, · 599 unmodified lines
600600 return NOTIFY_DONE;
601601 }
602602
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)
604604 {
605− struct ci_hdrc *ci = dev_get_drvdata(dev);
605+ struct ci_hdrc *ci = usb_role_switch_get_drvdata(sw);
606606 enum usb_role role;
607607 unsigned long flags;
608608
@@ -613,9 +613,10 @@ static enum usb_role ci_usb_role_switch_get(struct device *dev) · 4 unmodified lines
613613 return role;
614614 }
615615
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)
617618 {
618− struct ci_hdrc *ci = dev_get_drvdata(dev);
619+ struct ci_hdrc *ci = usb_role_switch_get_drvdata(sw);
619620 struct ci_hdrc_cable *cable = NULL;
620621 enum usb_role current_role = ci_role_to_usb_role(ci);
621622 enum ci_role ci_role = usb_role_to_ci_role(role);
@@ -1118,6 +1119,7 @@ static int ci_hdrc_probe(struct platform_device *pdev) · 496 unmodified lines
11181119 }
11191120
11201121 if (ci_role_switch.fwnode) {
1122+ ci_role_switch.driver_data = ci;
11211123 ci->role_switch = usb_role_switch_register(dev,
11221124 &ci_role_switch);
11231125 if (IS_ERR(ci->role_switch)) {
drivers/usb/dwc3/dwc3-meson-g12a.c+6−4
@@ -321,9 +321,10 @@ static int dwc3_meson_g12a_otg_mode_set(struct dwc3_meson_g12a *priv, · 320 unmodified lines
321321 return 0;
322322 }
323323
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)
325326 {
326− struct dwc3_meson_g12a *priv = dev_get_drvdata(dev);
327+ struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw);
327328 enum phy_mode mode;
328329
329330 if (role == USB_ROLE_NONE)
@@ -338,9 +339,9 @@ static int dwc3_meson_g12a_role_set(struct device *dev, enum usb_role role) · 8 unmodified lines
338339 return dwc3_meson_g12a_otg_mode_set(priv, mode);
339340 }
340341
341−static enum usb_role dwc3_meson_g12a_role_get(struct device *dev)
342+static enum usb_role dwc3_meson_g12a_role_get(struct usb_role_switch *sw)
342343 {
343− struct dwc3_meson_g12a *priv = dev_get_drvdata(dev);
344+ struct dwc3_meson_g12a *priv = usb_role_switch_get_drvdata(sw);
344345
345346 return priv->otg_phy_mode == PHY_MODE_USB_HOST ?
346347 USB_ROLE_HOST : USB_ROLE_DEVICE;
@@ -499,6 +500,7 @@ static int dwc3_meson_g12a_probe(struct platform_device *pdev) · 152 unmodified lines
499500 priv->switch_desc.allow_userspace_control = true;
500501 priv->switch_desc.set = dwc3_meson_g12a_role_set;
501502 priv->switch_desc.get = dwc3_meson_g12a_role_get;
503+ priv->switch_desc.driver_data = priv;
502504
503505 priv->role_switch = usb_role_switch_register(dev, &priv->switch_desc);
504506 if (IS_ERR(priv->role_switch))
drivers/usb/gadget/udc/renesas_usb3.c+14−12
@@ -2355,14 +2355,14 @@ static const struct usb_gadget_ops renesas_usb3_gadget_ops = { · 2354 unmodified lines
23552355 .set_selfpowered = renesas_usb3_set_selfpowered,
23562356 };
23572357
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)
23592359 {
2360− struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
2360+ struct renesas_usb3 *usb3 = usb_role_switch_get_drvdata(sw);
23612361 enum usb_role cur_role;
23622362
2363− pm_runtime_get_sync(dev);
2363+ pm_runtime_get_sync(usb3_to_dev(usb3));
23642364 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));
23662366
23672367 return cur_role;
23682368 }
@@ -2372,7 +2372,7 @@ static void handle_ext_role_switch_states(struct device *dev, · 3 unmodified lines
23722372 {
23732373 struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
23742374 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);
23762376
23772377 switch (role) {
23782378 case USB_ROLE_NONE:
@@ -2424,7 +2424,7 @@ static void handle_role_switch_states(struct device *dev, · 45 unmodified lines
24242424 {
24252425 struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
24262426 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);
24282428
24292429 if (cur_role == USB_ROLE_HOST && role == USB_ROLE_DEVICE) {
24302430 device_release_driver(host);
@@ -2438,19 +2438,19 @@ static void handle_role_switch_states(struct device *dev, · 7 unmodified lines
24382438 }
24392439 }
24402440
2441−static int renesas_usb3_role_switch_set(struct device *dev,
2441+static int renesas_usb3_role_switch_set(struct usb_role_switch *sw,
24422442 enum usb_role role)
24432443 {
2444− struct renesas_usb3 *usb3 = dev_get_drvdata(dev);
2444+ struct renesas_usb3 *usb3 = usb_role_switch_get_drvdata(sw);
24452445
2446− pm_runtime_get_sync(dev);
2446+ pm_runtime_get_sync(usb3_to_dev(usb3));
24472447
24482448 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);
24502450 else
2451− handle_role_switch_states(dev, role);
2451+ handle_role_switch_states(usb3_to_dev(usb3), role);
24522452
2453− pm_runtime_put(dev);
2453+ pm_runtime_put(usb3_to_dev(usb3));
24542454
24552455 return 0;
24562456 }
@@ -2831,6 +2831,8 @@ static int renesas_usb3_probe(struct platform_device *pdev) · 374 unmodified lines
28312831 renesas_usb3_role_switch_desc.fwnode = dev_fwnode(&pdev->dev);
28322832 }
28332833
2834+ renesas_usb3_role_switch_desc.driver_data = usb3;
2835+
28342836 INIT_WORK(&usb3->role_work, renesas_usb3_role_work);
28352837 usb3->role_sw = usb_role_switch_register(&pdev->dev,
28362838 &renesas_usb3_role_switch_desc);
drivers/usb/gadget/udc/tegra-xudc.c+5−3
@@ -676,12 +676,13 @@ static void tegra_xudc_usb_role_sw_work(struct work_struct *work) · 675 unmodified lines
676676
677677 }
678678
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)
680681 {
681− struct tegra_xudc *xudc = dev_get_drvdata(dev);
682+ struct tegra_xudc *xudc = usb_role_switch_get_drvdata(sw);
682683 unsigned long flags;
683684
684− dev_dbg(dev, "%s role is %d\n", __func__, role);
685+ dev_dbg(xudc->dev, "%s role is %d\n", __func__, role);
685686
686687 spin_lock_irqsave(&xudc->lock, flags);
687688
@@ -3590,6 +3591,7 @@ static int tegra_xudc_probe(struct platform_device *pdev) · 2902 unmodified lines
35903591 if (of_property_read_bool(xudc->dev->of_node, "usb-role-switch")) {
35913592 role_sx_desc.set = tegra_xudc_usb_role_sw_set;
35923593 role_sx_desc.fwnode = dev_fwnode(xudc->dev);
3594+ role_sx_desc.driver_data = xudc;
35933595
35943596 xudc->usb_role_sw = usb_role_switch_register(xudc->dev,
35953597 &role_sx_desc);
drivers/usb/mtu3/mtu3_dr.c+5−4
@@ -320,9 +320,9 @@ void ssusb_set_force_mode(struct ssusb_mtk *ssusb, · 319 unmodified lines
320320 mtu3_writel(ssusb->ippc_base, SSUSB_U2_CTRL(0), value);
321321 }
322322
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)
324324 {
325− struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
325+ struct ssusb_mtk *ssusb = usb_role_switch_get_drvdata(sw);
326326 bool to_host = false;
327327
328328 if (role == USB_ROLE_HOST)
@@ -334,9 +334,9 @@ static int ssusb_role_sw_set(struct device *dev, enum usb_role role) · 5 unmodified lines
334334 return 0;
335335 }
336336
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)
338338 {
339− struct ssusb_mtk *ssusb = dev_get_drvdata(dev);
339+ struct ssusb_mtk *ssusb = usb_role_switch_get_drvdata(sw);
340340 enum usb_role role;
341341
342342 role = ssusb->is_host ? USB_ROLE_HOST : USB_ROLE_DEVICE;
@@ -356,6 +356,7 @@ static int ssusb_role_sw_register(struct otg_switch_mtk *otg_sx) · 13 unmodified lines
356356 role_sx_desc.set = ssusb_role_sw_set;
357357 role_sx_desc.get = ssusb_role_sw_get;
358358 role_sx_desc.fwnode = dev_fwnode(ssusb->dev);
359+ role_sx_desc.driver_data = ssusb;
359360 otg_sx->role_sw = usb_role_switch_register(ssusb->dev, &role_sx_desc);
360361
361362 return PTR_ERR_OR_ZERO(otg_sx->role_sw);
drivers/usb/musb/mediatek.c+10−6
@@ -115,9 +115,8 @@ static void mtk_musb_clks_disable(struct mtk_glue *glue) · 114 unmodified lines
115115 clk_disable_unprepare(glue->main);
116116 }
117117
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)
119119 {
120− struct mtk_glue *glue = dev_get_drvdata(dev);
121120 struct musb *musb = glue->musb;
122121 u8 devctl = readb(musb->mregs + MUSB_DEVCTL);
123122 enum usb_role new_role;
@@ -168,9 +167,14 @@ static int musb_usb_role_sx_set(struct device *dev, enum usb_role role) · 44 unmodified lines
168167 return 0;
169168 }
170169
171−static enum usb_role musb_usb_role_sx_get(struct device *dev)
170+static int musb_usb_role_sx_set(struct usb_role_switch *sw, enum usb_role role)
172171 {
173− struct mtk_glue *glue = dev_get_drvdata(dev);
172+ return mtk_otg_switch_set(usb_role_switch_get_drvdata(sw), role);
173+}
174+
175+static enum usb_role musb_usb_role_sx_get(struct usb_role_switch *sw)
176+{
177+ struct mtk_glue *glue = usb_role_switch_get_drvdata(sw);
174178
175179 return glue->role;
176180 }
@@ -182,6 +186,7 @@ static int mtk_otg_switch_init(struct mtk_glue *glue) · 5 unmodified lines
182186 role_sx_desc.set = musb_usb_role_sx_set;
183187 role_sx_desc.get = musb_usb_role_sx_get;
184188 role_sx_desc.fwnode = dev_fwnode(glue->dev);
189+ role_sx_desc.driver_data = glue;
185190 glue->role_sw = usb_role_switch_register(glue->dev, &role_sx_desc);
186191
187192 return PTR_ERR_OR_ZERO(glue->role_sw);
@@ -288,8 +293,7 @@ static int mtk_musb_set_mode(struct musb *musb, u8 mode) · 100 unmodified lines
288293 return -EINVAL;
289294 }
290295
291− glue->role = new_role;
292− musb_usb_role_sx_set(dev, glue->role);
296+ mtk_otg_switch_set(glue, new_role);
293297 return 0;
294298 }
295299
drivers/usb/roles/class.c+2−2
@@ -48,7 +48,7 @@ int usb_role_switch_set_role(struct usb_role_switch *sw, enum usb_role role) · 47 unmodified lines
4848
4949 mutex_lock(&sw->lock);
5050
51− ret = sw->set(sw->dev.parent, role);
51+ ret = sw->set(sw, role);
5252 if (!ret)
5353 sw->role = role;
5454
@@ -75,7 +75,7 @@ enum usb_role usb_role_switch_get_role(struct usb_role_switch *sw) · 20 unmodified lines
7575 mutex_lock(&sw->lock);
7676
7777 if (sw->get)
78− role = sw->get(sw->dev.parent);
78+ role = sw->get(sw);
7979 else
8080 role = sw->role;
8181
drivers/usb/roles/intel-xhci-usb-role-switch.c+15−11
@@ -42,6 +42,7 @@ · 41 unmodified lines
4242 #define DRV_NAME "intel_xhci_usb_sw"
4343
4444 struct intel_xhci_usb_data {
45+ struct device *dev;
4546 struct usb_role_switch *role_sw;
4647 void __iomem *base;
4748 bool enable_sw_switch;
@@ -51,9 +52,10 @@ static const struct software_node intel_xhci_usb_node = { · 3 unmodified lines
5152 "intel-xhci-usb-sw",
5253 };
5354
54−static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role)
55+static int intel_xhci_usb_set_role(struct usb_role_switch *sw,
56+ enum usb_role role)
5557 {
56− struct intel_xhci_usb_data *data = dev_get_drvdata(dev);
58+ struct intel_xhci_usb_data *data = usb_role_switch_get_drvdata(sw);
5759 unsigned long timeout;
5860 acpi_status status;
5961 u32 glk, val;
@@ -66,11 +68,11 @@ static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role) · 6 unmodified lines
6668 */
6769 status = acpi_acquire_global_lock(ACPI_WAIT_FOREVER, &glk);
6870 if (ACPI_FAILURE(status) && status != AE_NOT_CONFIGURED) {
69− dev_err(dev, "Error could not acquire lock\n");
71+ dev_err(data->dev, "Error could not acquire lock\n");
7072 return -EIO;
7173 }
7274
73− pm_runtime_get_sync(dev);
75+ pm_runtime_get_sync(data->dev);
7476
7577 /*
7678 * Set idpin value as requested.
@@ -112,7 +114,7 @@ static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role) · 35 unmodified lines
112114 do {
113115 val = readl(data->base + DUAL_ROLE_CFG1);
114116 if (!!(val & HOST_MODE) == (role == USB_ROLE_HOST)) {
115− pm_runtime_put(dev);
117+ pm_runtime_put(data->dev);
116118 return 0;
117119 }
118120
@@ -120,21 +122,21 @@ static int intel_xhci_usb_set_role(struct device *dev, enum usb_role role) · 1 unmodified line
120122 usleep_range(5000, 10000);
121123 } while (time_before(jiffies, timeout));
122124
123− pm_runtime_put(dev);
125+ pm_runtime_put(data->dev);
124126
125− dev_warn(dev, "Timeout waiting for role-switch\n");
127+ dev_warn(data->dev, "Timeout waiting for role-switch\n");
126128 return -ETIMEDOUT;
127129 }
128130
129−static enum usb_role intel_xhci_usb_get_role(struct device *dev)
131+static enum usb_role intel_xhci_usb_get_role(struct usb_role_switch *sw)
130132 {
131− struct intel_xhci_usb_data *data = dev_get_drvdata(dev);
133+ struct intel_xhci_usb_data *data = usb_role_switch_get_drvdata(sw);
132134 enum usb_role role;
133135 u32 val;
134136
135− pm_runtime_get_sync(dev);
137+ pm_runtime_get_sync(data->dev);
136138 val = readl(data->base + DUAL_ROLE_CFG0);
137− pm_runtime_put(dev);
139+ pm_runtime_put(data->dev);
138140
139141 if (!(val & SW_IDPIN))
140142 role = USB_ROLE_HOST;
@@ -175,7 +177,9 @@ static int intel_xhci_usb_probe(struct platform_device *pdev) · 34 unmodified lines
175177 sw_desc.get = intel_xhci_usb_get_role,
176178 sw_desc.allow_userspace_control = true,
177179 sw_desc.fwnode = software_node_fwnode(&intel_xhci_usb_node);
180+ sw_desc.driver_data = data;
178181
182+ data->dev = dev;
179183 data->enable_sw_switch = !device_property_read_bool(dev,
180184 "sw_switch_disable");
181185
include/linux/usb/role.h+3−2
@@ -13,8 +13,9 @@ enum usb_role { · 12 unmodified lines
1313 USB_ROLE_DEVICE,
1414 };
1515
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);
1819
1920 /**
2021 * struct usb_role_switch_desc - USB Role Switch Descriptor