diff --git a/kernel.spec b/kernel.spec index c9f3630f6..ebbf8f978 100644 --- a/kernel.spec +++ b/kernel.spec @@ -586,6 +586,7 @@ Patch332: arm64-socionext-96b-enablement.patch # Fix Raspberry Pi and possibly some other dwc2/dwc3 users # https://patchwork.kernel.org/patch/10149439/ +Patch399: phy-work-around-phys-references-to-usb-phy-devices.patch # Patch399: phy-work-around-phys-references-to-usb-phy-devices.patch # 400 - IBM (ppc/s390x) patches diff --git a/phy-work-around-phys-references-to-usb-phy-devices.patch b/phy-work-around-phys-references-to-usb-phy-devices.patch new file mode 100644 index 000000000..1c7f39b7a --- /dev/null +++ b/phy-work-around-phys-references-to-usb-phy-devices.patch @@ -0,0 +1,104 @@ +From patchwork Mon Jan 8 13:01:10 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: phy: work around 'phys' references to usb-phy devices +From: Arnd Bergmann +X-Patchwork-Id: 10149439 +Message-Id: <20180108130116.80148-1-arnd@arndb.de> +To: Kishon Vijay Abraham I +Cc: Stefan Wahren , devicetree@vger.kernel.org, + Florian Fainelli , Arnd Bergmann , + Felipe Balbi , linux-usb@vger.kernel.org, + linux-kernel@vger.kernel.org, stable@vger.kernel.org, + Eric Anholt , Rob Herring , + Andrzej Pietrasiewicz , + linux-arm-kernel@lists.infradead.org +Date: Mon, 8 Jan 2018 14:01:10 +0100 + +Stefan Wahren reports a problem with a warning fix that was merged +for v4.15: we had lots of device nodes with a 'phys' property pointing +to a device node that is not compliant with the binding documented in +Documentation/devicetree/bindings/phy/phy-bindings.txt + +This generally works because USB HCD drivers that support both the generic +phy subsystem and the older usb-phy subsystem ignore most errors from +phy_get() and related calls and then use the usb-phy driver instead. + +However, usb_add_hcd() (along with the respective functions in dwc2 and +dwc3) propagate the EPROBE_DEFER return code so we can try again whenever +the driver gets loaded. In case the driver is written for the usb-phy +subsystem (like usb-generic-phy aka usb-nop-xceiv), we will never load +a generic-phy driver for it, and keep failing here. + +There is only a small number of remaining usb-phy drivers that support +device tree, so this adds a workaround by providing a full list of the +potentially affected drivers, and always failing the probe with -ENODEV +here, which is the same behavior that we used to get with incorrect +device tree files. Since we generally want older kernels to also want +to work with the fixed devicetree files, it would be good to backport +the patch into stable kernels as well (3.13+ are possibly affected). +Reverting back to the DTS sources that work would in theory fix USB +support for now, but in the long run we'd run into the same problem +again when the drivers get ported from usb-phy to generic-phy. + +Fixes: 014d6da6cb25 ("ARM: dts: bcm283x: Fix DTC warnings about missing phy-cells") +Link: https://marc.info/?l=linux-usb&m=151518314314753&w=2 +Cc: stable@vger.kernel.org +Cc: Stefan Wahren +Cc: Felipe Balbi +Signed-off-by: Arnd Bergmann +--- +This obviously needs to be tested, I wrote this up as a reply to +Stefan's bug report. I'm fairly sure that I covered all usb-phy +driver strings here. My goal is to have a fix merged into 4.15 +rather than reverting all the DT fixes. +--- + drivers/phy/phy-core.c | 27 +++++++++++++++++++++++++++ + 1 file changed, 27 insertions(+) + +diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c +index b4964b067aec..bb4dd2a2de2d 100644 +--- a/drivers/phy/phy-core.c ++++ b/drivers/phy/phy-core.c +@@ -387,6 +387,24 @@ int phy_calibrate(struct phy *phy) + } + EXPORT_SYMBOL_GPL(phy_calibrate); + ++static struct of_device_id __maybe_unused legacy_usbphy[] = { ++ { .compatible = "fsl,imx23-usbphy" }, ++ { .compatible = "fsl,imx6q-usbphy" }, ++ { .compatible = "fsl,imx6sl-usbphy" }, ++ { .compatible = "fsl,imx6sx-usbphy" }, ++ { .compatible = "fsl,imx6ul-usbphy" }, ++ { .compatible = "fsl,vf610-usbphy" }, ++ { .compatible = "nvidia,tegra20-usb-phy" }, ++ { .compatible = "nvidia,tegra30-usb-phy" }, ++ { .compatible = "nxp,isp1301" }, ++ { .compatible = "ti,am335x-usb-ctrl-module" }, ++ { .compatible = "ti,am335x-usb-phy" }, ++ { .compatible = "ti,keystone-usbphy" }, ++ { .compatible = "ti,twl6030-usb" }, ++ { .compatible = "usb-nop-xceiv" }, ++ {}, ++}; ++ + /** + * _of_phy_get() - lookup and obtain a reference to a phy by phandle + * @np: device_node for which to get the phy +@@ -410,6 +428,15 @@ static struct phy *_of_phy_get(struct device_node *np, int index) + if (ret) + return ERR_PTR(-ENODEV); + ++ /* ++ * Some USB host controllers use a "phys" property to refer to ++ * a device that does not have a generic phy driver but that ++ * has a driver for the older usb-phy framework. ++ * We must not return -EPROBE_DEFER for those, so bail out early. ++ */ ++ if (of_match_node(legacy_usbphy, args.np)) ++ return ERR_PTR(-ENODEV); ++ + mutex_lock(&phy_provider_mutex); + phy_provider = of_phy_provider_lookup(args.np); + if (IS_ERR(phy_provider) || !try_module_get(phy_provider->owner)) {