gemini: Add kernel v6.1 patches
[openwrt/staging/wigyori.git] / target / linux / gemini / patches-6.1 / 0004-usb-fotg210-Select-subdriver-by-mode.patch
diff --git a/target/linux/gemini/patches-6.1/0004-usb-fotg210-Select-subdriver-by-mode.patch b/target/linux/gemini/patches-6.1/0004-usb-fotg210-Select-subdriver-by-mode.patch
new file mode 100644 (file)
index 0000000..6a19a0a
--- /dev/null
@@ -0,0 +1,68 @@
+From 7c0b661926097e935f2711857596fc2277b2304a Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+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 <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>
+---
+--- 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;
+ }