]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/karo/tx48/spl.c
TX6 Release 2013-04-22
[karo-tx-uboot.git] / board / karo / tx48 / spl.c
1 /*
2  * board/karo/tx48/spl.c
3  * Copyright (C) 2012 Lothar Waßmann <LW@KARO-electronics.de>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation version 2.
8  *
9  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
10  * kind, whether express or implied; without even the implied warranty
11  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  */
14
15 #include <common.h>
16 #include <errno.h>
17 #include <miiphy.h>
18 #include <netdev.h>
19 #include <serial.h>
20 #include <libfdt.h>
21 #include <fdt_support.h>
22 #include <nand.h>
23 #include <net.h>
24 #include <spl.h>
25 #include <linux/mtd/nand.h>
26 #include <asm/gpio.h>
27 #include <asm/cache.h>
28 #include <asm/omap_common.h>
29 #include <asm/io.h>
30 #include <asm/arch/cpu.h>
31 #include <asm/arch/hardware.h>
32 #include <asm/arch/mmc_host_def.h>
33 #include <asm/arch/ddr_defs.h>
34 #include <asm/arch/sys_proto.h>
35 #include <asm/arch/nand.h>
36 #include <asm/arch/clock.h>
37 #include <video_fb.h>
38 #include <asm/arch/da8xx-fb.h>
39
40 #define TX48_LED_GPIO           AM33XX_GPIO_NR(1, 26)
41 #define TX48_ETH_PHY_RST_GPIO   AM33XX_GPIO_NR(3, 8)
42 #define TX48_LCD_RST_GPIO       AM33XX_GPIO_NR(1, 19)
43 #define TX48_LCD_PWR_GPIO       AM33XX_GPIO_NR(1, 22)
44 #define TX48_LCD_BACKLIGHT_GPIO AM33XX_GPIO_NR(3, 14)
45
46 #define GMII_SEL                (CTRL_BASE + 0x650)
47
48 /* UART Defines */
49 #define UART_SYSCFG_OFFSET      0x54
50 #define UART_SYSSTS_OFFSET      0x58
51
52 #define UART_RESET              (0x1 << 1)
53 #define UART_CLK_RUNNING_MASK   0x1
54 #define UART_SMART_IDLE_EN      (0x1 << 0x3)
55
56 /* Timer Defines */
57 #define TSICR_REG               0x54
58 #define TIOCP_CFG_REG           0x10
59 #define TCLR_REG                0x38
60
61 /* RGMII mode define */
62 #define RGMII_MODE_ENABLE       0xA
63 #define RMII_MODE_ENABLE        0x5
64 #define MII_MODE_ENABLE         0x0
65
66 #define NO_OF_MAC_ADDR          1
67 #define ETH_ALEN                6
68
69 #define MUX_CFG(value, offset)  {                                       \
70         __raw_writel(value, (CTRL_BASE + (offset)));                    \
71         }
72
73 /* PAD Control Fields */
74 #define SLEWCTRL        (0x1 << 6)
75 #define RXACTIVE        (0x1 << 5)
76 #define PULLUP_EN       (0x1 << 4) /* Pull UP Selection */
77 #define PULLUDEN        (0x0 << 3) /* Pull up enabled */
78 #define PULLUDDIS       (0x1 << 3) /* Pull up disabled */
79 #define MODE(val)       (val)
80
81 /*
82  * PAD CONTROL OFFSETS
83  * Field names corresponds to the pad signal name
84  */
85 struct pad_signals {
86         int gpmc_ad0;
87         int gpmc_ad1;
88         int gpmc_ad2;
89         int gpmc_ad3;
90         int gpmc_ad4;
91         int gpmc_ad5;
92         int gpmc_ad6;
93         int gpmc_ad7;
94         int gpmc_ad8;
95         int gpmc_ad9;
96         int gpmc_ad10;
97         int gpmc_ad11;
98         int gpmc_ad12;
99         int gpmc_ad13;
100         int gpmc_ad14;
101         int gpmc_ad15;
102         int gpmc_a0;
103         int gpmc_a1;
104         int gpmc_a2;
105         int gpmc_a3;
106         int gpmc_a4;
107         int gpmc_a5;
108         int gpmc_a6;
109         int gpmc_a7;
110         int gpmc_a8;
111         int gpmc_a9;
112         int gpmc_a10;
113         int gpmc_a11;
114         int gpmc_wait0;
115         int gpmc_wpn;
116         int gpmc_be1n;
117         int gpmc_csn0;
118         int gpmc_csn1;
119         int gpmc_csn2;
120         int gpmc_csn3;
121         int gpmc_clk;
122         int gpmc_advn_ale;
123         int gpmc_oen_ren;
124         int gpmc_wen;
125         int gpmc_be0n_cle;
126         int lcd_data0;
127         int lcd_data1;
128         int lcd_data2;
129         int lcd_data3;
130         int lcd_data4;
131         int lcd_data5;
132         int lcd_data6;
133         int lcd_data7;
134         int lcd_data8;
135         int lcd_data9;
136         int lcd_data10;
137         int lcd_data11;
138         int lcd_data12;
139         int lcd_data13;
140         int lcd_data14;
141         int lcd_data15;
142         int lcd_vsync;
143         int lcd_hsync;
144         int lcd_pclk;
145         int lcd_ac_bias_en;
146         int mmc0_dat3;
147         int mmc0_dat2;
148         int mmc0_dat1;
149         int mmc0_dat0;
150         int mmc0_clk;
151         int mmc0_cmd;
152         int mii1_col;
153         int mii1_crs;
154         int mii1_rxerr;
155         int mii1_txen;
156         int mii1_rxdv;
157         int mii1_txd3;
158         int mii1_txd2;
159         int mii1_txd1;
160         int mii1_txd0;
161         int mii1_txclk;
162         int mii1_rxclk;
163         int mii1_rxd3;
164         int mii1_rxd2;
165         int mii1_rxd1;
166         int mii1_rxd0;
167         int rmii1_refclk;
168         int mdio_data;
169         int mdio_clk;
170         int spi0_sclk;
171         int spi0_d0;
172         int spi0_d1;
173         int spi0_cs0;
174         int spi0_cs1;
175         int ecap0_in_pwm0_out;
176         int uart0_ctsn;
177         int uart0_rtsn;
178         int uart0_rxd;
179         int uart0_txd;
180         int uart1_ctsn;
181         int uart1_rtsn;
182         int uart1_rxd;
183         int uart1_txd;
184         int i2c0_sda;
185         int i2c0_scl;
186         int mcasp0_aclkx;
187         int mcasp0_fsx;
188         int mcasp0_axr0;
189         int mcasp0_ahclkr;
190         int mcasp0_aclkr;
191         int mcasp0_fsr;
192         int mcasp0_axr1;
193         int mcasp0_ahclkx;
194         int xdma_event_intr0;
195         int xdma_event_intr1;
196         int nresetin_out;
197         int porz;
198         int nnmi;
199         int osc0_in;
200         int osc0_out;
201         int rsvd1;
202         int tms;
203         int tdi;
204         int tdo;
205         int tck;
206         int ntrst;
207         int emu0;
208         int emu1;
209         int osc1_in;
210         int osc1_out;
211         int pmic_power_en;
212         int rtc_porz;
213         int rsvd2;
214         int ext_wakeup;
215         int enz_kaldo_1p8v;
216         int usb0_dm;
217         int usb0_dp;
218         int usb0_ce;
219         int usb0_id;
220         int usb0_vbus;
221         int usb0_drvvbus;
222         int usb1_dm;
223         int usb1_dp;
224         int usb1_ce;
225         int usb1_id;
226         int usb1_vbus;
227         int usb1_drvvbus;
228         int ddr_resetn;
229         int ddr_csn0;
230         int ddr_cke;
231         int ddr_ck;
232         int ddr_nck;
233         int ddr_casn;
234         int ddr_rasn;
235         int ddr_wen;
236         int ddr_ba0;
237         int ddr_ba1;
238         int ddr_ba2;
239         int ddr_a0;
240         int ddr_a1;
241         int ddr_a2;
242         int ddr_a3;
243         int ddr_a4;
244         int ddr_a5;
245         int ddr_a6;
246         int ddr_a7;
247         int ddr_a8;
248         int ddr_a9;
249         int ddr_a10;
250         int ddr_a11;
251         int ddr_a12;
252         int ddr_a13;
253         int ddr_a14;
254         int ddr_a15;
255         int ddr_odt;
256         int ddr_d0;
257         int ddr_d1;
258         int ddr_d2;
259         int ddr_d3;
260         int ddr_d4;
261         int ddr_d5;
262         int ddr_d6;
263         int ddr_d7;
264         int ddr_d8;
265         int ddr_d9;
266         int ddr_d10;
267         int ddr_d11;
268         int ddr_d12;
269         int ddr_d13;
270         int ddr_d14;
271         int ddr_d15;
272         int ddr_dqm0;
273         int ddr_dqm1;
274         int ddr_dqs0;
275         int ddr_dqsn0;
276         int ddr_dqs1;
277         int ddr_dqsn1;
278         int ddr_vref;
279         int ddr_vtp;
280         int ddr_strben0;
281         int ddr_strben1;
282         int ain7;
283         int ain6;
284         int ain5;
285         int ain4;
286         int ain3;
287         int ain2;
288         int ain1;
289         int ain0;
290         int vrefp;
291         int vrefn;
292 };
293
294 struct pin_mux {
295         short reg_offset;
296         uint8_t val;
297 };
298
299 #define PAD_CTRL_BASE   0x800
300 #define OFFSET(x)       (unsigned int) (&((struct pad_signals *) \
301                                 (PAD_CTRL_BASE))->x)
302
303 static struct pin_mux tx48_pins[] = {
304 #ifdef CONFIG_CMD_NAND
305         { OFFSET(gpmc_ad0), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD0 */
306         { OFFSET(gpmc_ad1), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD1 */
307         { OFFSET(gpmc_ad2), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD2 */
308         { OFFSET(gpmc_ad3), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD3 */
309         { OFFSET(gpmc_ad4), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD4 */
310         { OFFSET(gpmc_ad5), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD5 */
311         { OFFSET(gpmc_ad6), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD6 */
312         { OFFSET(gpmc_ad7), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD7 */
313         { OFFSET(gpmc_wait0), MODE(0) | RXACTIVE | PULLUP_EN, }, /* NAND WAIT */
314         { OFFSET(gpmc_wpn), MODE(7) | PULLUP_EN | RXACTIVE, },  /* NAND_WPN */
315         { OFFSET(gpmc_csn0), MODE(0) | PULLUDEN, },     /* NAND_CS0 */
316         { OFFSET(gpmc_advn_ale), MODE(0) | PULLUDEN, }, /* NAND_ADV_ALE */
317         { OFFSET(gpmc_oen_ren), MODE(0) | PULLUDEN, },  /* NAND_OE */
318         { OFFSET(gpmc_wen), MODE(0) | PULLUDEN, },      /* NAND_WEN */
319         { OFFSET(gpmc_be0n_cle), MODE(0) | PULLUDEN, }, /* NAND_BE_CLE */
320 #endif
321         /* I2C0 */
322         { OFFSET(i2c0_sda), MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL, }, /* I2C_DATA */
323         { OFFSET(i2c0_scl), MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL, }, /* I2C_SCLK */
324
325 #ifndef CONFIG_NO_ETH
326         /* RMII1 */
327         { OFFSET(mii1_crs), MODE(1) | RXACTIVE, },      /* RMII1_CRS */
328         { OFFSET(mii1_rxerr), MODE(1) | RXACTIVE | PULLUDEN, },  /* RMII1_RXERR */
329         { OFFSET(mii1_txen), MODE(1), },                     /* RMII1_TXEN */
330         { OFFSET(mii1_txd1), MODE(1), },                     /* RMII1_TXD1 */
331         { OFFSET(mii1_txd0), MODE(1), },                     /* RMII1_TXD0 */
332         { OFFSET(mii1_rxd1), MODE(1) | RXACTIVE | PULLUP_EN, }, /* RMII1_RXD1 */
333         { OFFSET(mii1_rxd0), MODE(1) | RXACTIVE | PULLUP_EN, }, /* RMII1_RXD0 */
334         { OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN, }, /* MDIO_DATA */
335         { OFFSET(mdio_clk), MODE(0) | PULLUP_EN, },     /* MDIO_CLK */
336         { OFFSET(rmii1_refclk), MODE(0) | RXACTIVE, },  /* RMII1_REFCLK */
337         { OFFSET(emu0), MODE(7) | RXACTIVE},         /* nINT */
338         { OFFSET(emu1), MODE(7), },                  /* nRST */
339 #endif
340 };
341
342 static struct gpio tx48_gpios[] = {
343         /* configure this pin early to prevent flicker of the LCD */
344         { TX48_LCD_BACKLIGHT_GPIO, GPIOF_OUTPUT_INIT_HIGH, "LCD BACKLIGHT", },
345 };
346
347 static struct pin_mux tx48_mmc_pins[] = {
348 #ifdef CONFIG_OMAP_HSMMC
349         /* MMC1 */
350         { OFFSET(mii1_rxd2), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT3 */
351         { OFFSET(mii1_rxd3), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT2 */
352         { OFFSET(mii1_rxclk), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT1 */
353         { OFFSET(mii1_txclk), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT0 */
354         { OFFSET(gpmc_csn1), MODE(2) | RXACTIVE | PULLUP_EN, }, /* MMC1_CLK */
355         { OFFSET(gpmc_csn2), MODE(2) | RXACTIVE | PULLUP_EN, }, /* MMC1_CMD */
356         { OFFSET(mcasp0_fsx), MODE(4) | RXACTIVE, },    /* MMC1_CD */
357 #endif
358 };
359
360 /*
361  * Configure the pin mux for the module
362  */
363 static inline void tx48_set_pin_mux(const struct pin_mux *pin_mux,
364                         int num_pins)
365 {
366         int i;
367
368         for (i = 0; i < num_pins; i++)
369                 MUX_CFG(pin_mux[i].val, pin_mux[i].reg_offset);
370 }
371
372 static struct pin_mux tx48_uart0_pins[] = {
373 #ifdef CONFIG_SYS_NS16550_COM1
374         /* UART0 for early boot messages */
375         { OFFSET(uart0_rxd), MODE(0) | PULLUP_EN | RXACTIVE, }, /* UART0_RXD */
376         { OFFSET(uart0_txd), MODE(0) | PULLUDEN, },             /* UART0_TXD */
377         { OFFSET(uart0_ctsn), MODE(0) | PULLUP_EN | RXACTIVE, },/* UART0_CTS */
378         { OFFSET(uart0_rtsn), MODE(0) | PULLUDEN, },            /* UART0_RTS */
379 #endif
380 #ifdef CONFIG_SYS_NS16550_COM2
381         /* UART1 */
382         { OFFSET(uart1_rxd), MODE(0) | PULLUP_EN | RXACTIVE, }, /* UART1_RXD */
383         { OFFSET(uart1_txd), MODE(0) | PULLUDEN, },             /* UART1_TXD */
384         { OFFSET(uart1_ctsn), MODE(0) | PULLUP_EN | RXACTIVE, },/* UART1_CTS */
385         { OFFSET(uart1_rtsn), MODE(0) | PULLUDEN, },            /* UART1_RTS */
386 #endif
387 #ifdef CONFIG_SYS_NS16550_COM3
388         /* UART5 */
389         { OFFSET(mii1_rxdv), MODE(3) | PULLUP_EN | RXACTIVE, }, /* UART5_RXD */
390         { OFFSET(mii1_col), MODE(3) | PULLUDEN, },              /* UART5_TXD */
391         { OFFSET(mmc0_dat1), MODE(2) | PULLUP_EN | RXACTIVE, }, /* UART5_CTS */
392         { OFFSET(mmc0_dat0), MODE(2) | PULLUDEN, },             /* UART5_RTS */
393 #endif
394 };
395
396 /*
397  * early system init of muxing and clocks.
398  */
399 void enable_uart0_pin_mux(void)
400 {
401         tx48_set_pin_mux(tx48_uart0_pins, ARRAY_SIZE(tx48_uart0_pins));
402 }
403
404 void enable_mmc0_pin_mux(void)
405 {
406         tx48_set_pin_mux(tx48_mmc_pins, ARRAY_SIZE(tx48_mmc_pins));
407 }
408
409 static const struct ddr_data tx48_ddr3_data = {
410         .datardsratio0 = MT41J128MJT125_RD_DQS,
411         .datawdsratio0 = MT41J128MJT125_WR_DQS,
412         .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
413         .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,
414         .datadldiff0 = PHY_DLL_LOCK_DIFF,
415 };
416
417 static const struct cmd_control tx48_ddr3_cmd_ctrl_data = {
418         .cmd0csratio = MT41J128MJT125_RATIO,
419         .cmd0dldiff = MT41J128MJT125_DLL_LOCK_DIFF,
420         .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
421
422         .cmd1csratio = MT41J128MJT125_RATIO,
423         .cmd1dldiff = MT41J128MJT125_DLL_LOCK_DIFF,
424         .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
425
426         .cmd2csratio = MT41J128MJT125_RATIO,
427         .cmd2dldiff = MT41J128MJT125_DLL_LOCK_DIFF,
428         .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,
429 };
430
431 static struct emif_regs tx48_ddr3_emif_reg_data = {
432         .sdram_config = MT41J128MJT125_EMIF_SDCFG,
433         .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
434         .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
435         .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
436         .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
437         .zq_config = MT41J128MJT125_ZQ_CFG,
438         .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY,
439 };
440
441 void s_init(void)
442 {
443 #ifndef CONFIG_HW_WATCHDOG
444         struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE;
445
446         /* WDT1 is already running when the bootloader gets control
447          * Disable it to avoid "random" resets
448          */
449         writel(0xAAAA, &wdtimer->wdtwspr);
450         while (readl(&wdtimer->wdtwwps) != 0x0)
451                 ;
452         writel(0x5555, &wdtimer->wdtwspr);
453         while (readl(&wdtimer->wdtwwps) != 0x0)
454                 ;
455 #endif
456         /* Setup the PLLs and the clocks for the peripherals */
457         pll_init();
458
459         /* UART softreset */
460         u32 regVal;
461         struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
462
463         enable_uart0_pin_mux();
464
465         regVal = readl(&uart_base->uartsyscfg);
466         regVal |= UART_RESET;
467         writel(regVal, &uart_base->uartsyscfg);
468         while ((readl(&uart_base->uartsyssts) &
469                 UART_CLK_RUNNING_MASK) != UART_CLK_RUNNING_MASK)
470                 ;
471
472         /* Disable smart idle */
473         regVal = readl(&uart_base->uartsyscfg);
474         regVal |= UART_SMART_IDLE_EN;
475         writel(regVal, &uart_base->uartsyscfg);
476
477         /* Initialize the Timer */
478         timer_init();
479
480         preloader_console_init();
481
482         config_ddr(303, MT41J128MJT125_IOCTRL_VALUE, &tx48_ddr3_data,
483                 &tx48_ddr3_cmd_ctrl_data, &tx48_ddr3_emif_reg_data);
484
485         /* Enable MMC0 */
486         enable_mmc0_pin_mux();
487
488         gpio_request_array(tx48_gpios, ARRAY_SIZE(tx48_gpios));
489         tx48_set_pin_mux(tx48_pins, ARRAY_SIZE(tx48_pins));
490 }