]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/nvidia/common/board.c
Merge branch 'master' of git://git.denx.de/u-boot-coldfire
[karo-tx-uboot.git] / board / nvidia / common / board.c
1 /*
2  *  (C) Copyright 2010,2011
3  *  NVIDIA Corporation <www.nvidia.com>
4  *
5  * See file CREDITS for list of people who contributed to this
6  * project.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of
11  * the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
21  * MA 02111-1307 USA
22  */
23
24 #include <common.h>
25 #include <ns16550.h>
26 #include <asm/io.h>
27 #include <asm/arch/tegra2.h>
28 #include <asm/arch/sys_proto.h>
29
30 #include <asm/arch/clk_rst.h>
31 #include <asm/arch/clock.h>
32 #include <asm/arch/pinmux.h>
33 #include <asm/arch/uart.h>
34 #include "board.h"
35
36 #ifdef CONFIG_TEGRA2_MMC
37 #include <mmc.h>
38 #endif
39
40 DECLARE_GLOBAL_DATA_PTR;
41
42 const struct tegra2_sysinfo sysinfo = {
43         CONFIG_TEGRA2_BOARD_STRING
44 };
45
46 #ifdef CONFIG_BOARD_EARLY_INIT_F
47 int board_early_init_f(void)
48 {
49         /* Initialize periph clocks */
50         clock_init();
51
52         /* Initialize periph pinmuxes */
53         pinmux_init();
54
55         /* Initialize periph GPIOs */
56         gpio_init();
57
58         /* Init UART, scratch regs, and start CPU */
59         tegra2_start();
60         return 0;
61 }
62 #endif  /* EARLY_INIT */
63
64 /*
65  * Routine: timer_init
66  * Description: init the timestamp and lastinc value
67  */
68 int timer_init(void)
69 {
70         return 0;
71 }
72
73 /*
74  * Routine: clock_init_uart
75  * Description: init the PLL and clock for the UART(s)
76  */
77 static void clock_init_uart(void)
78 {
79         struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE;
80         struct clk_pll *pll = &clkrst->crc_pll[CLOCK_PLL_ID_PERIPH];
81         u32 reg;
82
83         reg = readl(&pll->pll_base);
84         if (!(reg & PLL_BASE_OVRRIDE_MASK)) {
85                 /* Override pllp setup for 216MHz operation. */
86                 reg = PLL_BYPASS_MASK | PLL_BASE_OVRRIDE_MASK |
87                         (1 << PLL_DIVP_SHIFT) | (0xc << PLL_DIVM_SHIFT);
88                 reg |= (NVRM_PLLP_FIXED_FREQ_KHZ / 500) << PLL_DIVN_SHIFT;
89                 writel(reg, &pll->pll_base);
90
91                 reg |= PLL_ENABLE_MASK;
92                 writel(reg, &pll->pll_base);
93
94                 reg &= ~PLL_BYPASS_MASK;
95                 writel(reg, &pll->pll_base);
96         }
97
98 #if defined(CONFIG_TEGRA2_ENABLE_UARTA)
99         /* Assert UART reset and enable clock */
100         reset_set_enable(PERIPH_ID_UART1, 1);
101         clock_enable(PERIPH_ID_UART1);
102
103         /* Enable pllp_out0 to UART */
104         reg = readl(&clkrst->crc_clk_src_uarta);
105         reg &= 0x3FFFFFFF;      /* UARTA_CLK_SRC = 00, PLLP_OUT0 */
106         writel(reg, &clkrst->crc_clk_src_uarta);
107
108         /* wait for 2us */
109         udelay(2);
110
111         /* De-assert reset to UART */
112         reset_set_enable(PERIPH_ID_UART1, 0);
113 #endif  /* CONFIG_TEGRA2_ENABLE_UARTA */
114 #if defined(CONFIG_TEGRA2_ENABLE_UARTD)
115         /* Assert UART reset and enable clock */
116         reset_set_enable(PERIPH_ID_UART4, 1);
117         clock_enable(PERIPH_ID_UART4);
118
119         /* Enable pllp_out0 to UART */
120         reg = readl(&clkrst->crc_clk_src_uartd);
121         reg &= 0x3FFFFFFF;      /* UARTD_CLK_SRC = 00, PLLP_OUT0 */
122         writel(reg, &clkrst->crc_clk_src_uartd);
123
124         /* wait for 2us */
125         udelay(2);
126
127         /* De-assert reset to UART */
128         reset_set_enable(PERIPH_ID_UART4, 0);
129 #endif  /* CONFIG_TEGRA2_ENABLE_UARTD */
130 }
131
132 /*
133  * Routine: pin_mux_uart
134  * Description: setup the pin muxes/tristate values for the UART(s)
135  */
136 static void pin_mux_uart(void)
137 {
138         struct pmux_tri_ctlr *pmt = (struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
139         u32 reg;
140
141 #if defined(CONFIG_TEGRA2_ENABLE_UARTA)
142         reg = readl(&pmt->pmt_ctl_c);
143         reg &= 0xFFF0FFFF;      /* IRRX_/IRTX_SEL [19:16] = 00 UARTA */
144         writel(reg, &pmt->pmt_ctl_c);
145
146         pinmux_tristate_disable(PIN_IRRX);
147         pinmux_tristate_disable(PIN_IRTX);
148 #endif  /* CONFIG_TEGRA2_ENABLE_UARTA */
149 #if defined(CONFIG_TEGRA2_ENABLE_UARTD)
150         reg = readl(&pmt->pmt_ctl_b);
151         reg &= 0xFFFFFFF3;      /* GMC_SEL [3:2] = 00, UARTD */
152         writel(reg, &pmt->pmt_ctl_b);
153
154         pinmux_tristate_disable(PIN_GMC);
155 #endif  /* CONFIG_TEGRA2_ENABLE_UARTD */
156 }
157
158 /*
159  * Routine: clock_init_mmc
160  * Description: init the PLL and clocks for the SDMMC controllers
161  */
162 static void clock_init_mmc(void)
163 {
164         struct clk_rst_ctlr *clkrst = (struct clk_rst_ctlr *)NV_PA_CLK_RST_BASE;
165         u32 reg;
166
167         /* Do the SDMMC resets/clock enables */
168         reset_set_enable(PERIPH_ID_SDMMC4, 1);
169         clock_enable(PERIPH_ID_SDMMC4);
170
171         /* Enable pllp_out0 to SDMMC4 */
172         reg = readl(&clkrst->crc_clk_src_sdmmc4);
173         reg &= 0x3FFFFF00;      /* SDMMC4_CLK_SRC = 00, PLLP_OUT0 */
174         reg |= (10 << 1);       /* n-1, 11-1 shl 1 */
175         writel(reg, &clkrst->crc_clk_src_sdmmc4);
176
177         /*
178          * As per the Tegra2 TRM, section 5.3.4:
179          * 'Wait 2 us for the clock to flush through the pipe/logic'
180          */
181         udelay(2);
182
183         reset_set_enable(PERIPH_ID_SDMMC4, 1);
184
185         reset_set_enable(PERIPH_ID_SDMMC3, 1);
186         clock_enable(PERIPH_ID_SDMMC3);
187
188         /* Enable pllp_out0 to SDMMC4, set divisor to 11 for 20MHz */
189         reg = readl(&clkrst->crc_clk_src_sdmmc3);
190         reg &= 0x3FFFFF00;      /* SDMMC3_CLK_SRC = 00, PLLP_OUT0 */
191         reg |= (10 << 1);       /* n-1, 11-1 shl 1 */
192         writel(reg, &clkrst->crc_clk_src_sdmmc3);
193
194         /* wait for 2us */
195         udelay(2);
196
197         reset_set_enable(PERIPH_ID_SDMMC3, 0);
198 }
199
200 /*
201  * Routine: pin_mux_mmc
202  * Description: setup the pin muxes/tristate values for the SDMMC(s)
203  */
204 static void pin_mux_mmc(void)
205 {
206         struct pmux_tri_ctlr *pmt = (struct pmux_tri_ctlr *)NV_PA_APB_MISC_BASE;
207         u32 reg;
208
209         /* SDMMC4 */
210         /* config 2, x8 on 2nd set of pins */
211         reg = readl(&pmt->pmt_ctl_a);
212         reg |= (3 << 16);       /* ATB_SEL [17:16] = 11 SDIO4 */
213         writel(reg, &pmt->pmt_ctl_a);
214         reg = readl(&pmt->pmt_ctl_b);
215         reg |= (3 << 0);        /* GMA_SEL [1:0] = 11 SDIO4 */
216         writel(reg, &pmt->pmt_ctl_b);
217         reg = readl(&pmt->pmt_ctl_d);
218         reg |= (3 << 0);        /* GME_SEL [1:0] = 11 SDIO4 */
219         writel(reg, &pmt->pmt_ctl_d);
220
221         pinmux_tristate_disable(PIN_ATB);
222         pinmux_tristate_disable(PIN_GMA);
223         pinmux_tristate_disable(PIN_GME);
224
225         /* SDMMC3 */
226         /* SDIO3_CLK, SDIO3_CMD, SDIO3_DAT[3:0] */
227         reg = readl(&pmt->pmt_ctl_d);
228         reg &= 0xFFFF03FF;
229         reg |= (2 << 10);       /* SDB_SEL [11:10] = 01 SDIO3 */
230         reg |= (2 << 12);       /* SDC_SEL [13:12] = 01 SDIO3 */
231         reg |= (2 << 14);       /* SDD_SEL [15:14] = 01 SDIO3 */
232         writel(reg, &pmt->pmt_ctl_d);
233
234         pinmux_tristate_disable(PIN_SDC);
235         pinmux_tristate_disable(PIN_SDD);
236         pinmux_tristate_disable(PIN_SDB);
237 }
238
239 /*
240  * Routine: clock_init
241  * Description: Do individual peripheral clock reset/enables
242  */
243 void clock_init(void)
244 {
245         clock_init_uart();
246 }
247
248 /*
249  * Routine: pinmux_init
250  * Description: Do individual peripheral pinmux configs
251  */
252 void pinmux_init(void)
253 {
254         pin_mux_uart();
255 }
256
257 /*
258  * Routine: gpio_init
259  * Description: Do individual peripheral GPIO configs
260  */
261 void gpio_init(void)
262 {
263         gpio_config_uart();
264 }
265
266 /*
267  * Routine: board_init
268  * Description: Early hardware init.
269  */
270 int board_init(void)
271 {
272         /* boot param addr */
273         gd->bd->bi_boot_params = (NV_PA_SDRAM_BASE + 0x100);
274
275         return 0;
276 }
277
278 #ifdef CONFIG_TEGRA2_MMC
279 /* this is a weak define that we are overriding */
280 int board_mmc_init(bd_t *bd)
281 {
282         debug("board_mmc_init called\n");
283         /* Enable clocks, muxes, etc. for SDMMC controllers */
284         clock_init_mmc();
285         pin_mux_mmc();
286
287         debug("board_mmc_init: init eMMC\n");
288         /* init dev 0, eMMC chip, with 4-bit bus */
289         tegra2_mmc_init(0, 4);
290
291         debug("board_mmc_init: init SD slot\n");
292         /* init dev 1, SD slot, with 4-bit bus */
293         tegra2_mmc_init(1, 4);
294
295         return 0;
296 }
297
298 /* this is a weak define that we are overriding */
299 int board_mmc_getcd(u8 *cd, struct mmc *mmc)
300 {
301         debug("board_mmc_getcd called\n");
302         /*
303          * Hard-code CD presence for now. Need to add GPIO inputs
304          * for Seaboard & Harmony (& Kaen/Aebl/Wario?)
305          */
306         *cd = 1;
307         return 0;
308 }
309 #endif