xref: /openbmc/u-boot/arch/arm/mach-kirkwood/cpu.c (revision 56f86e39e80c5cbb17bec42cf6931cd203176830)
1*56f86e39SMasahiro Yamada /*
2*56f86e39SMasahiro Yamada  * (C) Copyright 2009
3*56f86e39SMasahiro Yamada  * Marvell Semiconductor <www.marvell.com>
4*56f86e39SMasahiro Yamada  * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
5*56f86e39SMasahiro Yamada  *
6*56f86e39SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
7*56f86e39SMasahiro Yamada  */
8*56f86e39SMasahiro Yamada 
9*56f86e39SMasahiro Yamada #include <common.h>
10*56f86e39SMasahiro Yamada #include <netdev.h>
11*56f86e39SMasahiro Yamada #include <asm/cache.h>
12*56f86e39SMasahiro Yamada #include <asm/io.h>
13*56f86e39SMasahiro Yamada #include <asm/arch/cpu.h>
14*56f86e39SMasahiro Yamada #include <asm/arch/soc.h>
15*56f86e39SMasahiro Yamada #include <mvebu_mmc.h>
16*56f86e39SMasahiro Yamada 
17*56f86e39SMasahiro Yamada void reset_cpu(unsigned long ignored)
18*56f86e39SMasahiro Yamada {
19*56f86e39SMasahiro Yamada 	struct kwcpu_registers *cpureg =
20*56f86e39SMasahiro Yamada 	    (struct kwcpu_registers *)KW_CPU_REG_BASE;
21*56f86e39SMasahiro Yamada 
22*56f86e39SMasahiro Yamada 	writel(readl(&cpureg->rstoutn_mask) | (1 << 2),
23*56f86e39SMasahiro Yamada 		&cpureg->rstoutn_mask);
24*56f86e39SMasahiro Yamada 	writel(readl(&cpureg->sys_soft_rst) | 1,
25*56f86e39SMasahiro Yamada 		&cpureg->sys_soft_rst);
26*56f86e39SMasahiro Yamada 	while (1) ;
27*56f86e39SMasahiro Yamada }
28*56f86e39SMasahiro Yamada 
29*56f86e39SMasahiro Yamada /*
30*56f86e39SMasahiro Yamada  * Window Size
31*56f86e39SMasahiro Yamada  * Used with the Base register to set the address window size and location.
32*56f86e39SMasahiro Yamada  * Must be programmed from LSB to MSB as sequence of ones followed by
33*56f86e39SMasahiro Yamada  * sequence of zeros. The number of ones specifies the size of the window in
34*56f86e39SMasahiro Yamada  * 64 KByte granularity (e.g., a value of 0x00FF specifies 256 = 16 MByte).
35*56f86e39SMasahiro Yamada  * NOTE: A value of 0x0 specifies 64-KByte size.
36*56f86e39SMasahiro Yamada  */
37*56f86e39SMasahiro Yamada unsigned int kw_winctrl_calcsize(unsigned int sizeval)
38*56f86e39SMasahiro Yamada {
39*56f86e39SMasahiro Yamada 	int i;
40*56f86e39SMasahiro Yamada 	unsigned int j = 0;
41*56f86e39SMasahiro Yamada 	u32 val = sizeval >> 1;
42*56f86e39SMasahiro Yamada 
43*56f86e39SMasahiro Yamada 	for (i = 0; val >= 0x10000; i++) {
44*56f86e39SMasahiro Yamada 		j |= (1 << i);
45*56f86e39SMasahiro Yamada 		val = val >> 1;
46*56f86e39SMasahiro Yamada 	}
47*56f86e39SMasahiro Yamada 	return (0x0000ffff & j);
48*56f86e39SMasahiro Yamada }
49*56f86e39SMasahiro Yamada 
50*56f86e39SMasahiro Yamada /*
51*56f86e39SMasahiro Yamada  * kw_config_adr_windows - Configure address Windows
52*56f86e39SMasahiro Yamada  *
53*56f86e39SMasahiro Yamada  * There are 8 address windows supported by Kirkwood Soc to addess different
54*56f86e39SMasahiro Yamada  * devices. Each window can be configured for size, BAR and remap addr
55*56f86e39SMasahiro Yamada  * Below configuration is standard for most of the cases
56*56f86e39SMasahiro Yamada  *
57*56f86e39SMasahiro Yamada  * If remap function not used, remap_lo must be set as base
58*56f86e39SMasahiro Yamada  *
59*56f86e39SMasahiro Yamada  * Reference Documentation:
60*56f86e39SMasahiro Yamada  * Mbus-L to Mbus Bridge Registers Configuration.
61*56f86e39SMasahiro Yamada  * (Sec 25.1 and 25.3 of Datasheet)
62*56f86e39SMasahiro Yamada  */
63*56f86e39SMasahiro Yamada int kw_config_adr_windows(void)
64*56f86e39SMasahiro Yamada {
65*56f86e39SMasahiro Yamada 	struct kwwin_registers *winregs =
66*56f86e39SMasahiro Yamada 		(struct kwwin_registers *)KW_CPU_WIN_BASE;
67*56f86e39SMasahiro Yamada 
68*56f86e39SMasahiro Yamada 	/* Window 0: PCIE MEM address space */
69*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 256, KWCPU_TARGET_PCIE,
70*56f86e39SMasahiro Yamada 		KWCPU_ATTR_PCIE_MEM, KWCPU_WIN_ENABLE), &winregs[0].ctrl);
71*56f86e39SMasahiro Yamada 
72*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_PCI_MEM, &winregs[0].base);
73*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_PCI_MEM, &winregs[0].remap_lo);
74*56f86e39SMasahiro Yamada 	writel(0x0, &winregs[0].remap_hi);
75*56f86e39SMasahiro Yamada 
76*56f86e39SMasahiro Yamada 	/* Window 1: PCIE IO address space */
77*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_CTRL_DATA(1024 * 64, KWCPU_TARGET_PCIE,
78*56f86e39SMasahiro Yamada 		KWCPU_ATTR_PCIE_IO, KWCPU_WIN_ENABLE), &winregs[1].ctrl);
79*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_PCI_IO, &winregs[1].base);
80*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_PCI_IO_REMAP, &winregs[1].remap_lo);
81*56f86e39SMasahiro Yamada 	writel(0x0, &winregs[1].remap_hi);
82*56f86e39SMasahiro Yamada 
83*56f86e39SMasahiro Yamada 	/* Window 2: NAND Flash address space */
84*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 128, KWCPU_TARGET_MEMORY,
85*56f86e39SMasahiro Yamada 		KWCPU_ATTR_NANDFLASH, KWCPU_WIN_ENABLE), &winregs[2].ctrl);
86*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_NANDF, &winregs[2].base);
87*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_NANDF, &winregs[2].remap_lo);
88*56f86e39SMasahiro Yamada 	writel(0x0, &winregs[2].remap_hi);
89*56f86e39SMasahiro Yamada 
90*56f86e39SMasahiro Yamada 	/* Window 3: SPI Flash address space */
91*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 128, KWCPU_TARGET_MEMORY,
92*56f86e39SMasahiro Yamada 		KWCPU_ATTR_SPIFLASH, KWCPU_WIN_ENABLE), &winregs[3].ctrl);
93*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_SPIF, &winregs[3].base);
94*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_SPIF, &winregs[3].remap_lo);
95*56f86e39SMasahiro Yamada 	writel(0x0, &winregs[3].remap_hi);
96*56f86e39SMasahiro Yamada 
97*56f86e39SMasahiro Yamada 	/* Window 4: BOOT Memory address space */
98*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_CTRL_DATA(1024 * 1024 * 128, KWCPU_TARGET_MEMORY,
99*56f86e39SMasahiro Yamada 		KWCPU_ATTR_BOOTROM, KWCPU_WIN_ENABLE), &winregs[4].ctrl);
100*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_BOOTROM, &winregs[4].base);
101*56f86e39SMasahiro Yamada 
102*56f86e39SMasahiro Yamada 	/* Window 5: Security SRAM address space */
103*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_CTRL_DATA(1024 * 64, KWCPU_TARGET_SASRAM,
104*56f86e39SMasahiro Yamada 		KWCPU_ATTR_SASRAM, KWCPU_WIN_ENABLE), &winregs[5].ctrl);
105*56f86e39SMasahiro Yamada 	writel(KW_DEFADR_SASRAM, &winregs[5].base);
106*56f86e39SMasahiro Yamada 
107*56f86e39SMasahiro Yamada 	/* Window 6-7: Disabled */
108*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_DISABLE, &winregs[6].ctrl);
109*56f86e39SMasahiro Yamada 	writel(KWCPU_WIN_DISABLE, &winregs[7].ctrl);
110*56f86e39SMasahiro Yamada 
111*56f86e39SMasahiro Yamada 	return 0;
112*56f86e39SMasahiro Yamada }
113*56f86e39SMasahiro Yamada 
114*56f86e39SMasahiro Yamada /*
115*56f86e39SMasahiro Yamada  * SYSRSTn Duration Counter Support
116*56f86e39SMasahiro Yamada  *
117*56f86e39SMasahiro Yamada  * Kirkwood SoC implements a hardware-based SYSRSTn duration counter.
118*56f86e39SMasahiro Yamada  * When SYSRSTn is asserted low, a SYSRSTn duration counter is running.
119*56f86e39SMasahiro Yamada  * The SYSRSTn duration counter is useful for implementing a manufacturer
120*56f86e39SMasahiro Yamada  * or factory reset. Upon a long reset assertion that is greater than a
121*56f86e39SMasahiro Yamada  * pre-configured environment variable value for sysrstdelay,
122*56f86e39SMasahiro Yamada  * The counter value is stored in the SYSRSTn Length Counter Register
123*56f86e39SMasahiro Yamada  * The counter is based on the 25-MHz reference clock (40ns)
124*56f86e39SMasahiro Yamada  * It is a 29-bit counter, yielding a maximum counting duration of
125*56f86e39SMasahiro Yamada  * 2^29/25 MHz (21.4 seconds). When the counter reach its maximum value,
126*56f86e39SMasahiro Yamada  * it remains at this value until counter reset is triggered by setting
127*56f86e39SMasahiro Yamada  * bit 31 of KW_REG_SYSRST_CNT
128*56f86e39SMasahiro Yamada  */
129*56f86e39SMasahiro Yamada static void kw_sysrst_action(void)
130*56f86e39SMasahiro Yamada {
131*56f86e39SMasahiro Yamada 	int ret;
132*56f86e39SMasahiro Yamada 	char *s = getenv("sysrstcmd");
133*56f86e39SMasahiro Yamada 
134*56f86e39SMasahiro Yamada 	if (!s) {
135*56f86e39SMasahiro Yamada 		debug("Error.. %s failed, check sysrstcmd\n",
136*56f86e39SMasahiro Yamada 			__FUNCTION__);
137*56f86e39SMasahiro Yamada 		return;
138*56f86e39SMasahiro Yamada 	}
139*56f86e39SMasahiro Yamada 
140*56f86e39SMasahiro Yamada 	debug("Starting %s process...\n", __FUNCTION__);
141*56f86e39SMasahiro Yamada 	ret = run_command(s, 0);
142*56f86e39SMasahiro Yamada 	if (ret != 0)
143*56f86e39SMasahiro Yamada 		debug("Error.. %s failed\n", __FUNCTION__);
144*56f86e39SMasahiro Yamada 	else
145*56f86e39SMasahiro Yamada 		debug("%s process finished\n", __FUNCTION__);
146*56f86e39SMasahiro Yamada }
147*56f86e39SMasahiro Yamada 
148*56f86e39SMasahiro Yamada static void kw_sysrst_check(void)
149*56f86e39SMasahiro Yamada {
150*56f86e39SMasahiro Yamada 	u32 sysrst_cnt, sysrst_dly;
151*56f86e39SMasahiro Yamada 	char *s;
152*56f86e39SMasahiro Yamada 
153*56f86e39SMasahiro Yamada 	/*
154*56f86e39SMasahiro Yamada 	 * no action if sysrstdelay environment variable is not defined
155*56f86e39SMasahiro Yamada 	 */
156*56f86e39SMasahiro Yamada 	s = getenv("sysrstdelay");
157*56f86e39SMasahiro Yamada 	if (s == NULL)
158*56f86e39SMasahiro Yamada 		return;
159*56f86e39SMasahiro Yamada 
160*56f86e39SMasahiro Yamada 	/* read sysrstdelay value */
161*56f86e39SMasahiro Yamada 	sysrst_dly = (u32) simple_strtoul(s, NULL, 10);
162*56f86e39SMasahiro Yamada 
163*56f86e39SMasahiro Yamada 	/* read SysRst Length counter register (bits 28:0) */
164*56f86e39SMasahiro Yamada 	sysrst_cnt = (0x1fffffff & readl(KW_REG_SYSRST_CNT));
165*56f86e39SMasahiro Yamada 	debug("H/w Rst hold time: %d.%d secs\n",
166*56f86e39SMasahiro Yamada 		sysrst_cnt / SYSRST_CNT_1SEC_VAL,
167*56f86e39SMasahiro Yamada 		sysrst_cnt % SYSRST_CNT_1SEC_VAL);
168*56f86e39SMasahiro Yamada 
169*56f86e39SMasahiro Yamada 	/* clear the counter for next valid read*/
170*56f86e39SMasahiro Yamada 	writel(1 << 31, KW_REG_SYSRST_CNT);
171*56f86e39SMasahiro Yamada 
172*56f86e39SMasahiro Yamada 	/*
173*56f86e39SMasahiro Yamada 	 * sysrst_action:
174*56f86e39SMasahiro Yamada 	 * if H/w Reset key is pressed and hold for time
175*56f86e39SMasahiro Yamada 	 * more than sysrst_dly in seconds
176*56f86e39SMasahiro Yamada 	 */
177*56f86e39SMasahiro Yamada 	if (sysrst_cnt >= SYSRST_CNT_1SEC_VAL * sysrst_dly)
178*56f86e39SMasahiro Yamada 		kw_sysrst_action();
179*56f86e39SMasahiro Yamada }
180*56f86e39SMasahiro Yamada 
181*56f86e39SMasahiro Yamada #if defined(CONFIG_DISPLAY_CPUINFO)
182*56f86e39SMasahiro Yamada int print_cpuinfo(void)
183*56f86e39SMasahiro Yamada {
184*56f86e39SMasahiro Yamada 	char *rev = "??";
185*56f86e39SMasahiro Yamada 	u16 devid = (readl(KW_REG_PCIE_DEVID) >> 16) & 0xffff;
186*56f86e39SMasahiro Yamada 	u8 revid = readl(KW_REG_PCIE_REVID) & 0xff;
187*56f86e39SMasahiro Yamada 
188*56f86e39SMasahiro Yamada 	if ((readl(KW_REG_DEVICE_ID) & 0x03) > 2) {
189*56f86e39SMasahiro Yamada 		printf("Error.. %s:Unsupported Kirkwood SoC 88F%04x\n", __FUNCTION__, devid);
190*56f86e39SMasahiro Yamada 		return -1;
191*56f86e39SMasahiro Yamada 	}
192*56f86e39SMasahiro Yamada 
193*56f86e39SMasahiro Yamada 	switch (revid) {
194*56f86e39SMasahiro Yamada 	case 0:
195*56f86e39SMasahiro Yamada 		if (devid == 0x6281)
196*56f86e39SMasahiro Yamada 			rev = "Z0";
197*56f86e39SMasahiro Yamada 		else if (devid == 0x6282)
198*56f86e39SMasahiro Yamada 			rev = "A0";
199*56f86e39SMasahiro Yamada 		break;
200*56f86e39SMasahiro Yamada 	case 1:
201*56f86e39SMasahiro Yamada 		rev = "A1";
202*56f86e39SMasahiro Yamada 		break;
203*56f86e39SMasahiro Yamada 	case 2:
204*56f86e39SMasahiro Yamada 		rev = "A0";
205*56f86e39SMasahiro Yamada 		break;
206*56f86e39SMasahiro Yamada 	case 3:
207*56f86e39SMasahiro Yamada 		rev = "A1";
208*56f86e39SMasahiro Yamada 		break;
209*56f86e39SMasahiro Yamada 	default:
210*56f86e39SMasahiro Yamada 		break;
211*56f86e39SMasahiro Yamada 	}
212*56f86e39SMasahiro Yamada 
213*56f86e39SMasahiro Yamada 	printf("SoC:   Kirkwood 88F%04x_%s\n", devid, rev);
214*56f86e39SMasahiro Yamada 	return 0;
215*56f86e39SMasahiro Yamada }
216*56f86e39SMasahiro Yamada #endif /* CONFIG_DISPLAY_CPUINFO */
217*56f86e39SMasahiro Yamada 
218*56f86e39SMasahiro Yamada #ifdef CONFIG_ARCH_CPU_INIT
219*56f86e39SMasahiro Yamada int arch_cpu_init(void)
220*56f86e39SMasahiro Yamada {
221*56f86e39SMasahiro Yamada 	u32 reg;
222*56f86e39SMasahiro Yamada 	struct kwcpu_registers *cpureg =
223*56f86e39SMasahiro Yamada 		(struct kwcpu_registers *)KW_CPU_REG_BASE;
224*56f86e39SMasahiro Yamada 
225*56f86e39SMasahiro Yamada 	/* Linux expects` the internal registers to be at 0xf1000000 */
226*56f86e39SMasahiro Yamada 	writel(KW_REGS_PHY_BASE, KW_OFFSET_REG);
227*56f86e39SMasahiro Yamada 
228*56f86e39SMasahiro Yamada 	/* Enable and invalidate L2 cache in write through mode */
229*56f86e39SMasahiro Yamada 	writel(readl(&cpureg->l2_cfg) | 0x18, &cpureg->l2_cfg);
230*56f86e39SMasahiro Yamada 	invalidate_l2_cache();
231*56f86e39SMasahiro Yamada 
232*56f86e39SMasahiro Yamada 	kw_config_adr_windows();
233*56f86e39SMasahiro Yamada 
234*56f86e39SMasahiro Yamada #ifdef CONFIG_KIRKWOOD_RGMII_PAD_1V8
235*56f86e39SMasahiro Yamada 	/*
236*56f86e39SMasahiro Yamada 	 * Configures the I/O voltage of the pads connected to Egigabit
237*56f86e39SMasahiro Yamada 	 * Ethernet interface to 1.8V
238*56f86e39SMasahiro Yamada 	 * By default it is set to 3.3V
239*56f86e39SMasahiro Yamada 	 */
240*56f86e39SMasahiro Yamada 	reg = readl(KW_REG_MPP_OUT_DRV_REG);
241*56f86e39SMasahiro Yamada 	reg |= (1 << 7);
242*56f86e39SMasahiro Yamada 	writel(reg, KW_REG_MPP_OUT_DRV_REG);
243*56f86e39SMasahiro Yamada #endif
244*56f86e39SMasahiro Yamada #ifdef CONFIG_KIRKWOOD_EGIGA_INIT
245*56f86e39SMasahiro Yamada 	/*
246*56f86e39SMasahiro Yamada 	 * Set egiga port0/1 in normal functional mode
247*56f86e39SMasahiro Yamada 	 * This is required becasue on kirkwood by default ports are in reset mode
248*56f86e39SMasahiro Yamada 	 * OS egiga driver may not have provision to set them in normal mode
249*56f86e39SMasahiro Yamada 	 * and if u-boot is build without network support, network may fail at OS level
250*56f86e39SMasahiro Yamada 	 */
251*56f86e39SMasahiro Yamada 	reg = readl(KWGBE_PORT_SERIAL_CONTROL1_REG(0));
252*56f86e39SMasahiro Yamada 	reg &= ~(1 << 4);	/* Clear PortReset Bit */
253*56f86e39SMasahiro Yamada 	writel(reg, (KWGBE_PORT_SERIAL_CONTROL1_REG(0)));
254*56f86e39SMasahiro Yamada 	reg = readl(KWGBE_PORT_SERIAL_CONTROL1_REG(1));
255*56f86e39SMasahiro Yamada 	reg &= ~(1 << 4);	/* Clear PortReset Bit */
256*56f86e39SMasahiro Yamada 	writel(reg, (KWGBE_PORT_SERIAL_CONTROL1_REG(1)));
257*56f86e39SMasahiro Yamada #endif
258*56f86e39SMasahiro Yamada #ifdef CONFIG_KIRKWOOD_PCIE_INIT
259*56f86e39SMasahiro Yamada 	/*
260*56f86e39SMasahiro Yamada 	 * Enable PCI Express Port0
261*56f86e39SMasahiro Yamada 	 */
262*56f86e39SMasahiro Yamada 	reg = readl(&cpureg->ctrl_stat);
263*56f86e39SMasahiro Yamada 	reg |= (1 << 0);	/* Set PEX0En Bit */
264*56f86e39SMasahiro Yamada 	writel(reg, &cpureg->ctrl_stat);
265*56f86e39SMasahiro Yamada #endif
266*56f86e39SMasahiro Yamada 	return 0;
267*56f86e39SMasahiro Yamada }
268*56f86e39SMasahiro Yamada #endif /* CONFIG_ARCH_CPU_INIT */
269*56f86e39SMasahiro Yamada 
270*56f86e39SMasahiro Yamada /*
271*56f86e39SMasahiro Yamada  * SOC specific misc init
272*56f86e39SMasahiro Yamada  */
273*56f86e39SMasahiro Yamada #if defined(CONFIG_ARCH_MISC_INIT)
274*56f86e39SMasahiro Yamada int arch_misc_init(void)
275*56f86e39SMasahiro Yamada {
276*56f86e39SMasahiro Yamada 	volatile u32 temp;
277*56f86e39SMasahiro Yamada 
278*56f86e39SMasahiro Yamada 	/*CPU streaming & write allocate */
279*56f86e39SMasahiro Yamada 	temp = readfr_extra_feature_reg();
280*56f86e39SMasahiro Yamada 	temp &= ~(1 << 28);	/* disable wr alloc */
281*56f86e39SMasahiro Yamada 	writefr_extra_feature_reg(temp);
282*56f86e39SMasahiro Yamada 
283*56f86e39SMasahiro Yamada 	temp = readfr_extra_feature_reg();
284*56f86e39SMasahiro Yamada 	temp &= ~(1 << 29);	/* streaming disabled */
285*56f86e39SMasahiro Yamada 	writefr_extra_feature_reg(temp);
286*56f86e39SMasahiro Yamada 
287*56f86e39SMasahiro Yamada 	/* L2Cache settings */
288*56f86e39SMasahiro Yamada 	temp = readfr_extra_feature_reg();
289*56f86e39SMasahiro Yamada 	/* Disable L2C pre fetch - Set bit 24 */
290*56f86e39SMasahiro Yamada 	temp |= (1 << 24);
291*56f86e39SMasahiro Yamada 	/* enable L2C - Set bit 22 */
292*56f86e39SMasahiro Yamada 	temp |= (1 << 22);
293*56f86e39SMasahiro Yamada 	writefr_extra_feature_reg(temp);
294*56f86e39SMasahiro Yamada 
295*56f86e39SMasahiro Yamada 	icache_enable();
296*56f86e39SMasahiro Yamada 	/* Change reset vector to address 0x0 */
297*56f86e39SMasahiro Yamada 	temp = get_cr();
298*56f86e39SMasahiro Yamada 	set_cr(temp & ~CR_V);
299*56f86e39SMasahiro Yamada 
300*56f86e39SMasahiro Yamada 	/* checks and execute resset to factory event */
301*56f86e39SMasahiro Yamada 	kw_sysrst_check();
302*56f86e39SMasahiro Yamada 
303*56f86e39SMasahiro Yamada 	return 0;
304*56f86e39SMasahiro Yamada }
305*56f86e39SMasahiro Yamada #endif /* CONFIG_ARCH_MISC_INIT */
306*56f86e39SMasahiro Yamada 
307*56f86e39SMasahiro Yamada #ifdef CONFIG_MVGBE
308*56f86e39SMasahiro Yamada int cpu_eth_init(bd_t *bis)
309*56f86e39SMasahiro Yamada {
310*56f86e39SMasahiro Yamada 	mvgbe_initialize(bis);
311*56f86e39SMasahiro Yamada 	return 0;
312*56f86e39SMasahiro Yamada }
313*56f86e39SMasahiro Yamada #endif
314*56f86e39SMasahiro Yamada 
315*56f86e39SMasahiro Yamada #ifdef CONFIG_MVEBU_MMC
316*56f86e39SMasahiro Yamada int board_mmc_init(bd_t *bis)
317*56f86e39SMasahiro Yamada {
318*56f86e39SMasahiro Yamada 	mvebu_mmc_init(bis);
319*56f86e39SMasahiro Yamada 	return 0;
320*56f86e39SMasahiro Yamada }
321*56f86e39SMasahiro Yamada #endif /* CONFIG_MVEBU_MMC */
322