[U-Boot] [PATCH v2] pm9g45_v1.3: make ethernet works

Asen Dimov dimov at ronetix.at
Thu Feb 17 14:46:18 CET 2011


V2:
- put the PHY reset/init code on a proper place, so now
in the config file PHY reset could be enabled/disabled
if nRST signal is not long enough.

Signed-off-by: Asen Dimov <dimov at ronetix.at>
---
 board/ronetix/pm9g45/pm9g45.c |   50 +++++++++++++++++++++++++++--------------
 include/configs/pm9g45.h      |    5 ++++
 2 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/board/ronetix/pm9g45/pm9g45.c b/board/ronetix/pm9g45/pm9g45.c
index 79b7c9d..d9e16b9 100644
--- a/board/ronetix/pm9g45/pm9g45.c
+++ b/board/ronetix/pm9g45/pm9g45.c
@@ -108,23 +108,6 @@ static void pm9g45_macb_hw_init(void)
 	/* Enable clock */
 	writel(1 << AT91SAM9G45_ID_EMAC, &pmc->pcer);
 
-	/*
-	 * Disable pull-up on:
-	 *	RXDV (PA15) => PHY normal mode (not Test mode)
-	 *	ERX0 (PA12) => PHY ADDR0
-	 *	ERX1 (PA13) => PHY ADDR1 => PHYADDR = 0x0
-	 *
-	 * PHY has internal pull-down
-	 */
-	at91_set_pio_pullup(AT91_PIO_PORTA, 15, 0);
-	at91_set_pio_pullup(AT91_PIO_PORTA, 12, 0);
-	at91_set_pio_pullup(AT91_PIO_PORTA, 13, 0);
-
-	/* Re-enable pull-up */
-	at91_set_pio_pullup(AT91_PIO_PORTA, 15, 1);
-	at91_set_pio_pullup(AT91_PIO_PORTA, 12, 1);
-	at91_set_pio_pullup(AT91_PIO_PORTA, 13, 1);
-
 	at91_macb_hw_init();
 }
 #endif
@@ -174,6 +157,39 @@ void dram_init_banksize(void)
 #ifdef CONFIG_RESET_PHY_R
 void reset_phy(void)
 {
+	at91_rstc_t	*rstc	= (at91_rstc_t *) AT91_RSTC_BASE;
+	unsigned long	erstl;
+
+	/*
+	 * Disable pull-up on:
+	 *	RXDV (PA15) => PHY normal mode (not Test mode)
+	 *	ERX0 (PA12) => PHY ADDR0
+	 *	ERX1 (PA13) => PHY ADDR1 => PHYADDR = 0x0
+	 *
+	 * PHY has internal pull-down
+	 */
+	at91_set_pio_pullup(AT91_PIO_PORTA, 15, 0);
+	at91_set_pio_pullup(AT91_PIO_PORTA, 12, 0);
+	at91_set_pio_pullup(AT91_PIO_PORTA, 13, 0);
+
+	erstl = readl(&rstc->mr) & AT91_RSTC_MR_ERSTL_MASK;
+
+	/* Need to reset PHY -> 500ms reset */
+	writel(AT91_RSTC_KEY | AT91_RSTC_MR_ERSTL(0x0D) |
+		AT91_RSTC_MR_URSTEN, &rstc->mr);
+	writel(AT91_RSTC_KEY | AT91_RSTC_CR_EXTRST, &rstc->cr);
+
+	/* Wait for end hardware reset */
+	while (!(readl(&rstc->sr) & AT91_RSTC_SR_NRSTL));
+
+	/* Restore NRST value */
+	writel(AT91_RSTC_KEY | erstl | AT91_RSTC_MR_URSTEN, &rstc->mr);
+
+	/* Re-enable pull-up */
+	at91_set_pio_pullup(AT91_PIO_PORTA, 15, 1);
+	at91_set_pio_pullup(AT91_PIO_PORTA, 12, 1);
+	at91_set_pio_pullup(AT91_PIO_PORTA, 13, 1);
+
 #ifdef CONFIG_MACB
 	/*
 	 * Initialize ethernet HW addr prior to starting Linux,
diff --git a/include/configs/pm9g45.h b/include/configs/pm9g45.h
index ec51ccf..4d8089f 100644
--- a/include/configs/pm9g45.h
+++ b/include/configs/pm9g45.h
@@ -125,6 +125,11 @@
 #define CONFIG_NET_MULTI		1
 #define CONFIG_NET_RETRY_COUNT		20
 #define CONFIG_RESET_PHY_R		1
+#define CONFIG_MACB_SEARCH_PHY
+#define CONFIG_CMD_MII
+#define CONFIG_OVERWRITE_ETHADDR_ONCE
+/* MAC is Organizationally Unique Identifier + 3 octects user numbers */
+#define CONFIG_ETHADDR		"02:00:00:fe:ed:00"
 
 /* USB */
 #define CONFIG_USB_ATMEL
-- 
1.5.5.6



More information about the U-Boot mailing list