]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/ti/am335x/board.c
Add DDR3 support for AM335x-EVM (Version 1.5A)
[karo-tx-uboot.git] / board / ti / am335x / board.c
index 309a425a17f84cffbe359e499d2a9f74de569f03..b9ac1d5982dd2dd6b93a1d600fd6d19f302f06b1 100644 (file)
@@ -44,7 +44,7 @@ static struct uart_sys *uart_base = (struct uart_sys *)DEFAULT_UART_BASE;
 
 /* MII mode defines */
 #define MII_MODE_ENABLE                0x0
-#define RGMII_MODE_ENABLE      0xA
+#define RGMII_MODE_ENABLE      0x3A
 
 /* GPIO that controls power to DDR on EVM-SK */
 #define GPIO_DDR_VTT_EN                7
@@ -68,6 +68,17 @@ static inline int board_is_evm_sk(void)
        return !strncmp("A335X_SK", header.name, HDR_NAME_LEN);
 }
 
+static inline int board_is_idk(void)
+{
+       return !strncmp(header.config, "SKU#02", 6);
+}
+
+int board_is_evm_15_or_later(void)
+{
+       return (!strncmp("A33515BB", header.name, 8) &&
+               strncmp("1.5", header.version, 3) <= 0);
+}
+
 /*
  * Read header information from EEPROM into global structure.
  */
