global: Migrate CONFIG_SYS_FSL* symbols to the CFG_SYS namespace
[platform/kernel/u-boot.git] / board / toradex / colibri_imx6 / colibri_imx6.c
index 10c595d..475250d 100644 (file)
@@ -7,9 +7,14 @@
  */
 
 #include <common.h>
+#include <cpu_func.h>
 #include <dm.h>
 #include <env.h>
 #include <init.h>
+#include <net.h>
+#include <asm/global_data.h>
+#include <linux/bitops.h>
+#include <linux/delay.h>
 
 #include <asm/arch/clock.h>
 #include <asm/arch/crm_regs.h>
@@ -51,9 +56,6 @@ DECLARE_GLOBAL_DATA_PTR;
        PAD_CTL_SPEED_LOW | PAD_CTL_DSE_80ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
 
-#define ENET_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
-       PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS)
-
 #define WEAK_PULLUP    (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm | PAD_CTL_HYS |   \
        PAD_CTL_SRE_SLOW)
@@ -83,7 +85,7 @@ iomux_v3_cfg_t const uart1_pads[] = {
        MX6_PAD_CSI0_DAT11__UART1_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
 };
 
-#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD)
+#if defined(CONFIG_FSL_ESDHC_IMX) && defined(CONFIG_SPL_BUILD)
 /* Colibri MMC */
 iomux_v3_cfg_t const usdhc1_pads[] = {
        MX6_PAD_SD1_CLK__SD1_CLK    | MUX_PAD_CTRL(USDHC_PAD_CTRL),
@@ -112,24 +114,6 @@ iomux_v3_cfg_t const usdhc3_pads[] = {
 };
 #endif /* CONFIG_FSL_ESDHC_IMX & CONFIG_SPL_BUILD */
 
-iomux_v3_cfg_t const enet_pads[] = {
-       MX6_PAD_ENET_MDC__ENET_MDC              | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_MDIO__ENET_MDIO            | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_RXD0__ENET_RX_DATA0        | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_RXD1__ENET_RX_DATA1        | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_RX_ER__ENET_RX_ER          | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_TX_EN__ENET_TX_EN          | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_TXD0__ENET_TX_DATA0        | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_TXD1__ENET_TX_DATA1        | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET_CRS_DV__ENET_RX_EN         | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_GPIO_16__ENET_REF_CLK           | MUX_PAD_CTRL(ENET_PAD_CTRL),
-};
-
-static void setup_iomux_enet(void)
-{
-       imx_iomux_v3_setup_multiple_pads(enet_pads, ARRAY_SIZE(enet_pads));
-}
-
 /* mux auxiliary pins to GPIO, so they can be used from the U-Boot cmdline */
 iomux_v3_cfg_t const gpio_pads[] = {
        /* ADDRESS[17:18] [25] used as GPIO */
@@ -304,9 +288,9 @@ int board_ehci_hcd_init(int port)
 }
 #endif
 
-#if defined(CONFIG_FSL_ESDHC) && defined(CONFIG_SPL_BUILD)
+#if defined(CONFIG_FSL_ESDHC_IMX) && defined(CONFIG_SPL_BUILD)
 /* use the following sequence: eMMC, MMC */
-struct fsl_esdhc_cfg usdhc_cfg[CONFIG_SYS_FSL_USDHC_NUM] = {
+struct fsl_esdhc_cfg usdhc_cfg[CFG_SYS_FSL_USDHC_NUM] = {
        {USDHC3_BASE_ADDR},
        {USDHC1_BASE_ADDR},
 };
@@ -327,7 +311,7 @@ int board_mmc_getcd(struct mmc *mmc)
        return ret;
 }
 
-int board_mmc_init(bd_t *bis)
+int board_mmc_init(struct bd_info *bis)
 {
        struct src *psrc = (struct src *)SRC_BASE_ADDR;
        unsigned reg = readl(&psrc->sbmr1) >> 11;
@@ -371,47 +355,18 @@ int board_phy_config(struct phy_device *phydev)
        return 0;
 }
 
-int board_eth_init(bd_t *bis)
+int setup_fec(void)
 {
-       struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
-       uint32_t base = IMX_FEC_BASE;
-       struct mii_dev *bus = NULL;
-       struct phy_device *phydev = NULL;
        int ret;
+       struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
 
        /* provide the PHY clock from the i.MX 6 */
        ret = enable_fec_anatop_clock(0, ENET_50MHZ);
        if (ret)
                return ret;
 
-       /* set gpr1[ENET_CLK_SEL] */
        setbits_le32(&iomuxc_regs->gpr[1], IOMUXC_GPR1_ENET_CLK_SEL_MASK);
 
-       setup_iomux_enet();
-
-#ifdef CONFIG_FEC_MXC
-       bus = fec_get_miibus(base, -1);
-       if (!bus)
-               return 0;
-
-       /* scan PHY 1..7 */
-       phydev = phy_find_by_mask(bus, 0xff, PHY_INTERFACE_MODE_RMII);
-       if (!phydev) {
-               free(bus);
-               puts("no PHY found\n");
-               return 0;
-       }
-
-       phy_reset(phydev);
-       printf("using PHY at %d\n", phydev->addr);
-       ret = fec_probe(bis, -1, base, bus, phydev);
-       if (ret) {
-               printf("FEC MXC: %s:failed\n", __func__);
-               free(phydev);
-               free(bus);
-       }
-#endif /* CONFIG_FEC_MXC */
-
        return 0;
 }
 
@@ -633,7 +588,9 @@ int board_init(void)
 {
        /* address of boot parameters */
        gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
-
+#if defined(CONFIG_FEC_MXC)
+       setup_fec();
+#endif
 #if defined(CONFIG_VIDEO_IPUV3)
        setup_display();
 #endif
@@ -654,12 +611,11 @@ int board_init(void)
 #ifdef CONFIG_BOARD_LATE_INIT
 int board_late_init(void)
 {
-#if defined(CONFIG_REVISION_TAG) && \
-    defined(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)
+#if defined(CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG)
        char env_str[256];
        u32 rev;
 
-       rev = get_board_rev();
+       rev = get_board_revision();
        snprintf(env_str, ARRAY_SIZE(env_str), "%.4x", rev);
        env_set("board_rev", env_str);
 #endif
@@ -696,7 +652,7 @@ int checkboard(void)
 }
 
 #if defined(CONFIG_OF_LIBFDT) && defined(CONFIG_OF_BOARD_SETUP)
-int ft_board_setup(void *blob, bd_t *bd)
+int ft_board_setup(void *blob, struct bd_info *bd)
 {
        u32 cma_size;
 
@@ -1024,13 +980,17 @@ static void ccgr_init(void)
 /*
  * Setup CCM_CCOSR register as follows:
  *
- * cko1_en  = 1           --> CKO1 enabled
- * cko1_div = 111  --> divide by 8
- * cko1_sel = 1011 --> ahb_clk_root
+ * clko2_en  = 1     --> CKO2 enabled
+ * clko2_div = 000   --> divide by 1
+ * clko2_sel = 01110 --> osc_clk (24MHz)
  *
- * This sets CKO1 at ahb_clk_root/8 = 132/8 = 16.5 MHz
+ * clk_out_sel = 1   --> Output CKO2 to CKO1
+ *
+ * This sets both CLKO2/CLKO1 output to 24MHz,
+ * CLKO1 configuration not relevant because of clk_out_sel
+ * (CLKO1 set to default)
  */
-       writel(0x000000FB, &ccm->ccosr);
+       writel(0x010E0101, &ccm->ccosr);
 }
 
 static void ddr_init(int *table, int size)
@@ -1041,9 +1001,28 @@ static void ddr_init(int *table, int size)
                writel(table[2 * i + 1], table[2 * i]);
 }
 
+/* Perform DDR DRAM calibration */
+static void spl_dram_perform_cal(u8 dsize)
+{
+#ifdef CONFIG_MX6_DDRCAL
+       int err;
+       struct mx6_ddr_sysinfo ddr_sysinfo = {
+               .dsize = dsize,
+       };
+
+       err = mmdc_do_write_level_calibration(&ddr_sysinfo);
+       if (err)
+               printf("error %d from write level calibration\n", err);
+       err = mmdc_do_dqs_calibration(&ddr_sysinfo);
+       if (err)
+               printf("error %d from dqs calibration\n", err);
+#endif
+}
+
 static void spl_dram_init(void)
 {
        int minc, maxc;
+       u8 dsize = 2;
 
        switch (get_cpu_temp_grade(&minc, &maxc)) {
        case TEMP_COMMERCIAL:
@@ -1053,6 +1032,7 @@ static void spl_dram_init(void)
                        ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
                } else {
                        puts("Commercial temperature grade DDR3 timings, 32bit bus width.\n");
+                       dsize = 1;
                        ddr_init(mx6s_dcd_table, ARRAY_SIZE(mx6s_dcd_table));
                }
                break;
@@ -1064,11 +1044,13 @@ static void spl_dram_init(void)
                        ddr_init(mx6dl_dcd_table, ARRAY_SIZE(mx6dl_dcd_table));
                } else {
                        puts("Industrial temperature grade DDR3 timings, 32bit bus width.\n");
+                       dsize = 1;
                        ddr_init(mx6s_dcd_table, ARRAY_SIZE(mx6s_dcd_table));
                }
                break;
        };
        udelay(100);
+       spl_dram_perform_cal(dsize);
 }
 
 static iomux_v3_cfg_t const gpio_reset_pad[] = {
@@ -1124,18 +1106,28 @@ void board_init_f(ulong dummy)
        board_init_r(NULL, 0);
 }
 
-void reset_cpu(ulong addr)
+#ifdef CONFIG_SPL_LOAD_FIT
+int board_fit_config_name_match(const char *name)
+{
+       if (!strcmp(name, "imx6-colibri"))
+               return 0;
+
+       return -1;
+}
+#endif
+
+void reset_cpu(void)
 {
 }
 
 #endif /* CONFIG_SPL_BUILD */
 
-static struct mxc_serial_platdata mxc_serial_plat = {
+static struct mxc_serial_plat mxc_serial_plat = {
        .reg = (struct mxc_uart *)UART1_BASE,
        .use_dte = true,
 };
 
-U_BOOT_DEVICE(mxc_serial) = {
+U_BOOT_DRVINFO(mxc_serial) = {
        .name = "serial_mxc",
-       .platdata = &mxc_serial_plat,
+       .plat = &mxc_serial_plat,
 };