mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/3] davinci_mdio: clk fixes
@ 2024-11-13  8:29 Sascha Hauer
  2024-11-13  8:29 ` [PATCH 1/3] net: davinci_mdio: drop phy_mask detection Sascha Hauer
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Sascha Hauer @ 2024-11-13  8:29 UTC (permalink / raw)
  To: open list:BAREBOX

This series fixes some deficiencies in the davinci_mdio driver

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
Sascha Hauer (3):
      net: davinci_mdio: drop phy_mask detection
      net: davinci_mdio: initialize priv->dev
      net: davinci_mdio: initialize divider from clk

 drivers/net/davinci_mdio.c | 61 ++++++++++++++++++++--------------------------
 1 file changed, 26 insertions(+), 35 deletions(-)
---
base-commit: 89ad0c51b24d6df4b5a99d6defa9324d8c30cfbe
change-id: 20241113-davinci-mdio-clk-fix-2d0501d23ea5

Best regards,
-- 
Sascha Hauer <s.hauer@pengutronix.de>




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/3] net: davinci_mdio: drop phy_mask detection
  2024-11-13  8:29 [PATCH 0/3] davinci_mdio: clk fixes Sascha Hauer
@ 2024-11-13  8:29 ` Sascha Hauer
  2024-11-13  8:29 ` [PATCH 2/3] net: davinci_mdio: initialize priv->dev Sascha Hauer
  2024-11-13  8:29 ` [PATCH 3/3] net: davinci_mdio: initialize divider from clk Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2024-11-13  8:29 UTC (permalink / raw)
  To: open list:BAREBOX

The davinci_mdio driver tries to autodetect connected phys using the
controllers internal state engine that seems to periodically scan for
phys. It then sets phy_mask according to the phys found. This doesn't
work on a beagleplay board because the timeout is too short.

This phy detection mechanism is an optimization only, which in the best
case saves some time needed to scan the bus for phys later on. Normally
the phys are described in the device tree, in this case the bus isn't
scanned for devices anyway, so instead of adjusting the timeout we can
drop the whole thing altogether.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/net/davinci_mdio.c | 29 -----------------------------
 1 file changed, 29 deletions(-)

diff --git a/drivers/net/davinci_mdio.c b/drivers/net/davinci_mdio.c
index c5cd28fba4..fad14e92ea 100644
--- a/drivers/net/davinci_mdio.c
+++ b/drivers/net/davinci_mdio.c
@@ -110,8 +110,6 @@ static int cpsw_mdio_probe(struct device *dev)
 {
 	struct resource *iores;
 	struct cpsw_mdio_priv *priv;
-	uint64_t start;
-	uint32_t phy_mask;
 	int ret;
 
 	priv = xzalloc(sizeof(*priv));
@@ -137,33 +135,6 @@ static int cpsw_mdio_probe(struct device *dev)
 	 */
 	writel(0xff | CONTROL_ENABLE, &priv->mdio_regs->control);
 
-	/*
-	 * wait for scan logic to settle:
-	 * the scan time consists of (a) a large fixed component, and (b) a
-	 * small component that varies with the mii bus frequency.  These
-	 * were estimated using measurements at 1.1 and 2.2 MHz on tnetv107x
-	 * silicon.  Since the effect of (b) was found to be largely
-	 * negligible, we keep things simple here.
-	 */
-	udelay(2000);
-
-	start = get_time_ns();
-	while (1) {
-		phy_mask = readl(&priv->mdio_regs->alive);
-		if (phy_mask) {
-			dev_info(dev, "detected phy mask 0x%x\n", phy_mask);
-			phy_mask = ~phy_mask;
-			break;
-		}
-		if (is_timeout(start, 256 * MSECOND)) {
-			dev_err(dev, "no live phy, scanning all\n");
-			phy_mask = 0;
-			break;
-		}
-	}
-
-	priv->miibus.phy_mask = phy_mask;
-
 	ret = mdiobus_register(&priv->miibus);
 	if (ret)
 		return ret;

-- 
2.39.5




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/3] net: davinci_mdio: initialize priv->dev
  2024-11-13  8:29 [PATCH 0/3] davinci_mdio: clk fixes Sascha Hauer
  2024-11-13  8:29 ` [PATCH 1/3] net: davinci_mdio: drop phy_mask detection Sascha Hauer
@ 2024-11-13  8:29 ` Sascha Hauer
  2024-11-13  8:29 ` [PATCH 3/3] net: davinci_mdio: initialize divider from clk Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2024-11-13  8:29 UTC (permalink / raw)
  To: open list:BAREBOX

struct cpsw_mdio_priv has a struct device *dev member which is used, but
never initialized. Add the missing initialization.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/net/davinci_mdio.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/davinci_mdio.c b/drivers/net/davinci_mdio.c
index fad14e92ea..ef08911f3f 100644
--- a/drivers/net/davinci_mdio.c
+++ b/drivers/net/davinci_mdio.c
@@ -113,6 +113,7 @@ static int cpsw_mdio_probe(struct device *dev)
 	int ret;
 
 	priv = xzalloc(sizeof(*priv));
+	priv->dev = dev;
 
 	/* If we can't request I/O memory region, we'll assume parent did
 	 * it for us

-- 
2.39.5




^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 3/3] net: davinci_mdio: initialize divider from clk
  2024-11-13  8:29 [PATCH 0/3] davinci_mdio: clk fixes Sascha Hauer
  2024-11-13  8:29 ` [PATCH 1/3] net: davinci_mdio: drop phy_mask detection Sascha Hauer
  2024-11-13  8:29 ` [PATCH 2/3] net: davinci_mdio: initialize priv->dev Sascha Hauer
@ 2024-11-13  8:29 ` Sascha Hauer
  2 siblings, 0 replies; 4+ messages in thread