@@ -133,75 +144,119 @@ static void rtc32k_enable(void)
 }
 
 static const struct ddr_data ddr2_data = {
-       .datardsratio0 = ((DDR2_RD_DQS<<30)|(DDR2_RD_DQS<<20)
-                               |(DDR2_RD_DQS<<10)|(DDR2_RD_DQS<<0)),
-       .datawdsratio0 = ((DDR2_WR_DQS<<30)|(DDR2_WR_DQS<<20)
-                               |(DDR2_WR_DQS<<10)|(DDR2_WR_DQS<<0)),
-       .datawiratio0 = ((DDR2_PHY_WRLVL<<30)|(DDR2_PHY_WRLVL<<20)
-                               |(DDR2_PHY_WRLVL<<10)|(DDR2_PHY_WRLVL<<0)),
-       .datagiratio0 = ((DDR2_PHY_GATELVL<<30)|(DDR2_PHY_GATELVL<<20)
-                               |(DDR2_PHY_GATELVL<<10)|(DDR2_PHY_GATELVL<<0)),
-       .datafwsratio0 = ((DDR2_PHY_FIFO_WE<<30)|(DDR2_PHY_FIFO_WE<<20)
-                               |(DDR2_PHY_FIFO_WE<<10)|(DDR2_PHY_FIFO_WE<<0)),
-       .datawrsratio0 = ((DDR2_PHY_WR_DATA<<30)|(DDR2_PHY_WR_DATA<<20)
-                               |(DDR2_PHY_WR_DATA<<10)|(DDR2_PHY_WR_DATA<<0)),
-       .datauserank0delay = DDR2_PHY_RANK0_DELAY,
+       .datardsratio0 = ((MT47H128M16RT25E_RD_DQS<<30) |
+                         (MT47H128M16RT25E_RD_DQS<<20) |
+                         (MT47H128M16RT25E_RD_DQS<<10) |
+                         (MT47H128M16RT25E_RD_DQS<<0)),
+       .datawdsratio0 = ((MT47H128M16RT25E_WR_DQS<<30) |
+                         (MT47H128M16RT25E_WR_DQS<<20) |
+                         (MT47H128M16RT25E_WR_DQS<<10) |
+                         (MT47H128M16RT25E_WR_DQS<<0)),
+       .datawiratio0 = ((MT47H128M16RT25E_PHY_WRLVL<<30) |
+                        (MT47H128M16RT25E_PHY_WRLVL<<20) |
+                        (MT47H128M16RT25E_PHY_WRLVL<<10) |
+                        (MT47H128M16RT25E_PHY_WRLVL<<0)),
+       .datagiratio0 = ((MT47H128M16RT25E_PHY_GATELVL<<30) |
+                        (MT47H128M16RT25E_PHY_GATELVL<<20) |
+                        (MT47H128M16RT25E_PHY_GATELVL<<10) |
+                        (MT47H128M16RT25E_PHY_GATELVL<<0)),
+       .datafwsratio0 = ((MT47H128M16RT25E_PHY_FIFO_WE<<30) |
+                         (MT47H128M16RT25E_PHY_FIFO_WE<<20) |
+                         (MT47H128M16RT25E_PHY_FIFO_WE<<10) |
+                         (MT47H128M16RT25E_PHY_FIFO_WE<<0)),
+       .datawrsratio0 = ((MT47H128M16RT25E_PHY_WR_DATA<<30) |
+                         (MT47H128M16RT25E_PHY_WR_DATA<<20) |
+                         (MT47H128M16RT25E_PHY_WR_DATA<<10) |
+                         (MT47H128M16RT25E_PHY_WR_DATA<<0)),
+       .datauserank0delay = MT47H128M16RT25E_PHY_RANK0_DELAY,
        .datadldiff0 = PHY_DLL_LOCK_DIFF,
 };
 
 static const struct cmd_control ddr2_cmd_ctrl_data = {
-       .cmd0csratio = DDR2_RATIO,
-       .cmd0dldiff = DDR2_DLL_LOCK_DIFF,
-       .cmd0iclkout = DDR2_INVERT_CLKOUT,
+       .cmd0csratio = MT47H128M16RT25E_RATIO,
+       .cmd0dldiff = MT47H128M16RT25E_DLL_LOCK_DIFF,
+       .cmd0iclkout = MT47H128M16RT25E_INVERT_CLKOUT,
 
-       .cmd1csratio = DDR2_RATIO,
-       .cmd1dldiff = DDR2_DLL_LOCK_DIFF,
-       .cmd1iclkout = DDR2_INVERT_CLKOUT,
+       .cmd1csratio = MT47H128M16RT25E_RATIO,
+       .cmd1dldiff = MT47H128M16RT25E_DLL_LOCK_DIFF,
+       .cmd1iclkout = MT47H128M16RT25E_INVERT_CLKOUT,
 
-       .cmd2csratio = DDR2_RATIO,
-       .cmd2dldiff = DDR2_DLL_LOCK_DIFF,
-       .cmd2iclkout = DDR2_INVERT_CLKOUT,
+       .cmd2csratio = MT47H128M16RT25E_RATIO,
+       .cmd2dldiff = MT47H128M16RT25E_DLL_LOCK_DIFF,
+       .cmd2iclkout = MT47H128M16RT25E_INVERT_CLKOUT,
 };
 
 static const struct emif_regs ddr2_emif_reg_data = {
-       .sdram_config = DDR2_EMIF_SDCFG,
-       .ref_ctrl = DDR2_EMIF_SDREF,
-       .sdram_tim1 = DDR2_EMIF_TIM1,
-       .sdram_tim2 = DDR2_EMIF_TIM2,
-       .sdram_tim3 = DDR2_EMIF_TIM3,
-       .emif_ddr_phy_ctlr_1 = DDR2_EMIF_READ_LATENCY,
+       .sdram_config = MT47H128M16RT25E_EMIF_SDCFG,
+       .ref_ctrl = MT47H128M16RT25E_EMIF_SDREF,
+       .sdram_tim1 = MT47H128M16RT25E_EMIF_TIM1,
+       .sdram_tim2 = MT47H128M16RT25E_EMIF_TIM2,
+       .sdram_tim3 = MT47H128M16RT25E_EMIF_TIM3,
+       .emif_ddr_phy_ctlr_1 = MT47H128M16RT25E_EMIF_READ_LATENCY,
 };
 
 static const struct ddr_data ddr3_data = {
-       .datardsratio0 = DDR3_RD_DQS,
-       .datawdsratio0 = DDR3_WR_DQS,
-       .datafwsratio0 = DDR3_PHY_FIFO_WE,
-       .datawrsratio0 = DDR3_PHY_WR_DATA,
+       .datardsratio0 = MT41J128MJT125_RD_DQS,
+       .datawdsratio0 = MT41J128MJT125_WR_DQS,
+       .datafwsratio0 = MT41J128MJT125_PHY_FIFO_WE,
+       .datawrsratio0 = MT41J128MJT125_PHY_WR_DATA,
+       .datadldiff0 = PHY_DLL_LOCK_DIFF,
+};
+
+static const struct ddr_data ddr3_evm_data = {
+       .datardsratio0 = MT41J512M8RH125_RD_DQS,
+       .datawdsratio0 = MT41J512M8RH125_WR_DQS,
+       .datafwsratio0 = MT41J512M8RH125_PHY_FIFO_WE,
+       .datawrsratio0 = MT41J512M8RH125_PHY_WR_DATA,
        .datadldiff0 = PHY_DLL_LOCK_DIFF,
 };
 
 static const struct cmd_control ddr3_cmd_ctrl_data = {
-       .cmd0csratio = DDR3_RATIO,
-       .cmd0dldiff = DDR3_DLL_LOCK_DIFF,
-       .cmd0iclkout = DDR3_INVERT_CLKOUT,
+       .cmd0csratio = MT41J128MJT125_RATIO,
+       .cmd0dldiff = MT41J128MJT125_DLL_LOCK_DIFF,
+       .cmd0iclkout = MT41J128MJT125_INVERT_CLKOUT,
+
+       .cmd1csratio = MT41J128MJT125_RATIO,
+       .cmd1dldiff = MT41J128MJT125_DLL_LOCK_DIFF,
+       .cmd1iclkout = MT41J128MJT125_INVERT_CLKOUT,
+
+       .cmd2csratio = MT41J128MJT125_RATIO,
+       .cmd2dldiff = MT41J128MJT125_DLL_LOCK_DIFF,
+       .cmd2iclkout = MT41J128MJT125_INVERT_CLKOUT,
+};
 
