RE: [PATCH 2/2] phy: fsl-imx8mq-usb: handle resettable hubs
From: Jun Li <hidden>
Date: 2021-02-02 02:03:17
Also in:
linux-devicetree, lkml
Hi,
-----Original Message----- From: Adrien Grassein <redacted> Sent: Friday, January 29, 2021 6:13 AM Cc: kishon@ti.com; vkoul@kernel.org; robh+dt@kernel.org; shawnguo@kernel.org; s.hauer@pengutronix.de; kernel@pengutronix.de; festevam@gmail.com; dl-linux-imx [off-list ref]; rikard.falkeborn@gmail.com; Peter Chen [off-list ref]; Jun Li [off-list ref]; linux-kernel@vger.kernel.org; devicetree@vger.kernel.org; linux-arm-kernel@lists.infradead.org; Adrien Grassein [off-list ref] Subject: [PATCH 2/2] phy: fsl-imx8mq-usb: handle resettable hubs Add an optional GPIO in the dtb description that will be used to reset the connected hub (if any).
Put the external usb device reset in host phy driver, this may not the right way, there was some attempts to handle this case(on board hub), I am not sure what's the status now. Li Jun
quoted hunk ↗ jump to hunk
Signed-off-by: Adrien Grassein <redacted> --- drivers/phy/freescale/phy-fsl-imx8mq-usb.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)diff --git a/drivers/phy/freescale/phy-fsl-imx8mq-usb.cb/drivers/phy/freescale/phy-fsl-imx8mq-usb.c index a29b4a6f7c24..00abf7814fe9 100644--- a/drivers/phy/freescale/phy-fsl-imx8mq-usb.c +++ b/drivers/phy/freescale/phy-fsl-imx8mq-usb.c@@ -4,6 +4,7 @@ #include <linux/bitfield.h> #include <linux/clk.h> #include <linux/delay.h> +#include <linux/gpio/consumer.h> #include <linux/io.h> #include <linux/module.h> #include <linux/of_platform.h>@@ -36,6 +37,7 @@ struct imx8mq_usb_phy { struct clk *clk; void __iomem *base; struct regulator *vbus; + struct gpio_desc *reset_gpio; }; static int imx8mq_usb_phy_init(struct phy *phy) @@ -111,6 +113,9 @@ static intimx8mq_phy_power_on(struct phy *phy) if (ret) return ret; + if (imx_phy->reset_gpio) + gpiod_set_value_cansleep(imx_phy->reset_gpio, 0); + return clk_prepare_enable(imx_phy->clk); }@@ -120,6 +125,8 @@ static int imx8mq_phy_power_off(struct phy *phy) clk_disable_unprepare(imx_phy->clk); regulator_disable(imx_phy->vbus); + if (imx_phy->reset_gpio) + gpiod_set_value_cansleep(imx_phy->reset_gpio, 1); return 0; }@@ -153,6 +160,7 @@ static int imx8mq_usb_phy_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct imx8mq_usb_phy *imx_phy; const struct phy_ops *phy_ops; + int ret; imx_phy = devm_kzalloc(dev, sizeof(*imx_phy), GFP_KERNEL); if (!imx_phy)@@ -180,6 +188,15 @@ static int imx8mq_usb_phy_probe(struct platform_device *pdev) if (IS_ERR(imx_phy->vbus)) return PTR_ERR(imx_phy->vbus); + imx_phy->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); + if (IS_ERR(imx_phy->reset_gpio)) { + ret = PTR_ERR(imx_phy->reset_gpio); + if (ret == -ENXIO || ret == -ENODEV) + imx_phy->reset_gpio = NULL; + else + return PTR_ERR(imx_phy->reset_gpio); + } + phy_set_drvdata(imx_phy->phy, imx_phy); phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); --2.25.1
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel