Thread (4 messages) flat view 4 messages, 3 authors, 2021-02-09

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.c
b/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 int
imx8mq_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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help