1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- From 7c0b661926097e935f2711857596fc2277b2304a Mon Sep 17 00:00:00 2001
- From: Linus Walleij <[email protected]>
- Date: Sun, 23 Oct 2022 16:47:08 +0200
- Subject: [PATCH 04/29] usb: fotg210: Select subdriver by mode
- Check which mode the hardware is in, and selecte the peripheral
- driver if the hardware is in explicit peripheral mode, otherwise
- select host mode.
- This should solve the immediate problem that both subdrivers
- can get probed.
- Cc: Fabian Vogt <[email protected]>
- Cc: Yuan-Hsin Chen <[email protected]>
- Cc: Felipe Balbi <[email protected]>
- Signed-off-by: Linus Walleij <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- Signed-off-by: Greg Kroah-Hartman <[email protected]>
- ---
- --- a/drivers/usb/fotg210/fotg210-core.c
- +++ b/drivers/usb/fotg210/fotg210-core.c
- @@ -10,30 +10,37 @@
- #include <linux/of.h>
- #include <linux/platform_device.h>
- #include <linux/usb.h>
- +#include <linux/usb/otg.h>
-
- #include "fotg210.h"
-
- static int fotg210_probe(struct platform_device *pdev)
- {
- + struct device *dev = &pdev->dev;
- + enum usb_dr_mode mode;
- int ret;
-
- - if (IS_ENABLED(CONFIG_USB_FOTG210_HCD)) {
- - ret = fotg210_hcd_probe(pdev);
- - if (ret)
- - return ret;
- - }
- - if (IS_ENABLED(CONFIG_USB_FOTG210_UDC))
- + mode = usb_get_dr_mode(dev);
- +
- + if (mode == USB_DR_MODE_PERIPHERAL)
- ret = fotg210_udc_probe(pdev);
- + else
- + ret = fotg210_hcd_probe(pdev);
-
- return ret;
- }
-
- static int fotg210_remove(struct platform_device *pdev)
- {
- - if (IS_ENABLED(CONFIG_USB_FOTG210_HCD))
- - fotg210_hcd_remove(pdev);
- - if (IS_ENABLED(CONFIG_USB_FOTG210_UDC))
- + struct device *dev = &pdev->dev;
- + enum usb_dr_mode mode;
- +
- + mode = usb_get_dr_mode(dev);
- +
- + if (mode == USB_DR_MODE_PERIPHERAL)
- fotg210_udc_remove(pdev);
- + else
- + fotg210_hcd_remove(pdev);
-
- return 0;
- }
|