common: Drop linux/bitops.h from common header
[platform/kernel/u-boot.git] / board / softing / vining_2000 / vining_2000.c
index 9ac17f7..e5e33dc 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <init.h>
+#include <net.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/crm_regs.h>
 #include <asm/arch/iomux.h>
@@ -18,6 +19,8 @@
 #include <asm/io.h>
 #include <asm/mach-imx/mxc_i2c.h>
 #include <env.h>
+#include <linux/bitops.h>
+#include <linux/delay.h>
 #include <linux/sizes.h>
 #include <common.h>
 #include <fsl_esdhc_imx.h>
@@ -72,42 +75,23 @@ int dram_init(void)
        return 0;
 }
 
-static iomux_v3_cfg_t const fec1_pads[] = {
-       MX6_PAD_ENET1_MDC__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET1_MDIO__ENET1_MDIO | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_RGMII1_RD0__ENET1_RX_DATA_0 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
-       MX6_PAD_RGMII1_RD1__ENET1_RX_DATA_1 | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
-       MX6_PAD_RGMII1_TD0__ENET1_TX_DATA_0 | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_RGMII1_TD1__ENET1_TX_DATA_1 | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_RGMII1_RX_CTL__ENET1_RX_EN | MUX_PAD_CTRL(ENET_RX_PAD_CTRL),
-       MX6_PAD_RGMII1_TX_CTL__ENET1_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
-       MX6_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL) |
-               MUX_MODE_SION,
-       /* LAN8720 PHY Reset */
-       MX6_PAD_RGMII1_TD3__GPIO5_IO_9 | MUX_PAD_CTRL(NO_PAD_CTRL),
-};
-
 static iomux_v3_cfg_t const pwm_led_pads[] = {
        MX6_PAD_RGMII2_RD2__PWM2_OUT | MUX_PAD_CTRL(NO_PAD_CTRL), /* green */
        MX6_PAD_RGMII2_TD2__PWM6_OUT | MUX_PAD_CTRL(NO_PAD_CTRL), /* red */
        MX6_PAD_RGMII2_RD3__PWM1_OUT | MUX_PAD_CTRL(NO_PAD_CTRL), /* blue */
 };
 
-#define PHY_RESET IMX_GPIO_NR(5, 9)
-
-int board_eth_init(bd_t *bis)
+static int board_net_init(void)
 {
        struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
-       int ret;
        unsigned char eth1addr[6];
+       int ret;
 
-       /* just to get secound mac address */
+       /* just to get second mac address */
        imx_get_mac_from_fuse(1, eth1addr);
        if (!env_get("eth1addr") && is_valid_ethaddr(eth1addr))
                eth_env_set_enetaddr("eth1addr", eth1addr);
 
-       imx_iomux_v3_setup_multiple_pads(fec1_pads, ARRAY_SIZE(fec1_pads));
-
        /*
         * Generate phy reference clock via pin IOMUX ENET_REF_CLK1/2 by erasing
         * ENET1/2_TX_CLK_DIR gpr1[14:13], so that reference clock is driven by
@@ -123,15 +107,7 @@ int board_eth_init(bd_t *bis)
        if (ret)
                goto eth_fail;
 
-       /* reset phy */
-       gpio_request(PHY_RESET, "PHY-reset");
-       gpio_direction_output(PHY_RESET, 0);
-       mdelay(16);
-       gpio_set_value(PHY_RESET, 1);
-       mdelay(1);
-
-       ret = fecmxc_initialize_multi(bis, 0, CONFIG_FEC_MXC_PHYADDR,
-                                       IMX_FEC_BASE);
+       ret = enable_fec_anatop_clock(1, ENET_50MHZ);
        if (ret)
                goto eth_fail;
 
@@ -139,7 +115,6 @@ int board_eth_init(bd_t *bis)
 
 eth_fail:
        printf("FEC MXC: %s:failed (%i)\n", __func__, ret);
-       gpio_set_value(PHY_RESET, 0);
        return ret;
 }
 
@@ -174,7 +149,7 @@ static struct pmic *pfuze_init(unsigned char i2cbus)
                return NULL;
 
        pmic_reg_read(p, PFUZE100_DEVICEID, &reg);
-       printf("PMIC:  PFUZE100 ID=0x%02x\n", reg);
+       printf("PMIC:  PFUZE%i00 ID=0x%02x\n", (reg & 1) ? 2 : 1, reg);
 
        /* Set SW1AB stanby volage to 0.975V */
        pmic_reg_read(p, PFUZE100_SW1ABSTBY, &reg);
@@ -254,6 +229,9 @@ int power_init_board(void)
        if (ret < 0)
                return ret;
 
