gemini: Add kernel v6.1 patches
[openwrt/openwrt.git] / target / linux / gemini / patches-6.1 / 0010-fotg210-udc-Handle-PCLK.patch
diff --git a/target/linux/gemini/patches-6.1/0010-fotg210-udc-Handle-PCLK.patch b/target/linux/gemini/patches-6.1/0010-fotg210-udc-Handle-PCLK.patch
new file mode 100644 (file)
index 0000000..8da3de3
--- /dev/null
@@ -0,0 +1,90 @@
+From 772ea3ec2b9363b45ef9a4768ea205f758c3debc Mon Sep 17 00:00:00 2001
+From: Linus Walleij <linus.walleij@linaro.org>
+Date: Mon, 14 Nov 2022 12:52:00 +0100
+Subject: [PATCH 10/29] fotg210-udc: Handle PCLK
+
+This adds optional handling of the peripheral clock PCLK.
+
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Link: https://lore.kernel.org/r/20221114115201.302887-3-linus.walleij@linaro.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+--- a/drivers/usb/fotg210/fotg210-udc.c
++++ b/drivers/usb/fotg210/fotg210-udc.c
+@@ -15,6 +15,7 @@
+ #include <linux/platform_device.h>
+ #include <linux/usb/ch9.h>
+ #include <linux/usb/gadget.h>
++#include <linux/clk.h>
+ #include <linux/usb/otg.h>
+ #include <linux/usb/phy.h>
+@@ -1145,6 +1146,10 @@ int fotg210_udc_remove(struct platform_d
+       fotg210_ep_free_request(&fotg210->ep[0]->ep, fotg210->ep0_req);
+       for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
+               kfree(fotg210->ep[i]);
++
++      if (!IS_ERR(fotg210->pclk))
++              clk_disable_unprepare(fotg210->pclk);
++
+       kfree(fotg210);
+       return 0;
+@@ -1180,17 +1185,34 @@ int fotg210_udc_probe(struct platform_de
+       fotg210->dev = dev;
++      /* It's OK not to supply this clock */
++      fotg210->pclk = devm_clk_get(dev, "PCLK");
++      if (!IS_ERR(fotg210->pclk)) {
++              ret = clk_prepare_enable(fotg210->pclk);
++              if (ret) {
++                      dev_err(dev, "failed to enable PCLK\n");
++                      return ret;
++              }
++      } else if (PTR_ERR(fotg210->pclk) == -EPROBE_DEFER) {
++              /*
++               * Percolate deferrals, for anything else,
++               * just live without the clocking.
++               */
++              ret = -EPROBE_DEFER;
++              goto err;
++      }
++
+       fotg210->phy = devm_usb_get_phy_by_phandle(dev->parent, "usb-phy", 0);
+       if (IS_ERR(fotg210->phy)) {
+               ret = PTR_ERR(fotg210->phy);
+               if (ret == -EPROBE_DEFER)
+-                      goto err;
++                      goto err_pclk;
+               dev_info(dev, "no PHY found\n");
+               fotg210->phy = NULL;
+       } else {
+               ret = usb_phy_init(fotg210->phy);
+               if (ret)
+-                      goto err;
++                      goto err_pclk;
+               dev_info(dev, "found and initialized PHY\n");
+       }
+@@ -1292,6 +1314,10 @@ err_map:
+ err_alloc:
+       for (i = 0; i < FOTG210_MAX_NUM_EP; i++)
+               kfree(fotg210->ep[i]);
++err_pclk:
++      if (!IS_ERR(fotg210->pclk))
++              clk_disable_unprepare(fotg210->pclk);
++
+       kfree(fotg210);
+ err:
+--- a/drivers/usb/fotg210/fotg210-udc.h
++++ b/drivers/usb/fotg210/fotg210-udc.h
+@@ -231,6 +231,7 @@ struct fotg210_ep {
+ struct fotg210_udc {
+       spinlock_t              lock; /* protect the struct */
+       void __iomem            *reg;
++      struct clk              *pclk;
+       unsigned long           irq_trigger;