xref: /rk3399_rockchip-uboot/board/davinci/da8xxevm/omapl138_lcdk.c (revision 00caae6d47645e68d6e5277aceb69592b49381a6)
1a868e443SPeter Howard /*
2a868e443SPeter Howard  * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
3a868e443SPeter Howard  *
4a868e443SPeter Howard  * Based on da850evm.c. Original Copyrights follow:
5a868e443SPeter Howard  *
6a868e443SPeter Howard  * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
7a868e443SPeter Howard  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
8a868e443SPeter Howard  *
95b8031ccSTom Rini  * SPDX-License-Identifier:	GPL-2.0+
10a868e443SPeter Howard  */
11a868e443SPeter Howard 
12a868e443SPeter Howard #include <common.h>
13a868e443SPeter Howard #include <i2c.h>
14a868e443SPeter Howard #include <net.h>
15a868e443SPeter Howard #include <netdev.h>
16a868e443SPeter Howard #include <spi.h>
17a868e443SPeter Howard #include <spi_flash.h>
18a868e443SPeter Howard #include <asm/arch/hardware.h>
19a868e443SPeter Howard #include <asm/ti-common/davinci_nand.h>
20a868e443SPeter Howard #include <asm/io.h>
211221ce45SMasahiro Yamada #include <linux/errno.h>
22c62db35dSSimon Glass #include <asm/mach-types.h>
23a868e443SPeter Howard #include <asm/arch/davinci_misc.h>
241d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
25a868e443SPeter Howard #include <mmc.h>
26a868e443SPeter Howard #include <asm/arch/sdmmc_defs.h>
27a868e443SPeter Howard #endif
28a868e443SPeter Howard 
29a868e443SPeter Howard DECLARE_GLOBAL_DATA_PTR;
30a868e443SPeter Howard 
31a868e443SPeter Howard #define pinmux(x)	(&davinci_syscfg_regs->pinmux[x])
32a868e443SPeter Howard 
331d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
34a868e443SPeter Howard /* MMC0 pin muxer settings */
35a868e443SPeter Howard const struct pinmux_config mmc0_pins[] = {
36a868e443SPeter Howard 	/* GP0[11] is required for SD to work on Rev 3 EVMs */
37a868e443SPeter Howard 	{ pinmux(0),  8, 4 },	/* GP0[11] */
38a868e443SPeter Howard 	{ pinmux(10), 2, 0 },	/* MMCSD0_CLK */
39a868e443SPeter Howard 	{ pinmux(10), 2, 1 },	/* MMCSD0_CMD */
40a868e443SPeter Howard 	{ pinmux(10), 2, 2 },	/* MMCSD0_DAT_0 */
41a868e443SPeter Howard 	{ pinmux(10), 2, 3 },	/* MMCSD0_DAT_1 */
42a868e443SPeter Howard 	{ pinmux(10), 2, 4 },	/* MMCSD0_DAT_2 */
43a868e443SPeter Howard 	{ pinmux(10), 2, 5 },	/* MMCSD0_DAT_3 */
44a868e443SPeter Howard 	/* LCDK supports only 4-bit mode, remaining pins are not configured */
45a868e443SPeter Howard };
46a868e443SPeter Howard #endif
47a868e443SPeter Howard 
48a868e443SPeter Howard /* UART pin muxer settings */
49a868e443SPeter Howard static const struct pinmux_config uart_pins[] = {
50a868e443SPeter Howard 	{ pinmux(0), 4, 6 },
51a868e443SPeter Howard 	{ pinmux(0), 4, 7 },
52a868e443SPeter Howard 	{ pinmux(4), 2, 4 },
53a868e443SPeter Howard 	{ pinmux(4), 2, 5 }
54a868e443SPeter Howard };
55a868e443SPeter Howard 
56a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC
57a868e443SPeter Howard static const struct pinmux_config emac_pins[] = {
58a868e443SPeter Howard 	{ pinmux(2), 8, 1 },
59a868e443SPeter Howard 	{ pinmux(2), 8, 2 },
60a868e443SPeter Howard 	{ pinmux(2), 8, 3 },
61a868e443SPeter Howard 	{ pinmux(2), 8, 4 },
62a868e443SPeter Howard 	{ pinmux(2), 8, 5 },
63a868e443SPeter Howard 	{ pinmux(2), 8, 6 },
64a868e443SPeter Howard 	{ pinmux(2), 8, 7 },
65a868e443SPeter Howard 	{ pinmux(3), 8, 0 },
66a868e443SPeter Howard 	{ pinmux(3), 8, 1 },
67a868e443SPeter Howard 	{ pinmux(3), 8, 2 },
68a868e443SPeter Howard 	{ pinmux(3), 8, 3 },
69a868e443SPeter Howard 	{ pinmux(3), 8, 4 },
70a868e443SPeter Howard 	{ pinmux(3), 8, 5 },
71a868e443SPeter Howard 	{ pinmux(3), 8, 6 },
72a868e443SPeter Howard 	{ pinmux(3), 8, 7 },
73a868e443SPeter Howard 	{ pinmux(4), 8, 0 },
74a868e443SPeter Howard 	{ pinmux(4), 8, 1 }
75a868e443SPeter Howard };
76a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC */
77a868e443SPeter Howard 
78a868e443SPeter Howard /* I2C pin muxer settings */
79a868e443SPeter Howard static const struct pinmux_config i2c_pins[] = {
80a868e443SPeter Howard 	{ pinmux(4), 2, 2 },
81a868e443SPeter Howard 	{ pinmux(4), 2, 3 }
82a868e443SPeter Howard };
83a868e443SPeter Howard 
84a868e443SPeter Howard #ifdef CONFIG_NAND_DAVINCI
85a868e443SPeter Howard const struct pinmux_config nand_pins[] = {
86a868e443SPeter Howard 	{ pinmux(7), 1, 1 },
87a868e443SPeter Howard 	{ pinmux(7), 1, 2 },
88a868e443SPeter Howard 	{ pinmux(7), 1, 4 },
89a868e443SPeter Howard 	{ pinmux(7), 1, 5 },
90a868e443SPeter Howard 	{ pinmux(8), 1, 0 },
91a868e443SPeter Howard 	{ pinmux(8), 1, 1 },
92a868e443SPeter Howard 	{ pinmux(8), 1, 2 },
93a868e443SPeter Howard 	{ pinmux(8), 1, 3 },
94a868e443SPeter Howard 	{ pinmux(8), 1, 4 },
95a868e443SPeter Howard 	{ pinmux(8), 1, 5 },
96a868e443SPeter Howard 	{ pinmux(8), 1, 6 },
97a868e443SPeter Howard 	{ pinmux(8), 1, 7 },
98a868e443SPeter Howard 	{ pinmux(9), 1, 0 },
99a868e443SPeter Howard 	{ pinmux(9), 1, 1 },
100a868e443SPeter Howard 	{ pinmux(9), 1, 2 },
101a868e443SPeter Howard 	{ pinmux(9), 1, 3 },
102a868e443SPeter Howard 	{ pinmux(9), 1, 4 },
103a868e443SPeter Howard 	{ pinmux(9), 1, 5 },
104a868e443SPeter Howard 	{ pinmux(9), 1, 6 },
105a868e443SPeter Howard 	{ pinmux(9), 1, 7 },
106a868e443SPeter Howard 	{ pinmux(12), 1, 5 },
107a868e443SPeter Howard 	{ pinmux(12), 1, 6 }
108a868e443SPeter Howard };
109a868e443SPeter Howard 
110a868e443SPeter Howard #endif
111a868e443SPeter Howard 
112a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
113a868e443SPeter Howard #define HAS_RMII 1
114a868e443SPeter Howard #else
115a868e443SPeter Howard #define HAS_RMII 0
116a868e443SPeter Howard #endif
117a868e443SPeter Howard 
118a868e443SPeter Howard const struct pinmux_resource pinmuxes[] = {
119a868e443SPeter Howard 	PINMUX_ITEM(uart_pins),
120a868e443SPeter Howard 	PINMUX_ITEM(i2c_pins),
121a868e443SPeter Howard #ifdef CONFIG_NAND_DAVINCI
122a868e443SPeter Howard 	PINMUX_ITEM(nand_pins),
123a868e443SPeter Howard #endif
124a868e443SPeter Howard };
125a868e443SPeter Howard 
126a868e443SPeter Howard const int pinmuxes_size = ARRAY_SIZE(pinmuxes);
127a868e443SPeter Howard 
128a868e443SPeter Howard const struct lpsc_resource lpsc[] = {
129a868e443SPeter Howard 	{ DAVINCI_LPSC_AEMIF },	/* NAND, NOR */
130a868e443SPeter Howard 	{ DAVINCI_LPSC_SPI1 },	/* Serial Flash */
131a868e443SPeter Howard 	{ DAVINCI_LPSC_EMAC },	/* image download */
132a868e443SPeter Howard 	{ DAVINCI_LPSC_UART2 },	/* console */
133a868e443SPeter Howard 	{ DAVINCI_LPSC_GPIO },
1341d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
135a868e443SPeter Howard 	{ DAVINCI_LPSC_MMC_SD },
136a868e443SPeter Howard #endif
137a868e443SPeter Howard };
138a868e443SPeter Howard 
139a868e443SPeter Howard const int lpsc_size = ARRAY_SIZE(lpsc);
140a868e443SPeter Howard 
141a868e443SPeter Howard #ifndef CONFIG_DA850_EVM_MAX_CPU_CLK
142a868e443SPeter Howard #define CONFIG_DA850_EVM_MAX_CPU_CLK	456000000
143a868e443SPeter Howard #endif
144a868e443SPeter Howard 
145a868e443SPeter Howard /*
146a868e443SPeter Howard  * get_board_rev() - setup to pass kernel board revision information
147a868e443SPeter Howard  * Returns:
148a868e443SPeter Howard  * bit[0-3]	Maximum cpu clock rate supported by onboard SoC
149a868e443SPeter Howard  *		0000b - 300 MHz
150a868e443SPeter Howard  *		0001b - 372 MHz
151a868e443SPeter Howard  *		0010b - 408 MHz
152a868e443SPeter Howard  *		0011b - 456 MHz
153a868e443SPeter Howard  */
get_board_rev(void)154a868e443SPeter Howard u32 get_board_rev(void)
155a868e443SPeter Howard {
156a868e443SPeter Howard 	return 0;
157a868e443SPeter Howard }
158a868e443SPeter Howard 
board_early_init_f(void)159a868e443SPeter Howard int board_early_init_f(void)
160a868e443SPeter Howard {
161a868e443SPeter Howard 	/*
162a868e443SPeter Howard 	 * Power on required peripherals
163a868e443SPeter Howard 	 * ARM does not have access by default to PSC0 and PSC1
164a868e443SPeter Howard 	 * assuming here that the DSP bootloader has set the IOPU
165a868e443SPeter Howard 	 * such that PSC access is available to ARM
166a868e443SPeter Howard 	 */
167a868e443SPeter Howard 	if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc)))
168a868e443SPeter Howard 		return 1;
169a868e443SPeter Howard 
170a868e443SPeter Howard 	return 0;
171a868e443SPeter Howard }
172a868e443SPeter Howard 
board_init(void)173a868e443SPeter Howard int board_init(void)
174a868e443SPeter Howard {
175a868e443SPeter Howard 	irq_init();
176a868e443SPeter Howard 
17794ba26f2STom Rini 	/* arch number of the board */
17894ba26f2STom Rini 	gd->bd->bi_arch_number = MACH_TYPE_OMAPL138_LCDK;
17994ba26f2STom Rini 
180a868e443SPeter Howard 	/* address of boot parameters */
181a868e443SPeter Howard 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
182a868e443SPeter Howard 
183a868e443SPeter Howard 
184a868e443SPeter Howard 	/* setup the SUSPSRC for ARM to control emulation suspend */
185a868e443SPeter Howard 	writel(readl(&davinci_syscfg_regs->suspsrc) &
186a868e443SPeter Howard 	       ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C |
187a868e443SPeter Howard 		 DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
188a868e443SPeter Howard 		 DAVINCI_SYSCFG_SUSPSRC_UART2),
189a868e443SPeter Howard 	       &davinci_syscfg_regs->suspsrc);
190a868e443SPeter Howard 
191a868e443SPeter Howard 	/* configure pinmux settings */
192a868e443SPeter Howard 	if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes)))
193a868e443SPeter Howard 		return 1;
194a868e443SPeter Howard 
195a868e443SPeter Howard #ifdef CONFIG_NAND_DAVINCI
196a868e443SPeter Howard 	/*
197a868e443SPeter Howard 	 * NAND CS setup - cycle counts based on da850evm NAND timings in the
198a868e443SPeter Howard 	 * Linux kernel @ 25MHz EMIFA
199a868e443SPeter Howard 	 */
200a868e443SPeter Howard 	writel((DAVINCI_ABCR_WSETUP(15) |
201a868e443SPeter Howard 		DAVINCI_ABCR_WSTROBE(63) |
202a868e443SPeter Howard 		DAVINCI_ABCR_WHOLD(7) |
203a868e443SPeter Howard 		DAVINCI_ABCR_RSETUP(15) |
204a868e443SPeter Howard 		DAVINCI_ABCR_RSTROBE(63) |
205a868e443SPeter Howard 		DAVINCI_ABCR_RHOLD(7) |
206a868e443SPeter Howard 		DAVINCI_ABCR_TA(3) |
207a868e443SPeter Howard 		DAVINCI_ABCR_ASIZE_16BIT),
208a868e443SPeter Howard 	       &davinci_emif_regs->ab2cr); /* CS3 */
209a868e443SPeter Howard #endif
210a868e443SPeter Howard 
211a868e443SPeter Howard 
2121d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
213a868e443SPeter Howard 	if (davinci_configure_pin_mux(mmc0_pins, ARRAY_SIZE(mmc0_pins)) != 0)
214a868e443SPeter Howard 		return 1;
215a868e443SPeter Howard #endif
216a868e443SPeter Howard 
217a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC
218a868e443SPeter Howard 	if (davinci_configure_pin_mux(emac_pins, ARRAY_SIZE(emac_pins)) != 0)
219a868e443SPeter Howard 		return 1;
220a868e443SPeter Howard 	davinci_emac_mii_mode_sel(HAS_RMII);
221a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC */
222a868e443SPeter Howard 
223a868e443SPeter Howard 	/* enable the console UART */
224a868e443SPeter Howard 	writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
225a868e443SPeter Howard 		DAVINCI_UART_PWREMU_MGMT_UTRST),
226a868e443SPeter Howard 	       &davinci_uart2_ctrl_regs->pwremu_mgmt);
227a868e443SPeter Howard 
228a868e443SPeter Howard 	return 0;
229a868e443SPeter Howard }
230a868e443SPeter Howard 
231a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC
232a868e443SPeter Howard 
233a868e443SPeter Howard /*
234a868e443SPeter Howard  * Initializes on-board ethernet controllers.
235a868e443SPeter Howard  */
board_eth_init(bd_t * bis)236a868e443SPeter Howard int board_eth_init(bd_t *bis)
237a868e443SPeter Howard {
238a868e443SPeter Howard 	if (!davinci_emac_initialize()) {
239a868e443SPeter Howard 		printf("Error: Ethernet init failed!\n");
240a868e443SPeter Howard 		return -1;
241a868e443SPeter Howard 	}
242a868e443SPeter Howard 
243a868e443SPeter Howard 	return 0;
244a868e443SPeter Howard }
245a868e443SPeter Howard 
246a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC */
247a868e443SPeter Howard 
248a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_BUS	0
249a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_CS	0
250a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_MAX_HZ	CONFIG_SF_DEFAULT_SPEED
251a868e443SPeter Howard #define CFG_MAC_ADDR_SPI_MODE	SPI_MODE_3
252a868e443SPeter Howard 
253a868e443SPeter Howard #define CFG_MAC_ADDR_OFFSET	(flash->size - SZ_64K)
254a868e443SPeter Howard 
get_mac_addr(u8 * addr)255a868e443SPeter Howard static int  get_mac_addr(u8 *addr)
256a868e443SPeter Howard {
257a868e443SPeter Howard 	/* Need to find a way to get MAC ADDRESS */
258a868e443SPeter Howard 	return 0;
259a868e443SPeter Howard }
260a868e443SPeter Howard 
dsp_lpsc_on(unsigned domain,unsigned int id)261a868e443SPeter Howard void dsp_lpsc_on(unsigned domain, unsigned int id)
262a868e443SPeter Howard {
263a868e443SPeter Howard 	dv_reg_p mdstat, mdctl, ptstat, ptcmd;
264a868e443SPeter Howard 	struct davinci_psc_regs *psc_regs;
265a868e443SPeter Howard 
266a868e443SPeter Howard 	psc_regs = davinci_psc0_regs;
267a868e443SPeter Howard 	mdstat = &psc_regs->psc0.mdstat[id];
268a868e443SPeter Howard 	mdctl = &psc_regs->psc0.mdctl[id];
269a868e443SPeter Howard 	ptstat = &psc_regs->ptstat;
270a868e443SPeter Howard 	ptcmd = &psc_regs->ptcmd;
271a868e443SPeter Howard 
272a868e443SPeter Howard 	while (*ptstat & (0x1 << domain))
273a868e443SPeter Howard 		;
274a868e443SPeter Howard 
275a868e443SPeter Howard 	if ((*mdstat & 0x1f) == 0x03)
276a868e443SPeter Howard 		return;                 /* Already on and enabled */
277a868e443SPeter Howard 
278a868e443SPeter Howard 	*mdctl |= 0x03;
279a868e443SPeter Howard 
280a868e443SPeter Howard 	*ptcmd = 0x1 << domain;
281a868e443SPeter Howard 
282a868e443SPeter Howard 	while (*ptstat & (0x1 << domain))
283a868e443SPeter Howard 		;
284a868e443SPeter Howard 	while ((*mdstat & 0x1f) != 0x03)
285a868e443SPeter Howard 		;		/* Probably an overkill... */
286a868e443SPeter Howard }
287a868e443SPeter Howard 
dspwake(void)288a868e443SPeter Howard static void dspwake(void)
289a868e443SPeter Howard {
290a868e443SPeter Howard 	unsigned *resetvect = (unsigned *)DAVINCI_L3CBARAM_BASE;
291a868e443SPeter Howard 
292a868e443SPeter Howard 	/* if the device is ARM only, return */
293a868e443SPeter Howard 	if ((REG(CHIP_REV_ID_REG) & 0x3f) == 0x10)
294a868e443SPeter Howard 		return;
295a868e443SPeter Howard 
296*00caae6dSSimon Glass 	if (!strcmp(env_get("dspwake"), "no"))
297a868e443SPeter Howard 		return;
298a868e443SPeter Howard 
299a868e443SPeter Howard 	*resetvect++ = 0x1E000; /* DSP Idle */
300a868e443SPeter Howard 	/* clear out the next 10 words as NOP */
301a868e443SPeter Howard 	memset(resetvect, 0, sizeof(unsigned) * 10);
302a868e443SPeter Howard 
303a868e443SPeter Howard 	/* setup the DSP reset vector */
304a868e443SPeter Howard 	REG(HOST1CFG) = DAVINCI_L3CBARAM_BASE;
305a868e443SPeter Howard 
306a868e443SPeter Howard 	dsp_lpsc_on(1, DAVINCI_LPSC_GEM);
307a868e443SPeter Howard 	REG(PSC0_MDCTL + (15 * 4)) |= 0x100;
308a868e443SPeter Howard }
309a868e443SPeter Howard 
310a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
311a868e443SPeter Howard /**
312a868e443SPeter Howard  * rmii_hw_init
313a868e443SPeter Howard  *
314a868e443SPeter Howard  */
rmii_hw_init(void)315a868e443SPeter Howard int rmii_hw_init(void)
316a868e443SPeter Howard {
317a868e443SPeter Howard 	return 0;
318a868e443SPeter Howard }
319a868e443SPeter Howard #endif /* CONFIG_DRIVER_TI_EMAC_USE_RMII */
320a868e443SPeter Howard 
misc_init_r(void)321a868e443SPeter Howard int misc_init_r(void)
322a868e443SPeter Howard {
323a868e443SPeter Howard 	uint8_t tmp[20], addr[10];
324a868e443SPeter Howard 
325a868e443SPeter Howard 
326*00caae6dSSimon Glass 	if (env_get("ethaddr") == NULL) {
327a868e443SPeter Howard 		/* Read Ethernet MAC address from EEPROM */
328a868e443SPeter Howard 		if (dvevm_read_mac_address(addr)) {
329a868e443SPeter Howard 			/* Set Ethernet MAC address from EEPROM */
330a868e443SPeter Howard 			davinci_sync_env_enetaddr(addr);
331a868e443SPeter Howard 		} else {
332a868e443SPeter Howard 			get_mac_addr(addr);
333a868e443SPeter Howard 		}
334a868e443SPeter Howard 
33502c2de6eSFabien Parent 		if (!is_multicast_ethaddr(addr) && !is_zero_ethaddr(addr)) {
33602c2de6eSFabien Parent 			sprintf((char *)tmp, "%02x:%02x:%02x:%02x:%02x:%02x",
33702c2de6eSFabien Parent 				addr[0], addr[1], addr[2], addr[3], addr[4],
33802c2de6eSFabien Parent 				addr[5]);
339a868e443SPeter Howard 
340382bee57SSimon Glass 			env_set("ethaddr", (char *)tmp);
34102c2de6eSFabien Parent 		} else {
34202c2de6eSFabien Parent 			printf("Invalid MAC address read.\n");
343a868e443SPeter Howard 		}
34402c2de6eSFabien Parent 	}
34502c2de6eSFabien Parent 
346a868e443SPeter Howard #ifdef CONFIG_DRIVER_TI_EMAC_USE_RMII
347a868e443SPeter Howard 	/* Select RMII fucntion through the expander */
348a868e443SPeter Howard 	if (rmii_hw_init())
349a868e443SPeter Howard 		printf("RMII hardware init failed!!!\n");
350a868e443SPeter Howard #endif
351a868e443SPeter Howard 
352a868e443SPeter Howard 	dspwake();
353a868e443SPeter Howard 
354a868e443SPeter Howard 	return 0;
355a868e443SPeter Howard }
356a868e443SPeter Howard 
3571d2c0506SMasahiro Yamada #ifdef CONFIG_MMC_DAVINCI
358a868e443SPeter Howard static struct davinci_mmc mmc_sd0 = {
359a868e443SPeter Howard 	.reg_base = (struct davinci_mmc_regs *)DAVINCI_MMC_SD0_BASE,
360a868e443SPeter Howard 	.host_caps = MMC_MODE_4BIT,     /* DA850 supports only 4-bit SD/MMC */
361a868e443SPeter Howard 	.voltages = MMC_VDD_32_33 | MMC_VDD_33_34,
362a868e443SPeter Howard 	.version = MMC_CTLR_VERSION_2,
363a868e443SPeter Howard };
364a868e443SPeter Howard 
board_mmc_init(bd_t * bis)365a868e443SPeter Howard int board_mmc_init(bd_t *bis)
366a868e443SPeter Howard {
367a868e443SPeter Howard 	mmc_sd0.input_clk = clk_get(DAVINCI_MMCSD_CLKID);
368a868e443SPeter Howard 
369a868e443SPeter Howard 	/* Add slot-0 to mmc subsystem */
370a868e443SPeter Howard 	return davinci_mmc_init(bis, &mmc_sd0);
371a868e443SPeter Howard }
372a868e443SPeter Howard #endif
373