-       .cmd1csratio = DDR3_RATIO,
-       .cmd1dldiff = DDR3_DLL_LOCK_DIFF,
-       .cmd1iclkout = DDR3_INVERT_CLKOUT,
+static const struct cmd_control ddr3_evm_cmd_ctrl_data = {
+       .cmd0csratio = MT41J512M8RH125_RATIO,
+       .cmd0dldiff = MT41J512M8RH125_DLL_LOCK_DIFF,
+       .cmd0iclkout = MT41J512M8RH125_INVERT_CLKOUT,
 
-       .cmd2csratio = DDR3_RATIO,
-       .cmd2dldiff = DDR3_DLL_LOCK_DIFF,
-       .cmd2iclkout = DDR3_INVERT_CLKOUT,
+       .cmd1csratio = MT41J512M8RH125_RATIO,
+       .cmd1dldiff = MT41J512M8RH125_DLL_LOCK_DIFF,
+       .cmd1iclkout = MT41J512M8RH125_INVERT_CLKOUT,
+
+       .cmd2csratio = MT41J512M8RH125_RATIO,
+       .cmd2dldiff = MT41J512M8RH125_DLL_LOCK_DIFF,
+       .cmd2iclkout = MT41J512M8RH125_INVERT_CLKOUT,
 };
 
 static struct emif_regs ddr3_emif_reg_data = {
-       .sdram_config = DDR3_EMIF_SDCFG,
-       .ref_ctrl = DDR3_EMIF_SDREF,
-       .sdram_tim1 = DDR3_EMIF_TIM1,
-       .sdram_tim2 = DDR3_EMIF_TIM2,
-       .sdram_tim3 = DDR3_EMIF_TIM3,
-       .zq_config = DDR3_ZQ_CFG,
-       .emif_ddr_phy_ctlr_1 = DDR3_EMIF_READ_LATENCY,
+       .sdram_config = MT41J128MJT125_EMIF_SDCFG,
+       .ref_ctrl = MT41J128MJT125_EMIF_SDREF,
+       .sdram_tim1 = MT41J128MJT125_EMIF_TIM1,
+       .sdram_tim2 = MT41J128MJT125_EMIF_TIM2,
+       .sdram_tim3 = MT41J128MJT125_EMIF_TIM3,
+       .zq_config = MT41J128MJT125_ZQ_CFG,
+       .emif_ddr_phy_ctlr_1 = MT41J128MJT125_EMIF_READ_LATENCY,
+};
+
+static struct emif_regs ddr3_evm_emif_reg_data = {
+       .sdram_config = MT41J512M8RH125_EMIF_SDCFG,
+       .ref_ctrl = MT41J512M8RH125_EMIF_SDREF,
+       .sdram_tim1 = MT41J512M8RH125_EMIF_TIM1,
+       .sdram_tim2 = MT41J512M8RH125_EMIF_TIM2,
+       .sdram_tim3 = MT41J512M8RH125_EMIF_TIM3,
+       .zq_config = MT41J512M8RH125_ZQ_CFG,
+       .emif_ddr_phy_ctlr_1 = MT41J512M8RH125_EMIF_READ_LATENCY,
 };
 #endif
 
@@ -230,7 +285,24 @@ void s_init(void)
        /* UART softreset */
        u32 regVal;
 
+#ifdef CONFIG_SERIAL1
        enable_uart0_pin_mux();
+#endif /* CONFIG_SERIAL1 */
+#ifdef CONFIG_SERIAL2
+       enable_uart1_pin_mux();
+#endif /* CONFIG_SERIAL2 */
+#ifdef CONFIG_SERIAL3
+       enable_uart2_pin_mux();
+#endif /* CONFIG_SERIAL3 */
+#ifdef CONFIG_SERIAL4
+       enable_uart3_pin_mux();
+#endif /* CONFIG_SERIAL4 */
+#ifdef CONFIG_SERIAL5
+       enable_uart4_pin_mux();
+#endif /* CONFIG_SERIAL5 */
+#ifdef CONFIG_SERIAL6
+       enable_uart5_pin_mux();
+#endif /* CONFIG_SERIAL6 */
 
        regVal = readl(&uart_base->uartsyscfg);
        regVal |= UART_RESET;