+       set_ldo_voltage(LDO_ARM, 1175); /* Set VDDARM to 1.175V */
+       set_ldo_voltage(LDO_SOC, 1175); /* Set VDDSOC to 1.175V */
+
        return 0;
 }
 
@@ -424,7 +402,7 @@ int board_init(void)
        setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
 #endif
 
-       return 0;
+       return board_net_init();
 }
 
 int checkboard(void)
@@ -434,12 +412,27 @@ int checkboard(void)
        return 0;
 }
 
+#define PCIE_PHY_PUP_REQ               BIT(7)
+
+void board_preboot_os(void)
+{
+       struct iomuxc *iomuxc_regs = (struct iomuxc *)IOMUXC_BASE_ADDR;
+       struct gpc *gpc_regs = (struct gpc *)GPC_BASE_ADDR;
+
+       /* Bring the PCI power domain up, so that old vendorkernel works. */
+       setbits_le32(&iomuxc_regs->gpr[12], IOMUXC_GPR12_TEST_POWERDOWN);
+       setbits_le32(&iomuxc_regs->gpr[5], IOMUXC_GPR5_PCIE_BTNRST);
+       setbits_le32(&gpc_regs->cntr, PCIE_PHY_PUP_REQ);
+}
+
 #ifdef CONFIG_SPL_BUILD
 #include <linux/libfdt.h>
 #include <spl.h>
 #include <asm/arch/mx6-ddr.h>
 
-static struct fsl_esdhc_cfg usdhc_cfg = { USDHC4_BASE_ADDR };
+static iomux_v3_cfg_t const pcie_pads[] = {
+       MX6_PAD_NAND_DATA02__GPIO4_IO_6 | MUX_PAD_CTRL(GPIO_PAD_CTRL),
+};
 
 static iomux_v3_cfg_t const uart_pads[] = {
        MX6_PAD_GPIO1_IO04__UART1_TX | MUX_PAD_CTRL(UART_PAD_CTRL),
@@ -459,35 +452,23 @@ static iomux_v3_cfg_t const usdhc4_pads[] = {
        MX6_PAD_SD4_DATA7__USDHC4_DATA7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),
 };
 
+static void vining2000_spl_setup_iomux_pcie(void)
+{
+       imx_iomux_v3_setup_multiple_pads(pcie_pads, ARRAY_SIZE(pcie_pads));
+}
+
 static void vining2000_spl_setup_iomux_uart(void)
 {
        imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
 }
 
+static struct fsl_esdhc_cfg usdhc_cfg = { USDHC4_BASE_ADDR };
+
 int board_mmc_init(bd_t *bis)
 {
-       struct src *src_regs = (struct src *)SRC_BASE_ADDR;
-       u32 val;
-       u32 port;
-
-       val = readl(&src_regs->sbmr1);
-
-       if ((val & 0xc0) != 0x40) {
-               printf("Not boot from USDHC!\n");
-               return -EINVAL;
-       }
-
-       port = (val >> 11) & 0x3;
-       printf("port %d\n", port);
-       switch (port) {
-       case 3:
-               imx_iomux_v3_setup_multiple_pads(
-                       usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
-               usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
-               usdhc_cfg.esdhc_base = USDHC4_BASE_ADDR;
-               break;
-       }
+       imx_iomux_v3_setup_multiple_pads(usdhc4_pads, ARRAY_SIZE(usdhc4_pads));
 
+       usdhc_cfg.sdhc_clk = mxc_get_clock(MXC_ESDHC4_CLK);
        gd->arch.sdhc_clk = usdhc_cfg.sdhc_clk;
        return fsl_esdhc_initialize(bis, &usdhc_cfg);
 }
@@ -587,6 +568,11 @@ static void vining2000_spl_dram_init(void)
 
        mx6sx_dram_iocfg(mem_ddr.width, &mx6_ddr_ioregs, &mx6_grp_ioregs);
        mx6_dram_cfg(&sysinfo, &mx6_mmcd_calib, &mem_ddr);
+
+       /* Perform DDR DRAM calibration */
+       udelay(100);
+       mmdc_do_write_level_calibration(&sysinfo);
+       mmdc_do_dqs_calibration(&sysinfo);
 }
 
 void board_init_f(ulong dummy)
@@ -597,11 +583,17 @@ void board_init_f(ulong dummy)
        ccgr_init();
 
        /* iomux setup */
+       vining2000_spl_setup_iomux_pcie();
        vining2000_spl_setup_iomux_uart();
 
        /* setup GP timer */
        timer_init();
 
+       /* reset the PCIe device */
+       gpio_set_value(IMX_GPIO_NR(4, 6), 1);
+       udelay(50);
+       gpio_set_value(IMX_GPIO_NR(4, 6), 0);
+
        /* UART clocks enabled and gd valid - init serial console */
        preloader_console_init();