[linux-yocto] [PATCH 153/161] arch/powerpc: Fix Up the MDIO Offset and Period on Axxia

Cristian Bercaru cristian.bercaru at windriver.com
Thu May 21 12:22:15 PDT 2015


From: John Jacques <john.jacques at lsi.com>

If the MDIO offset and period are defined in the device tree,
use them.  Otherwise, don't change anything.

Signed-off-by: John Jacques <john.jacques at lsi.com>
Signed-off-by: Bruce Ashfield <bruce.ashfield at windriver.com>
---
 drivers/net/ethernet/lsi/lsi_acp_mdio.c |   38 +++++++++++++++++++++----------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/lsi/lsi_acp_mdio.c b/drivers/net/ethernet/lsi/lsi_acp_mdio.c
index aab609d..da7dc92 100644
--- a/drivers/net/ethernet/lsi/lsi_acp_mdio.c
+++ b/drivers/net/ethernet/lsi/lsi_acp_mdio.c
@@ -253,17 +253,12 @@ EXPORT_SYMBOL(acp_mdio_write);
  */
 
 static void
-acp_mdio_initialize(void)
+acp_mdio_initialize(int offset, int period)
 {
-#ifdef CONFIG_ARM
-	/* LSI AXM (ARM) Platforms. */
-	write_reg(MDIO_CLK_OFFSET, 0x1c);
-	write_reg(MDIO_CLK_PERIOD, 0xf0);
-#else
-	/* LSI ACP (PPC) Platforms. */
-	write_reg(MDIO_CLK_OFFSET, 0x10);
-	write_reg(MDIO_CLK_PERIOD, 0x2c);
-#endif
+	write_reg(MDIO_CLK_OFFSET, offset);
+	write_reg(MDIO_CLK_PERIOD, period);
+
+	return;
 }
 
 /*
@@ -279,10 +274,13 @@ acp_mdio_init(void)
 	void __iomem *map;
 	u64 mdio_address;
 	u32 mdio_size;
+	u32 mdio_offset = 0;
+	u32 mdio_period = 0;
 
 	pr_info("MDIO: Initializing Axxia Wrappers.\n");
 
 	mdio_priv = kzalloc(sizeof(struct lsi_mdio_priv), GFP_KERNEL);
+
 	if (!mdio_priv)
 		return -ENOMEM;
 
@@ -308,6 +306,7 @@ acp_mdio_init(void)
 	}
 
 	mdio_address = of_translate_address(np, field);
+
 	if (mdio_address == OF_BAD_ADDR) {
 		pr_crit("MDIO: of_translate_address failed!\n");
 		rc = -EINVAL;
@@ -316,14 +315,29 @@ acp_mdio_init(void)
 
 	mdio_size = field[1];
 	map = ioremap(mdio_address, mdio_size);
+
 	if (!map) {
 		pr_crit("MDIO: Unable to ioremap!\n");
 		rc = -ENOMEM;
 		goto error;
 	}
+
+	mdio_priv->base = (unsigned long)map;
+
 	mdio_priv->base = (unsigned long)map;
+	field = of_get_property(np, "mdio-clock-offset", NULL);
+
+	if (field)
+		mdio_offset = ntohl(field[0]);
+
+	field = of_get_property(np, "mdio-clock-period", NULL);
+
+	if (field)
+		mdio_period = ntohl(field[0]);
+
+	if (0 != mdio_offset && 0 != mdio_period)
+		acp_mdio_initialize(mdio_offset, mdio_period);
 
-	acp_mdio_initialize();
 error:
 	return rc;
 }
@@ -331,5 +345,5 @@ error:
 module_init(acp_mdio_init);
 
 MODULE_AUTHOR("LSI Corporation");
-MODULE_DESCRIPTION("Timing Test");
+MODULE_DESCRIPTION("MDIO Access");
 MODULE_LICENSE("GPL");
-- 
1.7.9.5



More information about the linux-yocto mailing list