From: Sascha Hauer @ 2024-11-13  8:29 UTC (permalink / raw)
  To: open list:BAREBOX

Instead of using a fixed divider value calculate a divider from the
input clock.

We currently do not have clk support for am33xx, so we can't handle
no clk as an error. In this case assume a clock frequency of 256MHz.
With a default desired MDIO clock of 1MHz (used in many TI dtsi files)
we get a divider value of 0xff which we previously used as hardcoded
value.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 drivers/net/davinci_mdio.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)

diff --git a/drivers/net/davinci_mdio.c b/drivers/net/davinci_mdio.c
index ef08911f3f..a0cff97aa5 100644
--- a/drivers/net/davinci_mdio.c
+++ b/drivers/net/davinci_mdio.c
@@ -7,6 +7,7 @@
 #include <clock.h>
 #include <xfuncs.h>
 #include <io.h>
+#include <linux/clk.h>
 
 #define PHY_REG_MASK		0x1f
 #define PHY_ID_MASK		0x1f
@@ -43,6 +44,7 @@ struct cpsw_mdio_priv {
 	struct device			*dev;
 	struct mii_bus			miibus;
 	struct cpsw_mdio_regs		*mdio_regs;
+	struct clk			*clk;
 };
 
 /* wait until hardware is ready for another user access */
@@ -106,6 +108,28 @@ static int cpsw_mdio_write(struct mii_bus *bus, int phy_id, int phy_reg, u16 val
 	return 0;
 }
 
+#define CONTROL_MAX_DIV 0xffff
+
+static void cpsw_mdio_init_clk(struct cpsw_mdio_priv *priv)
+{
+	u32 mdio_in, clk_div;
+	u32 bus_freq = 2560000;
+
+	of_property_read_u32(priv->dev->of_node, "bus_freq", &bus_freq);
+
+	priv->clk = clk_get_enabled(priv->dev, "fck");
+	if (IS_ERR(priv->clk))
+		mdio_in = 250000000;
+	else
+		mdio_in = clk_get_rate(priv->clk);
+
+	clk_div = (mdio_in / bus_freq) - 1;
+	if (clk_div > CONTROL_MAX_DIV)
+		clk_div = CONTROL_MAX_DIV;
+
+	writel(clk_div | CONTROL_ENABLE, &priv->mdio_regs->control);
+}
+
 static int cpsw_mdio_probe(struct device *dev)
 {
 	struct resource *iores;
@@ -129,12 +153,7 @@ static int cpsw_mdio_probe(struct device *dev)
 	priv->miibus.priv = priv;
 	priv->miibus.parent = dev;
 
-	/*
-	 * set enable and clock divider
-	 *
-	 * FIXME: Use a clock to calculate the divider
-	 */
-	writel(0xff | CONTROL_ENABLE, &priv->mdio_regs->control);
+	cpsw_mdio_init_clk(priv);
 
 	ret = mdiobus_register(&priv->miibus);
 	if (ret)

-- 
2.39.5




^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2024-11-13  8:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-11-13  8:29 [PATCH 0/3] davinci_mdio: clk fixes Sascha Hauer
2024-11-13  8:29 ` [PATCH 1/3] net: davinci_mdio: drop phy_mask detection Sascha Hauer
2024-11-13  8:29 ` [PATCH 2/3] net: davinci_mdio: initialize priv->dev Sascha Hauer
2024-11-13  8:29 ` [PATCH 3/3] net: davinci_mdio: initialize divider from clk Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox