Merge https://source.denx.de/u-boot/custodians/u-boot-sunxi
[platform/kernel/u-boot.git] / board / sunxi / gmac.c
1 #include <common.h>
2 #include <netdev.h>
3 #include <miiphy.h>
4 #include <asm/gpio.h>
5 #include <asm/io.h>
6 #include <asm/arch/clock.h>
7
8 void eth_init_board(void)
9 {
10         int pin;
11         struct sunxi_ccm_reg *const ccm =
12                 (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
13
14         /* Set MII clock */
15 #ifdef CONFIG_RGMII
16         setbits_le32(&ccm->gmac_clk_cfg, CCM_GMAC_CTRL_TX_CLK_SRC_INT_RGMII |
17                 CCM_GMAC_CTRL_GPIT_RGMII);
18         setbits_le32(&ccm->gmac_clk_cfg,
19                      CCM_GMAC_CTRL_TX_CLK_DELAY(CONFIG_GMAC_TX_DELAY));
20 #else
21         setbits_le32(&ccm->gmac_clk_cfg, CCM_GMAC_CTRL_TX_CLK_SRC_MII |
22                 CCM_GMAC_CTRL_GPIT_MII);
23 #endif
24
25 #ifndef CONFIG_MACH_SUN6I
26         /* Configure pin mux settings for GMAC */
27 #ifdef CONFIG_SUN7I_GMAC_FORCE_TXERR
28         for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(17); pin++) {
29 #else
30         for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(16); pin++) {
31 #endif
32 #ifdef CONFIG_RGMII
33                 /* skip unused pins in RGMII mode */
34                 if (pin == SUNXI_GPA(9) || pin == SUNXI_GPA(14))
35                         continue;
36 #endif
37                 sunxi_gpio_set_cfgpin(pin, SUN7I_GPA_GMAC);
38                 sunxi_gpio_set_drv(pin, 3);
39         }
40 #elif defined CONFIG_RGMII
41         /* Configure sun6i RGMII mode pin mux settings */
42         for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(3); pin++) {
43                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
44                 sunxi_gpio_set_drv(pin, 3);
45         }
46         for (pin = SUNXI_GPA(9); pin <= SUNXI_GPA(14); pin++) {
47                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
48                 sunxi_gpio_set_drv(pin, 3);
49         }
50         for (pin = SUNXI_GPA(19); pin <= SUNXI_GPA(20); pin++) {
51                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
52                 sunxi_gpio_set_drv(pin, 3);
53         }
54         for (pin = SUNXI_GPA(25); pin <= SUNXI_GPA(27); pin++) {
55                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
56                 sunxi_gpio_set_drv(pin, 3);
57         }
58 #elif defined CONFIG_GMII
59         /* Configure sun6i GMII mode pin mux settings */
60         for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(27); pin++) {
61                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
62                 sunxi_gpio_set_drv(pin, 2);
63         }
64 #else
65         /* Configure sun6i MII mode pin mux settings */
66         for (pin = SUNXI_GPA(0); pin <= SUNXI_GPA(3); pin++)
67                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
68         for (pin = SUNXI_GPA(8); pin <= SUNXI_GPA(9); pin++)
69                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
70         for (pin = SUNXI_GPA(11); pin <= SUNXI_GPA(14); pin++)
71                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
72         for (pin = SUNXI_GPA(19); pin <= SUNXI_GPA(24); pin++)
73                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
74         for (pin = SUNXI_GPA(26); pin <= SUNXI_GPA(27); pin++)
75                 sunxi_gpio_set_cfgpin(pin, SUN6I_GPA_GMAC);
76 #endif
77 }