usb: fotg210: Select subdriver by mode
authorLinus Walleij <linus.walleij@linaro.org>
Sun, 23 Oct 2022 14:47:08 +0000 (16:47 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 9 Nov 2022 11:38:09 +0000 (12:38 +0100)
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>
drivers/usb/fotg210/fotg210-core.c

index ab7b8974bc18ba531829507e5f46b8a13361ba5b..3d07ee46f6d1d4f3d6fc04ed5aa401849ab25eff 100644 (file)
 #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;
 }