@@ -265,10 +337,13 @@ void s_init(void)
        }
 
        if (board_is_evm_sk() || board_is_bone_lt())
-               config_ddr(303, DDR3_IOCTRL_VALUE, &ddr3_data,
+               config_ddr(303, MT41J128MJT125_IOCTRL_VALUE, &ddr3_data,
                           &ddr3_cmd_ctrl_data, &ddr3_emif_reg_data);
+       else if (board_is_evm_15_or_later())
+               config_ddr(303, MT41J512M8RH125_IOCTRL_VALUE, &ddr3_evm_data,
+                          &ddr3_evm_cmd_ctrl_data, &ddr3_evm_emif_reg_data);
        else
-               config_ddr(266, DDR2_IOCTRL_VALUE, &ddr2_data,
+               config_ddr(266, MT47H128M16RT25E_IOCTRL_VALUE, &ddr2_data,
                           &ddr2_cmd_ctrl_data, &ddr2_emif_reg_data);
 #endif
 }
@@ -284,9 +359,31 @@ int board_init(void)
 
        gd->bd->bi_boot_params = PHYS_DRAM_1 + 0x100;
 
+       gpmc_init();
+
        return 0;
 }
 
+#ifdef CONFIG_BOARD_LATE_INIT
+int board_late_init(void)
+{
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       char safe_string[HDR_NAME_LEN + 1];
+
+       /* Now set variables based on the header. */
+       strncpy(safe_string, (char *)header.name, sizeof(header.name));
+       safe_string[sizeof(header.name)] = 0;
+       setenv("board_name", safe_string);
+
+       strncpy(safe_string, (char *)header.version, sizeof(header.version));
+       safe_string[sizeof(header.version)] = 0;
+       setenv("board_rev", safe_string);
+#endif
+
+       return 0;
+}
+#endif
+
 #ifdef CONFIG_DRIVER_TI_CPSW
 static void cpsw_control(int enabled)
 {
@@ -325,14 +422,19 @@ static struct cpsw_platform_data cpsw_data = {
        .host_port_num          = 0,
        .version                = CPSW_CTRL_VERSION_2,
 };
+#endif
 
+#if defined(CONFIG_DRIVER_TI_CPSW) || \
+       (defined(CONFIG_USB_ETHER) && defined(CONFIG_MUSB_GADGET))
 int board_eth_init(bd_t *bis)
 {
+       int rv, n = 0;
+#ifdef CONFIG_DRIVER_TI_CPSW
        uint8_t mac_addr[6];
        uint32_t mac_hi, mac_lo;
 
        if (!eth_getenv_enetaddr("ethaddr", mac_addr)) {
-               debug("<ethaddr> not set. Reading from E-fuse\n");
+               printf("<ethaddr> not set. Reading from E-fuse\n");
                /* try reading mac address from efuse */
                mac_lo = readl(&cdev->macid0l);
                mac_hi = readl(&cdev->macid0h);
@@ -346,10 +448,10 @@ int board_eth_init(bd_t *bis)
                if (is_valid_ether_addr(mac_addr))
                        eth_setenv_enetaddr("ethaddr", mac_addr);
                else
-                       return -1;
+                       goto try_usbether;
        }
 
-       if (board_is_bone() || board_is_bone_lt()) {
+       if (board_is_bone() || board_is_bone_lt() || board_is_idk()) {
                writel(MII_MODE_ENABLE, &cdev->miisel);
                cpsw_slaves[0].phy_if = cpsw_slaves[1].phy_if =
                                PHY_INTERFACE_MODE_MII;
@@ -359,6 +461,20 @@ int board_eth_init(bd_t *bis)
                                PHY_INTERFACE_MODE_RGMII;
        }
 
-       return cpsw_register(&cpsw_data);
+       rv = cpsw_register(&cpsw_data);
+       if (rv < 0)
+               printf("Error %d registering CPSW switch\n", rv);
+       else
+               n += rv;
+#endif
+try_usbether:
+#if defined(CONFIG_USB_ETHER) && !defined(CONFIG_SPL_BUILD)
+       rv = usb_eth_initialize(bis);
+       if (rv < 0)
+               printf("Error %d registering USB_ETHER\n", rv);
+       else
+               n += rv;
+#endif
+       return n;
 }
 #endif