1*fcea480dSMarek Vasut /*
2*fcea480dSMarek Vasut * Aries M28 module
3*fcea480dSMarek Vasut *
4*fcea480dSMarek Vasut * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
5*fcea480dSMarek Vasut * on behalf of DENX Software Engineering GmbH
6*fcea480dSMarek Vasut *
7*fcea480dSMarek Vasut * SPDX-License-Identifier: GPL-2.0+
8*fcea480dSMarek Vasut */
9*fcea480dSMarek Vasut
10*fcea480dSMarek Vasut #include <common.h>
11*fcea480dSMarek Vasut #include <asm/gpio.h>
12*fcea480dSMarek Vasut #include <asm/io.h>
13*fcea480dSMarek Vasut #include <asm/arch/imx-regs.h>
14*fcea480dSMarek Vasut #include <asm/arch/iomux-mx28.h>
15*fcea480dSMarek Vasut #include <asm/arch/clock.h>
16*fcea480dSMarek Vasut #include <asm/arch/sys_proto.h>
17*fcea480dSMarek Vasut #include <linux/mii.h>
18*fcea480dSMarek Vasut #include <miiphy.h>
19*fcea480dSMarek Vasut #include <netdev.h>
20*fcea480dSMarek Vasut #include <errno.h>
21*fcea480dSMarek Vasut
22*fcea480dSMarek Vasut DECLARE_GLOBAL_DATA_PTR;
23*fcea480dSMarek Vasut
24*fcea480dSMarek Vasut /*
25*fcea480dSMarek Vasut * Functions
26*fcea480dSMarek Vasut */
board_early_init_f(void)27*fcea480dSMarek Vasut int board_early_init_f(void)
28*fcea480dSMarek Vasut {
29*fcea480dSMarek Vasut /* IO0 clock at 480MHz */
30*fcea480dSMarek Vasut mxs_set_ioclk(MXC_IOCLK0, 480000);
31*fcea480dSMarek Vasut /* IO1 clock at 480MHz */
32*fcea480dSMarek Vasut mxs_set_ioclk(MXC_IOCLK1, 480000);
33*fcea480dSMarek Vasut
34*fcea480dSMarek Vasut /* SSP0 clock at 96MHz */
35*fcea480dSMarek Vasut mxs_set_sspclk(MXC_SSPCLK0, 96000, 0);
36*fcea480dSMarek Vasut /* SSP2 clock at 160MHz */
37*fcea480dSMarek Vasut mxs_set_sspclk(MXC_SSPCLK2, 160000, 0);
38*fcea480dSMarek Vasut
39*fcea480dSMarek Vasut #ifdef CONFIG_CMD_USB
40*fcea480dSMarek Vasut mxs_iomux_setup_pad(MX28_PAD_SSP2_SS1__USB1_OVERCURRENT);
41*fcea480dSMarek Vasut mxs_iomux_setup_pad(MX28_PAD_AUART3_TX__GPIO_3_13 |
42*fcea480dSMarek Vasut MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP);
43*fcea480dSMarek Vasut gpio_direction_output(MX28_PAD_AUART3_TX__GPIO_3_13, 0);
44*fcea480dSMarek Vasut
45*fcea480dSMarek Vasut mxs_iomux_setup_pad(MX28_PAD_AUART3_RX__GPIO_3_12 |
46*fcea480dSMarek Vasut MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP);
47*fcea480dSMarek Vasut gpio_direction_output(MX28_PAD_AUART3_RX__GPIO_3_12, 0);
48*fcea480dSMarek Vasut #endif
49*fcea480dSMarek Vasut
50*fcea480dSMarek Vasut return 0;
51*fcea480dSMarek Vasut }
52*fcea480dSMarek Vasut
board_init(void)53*fcea480dSMarek Vasut int board_init(void)
54*fcea480dSMarek Vasut {
55*fcea480dSMarek Vasut /* Adress of boot parameters */
56*fcea480dSMarek Vasut gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
57*fcea480dSMarek Vasut
58*fcea480dSMarek Vasut return 0;
59*fcea480dSMarek Vasut }
60*fcea480dSMarek Vasut
dram_init(void)61*fcea480dSMarek Vasut int dram_init(void)
62*fcea480dSMarek Vasut {
63*fcea480dSMarek Vasut return mxs_dram_init();
64*fcea480dSMarek Vasut }
65*fcea480dSMarek Vasut
66*fcea480dSMarek Vasut #ifdef CONFIG_CMD_MMC
m28_mmc_wp(int id)67*fcea480dSMarek Vasut static int m28_mmc_wp(int id)
68*fcea480dSMarek Vasut {
69*fcea480dSMarek Vasut if (id != 0) {
70*fcea480dSMarek Vasut printf("MXS MMC: Invalid card selected (card id = %d)\n", id);
71*fcea480dSMarek Vasut return 1;
72*fcea480dSMarek Vasut }
73*fcea480dSMarek Vasut
74*fcea480dSMarek Vasut return gpio_get_value(MX28_PAD_AUART2_CTS__GPIO_3_10);
75*fcea480dSMarek Vasut }
76*fcea480dSMarek Vasut
board_mmc_init(bd_t * bis)77*fcea480dSMarek Vasut int board_mmc_init(bd_t *bis)
78*fcea480dSMarek Vasut {
79*fcea480dSMarek Vasut /* Configure WP as input. */
80*fcea480dSMarek Vasut gpio_direction_input(MX28_PAD_AUART2_CTS__GPIO_3_10);
81*fcea480dSMarek Vasut /* Turn on the power to the card. */
82*fcea480dSMarek Vasut gpio_direction_output(MX28_PAD_PWM3__GPIO_3_28, 0);
83*fcea480dSMarek Vasut
84*fcea480dSMarek Vasut return mxsmmc_initialize(bis, 0, m28_mmc_wp, NULL);
85*fcea480dSMarek Vasut }
86*fcea480dSMarek Vasut #endif
87*fcea480dSMarek Vasut
88*fcea480dSMarek Vasut #ifdef CONFIG_CMD_NET
89*fcea480dSMarek Vasut
90*fcea480dSMarek Vasut #define MII_OPMODE_STRAP_OVERRIDE 0x16
91*fcea480dSMarek Vasut #define MII_PHY_CTRL1 0x1e
92*fcea480dSMarek Vasut #define MII_PHY_CTRL2 0x1f
93*fcea480dSMarek Vasut
fecmxc_mii_postcall(int phy)94*fcea480dSMarek Vasut int fecmxc_mii_postcall(int phy)
95*fcea480dSMarek Vasut {
96*fcea480dSMarek Vasut #if defined(CONFIG_ARIES_M28_V11) || defined(CONFIG_ARIES_M28_V10)
97*fcea480dSMarek Vasut /* KZ8031 PHY on old boards. */
98*fcea480dSMarek Vasut const uint32_t freq = 0x0080;
99*fcea480dSMarek Vasut #else
100*fcea480dSMarek Vasut /* KZ8021 PHY on new boards. */
101*fcea480dSMarek Vasut const uint32_t freq = 0x0000;
102*fcea480dSMarek Vasut #endif
103*fcea480dSMarek Vasut
104*fcea480dSMarek Vasut miiphy_write("FEC1", phy, MII_BMCR, 0x9000);
105*fcea480dSMarek Vasut miiphy_write("FEC1", phy, MII_OPMODE_STRAP_OVERRIDE, 0x0202);
106*fcea480dSMarek Vasut if (phy == 3)
107*fcea480dSMarek Vasut miiphy_write("FEC1", 3, MII_PHY_CTRL2, 0x8100 | freq);
108*fcea480dSMarek Vasut return 0;
109*fcea480dSMarek Vasut }
110*fcea480dSMarek Vasut
board_eth_init(bd_t * bis)111*fcea480dSMarek Vasut int board_eth_init(bd_t *bis)
112*fcea480dSMarek Vasut {
113*fcea480dSMarek Vasut struct mxs_clkctrl_regs *clkctrl_regs =
114*fcea480dSMarek Vasut (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
115*fcea480dSMarek Vasut struct eth_device *dev;
116*fcea480dSMarek Vasut int ret;
117*fcea480dSMarek Vasut
118*fcea480dSMarek Vasut ret = cpu_eth_init(bis);
119*fcea480dSMarek Vasut if (ret)
120*fcea480dSMarek Vasut return ret;
121*fcea480dSMarek Vasut
122*fcea480dSMarek Vasut clrsetbits_le32(&clkctrl_regs->hw_clkctrl_enet,
123*fcea480dSMarek Vasut CLKCTRL_ENET_TIME_SEL_MASK | CLKCTRL_ENET_CLK_OUT_EN,
124*fcea480dSMarek Vasut CLKCTRL_ENET_TIME_SEL_RMII_CLK);
125*fcea480dSMarek Vasut
126*fcea480dSMarek Vasut #if !defined(CONFIG_ARIES_M28_V11) && !defined(CONFIG_ARIES_M28_V10)
127*fcea480dSMarek Vasut /* Reset the new PHY */
128*fcea480dSMarek Vasut gpio_direction_output(MX28_PAD_AUART2_RTS__GPIO_3_11, 0);
129*fcea480dSMarek Vasut udelay(10000);
130*fcea480dSMarek Vasut gpio_set_value(MX28_PAD_AUART2_RTS__GPIO_3_11, 1);
131*fcea480dSMarek Vasut udelay(10000);
132*fcea480dSMarek Vasut #endif
133*fcea480dSMarek Vasut
134*fcea480dSMarek Vasut ret = fecmxc_initialize_multi(bis, 0, 0, MXS_ENET0_BASE);
135*fcea480dSMarek Vasut if (ret) {
136*fcea480dSMarek Vasut printf("FEC MXS: Unable to init FEC0\n");
137*fcea480dSMarek Vasut return ret;
138*fcea480dSMarek Vasut }
139*fcea480dSMarek Vasut
140*fcea480dSMarek Vasut ret = fecmxc_initialize_multi(bis, 1, 3, MXS_ENET1_BASE);
141*fcea480dSMarek Vasut if (ret) {
142*fcea480dSMarek Vasut printf("FEC MXS: Unable to init FEC1\n");
143*fcea480dSMarek Vasut return ret;
144*fcea480dSMarek Vasut }
145*fcea480dSMarek Vasut
146*fcea480dSMarek Vasut dev = eth_get_dev_by_name("FEC0");
147*fcea480dSMarek Vasut if (!dev) {
148*fcea480dSMarek Vasut printf("FEC MXS: Unable to get FEC0 device entry\n");
149*fcea480dSMarek Vasut return -EINVAL;
150*fcea480dSMarek Vasut }
151*fcea480dSMarek Vasut
152*fcea480dSMarek Vasut ret = fecmxc_register_mii_postcall(dev, fecmxc_mii_postcall);
153*fcea480dSMarek Vasut if (ret) {
154*fcea480dSMarek Vasut printf("FEC MXS: Unable to register FEC0 mii postcall\n");
155*fcea480dSMarek Vasut return ret;
156*fcea480dSMarek Vasut }
157*fcea480dSMarek Vasut
158*fcea480dSMarek Vasut dev = eth_get_dev_by_name("FEC1");
159*fcea480dSMarek Vasut if (!dev) {
160*fcea480dSMarek Vasut printf("FEC MXS: Unable to get FEC1 device entry\n");
161*fcea480dSMarek Vasut return -EINVAL;
162*fcea480dSMarek Vasut }
163*fcea480dSMarek Vasut
164*fcea480dSMarek Vasut ret = fecmxc_register_mii_postcall(dev, fecmxc_mii_postcall);
165*fcea480dSMarek Vasut if (ret) {
166*fcea480dSMarek Vasut printf("FEC MXS: Unable to register FEC1 mii postcall\n");
167*fcea480dSMarek Vasut return ret;
168*fcea480dSMarek Vasut }
169*fcea480dSMarek Vasut
170*fcea480dSMarek Vasut return ret;
171*fcea480dSMarek Vasut }
172*fcea480dSMarek Vasut
173*fcea480dSMarek Vasut #endif
174