arm: atmel: add gmac support for sama5d3xek board
authorBo Shen <voice.shen@atmel.com>
Wed, 26 Jun 2013 02:11:06 +0000 (10:11 +0800)
committerAndreas Bießmann <andreas.devel@googlemail.com>
Thu, 22 Aug 2013 14:49:54 +0000 (16:49 +0200)
add gmac support for sama5d3xek board, the gmac embedded in:
  - sama5d33, sama5d34, sama5d35

Signed-off-by: Bo Shen <voice.shen@atmel.com>
Signed-off-by: Andreas Bießmann <andreas.devel@googlemail.com>
arch/arm/cpu/armv7/at91/sama5d3_devices.c
arch/arm/include/asm/arch-at91/at91_common.h
board/atmel/sama5d3xek/sama5d3xek.c
include/configs/sama5d3xek.h

index 4a3fca56a1a94409abd7bf4d2e2461af271fbf82..e55e1c660255a0e5c9034a5d7a9d4ea283a4cc4b 100644 (file)
@@ -144,6 +144,30 @@ void at91_macb_hw_init(void)
        /* Enable clock */
        at91_periph_clk_enable(ATMEL_ID_EMAC);
 }
+
+void at91_gmac_hw_init(void)
+{
+       at91_set_a_periph(AT91_PIO_PORTB, 0, 0);        /* GTX0 */
+       at91_set_a_periph(AT91_PIO_PORTB, 1, 0);        /* GTX1 */
+       at91_set_a_periph(AT91_PIO_PORTB, 2, 0);        /* GTX2 */
+       at91_set_a_periph(AT91_PIO_PORTB, 3, 0);        /* GTX3 */
+       at91_set_a_periph(AT91_PIO_PORTB, 4, 0);        /* GRX0 */
+       at91_set_a_periph(AT91_PIO_PORTB, 5, 0);        /* GRX1 */
+       at91_set_a_periph(AT91_PIO_PORTB, 6, 0);        /* GRX2 */
+       at91_set_a_periph(AT91_PIO_PORTB, 7, 0);        /* GRX3 */
+       at91_set_a_periph(AT91_PIO_PORTB, 8, 0);        /* GTXCK */
+       at91_set_a_periph(AT91_PIO_PORTB, 9, 0);        /* GTXEN */
+
+       at91_set_a_periph(AT91_PIO_PORTB, 11, 0);       /* GRXCK */
+       at91_set_a_periph(AT91_PIO_PORTB, 13, 0);       /* GRXER */
+
+       at91_set_a_periph(AT91_PIO_PORTB, 16, 0);       /* GMDC */
+       at91_set_a_periph(AT91_PIO_PORTB, 17, 0);       /* GMDIO */
+       at91_set_a_periph(AT91_PIO_PORTB, 18, 0);       /* G125CK */
+
+       /* Enable clock */
+       at91_periph_clk_enable(ATMEL_ID_GMAC);
+}
 #endif
 
 #ifdef CONFIG_LCD
index d6597023c6e31b02b5e2bfcb099c8075f2965f39..9f54fddce51efe63473fbb403f51be20efffdc4e 100644 (file)
@@ -10,6 +10,7 @@
 #define AT91_COMMON_H
 
 void at91_can_hw_init(void);
+void at91_gmac_hw_init(void);
 void at91_macb_hw_init(void);
 void at91_mci_hw_init(void);
 void at91_serial0_hw_init(void);
index 4a309ad17f575697e0b1b539d930ebacc7d314da..97caf64d4040fe33e0c00fca362bbdc09ddbac7b 100644 (file)
@@ -17,6 +17,7 @@
 #include <lcd.h>
 #include <atmel_lcdc.h>
 #include <atmel_mci.h>
+#include <micrel.h>
 #include <net.h>
 #include <netdev.h>
 
@@ -178,6 +179,8 @@ int board_init(void)
 #ifdef CONFIG_MACB
        if (has_emac())
                at91_macb_hw_init();
+       if (has_gmac())
+               at91_gmac_hw_init();
 #endif
 #ifdef CONFIG_LCD
        if (has_lcdc())
@@ -193,6 +196,21 @@ int dram_init(void)
        return 0;
 }
 
+int board_phy_config(struct phy_device *phydev)
+{
+       /* rx data delay */
+       ksz9021_phy_extended_write(phydev,
+                                  MII_KSZ9021_EXT_RGMII_RX_DATA_SKEW, 0x2222);
+       /* tx data delay */
+       ksz9021_phy_extended_write(phydev,
+                                  MII_KSZ9021_EXT_RGMII_TX_DATA_SKEW, 0x2222);
+       /* rx/tx clock delay */
+       ksz9021_phy_extended_write(phydev,
+                                  MII_KSZ9021_EXT_RGMII_CLOCK_SKEW, 0xf2f4);
+
+       return 0;
+}
+
 int board_eth_init(bd_t *bis)
 {
        int rc = 0;
@@ -200,6 +218,8 @@ int board_eth_init(bd_t *bis)
 #ifdef CONFIG_MACB
        if (has_emac())
                rc = macb_eth_initialize(0, (void *)ATMEL_BASE_EMAC, 0x00);
+       if (has_gmac())
+               rc = macb_eth_initialize(0, (void *)ATMEL_BASE_GMAC, 0x00);
 #endif
 
        return rc;
index 10697d627af6d573d9f93b84258ba27d8adf396b..3dcf012dd87d0e78a20e43e9f3764829d8ed22c1 100644 (file)
 #define CONFIG_NET_MULTI
 #define CONFIG_NET_RETRY_COUNT         20
 #define CONFIG_MACB_SEARCH_PHY
+#define CONFIG_RGMII
+#define CONFIG_CMD_MII
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MICREL
+#define CONFIG_PHY_MICREL_KSZ9021
 
 /* MMC */
 #define CONFIG_CMD_MMC