]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/karo/tx48/spl.c
2d71d498d9d90189ec19cd61d692a8912e2c5cb9
[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/clock.h>
36 #include <asm/arch/mem.h>
37 #include <video_fb.h>
38 #include <asm/arch/da8xx-fb.h>
39
40 #include "flash.h"
41
42 #define TX48_LED_GPIO           AM33XX_GPIO_NR(1, 26)
43 #define TX48_ETH_PHY_RST_GPIO   AM33XX_GPIO_NR(3, 8)
44 #define TX48_LCD_RST_GPIO       AM33XX_GPIO_NR(1, 19)
45 #define TX48_LCD_PWR_GPIO       AM33XX_GPIO_NR(1, 22)
46 #define TX48_LCD_BACKLIGHT_GPIO AM33XX_GPIO_NR(3, 14)
47
48 #define GMII_SEL                (CTRL_BASE + 0x650)
49
50 /* UART Defines */
51 #define UART_SYSCFG_OFFSET      0x54
52 #define UART_SYSSTS_OFFSET      0x58
53
54 #define UART_RESET              (0x1 << 1)
55 #define UART_RESETDONE          (1 << 0)
56 #define UART_IDLE_MODE(m)       (((m) << 3) & UART_IDLE_MODE_MASK)
57 #define UART_IDLE_MODE_MASK     (0x3 << 3)
58
59 /* Timer Defines */
60 #define TSICR_REG               0x54
61 #define TIOCP_CFG_REG           0x10
62 #define TCLR_REG                0x38
63
64 /* RGMII mode define */
65 #define RGMII_MODE_ENABLE       0xA
66 #define RMII_MODE_ENABLE        0x5
67 #define MII_MODE_ENABLE         0x0
68
69 #define NO_OF_MAC_ADDR          1
70 #define ETH_ALEN                6
71
72 /* PAD Control Fields */
73 #define SLEWCTRL        (0x1 << 6)
74 #define RXACTIVE        (0x1 << 5)
75 #define PULLUP_EN       (0x1 << 4) /* Pull UP Selection */
76 #define PULLUDEN        (0x0 << 3) /* Pull up enabled */
77 #define PULLUDDIS       (0x1 << 3) /* Pull up disabled */
78 #define MODE(val)       (val)
79
80 DECLARE_GLOBAL_DATA_PTR;
81
82 /*
83  * PAD CONTROL OFFSETS
84  * Field names corresponds to the pad signal name
85  */
86 struct pad_signals {
87         int gpmc_ad0;
88         int gpmc_ad1;
89         int gpmc_ad2;
90         int gpmc_ad3;
91         int gpmc_ad4;
92         int gpmc_ad5;
93         int gpmc_ad6;
94         int gpmc_ad7;
95         int gpmc_ad8;
96         int gpmc_ad9;
97         int gpmc_ad10;
98         int gpmc_ad11;
99         int gpmc_ad12;
100         int gpmc_ad13;
101         int gpmc_ad14;
102         int gpmc_ad15;
103         int gpmc_a0;
104         int gpmc_a1;
105         int gpmc_a2;
106         int gpmc_a3;
107         int gpmc_a4;
108         int gpmc_a5;
109         int gpmc_a6;
110         int gpmc_a7;
111         int gpmc_a8;
112         int gpmc_a9;
113         int gpmc_a10;
114         int gpmc_a11;
115         int gpmc_wait0;
116         int gpmc_wpn;
117         int gpmc_be1n;
118         int gpmc_csn0;
119         int gpmc_csn1;
120         int gpmc_csn2;
121         int gpmc_csn3;
122         int gpmc_clk;
123         int gpmc_advn_ale;
124         int gpmc_oen_ren;
125         int gpmc_wen;
126         int gpmc_be0n_cle;
127         int lcd_data0;
128         int lcd_data1;
129         int lcd_data2;
130         int lcd_data3;
131         int lcd_data4;
132         int lcd_data5;
133         int lcd_data6;
134         int lcd_data7;
135         int lcd_data8;
136         int lcd_data9;
137         int lcd_data10;
138         int lcd_data11;
139         int lcd_data12;
140         int lcd_data13;
141         int lcd_data14;
142         int lcd_data15;
143         int lcd_vsync;
144         int lcd_hsync;
145         int lcd_pclk;
146         int lcd_ac_bias_en;
147         int mmc0_dat3;
148         int mmc0_dat2;
149         int mmc0_dat1;
150         int mmc0_dat0;
151         int mmc0_clk;
152         int mmc0_cmd;
153         int mii1_col;
154         int mii1_crs;
155         int mii1_rxerr;
156         int mii1_txen;
157         int mii1_rxdv;
158         int mii1_txd3;
159         int mii1_txd2;
160         int mii1_txd1;
161         int mii1_txd0;
162         int mii1_txclk;
163         int mii1_rxclk;
164         int mii1_rxd3;
165         int mii1_rxd2;
166         int mii1_rxd1;
167         int mii1_rxd0;
168         int rmii1_refclk;
169         int mdio_data;
170         int mdio_clk;
171         int spi0_sclk;
172         int spi0_d0;
173         int spi0_d1;
174         int spi0_cs0;
175         int spi0_cs1;
176         int ecap0_in_pwm0_out;
177         int uart0_ctsn;
178         int uart0_rtsn;
179         int uart0_rxd;
180         int uart0_txd;
181         int uart1_ctsn;
182         int uart1_rtsn;
183         int uart1_rxd;
184         int uart1_txd;
185         int i2c0_sda;
186         int i2c0_scl;
187         int mcasp0_aclkx;
188         int mcasp0_fsx;
189         int mcasp0_axr0;
190         int mcasp0_ahclkr;
191         int mcasp0_aclkr;
192         int mcasp0_fsr;
193         int mcasp0_axr1;
194         int mcasp0_ahclkx;
195         int xdma_event_intr0;
196         int xdma_event_intr1;
197         int nresetin_out;
198         int porz;
199         int nnmi;
200         int osc0_in;
201         int osc0_out;
202         int rsvd1;
203         int tms;
204         int tdi;
205         int tdo;
206         int tck;
207         int ntrst;
208         int emu0;
209         int emu1;
210         int osc1_in;
211         int osc1_out;
212         int pmic_power_en;
213         int rtc_porz;
214         int rsvd2;
215         int ext_wakeup;
216         int enz_kaldo_1p8v;
217         int usb0_dm;
218         int usb0_dp;
219         int usb0_ce;
220         int usb0_id;
221         int usb0_vbus;
222         int usb0_drvvbus;
223         int usb1_dm;
224         int usb1_dp;
225         int usb1_ce;
226         int usb1_id;
227         int usb1_vbus;
228         int usb1_drvvbus;
229         int ddr_resetn;
230         int ddr_csn0;
231         int ddr_cke;
232         int ddr_ck;
233         int ddr_nck;
234         int ddr_casn;
235         int ddr_rasn;
236         int ddr_wen;
237         int ddr_ba0;
238         int ddr_ba1;
239         int ddr_ba2;
240         int ddr_a0;
241         int ddr_a1;
242         int ddr_a2;
243         int ddr_a3;
244         int ddr_a4;
245         int ddr_a5;
246         int ddr_a6;
247         int ddr_a7;
248         int ddr_a8;
249         int ddr_a9;
250         int ddr_a10;
251         int ddr_a11;
252         int ddr_a12;
253         int ddr_a13;
254         int ddr_a14;
255         int ddr_a15;
256         int ddr_odt;
257         int ddr_d0;
258         int ddr_d1;
259         int ddr_d2;
260         int ddr_d3;
261         int ddr_d4;
262         int ddr_d5;
263         int ddr_d6;
264         int ddr_d7;
265         int ddr_d8;
266         int ddr_d9;
267         int ddr_d10;
268         int ddr_d11;
269         int ddr_d12;
270         int ddr_d13;
271         int ddr_d14;
272         int ddr_d15;
273         int ddr_dqm0;
274         int ddr_dqm1;
275         int ddr_dqs0;
276         int ddr_dqsn0;
277         int ddr_dqs1;
278         int ddr_dqsn1;
279         int ddr_vref;
280         int ddr_vtp;
281         int ddr_strben0;
282         int ddr_strben1;
283         int ain7;
284         int ain6;
285         int ain5;
286         int ain4;
287         int ain3;
288         int ain2;
289         int ain1;
290         int ain0;
291         int vrefp;
292         int vrefn;
293 };
294
295 struct pin_mux {
296         short reg_offset;
297         uint8_t val;
298 };
299
300 #define PAD_CTRL_BASE   0x800
301 #define OFFSET(x)       (unsigned int) (&((struct pad_signals *) \
302                                 (PAD_CTRL_BASE))->x)
303
304 static struct pin_mux tx48_pins[] = {
305 #ifdef CONFIG_CMD_NAND
306         { OFFSET(gpmc_ad0), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD0 */
307         { OFFSET(gpmc_ad1), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD1 */
308         { OFFSET(gpmc_ad2), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD2 */
309         { OFFSET(gpmc_ad3), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD3 */
310         { OFFSET(gpmc_ad4), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD4 */
311         { OFFSET(gpmc_ad5), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD5 */
312         { OFFSET(gpmc_ad6), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD6 */
313         { OFFSET(gpmc_ad7), MODE(0) | PULLUP_EN | RXACTIVE, },  /* NAND AD7 */
314         { OFFSET(gpmc_wait0), MODE(0) | RXACTIVE | PULLUP_EN, }, /* NAND WAIT */
315         { OFFSET(gpmc_wpn), MODE(7) | PULLUP_EN | RXACTIVE, },  /* NAND_WPN */
316         { OFFSET(gpmc_csn0), MODE(0) | PULLUDEN, },     /* NAND_CS0 */
317         { OFFSET(gpmc_advn_ale), MODE(0) | PULLUDEN, }, /* NAND_ADV_ALE */
318         { OFFSET(gpmc_oen_ren), MODE(0) | PULLUDEN, },  /* NAND_OE */
319         { OFFSET(gpmc_wen), MODE(0) | PULLUDEN, },      /* NAND_WEN */
320         { OFFSET(gpmc_be0n_cle), MODE(0) | PULLUDEN, }, /* NAND_BE_CLE */
321 #endif
322         /* I2C0 */
323         { OFFSET(i2c0_sda), MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL, }, /* I2C_DATA */
324         { OFFSET(i2c0_scl), MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL, }, /* I2C_SCLK */
325
326 #ifndef CONFIG_NO_ETH
327         /* RMII1 */
328         { OFFSET(mii1_crs), MODE(1) | RXACTIVE, },      /* RMII1_CRS */
329         { OFFSET(mii1_rxerr), MODE(1) | RXACTIVE | PULLUDEN, },  /* RMII1_RXERR */
330         { OFFSET(mii1_txen), MODE(1), },                     /* RMII1_TXEN */
331         { OFFSET(mii1_txd1), MODE(1), },                     /* RMII1_TXD1 */
332         { OFFSET(mii1_txd0), MODE(1), },                     /* RMII1_TXD0 */
333         { OFFSET(mii1_rxd1), MODE(1) | RXACTIVE | PULLUP_EN, }, /* RMII1_RXD1 */
334         { OFFSET(mii1_rxd0), MODE(1) | RXACTIVE | PULLUP_EN, }, /* RMII1_RXD0 */
335         { OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN, }, /* MDIO_DATA */
336         { OFFSET(mdio_clk), MODE(0) | PULLUP_EN, },     /* MDIO_CLK */
337         { OFFSET(rmii1_refclk), MODE(0) | RXACTIVE, },  /* RMII1_REFCLK */
338         { OFFSET(emu0), MODE(7) | RXACTIVE},         /* nINT */
339         { OFFSET(emu1), MODE(7), },                  /* nRST */
340 #endif
341 };
342
343 static struct gpio tx48_gpios[] = {
344         /* configure this pin early to prevent flicker of the LCD */
345         { TX48_LCD_BACKLIGHT_GPIO, GPIOFLAG_OUTPUT_INIT_HIGH, "LCD BACKLIGHT", },
346 };
347
348 static struct pin_mux tx48_mmc_pins[] = {
349 #ifdef CONFIG_OMAP_HSMMC
350         /* MMC1 */
351         { OFFSET(mii1_rxd2), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT3 */
352         { OFFSET(mii1_rxd3), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT2 */
353         { OFFSET(mii1_rxclk), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT1 */
354         { OFFSET(mii1_txclk), MODE(4) | RXACTIVE | PULLUP_EN, }, /* MMC1_DAT0 */
355         { OFFSET(gpmc_csn1), MODE(2) | RXACTIVE | PULLUP_EN, }, /* MMC1_CLK */
356         { OFFSET(gpmc_csn2), MODE(2) | RXACTIVE | PULLUP_EN, }, /* MMC1_CMD */
357         { OFFSET(mcasp0_fsx), MODE(4) | RXACTIVE, },    /* MMC1_CD */
358 #endif
359 };
360
361 /*
362  * Configure the pin mux for the module
363  */
364 static inline void tx48_set_pin_mux(const struct pin_mux *pin_mux,
365                         int num_pins)
366 {
367         int i;
368
369         for (i = 0; i < num_pins; i++)
370                 writel(pin_mux[i].val, CTRL_BASE + pin_mux[i].reg_offset);
371 }
372
373 static struct pin_mux tx48_uart0_pins[] = {
374 #ifdef CONFIG_SYS_NS16550_COM1
375         /* UART0 for early boot messages */
376         { OFFSET(uart0_rxd), MODE(0) | PULLUP_EN | RXACTIVE, }, /* UART0_RXD */
377         { OFFSET(uart0_txd), MODE(0) | PULLUDEN, },             /* UART0_TXD */
378         { OFFSET(uart0_ctsn), MODE(0) | PULLUP_EN | RXACTIVE, },/* UART0_CTS */
379         { OFFSET(uart0_rtsn), MODE(0) | PULLUDEN, },            /* UART0_RTS */
380 #endif
381 #ifdef CONFIG_SYS_NS16550_COM2
382         /* UART1 */
383         { OFFSET(uart1_rxd), MODE(0) | PULLUP_EN | RXACTIVE, }, /* UART1_RXD */
384         { OFFSET(uart1_txd), MODE(0) | PULLUDEN, },             /* UART1_TXD */
385         { OFFSET(uart1_ctsn), MODE(0) | PULLUP_EN | RXACTIVE, },/* UART1_CTS */
386         { OFFSET(uart1_rtsn), MODE(0) | PULLUDEN, },            /* UART1_RTS */
387 #endif
388 #ifdef CONFIG_SYS_NS16550_COM3
389         /* UART5 */
390         { OFFSET(mii1_rxdv), MODE(3) | PULLUP_EN | RXACTIVE, }, /* UART5_RXD */
391         { OFFSET(mii1_col), MODE(3) | PULLUDEN, },              /* UART5_TXD */
392         { OFFSET(mmc0_dat1), MODE(2) | PULLUP_EN | RXACTIVE, }, /* UART5_CTS */
393         { OFFSET(mmc0_dat0), MODE(2) | PULLUDEN, },             /* UART5_RTS */
394 #endif
395 };
396
397 /*
398  * early system init of muxing and clocks.
399  */
400 static void enable_uart0_pin_mux(void)
401 {
402         tx48_set_pin_mux(tx48_uart0_pins, ARRAY_SIZE(tx48_uart0_pins));
403 }
404
405 static void enable_mmc0_pin_mux(void)
406 {
407         tx48_set_pin_mux(tx48_mmc_pins, ARRAY_SIZE(tx48_mmc_pins));
408 }
409
410 static const u32 gpmc_nand_cfg[GPMC_MAX_REG] = {
411         TX48_NAND_GPMC_CONFIG1,
412         TX48_NAND_GPMC_CONFIG2,
413         TX48_NAND_GPMC_CONFIG3,
414         TX48_NAND_GPMC_CONFIG4,
415         TX48_NAND_GPMC_CONFIG5,
416         TX48_NAND_GPMC_CONFIG6,
417 };
418
419 #define SDRAM_CLK               CONFIG_SYS_DDR_CLK
420
421 #define ns_TO_ck(ns)            (((ns) * SDRAM_CLK + 999) / 1000)
422 #define ck_TO_ns(ck)            ((ck) * 1000 / SDRAM_CLK)
423
424 #ifdef DEBUG
425 static inline unsigned ck_val_check(unsigned ck, unsigned offs, unsigned max,
426                         const char *name)
427 {
428         if (ck < offs) {
429                 printf("value %u for parameter %s is out of range (min: %u\n",
430                         ck, name, offs);
431                 hang();
432         }
433         if (ck > max) {
434                 printf("value %u for parameter %s is out of range (max: %u\n",
435                         ck, name, max);
436                 hang();
437         }
438         return ck - offs;
439 }
440 #define CK_VAL(ck, offs, max)   ck_val_check(ck, offs, max, #ck)
441 #else
442 #define CK_VAL(ck, offs, max)   ((ck) - (offs))
443 #endif
444
445 #define DDR3_NT5CB128           1
446 #define DDR3_H5TQ2G8            2
447
448 #if 1
449 #define SDRAM_TYPE DDR3_NT5CB128
450 #else
451 #define SDRAM_TYPE DDR3_H5TQ2G8
452 #endif
453
454 #ifndef SDRAM_TYPE
455 #error No SDRAM_TYPE specified
456 #elif (SDRAM_TYPE == DDR3_NT5CB128) || (SDRAM_TYPE == DDR3_H5TQ2G8)
457 #define tRP                     ns_TO_ck(14)
458 #define tRCD                    ns_TO_ck(14)
459 #define tWR                     ns_TO_ck(15)
460 #define tRAS                    ns_TO_ck(35)
461 #define tRC                     ns_TO_ck(49)
462 #define tRRD                    max(ns_TO_ck(8), 4)
463 #define tWTR                    max(ns_TO_ck(8), 4)
464
465 #define tXP                     max(ns_TO_ck(6), 3)
466 #define tXPR                    max(5, ns_TO_ck(ck_TO_ns(tRFC + 1) + 10))
467 #define tODT                    ns_TO_ck(9)
468 #define tXSNR                   max(5, ns_TO_ck(ck_TO_ns(tRFC + 1) + 10))
469 #define tXSRD                   512
470 #define tRTP                    max(ns_TO_ck(8), 4)
471 #define tCKE                    max(ns_TO_ck(6), 3)
472
473 #define tPDLL_UL                512
474 #define tZQCS                   64
475 #define tRFC                    ns_TO_ck(160)
476 #define tRAS_MAX                0xf
477
478 static inline int cwl(u32 sdram_clk)
479 {
480         if (sdram_clk <= 300)
481                 return 5;
482         else if (sdram_clk > 300 && sdram_clk <= 333)
483                 return 5;
484         else if (sdram_clk > 333 && sdram_clk <= 400)
485                 return 5;
486         else if (sdram_clk > 400 && sdram_clk <= 533)
487                 return 6;
488         else if (sdram_clk > 533 && sdram_clk <= 666)
489                 return 7;
490         else if (SDRAM_TYPE != DDR3_H5TQ2G8)
491                 ;
492         else if (sdram_clk > 666 && sdram_clk <= 800)
493                 return 8;
494
495         printf("SDRAM clock out of range\n");
496         hang();
497 }
498 #define CWL cwl(SDRAM_CLK)
499
500 static inline int cl(u32 sdram_clk)
501 {
502         if (sdram_clk <= 300)
503                 return 5;
504         else if (sdram_clk > 300 && sdram_clk <= 333)
505                 return 5;
506         else if (sdram_clk > 333 && sdram_clk <= 400)
507                 return 6;
508         else if (sdram_clk > 400 && sdram_clk <= 533)
509                 return 8;
510         else if (sdram_clk > 533 && sdram_clk <= 666)
511                 return (SDRAM_TYPE == DDR3_H5TQ2G8) ? 10 : 9;
512         else if (SDRAM_TYPE != DDR3_H5TQ2G8)
513                 ;
514         else if (sdram_clk > 666 && sdram_clk <= 800)
515                 return 11;
516
517         printf("SDRAM clock out of range\n");
518         hang();
519 }
520 #define CL cl(SDRAM_CLK)
521
522 #define ROW_ADDR_BITS           14
523 #define SDRAM_PG_SIZE           1024
524 #else
525 #error Unsupported SDRAM_TYPE specified
526 #endif
527
528 #define SDRAM_CONFIG_VAL        (                                       \
529                 (3 << 29) /* SDRAM type: 0: DDR1 1: LPDDR1 2: DDR2 3: DDR3 */ | \
530                 (0 << 27) /* IBANK pos */ |                             \
531                 (2 << 24) /* termination resistor value 0: disable 1: RZQ/4 2: RZQ/2 3: RZQ/6 4: RZQ/12 5: RZQ/8 */ | \
532                 (0 << 23) /* DDR2 differential DQS */ |                 \
533                 (1 << 21) /* dynamic ODT 0: off 1: RZQ/4 2: RZQ/2 */ |  \
534                 (0 << 20) /* DLL disable */ |                           \
535                 (1 << 18) /* drive strength 0: RZQ/6 1: RZQ/7 */ |      \
536                 ((CWL - 5) << 16) /* CWL 0: 5 ... 3: 8 */ |             \
537                 (1 << 14) /* SDRAM data bus width 0: 32 1: 16 */ |      \
538                 (((CL - 4) * 2) << 10) /* CAS latency 2: 5 4: 6 6: 8 ... 14: 11 (DDR3) */ | \
539                 ((ROW_ADDR_BITS - 9) << 7) /* # of row addr bits 0: 9 ... 7: 16 */ | \
540                 (3 << 4) /* # of SDRAM internal banks 0: 1 1: 2 2: 4 3: 8 */ | \
541                 (0 << 3) /* # of CS lines */ |                          \
542                 ((ffs(SDRAM_PG_SIZE / 256) - 1) << 0) /* page size 0: 256 1: 512 2: 1024 3:2048 */ | \
543                 0)
544
545 #define SDREF_VAL               (                                       \
546                 (0 << 31) /* */ |                                       \
547                 (1 << 29) /* self refresh temperature range 1: extended temp range */ | \
548                 (0 << 28) /* auto self refresh enable */ |              \
549                 (0 << 24) /* partial array self refresh */ |            \
550                 ((SDRAM_CLK * 7800 / 1000) << 0) /* refresh interval */ | \
551                 0)
552
553 #define tFAW            ns_TO_ck(45)
554
555 #define SDRAM_TIM1_VAL  ((CK_VAL(tRP, 1, 16) << 25) |   \
556                          (CK_VAL(tRCD, 1, 16) << 21) |  \
557                          (CK_VAL(tWR, 1, 16) << 17) |   \
558                          (CK_VAL(tRAS, 1, 32) << 12) |  \
559                          (CK_VAL(tRC, 1, 64) << 6) |    \
560                          (CK_VAL(tRRD, 1, 8) << 3) |    \
561                          (CK_VAL(tWTR, 1, 8) << 0))
562
563 #define SDRAM_TIM2_VAL  ((CK_VAL(max(tCKE, tXP), 1, 8) << 28) | \
564                          (CK_VAL(tODT, 0, 8) << 25) |           \
565                          (CK_VAL(tXSNR, 1, 128) << 16) |        \
566                          (CK_VAL(tXSRD, 1, 1024) << 6) |        \
567                          (CK_VAL(tRTP, 1, 8) << 3) |            \
568                          (CK_VAL(tCKE, 1, 8) << 0))
569
570 #define SDRAM_TIM3_VAL  ((CK_VAL(DIV_ROUND_UP(tPDLL_UL, 128), 0, 16) << 28) | \
571                          (CK_VAL(tZQCS, 1, 64) << 15) |                 \
572                          (CK_VAL(tRFC, 1, 1024) << 4) |                 \
573                          (CK_VAL(tRAS_MAX, 0, 16) << 0))
574
575 #define ZQ_CONFIG_VAL           (                                       \
576                 (1 << 31) /* ZQ calib for CS1 */ |                      \
577                 (0 << 30) /* ZQ calib for CS0 */ |                      \
578                 (0 << 29) /* dual calib */ |                            \
579                 (1 << 28) /* ZQ calib on SR/PWDN exit */ |              \
580                 (2 << 18) /* ZQCL intervals for ZQINIT */ |             \
581                 (4 << 16) /* ZQCS intervals for ZQCL */ |               \
582                 (80 << 0) /* refr periods between ZQCS commands */ |    \
583                 0)
584
585 static struct ddr_data tx48_ddr3_data = {
586         /* reset defaults */
587         .datardsratio0 = 0x04010040,
588         .datawdsratio0 = 0x0,
589         .datafwsratio0 = 0x0,
590         .datawrsratio0 = 0x04010040,
591         .datadldiff0 = 0x4,
592 };
593
594 static struct cmd_control tx48_ddr3_cmd_ctrl_data = {
595         /* reset defaults */
596         .cmd0csratio = 0x80,
597         .cmd0dldiff = 0x04,
598         .cmd1csratio = 0x80,
599         .cmd1dldiff = 0x04,
600         .cmd2csratio = 0x80,
601         .cmd2dldiff = 0x04,
602 };
603
604 static void ddr3_calib_start(void)
605 {
606         static struct emif_reg_struct *emif_reg = (void *)EMIF4_0_CFG_BASE;
607         int loops = 0;
608         u32 regval;
609         u32 emif_status;
610
611         debug("Starting DDR3 calibration\n");
612
613         /* wait for DDR PHY ready */
614         while (!((emif_status = readl(&emif_reg->emif_status)) & (1 << 2))) {
615                 if (loops++ > 100000)
616                         break;
617                 udelay(1);
618         }
619         debug("EMIF status: %08x after %u loops\n", emif_status, loops);
620
621         /* enable DDR3 write levelling */
622         loops = 0;
623         writel(EMIF_REG_RDWRLVLFULL_START_MASK, &emif_reg->emif_rd_wr_lvl_ctl);
624         do {
625                 regval = readl(&emif_reg->emif_rd_wr_lvl_ctl);
626                 if (!(regval & EMIF_REG_RDWRLVLFULL_START_MASK))
627                         break;
628                 udelay(1);
629         } while (loops++ < 100000);
630         if (regval & EMIF_REG_RDWRLVLFULL_START_MASK) {
631                 printf("Full WRLVL timed out\n");
632         } else {
633                 debug("Full Write Levelling done after %u us\n", loops);
634         }
635         writel(0, &emif_reg->emif_rd_wr_lvl_rmp_ctl);
636         writel(0, &emif_reg->emif_rd_wr_lvl_rmp_win);
637         writel(0x0f808080, &emif_reg->emif_rd_wr_lvl_ctl);
638         debug("DDR3 calibration done\n");
639 }
640
641 static void tx48_ddr_init(void)
642 {
643         struct emif_regs r = {0};
644
645         debug("Initialising SDRAM timing for %u MHz DDR clock\n", SDRAM_CLK);
646
647         r.sdram_config = SDRAM_CONFIG_VAL;
648         r.ref_ctrl = SDREF_VAL;
649         r.sdram_tim1 = SDRAM_TIM1_VAL;
650         r.sdram_tim2 = SDRAM_TIM2_VAL;
651         r.sdram_tim3 = SDRAM_TIM3_VAL;
652         r.zq_config = ZQ_CONFIG_VAL;
653         r.emif_ddr_phy_ctlr_1 = 0x0000030b;
654
655         config_ddr(SDRAM_CLK, 0x04, &tx48_ddr3_data,
656                 &tx48_ddr3_cmd_ctrl_data, &r, 0);
657
658         ddr3_calib_start();
659
660         debug("%s: config_ddr done\n", __func__);
661 }
662
663 #ifdef CONFIG_HW_WATCHDOG
664 static inline void tx48_wdog_disable(void)
665 {
666 }
667 #else
668 static inline void tx48_wdog_disable(void)
669 {
670         struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE;
671
672         /* WDT1 is already running when the bootloader gets control
673          * Disable it to avoid "random" resets
674          */
675         writel(0xAAAA, &wdtimer->wdtwspr);
676         while (readl(&wdtimer->wdtwwps) != 0x0)
677                 ;
678         writel(0x5555, &wdtimer->wdtwspr);
679         while (readl(&wdtimer->wdtwwps) != 0x0)
680                 ;
681 }
682 #endif
683
684 void s_init(void)
685 {
686         struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
687         struct gpmc *gpmc_cfg = (struct gpmc *)GPMC_BASE;
688         int timeout = 1000;
689
690         gd = &gdata;
691
692         /*
693          * Save the boot parameters passed from romcode.
694          * We cannot delay the saving further than this,
695          * to prevent overwrites.
696          */
697         save_omap_boot_params();
698
699         /* Setup the PLLs and the clocks for the peripherals */
700         pll_init();
701
702         tx48_wdog_disable();
703
704         enable_uart0_pin_mux();
705
706         /* UART softreset */
707         writel(readl(&uart_base->uartsyscfg) | UART_RESET,
708                 &uart_base->uartsyscfg);
709         while (!(readl(&uart_base->uartsyssts) & UART_RESETDONE)) {
710                 udelay(1);
711                 if (timeout-- <= 0)
712                         break;
713         }
714
715         /* Disable smart idle */
716         writel((readl(&uart_base->uartsyscfg) & ~UART_IDLE_MODE_MASK) |
717                 UART_IDLE_MODE(1), &uart_base->uartsyscfg);
718
719         preloader_console_init();
720
721         if (timeout <= 0)
722                 printf("Timeout waiting for UART RESET\n");
723
724         timer_init();
725
726         tx48_ddr_init();
727
728         gpmc_init();
729         enable_gpmc_cs_config(gpmc_nand_cfg, &gpmc_cfg->cs[0],
730                         CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_SIZE);
731
732         /* Enable MMC0 */
733         enable_mmc0_pin_mux();
734
735         gpio_request_array(tx48_gpios, ARRAY_SIZE(tx48_gpios));
736         tx48_set_pin_mux(tx48_pins, ARRAY_SIZE(tx48_pins));
737 }