]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blobdiff - releases/4.14.111/usb-chipidea-grab-the-legacy-usb-phy-by-phandle-firs.patch
Linux 4.14.111
[thirdparty/kernel/stable-queue.git] / releases / 4.14.111 / usb-chipidea-grab-the-legacy-usb-phy-by-phandle-firs.patch
diff --git a/releases/4.14.111/usb-chipidea-grab-the-legacy-usb-phy-by-phandle-firs.patch b/releases/4.14.111/usb-chipidea-grab-the-legacy-usb-phy-by-phandle-firs.patch
new file mode 100644 (file)
index 0000000..bd74b60
--- /dev/null
@@ -0,0 +1,57 @@
+From 4bfb60133a24c2c3fc9332e1ae1c720e0e0448b5 Mon Sep 17 00:00:00 2001
+From: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
+Date: Wed, 27 Feb 2019 06:51:36 +0000
+Subject: usb: chipidea: Grab the (legacy) USB PHY by phandle first
+
+[ Upstream commit 68ef236274793066b9ba3154b16c0acc1c891e5c ]
+
+According to the chipidea driver bindings, the USB PHY is specified via
+the "phys" phandle node. However, this only takes effect for USB PHYs
+that use the common PHY framework. For legacy USB PHYs, a simple lookup
+based on the USB PHY type is done instead.
+
+This does not play out well when more than one USB PHY is registered,
+since the first registered PHY matching the type will always be
+returned regardless of what the driver was bound to.
+
+Fix this by looking up the PHY based on the "phys" phandle node.
+Although generic PHYs are rather matched by their "phys-name" and not
+the "phys" phandle directly, there is no helper for similar lookup on
+legacy PHYs and it's probably not worth the effort to add it.
+
+When no legacy USB PHY is found by phandle, fallback to grabbing any
+registered USB2 PHY. This ensures backward compatibility if some users
+were actually relying on this mechanism.
+
+Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
+Signed-off-by: Peter Chen <peter.chen@nxp.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/chipidea/core.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
+index 43ea5fb87b9a..70306ae039c0 100644
+--- a/drivers/usb/chipidea/core.c
++++ b/drivers/usb/chipidea/core.c
+@@ -938,8 +938,15 @@ static int ci_hdrc_probe(struct platform_device *pdev)
+       } else if (ci->platdata->usb_phy) {
+               ci->usb_phy = ci->platdata->usb_phy;
+       } else {
++              ci->usb_phy = devm_usb_get_phy_by_phandle(dev->parent, "phys",
++                                                        0);
+               ci->phy = devm_phy_get(dev->parent, "usb-phy");
+-              ci->usb_phy = devm_usb_get_phy(dev->parent, USB_PHY_TYPE_USB2);
++
++              /* Fallback to grabbing any registered USB2 PHY */
++              if (IS_ERR(ci->usb_phy) &&
++                  PTR_ERR(ci->usb_phy) != -EPROBE_DEFER)
++                      ci->usb_phy = devm_usb_get_phy(dev->parent,
++                                                     USB_PHY_TYPE_USB2);
+               /* if both generic PHY and USB PHY layers aren't enabled */
+               if (PTR_ERR(ci->phy) == -ENOSYS &&
+-- 
+2.19.1
+