mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 23:12:32 +00:00
58acb1dd2c
This adds a bunch of patches for the v6.1 Gemini kernel. For v5.15 this was down to a single upstream patch, but for kernel v6.2 I reworked the USB code for FOTG210, so instead of carrying over the half-baked and incomplete patch from v5.15 I just backported all the v6.2 patches, 31 in total, as it creates full device USB mode for e.g. D-Link DNS-313. Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
91 lines
2.4 KiB
Diff
91 lines
2.4 KiB
Diff
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;
|
|
|