1*9a3aae22SChristian Riesch /*
2*9a3aae22SChristian Riesch  * Copyright (C) 2011 OMICRON electronics GmbH
3*9a3aae22SChristian Riesch  *
4*9a3aae22SChristian Riesch  * Based on da850evm.c. Original Copyrights follow:
5*9a3aae22SChristian Riesch  *
6*9a3aae22SChristian Riesch  * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
7*9a3aae22SChristian Riesch  * Copyright (C) 2009 Nick Thompson, GE Fanuc, Ltd. <nick.thompson@gefanuc.com>
8*9a3aae22SChristian Riesch  * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
9*9a3aae22SChristian Riesch  *
10*9a3aae22SChristian Riesch  * This program is free software; you can redistribute it and/or modify
11*9a3aae22SChristian Riesch  * it under the terms of the GNU General Public License as published by
12*9a3aae22SChristian Riesch  * the Free Software Foundation; either version 2 of the License, or
13*9a3aae22SChristian Riesch  * (at your option) any later version.
14*9a3aae22SChristian Riesch  *
15*9a3aae22SChristian Riesch  * This program is distributed in the hope that it will be useful,
16*9a3aae22SChristian Riesch  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*9a3aae22SChristian Riesch  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*9a3aae22SChristian Riesch  * GNU General Public License for more details.
19*9a3aae22SChristian Riesch  *
20*9a3aae22SChristian Riesch  * You should have received a copy of the GNU General Public License
21*9a3aae22SChristian Riesch  * along with this program; if not, write to the Free Software
22*9a3aae22SChristian Riesch  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23*9a3aae22SChristian Riesch  */
24*9a3aae22SChristian Riesch 
25*9a3aae22SChristian Riesch #include <common.h>
26*9a3aae22SChristian Riesch #include <i2c.h>
27*9a3aae22SChristian Riesch #include <net.h>
28*9a3aae22SChristian Riesch #include <netdev.h>
29*9a3aae22SChristian Riesch #include <watchdog.h>
30*9a3aae22SChristian Riesch #include <asm/io.h>
31*9a3aae22SChristian Riesch #include <asm/arch/hardware.h>
32*9a3aae22SChristian Riesch #include <asm/arch/gpio.h>
33*9a3aae22SChristian Riesch #include <asm/arch/emif_defs.h>
34*9a3aae22SChristian Riesch #include <asm/arch/emac_defs.h>
35*9a3aae22SChristian Riesch #include <asm/arch/pinmux_defs.h>
36*9a3aae22SChristian Riesch #include <asm/arch/davinci_misc.h>
37*9a3aae22SChristian Riesch #include <asm/arch/timer_defs.h>
38*9a3aae22SChristian Riesch 
39*9a3aae22SChristian Riesch DECLARE_GLOBAL_DATA_PTR;
40*9a3aae22SChristian Riesch 
41*9a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_MASK    0x7f000000
42*9a3aae22SChristian Riesch #define CALIMAIN_HWVERSION_SHIFT   24
43*9a3aae22SChristian Riesch 
44*9a3aae22SChristian Riesch /* Hardware version pinmux settings */
45*9a3aae22SChristian Riesch const struct pinmux_config hwversion_pins[] = {
46*9a3aae22SChristian Riesch 	{ pinmux(16), 8, 2 }, /* GP7[15] */
47*9a3aae22SChristian Riesch 	{ pinmux(16), 8, 3 }, /* GP7[14] */
48*9a3aae22SChristian Riesch 	{ pinmux(16), 8, 4 }, /* GP7[13] */
49*9a3aae22SChristian Riesch 	{ pinmux(16), 8, 5 }, /* GP7[12] */
50*9a3aae22SChristian Riesch 	{ pinmux(16), 8, 6 }, /* GP7[11] */
51*9a3aae22SChristian Riesch 	{ pinmux(16), 8, 7 }, /* GP7[10] */
52*9a3aae22SChristian Riesch 	{ pinmux(17), 8, 0 }, /* GP7[9] */
53*9a3aae22SChristian Riesch 	{ pinmux(17), 8, 1 }  /* GP7[8] */
54*9a3aae22SChristian Riesch };
55*9a3aae22SChristian Riesch 
56*9a3aae22SChristian Riesch const struct pinmux_resource pinmuxes[] = {
57*9a3aae22SChristian Riesch 	PINMUX_ITEM(uart2_pins_txrx),
58*9a3aae22SChristian Riesch 	PINMUX_ITEM(emac_pins_mii),
59*9a3aae22SChristian Riesch 	PINMUX_ITEM(emac_pins_mdio),
60*9a3aae22SChristian Riesch 	PINMUX_ITEM(emifa_pins_nor),
61*9a3aae22SChristian Riesch 	PINMUX_ITEM(emifa_pins_cs2),
62*9a3aae22SChristian Riesch 	PINMUX_ITEM(emifa_pins_cs3),
63*9a3aae22SChristian Riesch };
64*9a3aae22SChristian Riesch 
65*9a3aae22SChristian Riesch const int pinmuxes_size = ARRAY_SIZE(pinmuxes);
66*9a3aae22SChristian Riesch 
67*9a3aae22SChristian Riesch const struct lpsc_resource lpsc[] = {
68*9a3aae22SChristian Riesch 	{ DAVINCI_LPSC_AEMIF },	/* NAND, NOR */
69*9a3aae22SChristian Riesch 	{ DAVINCI_LPSC_EMAC },	/* image download */
70*9a3aae22SChristian Riesch 	{ DAVINCI_LPSC_UART2 },	/* console */
71*9a3aae22SChristian Riesch 	{ DAVINCI_LPSC_GPIO },
72*9a3aae22SChristian Riesch };
73*9a3aae22SChristian Riesch 
74*9a3aae22SChristian Riesch const int lpsc_size = ARRAY_SIZE(lpsc);
75*9a3aae22SChristian Riesch 
76*9a3aae22SChristian Riesch /* read board revision from GPIO7[8..14] */
77*9a3aae22SChristian Riesch u32 get_board_rev(void)
78*9a3aae22SChristian Riesch {
79*9a3aae22SChristian Riesch 	lpsc_on(DAVINCI_LPSC_GPIO);
80*9a3aae22SChristian Riesch 	if (davinci_configure_pin_mux(hwversion_pins,
81*9a3aae22SChristian Riesch 				      ARRAY_SIZE(hwversion_pins)) != 0)
82*9a3aae22SChristian Riesch 		return 0xffffffff;
83*9a3aae22SChristian Riesch 
84*9a3aae22SChristian Riesch 	return (davinci_gpio_bank67->in_data & CALIMAIN_HWVERSION_MASK)
85*9a3aae22SChristian Riesch 		>> CALIMAIN_HWVERSION_SHIFT;
86*9a3aae22SChristian Riesch }
87*9a3aae22SChristian Riesch 
88*9a3aae22SChristian Riesch /*
89*9a3aae22SChristian Riesch  * determine the oscillator frequency depending on the board revision
90*9a3aae22SChristian Riesch  *
91*9a3aae22SChristian Riesch  * rev 0x00  ... 25 MHz oscillator
92*9a3aae22SChristian Riesch  * rev 0x01  ... 24 MHz oscillator
93*9a3aae22SChristian Riesch  */
94*9a3aae22SChristian Riesch int calimain_get_osc_freq(void)
95*9a3aae22SChristian Riesch {
96*9a3aae22SChristian Riesch 	u32 rev;
97*9a3aae22SChristian Riesch 	int freq;
98*9a3aae22SChristian Riesch 
99*9a3aae22SChristian Riesch 	rev = get_board_rev();
100*9a3aae22SChristian Riesch 	switch (rev) {
101*9a3aae22SChristian Riesch 	case 0x00:
102*9a3aae22SChristian Riesch 		freq = 25000000;
103*9a3aae22SChristian Riesch 		break;
104*9a3aae22SChristian Riesch 	default:
105*9a3aae22SChristian Riesch 		freq = 24000000;
106*9a3aae22SChristian Riesch 		break;
107*9a3aae22SChristian Riesch 	}
108*9a3aae22SChristian Riesch 	return freq;
109*9a3aae22SChristian Riesch }
110*9a3aae22SChristian Riesch 
111*9a3aae22SChristian Riesch int board_init(void)
112*9a3aae22SChristian Riesch {
113*9a3aae22SChristian Riesch 	int val;
114*9a3aae22SChristian Riesch 
115*9a3aae22SChristian Riesch #ifndef CONFIG_USE_IRQ
116*9a3aae22SChristian Riesch 	irq_init();
117*9a3aae22SChristian Riesch #endif
118*9a3aae22SChristian Riesch 
119*9a3aae22SChristian Riesch 	/* address of boot parameters */
120*9a3aae22SChristian Riesch 	gd->bd->bi_boot_params = LINUX_BOOT_PARAM_ADDR;
121*9a3aae22SChristian Riesch 
122*9a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC
123*9a3aae22SChristian Riesch 	/* select emac MII mode */
124*9a3aae22SChristian Riesch 	val = readl(&davinci_syscfg_regs->cfgchip3);
125*9a3aae22SChristian Riesch 	val &= ~(1 << 8);
126*9a3aae22SChristian Riesch 	writel(val, &davinci_syscfg_regs->cfgchip3);
127*9a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */
128*9a3aae22SChristian Riesch 
129*9a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG
130*9a3aae22SChristian Riesch 	davinci_hw_watchdog_enable();
131*9a3aae22SChristian Riesch #endif
132*9a3aae22SChristian Riesch 
133*9a3aae22SChristian Riesch 	printf("Input clock frequency: %d Hz\n", calimain_get_osc_freq());
134*9a3aae22SChristian Riesch 	printf("Board revision:        %d\n", get_board_rev());
135*9a3aae22SChristian Riesch 
136*9a3aae22SChristian Riesch 	return 0;
137*9a3aae22SChristian Riesch }
138*9a3aae22SChristian Riesch 
139*9a3aae22SChristian Riesch #ifdef CONFIG_DRIVER_TI_EMAC
140*9a3aae22SChristian Riesch /*
141*9a3aae22SChristian Riesch  * Initializes on-board ethernet controllers.
142*9a3aae22SChristian Riesch  */
143*9a3aae22SChristian Riesch int board_eth_init(bd_t *bis)
144*9a3aae22SChristian Riesch {
145*9a3aae22SChristian Riesch 	if (!davinci_emac_initialize()) {
146*9a3aae22SChristian Riesch 		printf("Error: Ethernet init failed!\n");
147*9a3aae22SChristian Riesch 		return -1;
148*9a3aae22SChristian Riesch 	}
149*9a3aae22SChristian Riesch 
150*9a3aae22SChristian Riesch 	return 0;
151*9a3aae22SChristian Riesch }
152*9a3aae22SChristian Riesch #endif /* CONFIG_DRIVER_TI_EMAC */
153*9a3aae22SChristian Riesch 
154*9a3aae22SChristian Riesch #ifdef CONFIG_HW_WATCHDOG
155*9a3aae22SChristian Riesch void hw_watchdog_reset(void)
156*9a3aae22SChristian Riesch {
157*9a3aae22SChristian Riesch 	davinci_hw_watchdog_reset();
158*9a3aae22SChristian Riesch }
159*9a3aae22SChristian Riesch #endif
160*9a3aae22SChristian Riesch 
161*9a3aae22SChristian Riesch #if defined(CONFIG_BOOTCOUNT_LIMIT)
162*9a3aae22SChristian Riesch void bootcount_store(ulong a)
163*9a3aae22SChristian Riesch {
164*9a3aae22SChristian Riesch 	struct davinci_rtc *reg =
165*9a3aae22SChristian Riesch 		(struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
166*9a3aae22SChristian Riesch 
167*9a3aae22SChristian Riesch 	/*
168*9a3aae22SChristian Riesch 	 * write RTC kick register to enable write
169*9a3aae22SChristian Riesch 	 * for RTC Scratch registers. Cratch0 and 1 are
170*9a3aae22SChristian Riesch 	 * used for bootcount values.
171*9a3aae22SChristian Riesch 	 */
172*9a3aae22SChristian Riesch 	writel(RTC_KICK0R_WE, &reg->kick0r);
173*9a3aae22SChristian Riesch 	writel(RTC_KICK1R_WE, &reg->kick1r);
174*9a3aae22SChristian Riesch 	writel(a, &reg->scratch0);
175*9a3aae22SChristian Riesch 	writel(BOOTCOUNT_MAGIC, &reg->scratch1);
176*9a3aae22SChristian Riesch }
177*9a3aae22SChristian Riesch 
178*9a3aae22SChristian Riesch ulong bootcount_load(void)
179*9a3aae22SChristian Riesch {
180*9a3aae22SChristian Riesch 	struct davinci_rtc *reg =
181*9a3aae22SChristian Riesch 		(struct davinci_rtc *)CONFIG_SYS_BOOTCOUNT_ADDR;
182*9a3aae22SChristian Riesch 
183*9a3aae22SChristian Riesch 	if (readl(&reg->scratch1) != BOOTCOUNT_MAGIC)
184*9a3aae22SChristian Riesch 		return 0;
185*9a3aae22SChristian Riesch 	else
186*9a3aae22SChristian Riesch 		return readl(&reg->scratch0);
187*9a3aae22SChristian Riesch }
188*9a3aae22SChristian Riesch #endif
189