xref: /rk3399_rockchip-uboot/board/davinci/ea20/ea20.c (revision 649a33e434ba743d500db6c1aef3a0937eb32c8d)
1*649a33e4SStefano Babic /*
2*649a33e4SStefano Babic  * (C) Copyright 2010
3*649a33e4SStefano Babic  * Stefano Babic, DENX Software Engineering, sbabic@denx.de
4*649a33e4SStefano Babic  *
5*649a33e4SStefano Babic  * Based on da850evm.c, original Copyrights follow:
6*649a33e4SStefano Babic  *
7*649a33e4SStefano Babic  * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
8*649a33e4SStefano Babic  *
9*649a33e4SStefano Babic  * Based on da830evm.c. Original Copyrights follow:
10*649a33e4SStefano Babic  *
11*649a33e4SStefano Babic  * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
12*649a33e4SStefano Babic  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
13*649a33e4SStefano Babic  *
14*649a33e4SStefano Babic  * This program is free software; you can redistribute it and/or modify
15*649a33e4SStefano Babic  * it under the terms of the GNU General Public License as published by
16*649a33e4SStefano Babic  * the Free Software Foundation; either version 2 of the License, or
17*649a33e4SStefano Babic  * (at your option) any later version.
18*649a33e4SStefano Babic  *
19*649a33e4SStefano Babic  * This program is distributed in the hope that it will be useful,
20*649a33e4SStefano Babic  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21*649a33e4SStefano Babic  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22*649a33e4SStefano Babic  * GNU General Public License for more details.
23*649a33e4SStefano Babic  *
24*649a33e4SStefano Babic  * You should have received a copy of the GNU General Public License
25*649a33e4SStefano Babic  * along with this program; if not, write to the Free Software
26*649a33e4SStefano Babic  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27*649a33e4SStefano Babic  */
28*649a33e4SStefano Babic 
29*649a33e4SStefano Babic #include <common.h>
30*649a33e4SStefano Babic #include <i2c.h>
31*649a33e4SStefano Babic #include <net.h>
32*649a33e4SStefano Babic #include <netdev.h>
33*649a33e4SStefano Babic #include <asm/arch/hardware.h>
34*649a33e4SStefano Babic #include <asm/arch/emif_defs.h>
35*649a33e4SStefano Babic #include <asm/arch/emac_defs.h>
36*649a33e4SStefano Babic #include <asm/io.h>
37*649a33e4SStefano Babic #include <asm/arch/davinci_misc.h>
38*649a33e4SStefano Babic 
39*649a33e4SStefano Babic DECLARE_GLOBAL_DATA_PTR;
40*649a33e4SStefano Babic 
41*649a33e4SStefano Babic #define pinmux(x)	(&davinci_syscfg_regs->pinmux[x])
42*649a33e4SStefano Babic 
43*649a33e4SStefano Babic /* SPI0 pin muxer settings */
44*649a33e4SStefano Babic static const struct pinmux_config spi1_pins[] = {
45*649a33e4SStefano Babic 	{ pinmux(5), 1, 1 },
46*649a33e4SStefano Babic 	{ pinmux(5), 1, 2 },
47*649a33e4SStefano Babic 	{ pinmux(5), 1, 4 },
48*649a33e4SStefano Babic 	{ pinmux(5), 1, 5 }
49*649a33e4SStefano Babic };
50*649a33e4SStefano Babic 
51*649a33e4SStefano Babic /* UART pin muxer settings */
52*649a33e4SStefano Babic static const struct pinmux_config uart_pins[] = {
53*649a33e4SStefano Babic 	{ pinmux(0), 4, 6 },
54*649a33e4SStefano Babic 	{ pinmux(0), 4, 7 },
55*649a33e4SStefano Babic 	{ pinmux(4), 2, 4 },
56*649a33e4SStefano Babic 	{ pinmux(4), 2, 5 }
57*649a33e4SStefano Babic };
58*649a33e4SStefano Babic 
59*649a33e4SStefano Babic #ifdef CONFIG_DRIVER_TI_EMAC
60*649a33e4SStefano Babic #define HAS_RMII 1
61*649a33e4SStefano Babic static const struct pinmux_config emac_pins[] = {
62*649a33e4SStefano Babic 	{ pinmux(14), 8, 2 },
63*649a33e4SStefano Babic 	{ pinmux(14), 8, 3 },
64*649a33e4SStefano Babic 	{ pinmux(14), 8, 4 },
65*649a33e4SStefano Babic 	{ pinmux(14), 8, 5 },
66*649a33e4SStefano Babic 	{ pinmux(14), 8, 6 },
67*649a33e4SStefano Babic 	{ pinmux(14), 8, 7 },
68*649a33e4SStefano Babic 	{ pinmux(15), 8, 1 },
69*649a33e4SStefano Babic 	{ pinmux(4), 8, 0 },
70*649a33e4SStefano Babic 	{ pinmux(4), 8, 1 }
71*649a33e4SStefano Babic };
72*649a33e4SStefano Babic #endif
73*649a33e4SStefano Babic 
74*649a33e4SStefano Babic #ifdef CONFIG_NAND_DAVINCI
75*649a33e4SStefano Babic const struct pinmux_config nand_pins[] = {
76*649a33e4SStefano Babic 	{ pinmux(7), 1, 1 },
77*649a33e4SStefano Babic 	{ pinmux(7), 1, 2 },
78*649a33e4SStefano Babic 	{ pinmux(7), 1, 4 },
79*649a33e4SStefano Babic 	{ pinmux(7), 1, 5 },
80*649a33e4SStefano Babic 	{ pinmux(9), 1, 0 },
81*649a33e4SStefano Babic 	{ pinmux(9), 1, 1 },
82*649a33e4SStefano Babic 	{ pinmux(9), 1, 2 },
83*649a33e4SStefano Babic 	{ pinmux(9), 1, 3 },
84*649a33e4SStefano Babic 	{ pinmux(9), 1, 4 },
85*649a33e4SStefano Babic 	{ pinmux(9), 1, 5 },
86*649a33e4SStefano Babic 	{ pinmux(9), 1, 6 },
87*649a33e4SStefano Babic 	{ pinmux(9), 1, 7 },
88*649a33e4SStefano Babic 	{ pinmux(12), 1, 5 },
89*649a33e4SStefano Babic 	{ pinmux(12), 1, 6 }
90*649a33e4SStefano Babic };
91*649a33e4SStefano Babic #endif
92*649a33e4SStefano Babic 
93*649a33e4SStefano Babic static const struct pinmux_resource pinmuxes[] = {
94*649a33e4SStefano Babic #ifdef CONFIG_SPI_FLASH
95*649a33e4SStefano Babic 	PINMUX_ITEM(spi1_pins),
96*649a33e4SStefano Babic #endif
97*649a33e4SStefano Babic 	PINMUX_ITEM(uart_pins),
98*649a33e4SStefano Babic #ifdef CONFIG_NAND_DAVINCI
99*649a33e4SStefano Babic 	PINMUX_ITEM(nand_pins),
100*649a33e4SStefano Babic #endif
101*649a33e4SStefano Babic };
102*649a33e4SStefano Babic 
103*649a33e4SStefano Babic static const struct lpsc_resource lpsc[] = {
104*649a33e4SStefano Babic 	{ DAVINCI_LPSC_AEMIF },	/* NAND, NOR */
105*649a33e4SStefano Babic 	{ DAVINCI_LPSC_SPI1 },	/* Serial Flash */
106*649a33e4SStefano Babic 	{ DAVINCI_LPSC_EMAC },	/* image download */
107*649a33e4SStefano Babic 	{ DAVINCI_LPSC_UART2 },	/* console */
108*649a33e4SStefano Babic 	{ DAVINCI_LPSC_GPIO },
109*649a33e4SStefano Babic };
110*649a33e4SStefano Babic 
111*649a33e4SStefano Babic int board_init(void)
112*649a33e4SStefano Babic {
113*649a33e4SStefano Babic #ifndef CONFIG_USE_IRQ
114*649a33e4SStefano Babic 	irq_init();
115*649a33e4SStefano Babic #endif
116*649a33e4SStefano Babic 
117*649a33e4SStefano Babic 
118*649a33e4SStefano Babic #ifdef CONFIG_NAND_DAVINCI
119*649a33e4SStefano Babic 	/*
120*649a33e4SStefano Babic 	 * NAND CS setup - cycle counts based on da850evm NAND timings in the
121*649a33e4SStefano Babic 	 * Linux kernel @ 25MHz EMIFA
122*649a33e4SStefano Babic 	 */
123*649a33e4SStefano Babic 	writel((DAVINCI_ABCR_WSETUP(0) |
124*649a33e4SStefano Babic 		DAVINCI_ABCR_WSTROBE(0) |
125*649a33e4SStefano Babic 		DAVINCI_ABCR_WHOLD(0) |
126*649a33e4SStefano Babic 		DAVINCI_ABCR_RSETUP(0) |
127*649a33e4SStefano Babic 		DAVINCI_ABCR_RSTROBE(1) |
128*649a33e4SStefano Babic 		DAVINCI_ABCR_RHOLD(0) |
129*649a33e4SStefano Babic 		DAVINCI_ABCR_TA(0) |
130*649a33e4SStefano Babic 		DAVINCI_ABCR_ASIZE_8BIT),
131*649a33e4SStefano Babic 	       &davinci_emif_regs->ab2cr); /* CS3 */
132*649a33e4SStefano Babic #endif
133*649a33e4SStefano Babic 
134*649a33e4SStefano Babic 	/* arch number of the board */
135*649a33e4SStefano Babic 	gd->bd->bi_arch_number = MACH_TYPE_EA20;
136*649a33e4SStefano Babic 
137*649a33e4SStefano Babic 	/* address of boot parameters */
138*649a33e4SStefano Babic 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
139*649a33e4SStefano Babic 
140*649a33e4SStefano Babic 	/*
141*649a33e4SStefano Babic 	 * Power on required peripherals
142*649a33e4SStefano Babic 	 * ARM does not have access by default to PSC0 and PSC1
143*649a33e4SStefano Babic 	 * assuming here that the DSP bootloader has set the IOPU
144*649a33e4SStefano Babic 	 * such that PSC access is available to ARM
145*649a33e4SStefano Babic 	 */
146*649a33e4SStefano Babic 	if (da8xx_configure_lpsc_items(lpsc, ARRAY_SIZE(lpsc)))
147*649a33e4SStefano Babic 		return 1;
148*649a33e4SStefano Babic 
149*649a33e4SStefano Babic 	/* setup the SUSPSRC for ARM to control emulation suspend */
150*649a33e4SStefano Babic 	writel(readl(&davinci_syscfg_regs->suspsrc) &
151*649a33e4SStefano Babic 	       ~(DAVINCI_SYSCFG_SUSPSRC_EMAC | DAVINCI_SYSCFG_SUSPSRC_I2C |
152*649a33e4SStefano Babic 		 DAVINCI_SYSCFG_SUSPSRC_SPI1 | DAVINCI_SYSCFG_SUSPSRC_TIMER0 |
153*649a33e4SStefano Babic 		 DAVINCI_SYSCFG_SUSPSRC_UART2),
154*649a33e4SStefano Babic 	       &davinci_syscfg_regs->suspsrc);
155*649a33e4SStefano Babic 
156*649a33e4SStefano Babic 	/* configure pinmux settings */
157*649a33e4SStefano Babic 	if (davinci_configure_pin_mux_items(pinmuxes, ARRAY_SIZE(pinmuxes)))
158*649a33e4SStefano Babic 		return 1;
159*649a33e4SStefano Babic 
160*649a33e4SStefano Babic #ifdef CONFIG_DRIVER_TI_EMAC
161*649a33e4SStefano Babic 	if (davinci_configure_pin_mux(emac_pins, ARRAY_SIZE(emac_pins)) != 0)
162*649a33e4SStefano Babic 		return 1;
163*649a33e4SStefano Babic 
164*649a33e4SStefano Babic 	davinci_emac_mii_mode_sel(HAS_RMII);
165*649a33e4SStefano Babic #endif /* CONFIG_DRIVER_TI_EMAC */
166*649a33e4SStefano Babic 
167*649a33e4SStefano Babic 	/* enable the console UART */
168*649a33e4SStefano Babic 	writel((DAVINCI_UART_PWREMU_MGMT_FREE | DAVINCI_UART_PWREMU_MGMT_URRST |
169*649a33e4SStefano Babic 		DAVINCI_UART_PWREMU_MGMT_UTRST),
170*649a33e4SStefano Babic 	       &davinci_uart2_ctrl_regs->pwremu_mgmt);
171*649a33e4SStefano Babic 
172*649a33e4SStefano Babic 	return 0;
173*649a33e4SStefano Babic }
174*649a33e4SStefano Babic 
175*649a33e4SStefano Babic #ifdef CONFIG_DRIVER_TI_EMAC
176*649a33e4SStefano Babic 
177*649a33e4SStefano Babic /*
178*649a33e4SStefano Babic  * Initializes on-board ethernet controllers.
179*649a33e4SStefano Babic  */
180*649a33e4SStefano Babic int board_eth_init(bd_t *bis)
181*649a33e4SStefano Babic {
182*649a33e4SStefano Babic 	if (!davinci_emac_initialize()) {
183*649a33e4SStefano Babic 		printf("Error: Ethernet init failed!\n");
184*649a33e4SStefano Babic 		return -1;
185*649a33e4SStefano Babic 	}
186*649a33e4SStefano Babic 
187*649a33e4SStefano Babic 	/*
188*649a33e4SStefano Babic 	 * This board has a RMII PHY. However, the MDC line on the SOM
189*649a33e4SStefano Babic 	 * must not be disabled (there is no MII PHY on the
190*649a33e4SStefano Babic 	 * baseboard) via the GPIO2[6], because this pin
191*649a33e4SStefano Babic 	 * disables at the same time the SPI flash.
192*649a33e4SStefano Babic 	 */
193*649a33e4SStefano Babic 
194*649a33e4SStefano Babic 	return 0;
195*649a33e4SStefano Babic }
196*649a33e4SStefano Babic #endif /* CONFIG_DRIVER_TI_EMAC */
197