summaryrefslogtreecommitdiff
path: root/drivers/usb/fotg210
diff options
context:
space:
mode:
authorLinus Walleij <linus.walleij@linaro.org>2022-10-23 17:47:08 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-11-09 14:38:09 +0300
commit1fac1c4da8a225ffbfae294ae36e18a3a65cb87e (patch)
tree78d6f338afecd199448eae64a08d40de340049f2 /drivers/usb/fotg210
parentaeffd2c3b09f4f50438ec8960095129798bcb33a (diff)
downloadlinux-1fac1c4da8a225ffbfae294ae36e18a3a65cb87e.tar.xz
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 <fabian@ritter-vogt.de> Cc: Yuan-Hsin Chen <yhchen@faraday-tech.com> Cc: Felipe Balbi <balbi@kernel.org> Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/20221023144708.3596563-3-linus.walleij@linaro.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/fotg210')
-rw-r--r--drivers/usb/fotg210/fotg210-core.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/usb/fotg210/fotg210-core.c b/drivers/usb/fotg210/fotg210-core.c
index ab7b8974bc18..3d07ee46f6d1 100644
--- 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;
}