openwrt-redmi-ax3000/target/linux/ipq50xx/patches/701-net-mdio-ipq4019-Add-phy-reset-support.patch
2024-07-14 23:50:59 +08:00

62 lines
1.8 KiB
Diff

From b9dde0c1cfad5e09d5be5248aeeda2941ec8e02b Mon Sep 17 00:00:00 2001
From: hzy <hzyitc@outlook.com>
Date: Mon, 20 Mar 2023 19:55:51 +0000
Subject: [PATCH 1/3] net: mdio: ipq4019: Add phy reset support
Signed-off-by: hzy <hzyitc@outlook.com>
---
drivers/net/phy/mdio-ipq4019.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/drivers/net/mdio/mdio-ipq4019.c b/drivers/net/mdio/mdio-ipq4019.c
index 7227917755cc..59a37e4378ea 100644
--- a/drivers/net/mdio/mdio-ipq4019.c
+++ b/drivers/net/mdio/mdio-ipq4019.c
@@ -12,6 +12,7 @@
#include <linux/phy.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
+#include <linux/reset.h>
#define MDIO_MODE_REG 0x40
#define MDIO_ADDR_REG 0x44
@@ -41,6 +42,7 @@ struct ipq4019_mdio_data {
void __iomem *membase;
void __iomem *eth_ldo_rdy;
struct clk *mdio_clk;
+ struct reset_control *phy_reset;
};
static int ipq4019_mdio_wait_busy(struct mii_bus *bus)
@@ -195,6 +197,13 @@ static int ipq_mdio_reset(struct mii_bus *bus)
fsleep(IPQ_PHY_SET_DELAY_US);
}
+ if (priv->phy_reset) {
+ reset_control_assert(priv->phy_reset);
+ fsleep(IPQ_PHY_SET_DELAY_US);
+ reset_control_deassert(priv->phy_reset);
+ fsleep(IPQ_PHY_SET_DELAY_US);
+ }
+
/* Configure MDIO clock source frequency if clock is specified in the device tree */
ret = clk_set_rate(priv->mdio_clk, IPQ_MDIO_CLK_RATE);
if (ret)
@@ -229,6 +238,13 @@ static int ipq4019_mdio_probe(struct platform_device *pdev)
if (res)
priv->eth_ldo_rdy = devm_ioremap_resource(&pdev->dev, res);
+ priv->phy_reset = devm_reset_control_get_optional(&pdev->dev, "phy");
+ if (IS_ERR(priv->phy_reset)) {
+ if (PTR_ERR(priv->phy_reset) == -EPROBE_DEFER)
+ return PTR_ERR(priv->phy_reset);
+ priv->phy_reset = NULL;
+ }
+
bus->name = "ipq4019_mdio";
bus->read = ipq4019_mdio_read;
bus->write = ipq4019_mdio_write;
--
2.25.1