Patch "USB: xhci-plat: fix legacy PHY double init" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    USB: xhci-plat: fix legacy PHY double init

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     usb-xhci-plat-fix-legacy-phy-double-init.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 594e50a713a04a04fc11a7dc1e5fe8f5a3e657c3
Author: Johan Hovold <johan+linaro@xxxxxxxxxx>
Date:   Fri Nov 3 17:43:23 2023 +0100

    USB: xhci-plat: fix legacy PHY double init
    
    [ Upstream commit 16b7e0cccb243033de4406ffb4d892365041a1e7 ]
    
    Commits 7b8ef22ea547 ("usb: xhci: plat: Add USB phy support") and
    9134c1fd0503 ("usb: xhci: plat: Add USB 3.0 phy support") added support
    for looking up legacy PHYs from the sysdev devicetree node and
    initialising them.
    
    This broke drivers such as dwc3 which manages PHYs themself as the PHYs
    would now be initialised twice, something which specifically can lead to
    resources being left enabled during suspend (e.g. with the
    usb_phy_generic PHY driver).
    
    As the dwc3 driver uses driver-name matching for the xhci platform
    device, fix this by only looking up and initialising PHYs for devices
    that have been matched using OF.
    
    Note that checking that the platform device has a devicetree node would
    currently be sufficient, but that could lead to subtle breakages in case
    anyone ever tries to reuse an ancestor's node.
    
    Fixes: 7b8ef22ea547 ("usb: xhci: plat: Add USB phy support")
    Fixes: 9134c1fd0503 ("usb: xhci: plat: Add USB 3.0 phy support")
    Cc: stable@xxxxxxxxxxxxxxx      # 4.1
    Cc: Maxime Ripard <mripard@xxxxxxxxxx>
    Cc: Stanley Chang <stanley_chang@xxxxxxxxxxx>
    Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx>
    Tested-by: Stefan Eichenberger <stefan.eichenberger@xxxxxxxxxxx>
    Tested-by: Stanley Chang <stanley_chang@xxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20231103164323.14294-1-johan+linaro@xxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
index c9a101f0e8d01..c9438dc56f5fc 100644
--- a/drivers/usb/host/xhci-plat.c
+++ b/drivers/usb/host/xhci-plat.c
@@ -184,7 +184,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
 	int			ret;
 	int			irq;
 	struct xhci_plat_priv	*priv = NULL;
-
+	bool			of_match;
 
 	if (usb_disabled())
 		return -ENODEV;
@@ -305,16 +305,23 @@ static int xhci_plat_probe(struct platform_device *pdev)
 					 &xhci->imod_interval);
 	}
 
-	hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, "usb-phy", 0);
-	if (IS_ERR(hcd->usb_phy)) {
-		ret = PTR_ERR(hcd->usb_phy);
-		if (ret == -EPROBE_DEFER)
-			goto disable_clk;
-		hcd->usb_phy = NULL;
-	} else {
-		ret = usb_phy_init(hcd->usb_phy);
-		if (ret)
-			goto disable_clk;
+	/*
+	 * Drivers such as dwc3 manages PHYs themself (and rely on driver name
+	 * matching for the xhci platform device).
+	 */
+	of_match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
+	if (of_match) {
+		hcd->usb_phy = devm_usb_get_phy_by_phandle(sysdev, "usb-phy", 0);
+		if (IS_ERR(hcd->usb_phy)) {
+			ret = PTR_ERR(hcd->usb_phy);
+			if (ret == -EPROBE_DEFER)
+				goto disable_clk;
+			hcd->usb_phy = NULL;
+		} else {
+			ret = usb_phy_init(hcd->usb_phy);
+			if (ret)
+				goto disable_clk;
+		}
 	}
 
 	hcd->tpl_support = of_usb_host_tpl_support(sysdev->of_node);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux