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