Merge branch 'master' of git://git.denx.de/u-boot-spi
[oweals/u-boot.git] / board / ge / bx50v3 / bx50v3.c
index 9d8d4780cfbbe72674f3be2d8a2424fff0f39666..b2d065c1b801244e01216ff637032390718dc3cd 100644 (file)
 #include "../../../drivers/net/e1000.h"
 DECLARE_GLOBAL_DATA_PTR;
 
+struct vpd_cache;
+
+static int confidx = 3;  /* Default to b850v3. */
+static struct vpd_cache vpd;
+
 #ifndef CONFIG_SYS_I2C_EEPROM_ADDR
 # define CONFIG_SYS_I2C_EEPROM_ADDR     0x50
 # define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 1
@@ -361,13 +366,14 @@ int board_cfb_skip(void)
        return 0;
 }
 
-static int detect_lcd(struct display_info_t const *dev)
+static int is_b850v3(void)
 {
-       if (IS_ENABLED(CONFIG_TARGET_GE_B450V3) ||
-           IS_ENABLED(CONFIG_TARGET_GE_B650V3))
-               return 1;
+       return confidx == 3;
+}
 
-       return 0;
+static int detect_lcd(struct display_info_t const *dev)
+{
+       return !is_b850v3();
 }
 
 struct display_info_t const displays[] = {{
@@ -492,6 +498,8 @@ static void setup_display_bx50v3(void)
        struct mxc_ccm_reg *mxc_ccm = (struct mxc_ccm_reg *)CCM_BASE_ADDR;
        struct iomuxc *iomux = (struct iomuxc *)IOMUXC_BASE_ADDR;
 
+       enable_videopll();
+
        /* When a reset/reboot is performed the display power needs to be turned
         * off for atleast 500ms. The boot time is ~300ms, we need to wait for
         * an additional 200ms here. Unfortunately we use external PMIC for
@@ -593,23 +601,16 @@ static void process_vpd(struct vpd_cache *vpd)
        switch (vpd->product_id) {
        case VPD_PRODUCT_B450:
                env_set("confidx", "1");
+               i210_index = 0;
+               fec_index = 1;
                break;
        case VPD_PRODUCT_B650:
                env_set("confidx", "2");
-               break;
-       case VPD_PRODUCT_B850:
-               env_set("confidx", "3");
-               break;
-       }
-
-       switch (vpd->product_id) {
-       case VPD_PRODUCT_B450:
-               /* fall thru */
-       case VPD_PRODUCT_B650:
                i210_index = 0;
                fec_index = 1;
                break;
        case VPD_PRODUCT_B850:
+               env_set("confidx", "3");
                i210_index = 1;
                fec_index = 2;
                break;
@@ -624,7 +625,6 @@ static void process_vpd(struct vpd_cache *vpd)
 
 static int read_vpd(uint eeprom_bus)
 {
-       struct vpd_cache vpd;
        int res;
        int size = 1024;
        uint8_t *data;
@@ -644,7 +644,6 @@ static int read_vpd(uint eeprom_bus)
        if (res == 0) {
                memset(&vpd, 0, sizeof(vpd));
                vpd_reader(size, data, &vpd, vpd_callback);
-               process_vpd(&vpd);
        }
 
        free(data);
@@ -684,7 +683,7 @@ int board_early_init_f(void)
        setup_iomux_uart();
 
 #if defined(CONFIG_VIDEO_IPUV3)
-       if (IS_ENABLED(CONFIG_TARGET_GE_B850V3))
+       if (is_b850v3())
                /* Set LDB clock to Video PLL */
                select_ldb_di_clock_source(MXC_PLL5_CLK);
        else
@@ -694,12 +693,35 @@ int board_early_init_f(void)
        return 0;
 }
 
+static void set_confidx(const struct vpd_cache* vpd)
+{
+       switch (vpd->product_id) {
+       case VPD_PRODUCT_B450:
+               confidx = 1;
+               break;
+       case VPD_PRODUCT_B650:
+               confidx = 2;
+               break;
+       case VPD_PRODUCT_B850:
+               confidx = 3;
+               break;
+       }
+}
+
 int board_init(void)
 {
+       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
+       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
+       setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
+
+       read_vpd(CONFIG_SYS_I2C_EEPROM_BUS);
+
+       set_confidx(&vpd);
+
        gpio_direction_output(SUS_S3_OUT, 1);
        gpio_direction_output(WIFI_EN, 1);
 #if defined(CONFIG_VIDEO_IPUV3)
-       if (IS_ENABLED(CONFIG_TARGET_GE_B850V3))
+       if (is_b850v3())
                setup_display_b850v3();
        else
                setup_display_bx50v3();
@@ -710,10 +732,6 @@ int board_init(void)
 #ifdef CONFIG_MXC_SPI
        setup_spi();
 #endif
-       setup_i2c(1, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
-       setup_i2c(2, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info2);
-       setup_i2c(3, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info3);
-
        return 0;
 }
 
@@ -779,12 +797,15 @@ void pmic_init(void)
 
 int board_late_init(void)
 {
-       read_vpd(CONFIG_SYS_I2C_EEPROM_BUS);
+       process_vpd(&vpd);
 
 #ifdef CONFIG_CMD_BMODE
        add_board_boot_modes(board_boot_modes);
 #endif
 
+       if (is_b850v3())
+               env_set("videoargs", "video=DP-1:1024x768@60 video=HDMI-A-1:1024x768@60");
+
        /* board specific pmic init */
        pmic_init();