2 * board/karo/tx48/spl.c
3 * Copyright (C) 2012 Lothar Waßmann <LW@KARO-electronics.de>
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.
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.
21 #include <fdt_support.h>
25 #include <linux/mtd/nand.h>
27 #include <asm/cache.h>
28 #include <asm/omap_common.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>
38 #include <asm/arch/da8xx-fb.h>
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)
48 #define GMII_SEL (CTRL_BASE + 0x650)
51 #define UART_SYSCFG_OFFSET 0x54
52 #define UART_SYSSTS_OFFSET 0x58
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)
60 #define TSICR_REG 0x54
61 #define TIOCP_CFG_REG 0x10
64 /* RGMII mode define */
65 #define RGMII_MODE_ENABLE 0xA
66 #define RMII_MODE_ENABLE 0x5
67 #define MII_MODE_ENABLE 0x0
69 #define NO_OF_MAC_ADDR 1
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)
80 DECLARE_GLOBAL_DATA_PTR;
84 * Field names corresponds to the pad signal name
176 int ecap0_in_pwm0_out;
195 int xdma_event_intr0;
196 int xdma_event_intr1;
300 #define PAD_CTRL_BASE 0x800
301 #define OFFSET(x) (unsigned int) (&((struct pad_signals *) \
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 */
323 { OFFSET(i2c0_sda), MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL, }, /* I2C_DATA */
324 { OFFSET(i2c0_scl), MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL, }, /* I2C_SCLK */
326 #ifndef CONFIG_NO_ETH
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 */
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", },
348 static struct pin_mux tx48_mmc_pins[] = {
349 #ifdef CONFIG_OMAP_HSMMC
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 */
362 * Configure the pin mux for the module
364 static inline void tx48_set_pin_mux(const struct pin_mux *pin_mux,
369 for (i = 0; i < num_pins; i++)
370 writel(pin_mux[i].val, CTRL_BASE + pin_mux[i].reg_offset);
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 */
381 #ifdef CONFIG_SYS_NS16550_COM2
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 */
388 #ifdef CONFIG_SYS_NS16550_COM3
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 */
398 * early system init of muxing and clocks.
400 static void enable_uart0_pin_mux(void)
402 tx48_set_pin_mux(tx48_uart0_pins, ARRAY_SIZE(tx48_uart0_pins));
405 static void enable_mmc0_pin_mux(void)
407 tx48_set_pin_mux(tx48_mmc_pins, ARRAY_SIZE(tx48_mmc_pins));
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,
419 #define SDRAM_CLK CONFIG_SYS_DDR_CLK
421 #define ns_TO_ck(ns) (((ns) * SDRAM_CLK + 999) / 1000)
422 #define ck_TO_ns(ck) ((ck) * 1000 / SDRAM_CLK)
425 static inline unsigned ck_val_check(unsigned ck, unsigned offs, unsigned max,
429 printf("value %u for parameter %s is out of range (min: %u\n",
434 printf("value %u for parameter %s is out of range (max: %u\n",
440 #define CK_VAL(ck, offs, max) ck_val_check(ck, offs, max, #ck)
442 #define CK_VAL(ck, offs, max) ((ck) - (offs))
445 #define DDR3_NT5CB128 1
446 #define DDR3_H5TQ2G8 2
449 #define SDRAM_TYPE DDR3_NT5CB128
451 #define SDRAM_TYPE DDR3_H5TQ2G8
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)
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))
470 #define tRTP max(ns_TO_ck(8), 4)
471 #define tCKE max(ns_TO_ck(6), 3)
475 #define tRFC ns_TO_ck(160)
478 static inline int cwl(u32 sdram_clk)
480 if (sdram_clk <= 300)
482 else if (sdram_clk > 300 && sdram_clk <= 333)
484 else if (sdram_clk > 333 && sdram_clk <= 400)
486 else if (sdram_clk > 400 && sdram_clk <= 533)
488 else if (sdram_clk > 533 && sdram_clk <= 666)
490 else if (SDRAM_TYPE != DDR3_H5TQ2G8)
492 else if (sdram_clk > 666 && sdram_clk <= 800)
495 printf("SDRAM clock out of range\n");
498 #define CWL cwl(SDRAM_CLK)
500 static inline int cl(u32 sdram_clk)
502 if (sdram_clk <= 300)
504 else if (sdram_clk > 300 && sdram_clk <= 333)
506 else if (sdram_clk > 333 && sdram_clk <= 400)
508 else if (sdram_clk > 400 && sdram_clk <= 533)
510 else if (sdram_clk > 533 && sdram_clk <= 666)
511 return (SDRAM_TYPE == DDR3_H5TQ2G8) ? 10 : 9;
512 else if (SDRAM_TYPE != DDR3_H5TQ2G8)
514 else if (sdram_clk > 666 && sdram_clk <= 800)
517 printf("SDRAM clock out of range\n");
520 #define CL cl(SDRAM_CLK)
522 #define ROW_ADDR_BITS 14
523 #define SDRAM_PG_SIZE 1024
525 #error Unsupported SDRAM_TYPE specified
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 */ | \
545 #define SDREF_VAL ( \
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 */ | \
553 #define tFAW ns_TO_ck(45)
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))
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))
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))
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 */ | \
585 static struct ddr_data tx48_ddr3_data = {
587 .datardsratio0 = 0x04010040,
588 .datawdsratio0 = 0x0,
589 .datafwsratio0 = 0x0,
590 .datawrsratio0 = 0x04010040,
594 static struct cmd_control tx48_ddr3_cmd_ctrl_data = {
604 static void ddr3_calib_start(void)
606 static struct emif_reg_struct *emif_reg = (void *)EMIF4_0_CFG_BASE;
611 debug("Starting DDR3 calibration\n");
613 /* wait for DDR PHY ready */
614 while (!((emif_status = readl(&emif_reg->emif_status)) & (1 << 2))) {
615 if (loops++ > 100000)
619 debug("EMIF status: %08x after %u loops\n", emif_status, loops);
621 /* enable DDR3 write levelling */
623 writel(EMIF_REG_RDWRLVLFULL_START_MASK, &emif_reg->emif_rd_wr_lvl_ctl);
625 regval = readl(&emif_reg->emif_rd_wr_lvl_ctl);
626 if (!(regval & EMIF_REG_RDWRLVLFULL_START_MASK))
629 } while (loops++ < 100000);
630 if (regval & EMIF_REG_RDWRLVLFULL_START_MASK) {
631 printf("Full WRLVL timed out\n");
633 debug("Full Write Levelling done after %u us\n", loops);
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");
641 static void tx48_ddr_init(void)
643 struct emif_regs r = {0};
645 debug("Initialising SDRAM timing for %u MHz DDR clock\n", SDRAM_CLK);
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;
655 config_ddr(SDRAM_CLK, 0x04, &tx48_ddr3_data,
656 &tx48_ddr3_cmd_ctrl_data, &r, 0);
660 debug("%s: config_ddr done\n", __func__);
663 #ifdef CONFIG_HW_WATCHDOG
664 static inline void tx48_wdog_disable(void)
668 static inline void tx48_wdog_disable(void)
670 struct wd_timer *wdtimer = (struct wd_timer *)WDT_BASE;
672 /* WDT1 is already running when the bootloader gets control
673 * Disable it to avoid "random" resets
675 writel(0xAAAA, &wdtimer->wdtwspr);
676 while (readl(&wdtimer->wdtwwps) != 0x0)
678 writel(0x5555, &wdtimer->wdtwspr);
679 while (readl(&wdtimer->wdtwwps) != 0x0)
686 struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
687 struct gpmc *gpmc_cfg = (struct gpmc *)GPMC_BASE;
693 * Save the boot parameters passed from romcode.
694 * We cannot delay the saving further than this,
695 * to prevent overwrites.
697 save_omap_boot_params();
699 /* Setup the PLLs and the clocks for the peripherals */
704 enable_uart0_pin_mux();
707 writel(readl(&uart_base->uartsyscfg) | UART_RESET,
708 &uart_base->uartsyscfg);
709 while (!(readl(&uart_base->uartsyssts) & UART_RESETDONE)) {
715 /* Disable smart idle */
716 writel((readl(&uart_base->uartsyscfg) & ~UART_IDLE_MODE_MASK) |
717 UART_IDLE_MODE(1), &uart_base->uartsyscfg);
719 preloader_console_init();
722 printf("Timeout waiting for UART RESET\n");
729 enable_gpmc_cs_config(gpmc_nand_cfg, &gpmc_cfg->cs[0],
730 CONFIG_SYS_NAND_BASE, CONFIG_SYS_NAND_SIZE);
733 enable_mmc0_pin_mux();
735 gpio_request_array(tx48_gpios, ARRAY_SIZE(tx48_gpios));
736 tx48_set_pin_mux(tx48_pins, ARRAY_SIZE(tx48_pins));