]> git.sur5r.net Git - u-boot/blobdiff - board/freescale/mx6sabresd/mx6sabresd.c
mx6sabresd: Use VESA 1024x768 timings
[u-boot] / board / freescale / mx6sabresd / mx6sabresd.c
index 8f369b35d92581ffef12820b5dbfc16b32363892..727334a2279300d110210a7f8646822b242e82b3 100644 (file)
 #include <i2c.h>
 #include <power/pmic.h>
 #include <power/pfuze100_pmic.h>
+#include "../common/pfuze.h"
 #include <asm/arch/mx6-ddr.h>
+#include <usb.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define BOOT_CFG       0x020D8004
-
 #define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |                  \
        PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |                 \
        PAD_CTL_SRE_FAST  | PAD_CTL_HYS)
@@ -94,8 +94,9 @@ static void setup_iomux_enet(void)
 
        /* Reset AR8031 PHY */
        gpio_direction_output(IMX_GPIO_NR(1, 25) , 0);
-       udelay(500);
+       mdelay(10);
        gpio_set_value(IMX_GPIO_NR(1, 25), 1);
+       udelay(100);
 }
 
 static iomux_v3_cfg_t const usdhc2_pads[] = {
@@ -234,6 +235,11 @@ struct fsl_esdhc_cfg usdhc_cfg[3] = {
 #define USDHC2_CD_GPIO IMX_GPIO_NR(2, 2)
 #define USDHC3_CD_GPIO IMX_GPIO_NR(2, 0)
 
+int board_mmc_get_env_dev(int devno)
+{
+       return devno - 1;
+}
+
 int board_mmc_getcd(struct mmc *mmc)
 {
        struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
@@ -262,7 +268,7 @@ int board_mmc_init(bd_t *bis)
 
        /*
         * According to the board_mmc_init() the following map is done:
-        * (U-boot device node)    (Physical Port)
+        * (U-Boot device node)    (Physical Port)
         * mmc0                    SD2
         * mmc1                    SD3
         * mmc2                    eMMC
@@ -300,7 +306,8 @@ int board_mmc_init(bd_t *bis)
 
        return 0;
 #else
-       unsigned reg = readl(BOOT_CFG) >> 11;
+       struct src *psrc = (struct src *)SRC_BASE_ADDR;
+       unsigned reg = readl(&psrc->sbmr1) >> 11;
        /*
         * Upon reading BOOT_CFG register the following map is done:
         * Bit 11 and 12 of BOOT_CFG register can determine the current
@@ -339,39 +346,6 @@ int board_mmc_init(bd_t *bis)
 }
 #endif
 
-int mx6_rgmii_rework(struct phy_device *phydev)
-{
-       unsigned short val;
-
-       /* To enable AR8031 ouput a 125MHz clk from CLK_25M */
-       phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x7);
-       phy_write(phydev, MDIO_DEVAD_NONE, 0xe, 0x8016);
-       phy_write(phydev, MDIO_DEVAD_NONE, 0xd, 0x4007);
-
-       val = phy_read(phydev, MDIO_DEVAD_NONE, 0xe);
-       val &= 0xffe3;
-       val |= 0x18;
-       phy_write(phydev, MDIO_DEVAD_NONE, 0xe, val);
-
-       /* introduce tx clock delay */
-       phy_write(phydev, MDIO_DEVAD_NONE, 0x1d, 0x5);
-       val = phy_read(phydev, MDIO_DEVAD_NONE, 0x1e);
-       val |= 0x0100;
-       phy_write(phydev, MDIO_DEVAD_NONE, 0x1e, val);
-
-       return 0;
-}
-
-int board_phy_config(struct phy_device *phydev)
-{
-       mx6_rgmii_rework(phydev);
-
-       if (phydev->drv->config)
-               phydev->drv->config(phydev);
-
-       return 0;
-}
-
 #if defined(CONFIG_VIDEO_IPUV3)
 static void disable_lvds(struct display_info_t const *dev)
 {
@@ -412,13 +386,13 @@ struct display_info_t const displays[] = {{
                .refresh        = 60,
                .xres           = 1024,
                .yres           = 768,
-               .pixclock       = 15385,
-               .left_margin    = 220,
-               .right_margin   = 40,
-               .upper_margin   = 21,
-               .lower_margin   = 7,
-               .hsync_len      = 60,
-               .vsync_len      = 10,
+               .pixclock       = 15384,
+               .left_margin    = 160,
+               .right_margin   = 24,
+               .upper_margin   = 29,
+               .lower_margin   = 3,
+               .hsync_len      = 136,
+               .vsync_len      = 6,
                .sync           = FB_SYNC_EXT,
                .vmode          = FB_VMODE_NONINTERLACED
 } }, {
@@ -432,13 +406,13 @@ struct display_info_t const displays[] = {{
                .refresh        = 60,
                .xres           = 1024,
                .yres           = 768,
-               .pixclock       = 15385,
-               .left_margin    = 220,
-               .right_margin   = 40,
-               .upper_margin   = 21,
-               .lower_margin   = 7,
-               .hsync_len      = 60,
-               .vsync_len      = 10,
+               .pixclock       = 15384,
+               .left_margin    = 160,
+               .right_margin   = 24,
+               .upper_margin   = 29,
+               .lower_margin   = 3,
+               .hsync_len      = 136,
+               .vsync_len      = 6,
                .sync           = FB_SYNC_EXT,
                .vmode          = FB_VMODE_NONINTERLACED
 } }, {
@@ -537,6 +511,69 @@ int board_eth_init(bd_t *bis)
        return cpu_eth_init(bis);
 }
 
+#ifdef CONFIG_USB_EHCI_MX6
+#define USB_OTHERREGS_OFFSET   0x800
+#define UCTRL_PWR_POL          (1 << 9)
+
+static iomux_v3_cfg_t const usb_otg_pads[] = {
+       MX6_PAD_EIM_D22__USB_OTG_PWR | MUX_PAD_CTRL(NO_PAD_CTRL),
+       MX6_PAD_ENET_RX_ER__USB_OTG_ID | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static iomux_v3_cfg_t const usb_hc1_pads[] = {
+       MX6_PAD_ENET_TXD1__GPIO1_IO29 | MUX_PAD_CTRL(NO_PAD_CTRL),
+};
+
+static void setup_usb(void)
+{
+       imx_iomux_v3_setup_multiple_pads(usb_otg_pads,
+                                        ARRAY_SIZE(usb_otg_pads));
+
+       /*
+        * set daisy chain for otg_pin_id on 6q.
+        * for 6dl, this bit is reserved
+        */
+       imx_iomux_set_gpr_register(1, 13, 1, 0);
+
+       imx_iomux_v3_setup_multiple_pads(usb_hc1_pads,
+                                        ARRAY_SIZE(usb_hc1_pads));
+}
+
+int board_ehci_hcd_init(int port)
+{
+       u32 *usbnc_usb_ctrl;
+
+       if (port > 1)
+               return -EINVAL;
+
+       usbnc_usb_ctrl = (u32 *)(USB_BASE_ADDR + USB_OTHERREGS_OFFSET +
+                                port * 4);
+
+       setbits_le32(usbnc_usb_ctrl, UCTRL_PWR_POL);
+
+       return 0;
+}
+
+int board_ehci_power(int port, int on)
+{
+       switch (port) {
+       case 0:
+               break;
+       case 1:
+               if (on)
+                       gpio_direction_output(IMX_GPIO_NR(1, 29), 1);
+               else
+                       gpio_direction_output(IMX_GPIO_NR(1, 29), 0);
+               break;
+       default:
+               printf("MXC USB port %d not yet supported\n", port);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+#endif
+
 int board_early_init_f(void)
 {
        setup_iomux_uart();
@@ -557,63 +594,39 @@ int board_init(void)
 #endif
        setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
 
+#ifdef CONFIG_USB_EHCI_MX6
+       setup_usb();
+#endif
+
        return 0;
 }
 
-static int pfuze_init(void)
+int power_init_board(void)
 {
        struct pmic *p;
-       int ret;
        unsigned int reg;
+       int ret;
 
-       ret = power_pfuze100_init(I2C_PMIC);
-       if (ret)
-               return ret;
+       p = pfuze_common_init(I2C_PMIC);
+       if (!p)
+               return -ENODEV;
 
-       p = pmic_get("PFUZE100");
-       ret = pmic_probe(p);
-       if (ret)
+       ret = pfuze_mode_init(p, APS_PFM);
+       if (ret < 0)
                return ret;
 
-       pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
-       printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
-
        /* Increase VGEN3 from 2.5 to 2.8V */
        pmic_reg_read(p, PFUZE100_VGEN3VOL, &reg);
-       reg &= ~0xf;
-       reg |= 0xa;
+       reg &= ~LDO_VOL_MASK;
+       reg |= LDOB_2_80V;
        pmic_reg_write(p, PFUZE100_VGEN3VOL, reg);
 
        /* Increase VGEN5 from 2.8 to 3V */
        pmic_reg_read(p, PFUZE100_VGEN5VOL, &reg);
-       reg &= ~0xf;
-       reg |= 0xc;
+       reg &= ~LDO_VOL_MASK;
+       reg |= LDOB_3_00V;
        pmic_reg_write(p, PFUZE100_VGEN5VOL, reg);
 
-       /* Set SW1AB stanby volage to 0.975V */
-       pmic_reg_read(p, PFUZE100_SW1ABSTBY, &reg);
-       reg &= ~0x3f;
-       reg |= 0x1b;
-       pmic_reg_write(p, PFUZE100_SW1ABSTBY, reg);
-
-       /* Set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */
-       pmic_reg_read(p, PUZE_100_SW1ABCONF, &reg);
-       reg &= ~0xc0;
-       reg |= 0x40;
-       pmic_reg_write(p, PUZE_100_SW1ABCONF, reg);
-
-       /* Set SW1C standby voltage to 0.975V */
-       pmic_reg_read(p, PFUZE100_SW1CSTBY, &reg);
-       reg &= ~0x3f;
-       reg |= 0x1b;
-       pmic_reg_write(p, PFUZE100_SW1CSTBY, reg);
-
-       /* Set SW1C/VDDSOC step ramp up time from 16us to 4us/25mV */
-       pmic_reg_read(p, PFUZE100_SW1CCONF, &reg);
-       reg &= ~0xc0;
-       reg |= 0x40;
-       pmic_reg_write(p, PFUZE100_SW1CCONF, reg);
-
        return 0;
 }
 
@@ -630,7 +643,7 @@ static const struct boot_mode board_boot_modes[] = {
        {"sd2",  MAKE_CFGVAL(0x40, 0x28, 0x00, 0x00)},
        {"sd3",  MAKE_CFGVAL(0x40, 0x30, 0x00, 0x00)},
        /* 8 bit bus width */
-       {"emmc", MAKE_CFGVAL(0x40, 0x38, 0x00, 0x00)},
+       {"emmc", MAKE_CFGVAL(0x60, 0x58, 0x00, 0x00)},
        {NULL,   0},
 };
 #endif
@@ -640,7 +653,17 @@ int board_late_init(void)
 #ifdef CONFIG_CMD_BMODE
        add_board_boot_modes(board_boot_modes);
 #endif
-       pfuze_init();
+
+#ifdef CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG
+       setenv("board_name", "SABRESD");
+
+       if (is_mx6dqp())
+               setenv("board_rev", "MX6QP");
+       else if (is_cpu_type(MXC_CPU_MX6Q) || is_cpu_type(MXC_CPU_MX6D))
+               setenv("board_rev", "MX6Q");
+       else if (is_cpu_type(MXC_CPU_MX6DL) || is_cpu_type(MXC_CPU_MX6SOLO))
+               setenv("board_rev", "MX6DL");
+#endif
 
        return 0;
 }
@@ -684,6 +707,35 @@ const struct mx6dq_iomux_ddr_regs mx6_ddr_ioregs = {
        .dram_dqm7 =  0x00020030,
 };
 
+const struct mx6dq_iomux_ddr_regs mx6dqp_ddr_ioregs = {
+       .dram_sdclk_0 =  0x00000030,
+       .dram_sdclk_1 =  0x00000030,
+       .dram_cas =  0x00000030,
+       .dram_ras =  0x00000030,
+       .dram_reset =  0x00000030,
+       .dram_sdcke0 =  0x00003000,
+       .dram_sdcke1 =  0x00003000,
+       .dram_sdba2 =  0x00000000,
+       .dram_sdodt0 =  0x00003030,
+       .dram_sdodt1 =  0x00003030,
+       .dram_sdqs0 =  0x00000030,
+       .dram_sdqs1 =  0x00000030,
+       .dram_sdqs2 =  0x00000030,
+       .dram_sdqs3 =  0x00000030,
+       .dram_sdqs4 =  0x00000030,
+       .dram_sdqs5 =  0x00000030,
+       .dram_sdqs6 =  0x00000030,
+       .dram_sdqs7 =  0x00000030,
+       .dram_dqm0 =  0x00000030,
+       .dram_dqm1 =  0x00000030,
+       .dram_dqm2 =  0x00000030,
+       .dram_dqm3 =  0x00000030,
+       .dram_dqm4 =  0x00000030,
+       .dram_dqm5 =  0x00000030,
+       .dram_dqm6 =  0x00000030,
+       .dram_dqm7 =  0x00000030,
+};
+
 const struct mx6dq_iomux_grp_regs mx6_grp_ioregs = {
        .grp_ddr_type =  0x000C0000,
        .grp_ddrmode_ctl =  0x00020000,
@@ -716,10 +768,26 @@ const struct mx6_mmdc_calibration mx6_mmcd_calib = {
        .p1_mpwrdlctl =  0x48254A36,
 };
 
+const struct mx6_mmdc_calibration mx6dqp_mmcd_calib = {
+       .p0_mpwldectrl0 =  0x001B001E,
+       .p0_mpwldectrl1 =  0x002E0029,
+       .p1_mpwldectrl0 =  0x001B002A,
+       .p1_mpwldectrl1 =  0x0019002C,
+       .p0_mpdgctrl0 =  0x43240334,
+       .p0_mpdgctrl1 =  0x0324031A,
+       .p1_mpdgctrl0 =  0x43340344,
+       .p1_mpdgctrl1 =  0x03280276,
+       .p0_mprddlctl =  0x44383A3E,
+       .p1_mprddlctl =  0x3C3C3846,
+       .p0_mpwrdlctl =  0x2E303230,
+       .p1_mpwrdlctl =  0x38283E34,
+};
+
+/* MT41K128M16JT-125 */
 static struct mx6_ddr3_cfg mem_ddr = {
        .mem_speed = 1600,
-       .density = 4,
-       .width = 64,
+       .density = 2,
+       .width = 16,
        .banks = 8,
        .rowaddr = 14,
        .coladdr = 10,
@@ -748,9 +816,15 @@ static void gpr_init(void)
 
        /* enable AXI cache for VDOA/VPU/IPU */
        writel(0xF00000CF, &iomux->gpr[4]);
-       /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
-       writel(0x007F007F, &iomux->gpr[6]);
-       writel(0x007F007F, &iomux->gpr[7]);
+       if (is_mx6dqp()) {
+               /* set IPU AXI-id1 Qos=0x1 AXI-id0/2/3 Qos=0x7 */
+               writel(0x007F007F, &iomux->gpr[6]);
+               writel(0x007F007F, &iomux->gpr[7]);
+       } else {
+               /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */
+               writel(0x007F007F, &iomux->gpr[6]);
+               writel(0x007F007F, &iomux->gpr[7]);
+       }
 }
 
 /*
@@ -761,28 +835,30 @@ static void spl_dram_init(void)
 {
        struct mx6_ddr_sysinfo sysinfo = {
                /* width of data bus:0=16,1=32,2=64 */
-               .dsize = mem_ddr.width/32,
+               .dsize = 2,
                /* config for full 4GB range so that get_mem_size() works */
                .cs_density = 32, /* 32Gb per CS */
                /* single chip select */
                .ncs = 1,
                .cs1_mirror = 0,
                .rtt_wr = 1 /*DDR3_RTT_60_OHM*/,        /* RTT_Wr = RZQ/4 */
-#ifdef RTT_NOM_120OHM
-               .rtt_nom = 2 /*DDR3_RTT_120_OHM*/,      /* RTT_Nom = RZQ/2 */
-#else
                .rtt_nom = 1 /*DDR3_RTT_60_OHM*/,       /* RTT_Nom = RZQ/4 */
-#endif
                .walat = 1,     /* Write additional latency */
                .ralat = 5,     /* Read additional latency */
                .mif3_mode = 3, /* Command prediction working mode */
                .bi_on = 1,     /* Bank interleaving enabled */
                .sde_to_rst = 0x10,     /* 14 cycles, 200us (JEDEC default) */
                .rst_to_cke = 0x23,     /* 33 cycles, 500us (JEDEC default) */
+               .ddr_type = DDR_TYPE_DDR3,
        };
 
-       mx6dq_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
-       mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
+       if (is_mx6dqp()) {
+               mx6dq_dram_iocfg(64, &mx6dqp_ddr_ioregs, &mx6_grp_ioregs);
+               mx6_dram_cfg(&sysinfo, &mx6dqp_mmcd_calib, &mem_ddr);
+       } else {
+               mx6dq_dram_iocfg(64, &mx6_ddr_ioregs, &mx6_grp_ioregs);
+               mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
+       }
 }
 
 void board_init_f(ulong dummy)
@@ -811,8 +887,4 @@ void board_init_f(ulong dummy)
        /* load/boot image from boot device */
        board_init_r(NULL, 0);
 }
-
-void reset_cpu(ulong addr)
-{
-}
 #endif