summaryrefslogtreecommitdiffstats
path: root/target/linux/gemini/patches-6.1/0009-fotg210-udc-Support-optional-external-PHY.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/gemini/patches-6.1/0009-fotg210-udc-Support-optional-external-PHY.patch')
-rw-r--r--target/linux/gemini/patches-6.1/0009-fotg210-udc-Support-optional-external-PHY.patch158
1 files changed, 0 insertions, 158 deletions
diff --git a/target/linux/gemini/patches-6.1/0009-fotg210-udc-Support-optional-external-PHY.patch b/target/linux/gemini/patches-6.1/0009-fotg210-udc-Support-optional-external-PHY.patch
deleted file mode 100644
index 498875c535..0000000000
--- a/target/linux/gemini/patches-6.1/0009-fotg210-udc-Support-optional-external-PHY.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From 03e4b585ac947e2d422bedf03179bbfec3aca3cf Mon Sep 17 00:00:00 2001
-From: Linus Walleij <linus.walleij@linaro.org>
-Date: Mon, 14 Nov 2022 12:51:59 +0100
-Subject: [PATCH 09/29] fotg210-udc: Support optional external PHY
-
-This adds support for an optional external PHY to the FOTG210
-UDC driver.
-
-Tested with the GPIO VBUS PHY driver on the Gemini SoC.
-
-Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-Link: https://lore.kernel.org/r/20221114115201.302887-2-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,8 @@
- #include <linux/platform_device.h>
- #include <linux/usb/ch9.h>
- #include <linux/usb/gadget.h>
-+#include <linux/usb/otg.h>
-+#include <linux/usb/phy.h>
-
- #include "fotg210.h"
- #include "fotg210-udc.h"
-@@ -1022,10 +1024,18 @@ static int fotg210_udc_start(struct usb_
- {
- struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
- u32 value;
-+ int ret;
-
- /* hook up the driver */
- fotg210->driver = driver;
-
-+ if (!IS_ERR_OR_NULL(fotg210->phy)) {
-+ ret = otg_set_peripheral(fotg210->phy->otg,
-+ &fotg210->gadget);
-+ if (ret)
-+ dev_err(fotg210->dev, "can't bind to phy\n");
-+ }
-+
- /* enable device global interrupt */
- value = ioread32(fotg210->reg + FOTG210_DMCR);
- value |= DMCR_GLINT_EN;
-@@ -1067,6 +1077,9 @@ static int fotg210_udc_stop(struct usb_g
- struct fotg210_udc *fotg210 = gadget_to_fotg210(g);
- unsigned long flags;
-
-+ if (!IS_ERR_OR_NULL(fotg210->phy))
-+ return otg_set_peripheral(fotg210->phy->otg, NULL);
-+
- spin_lock_irqsave(&fotg210->lock, flags);
-
- fotg210_init(fotg210);
-@@ -1082,12 +1095,50 @@ static const struct usb_gadget_ops fotg2
- .udc_stop = fotg210_udc_stop,
- };
-
-+/**
-+ * fotg210_phy_event - Called by phy upon VBus event
-+ * @nb: notifier block
-+ * @action: phy action, is vbus connect or disconnect
-+ * @data: the usb_gadget structure in fotg210
-+ *
-+ * Called by the USB Phy when a cable connect or disconnect is sensed.
-+ *
-+ * Returns NOTIFY_OK or NOTIFY_DONE
-+ */
-+static int fotg210_phy_event(struct notifier_block *nb, unsigned long action,
-+ void *data)
-+{
-+ struct usb_gadget *gadget = data;
-+
-+ if (!gadget)
-+ return NOTIFY_DONE;
-+
-+ switch (action) {
-+ case USB_EVENT_VBUS:
-+ usb_gadget_vbus_connect(gadget);
-+ return NOTIFY_OK;
-+ case USB_EVENT_NONE:
-+ usb_gadget_vbus_disconnect(gadget);
-+ return NOTIFY_OK;
-+ default:
-+ return NOTIFY_DONE;
-+ }
-+}
-+
-+static struct notifier_block fotg210_phy_notifier = {
-+ .notifier_call = fotg210_phy_event,
-+};
-+
- int fotg210_udc_remove(struct platform_device *pdev)
- {
- struct fotg210_udc *fotg210 = platform_get_drvdata(pdev);
- int i;
-
- usb_del_gadget_udc(&fotg210->gadget);
-+ if (!IS_ERR_OR_NULL(fotg210->phy)) {
-+ usb_unregister_notifier(fotg210->phy, &fotg210_phy_notifier);
-+ usb_put_phy(fotg210->phy);
-+ }
- iounmap(fotg210->reg);
- free_irq(platform_get_irq(pdev, 0), fotg210);
-
-@@ -1127,6 +1178,22 @@ int fotg210_udc_probe(struct platform_de
- if (fotg210 == NULL)
- goto err;
-
-+ fotg210->dev = dev;
-+
-+ 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;
-+ dev_info(dev, "no PHY found\n");
-+ fotg210->phy = NULL;
-+ } else {
-+ ret = usb_phy_init(fotg210->phy);
-+ if (ret)
-+ goto err;
-+ dev_info(dev, "found and initialized PHY\n");
-+ }
-+
- for (i = 0; i < FOTG210_MAX_NUM_EP; i++) {
- _ep[i] = kzalloc(sizeof(struct fotg210_ep), GFP_KERNEL);
- if (_ep[i] == NULL)
-@@ -1200,6 +1267,9 @@ int fotg210_udc_probe(struct platform_de
- goto err_req;
- }
-
-+ if (!IS_ERR_OR_NULL(fotg210->phy))
-+ usb_register_notifier(fotg210->phy, &fotg210_phy_notifier);
-+
- ret = usb_add_gadget_udc(dev, &fotg210->gadget);
- if (ret)
- goto err_add_udc;
-@@ -1209,6 +1279,8 @@ int fotg210_udc_probe(struct platform_de
- return 0;
-
- err_add_udc:
-+ if (!IS_ERR_OR_NULL(fotg210->phy))
-+ usb_unregister_notifier(fotg210->phy, &fotg210_phy_notifier);
- free_irq(ires->start, fotg210);
-
- err_req:
---- a/drivers/usb/fotg210/fotg210-udc.h
-+++ b/drivers/usb/fotg210/fotg210-udc.h
-@@ -234,6 +234,8 @@ struct fotg210_udc {
-
- unsigned long irq_trigger;
-
-+ struct device *dev;
-+ struct usb_phy *phy;
- struct usb_gadget gadget;
- struct usb_gadget_driver *driver;
-