]> git.sur5r.net Git - u-boot/blobdiff - board/ti/am57xx/board.c
mmc: replace CONFIG_GENERIC_MMC with CONFIG_MMC
[u-boot] / board / ti / am57xx / board.c
index 02cedbaa9c62df19ab7897a9e009ae6dbde2e720..3be697a6eaadd4c8dd85f4ac90ad2df5586d41c3 100644 (file)
 #include "mux_data.h"
 
 #define board_is_x15()         board_ti_is("BBRDX15_")
+#define board_is_x15_revb1()   (board_ti_is("BBRDX15_") && \
+                                (strncmp("B.10", board_ti_get_rev(), 3) <= 0))
 #define board_is_am572x_evm()  board_ti_is("AM572PM_")
+#define board_is_am572x_evm_reva3()    \
+                               (board_ti_is("AM572PM_") && \
+                                (strncmp("A.30", board_ti_get_rev(), 3) <= 0))
 #define board_is_am572x_idk()  board_ti_is("AM572IDK")
+#define board_is_am571x_idk()  board_ti_is("AM571IDK")
 
 #ifdef CONFIG_DRIVER_TI_CPSW
 #include <cpsw.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+#define GPIO_ETH_LCD           GPIO_TO_PIN(2, 22)
 /* GPIO 7_11 */
 #define GPIO_DDR_VTT_EN 203
 
+/* Touch screen controller to identify the LCD */
+#define OSD_TS_FT_BUS_ADDRESS  0
+#define OSD_TS_FT_CHIP_ADDRESS 0x38
+#define OSD_TS_FT_REG_ID       0xA3
+/*
+ * Touchscreen IDs for various OSD panels
+ * Ref: http://www.osddisplays.com/TI/OSD101T2587-53TS_A.1.pdf
+ */
+/* Used on newer osd101t2587 Panels */
+#define OSD_TS_FT_ID_5x46      0x54
+/* Used on older osd101t2045 Panels */
+#define OSD_TS_FT_ID_5606      0x08
+
 #define SYSINFO_BOARD_NAME_MAX_LEN     45
 
+#define TPS65903X_PRIMARY_SECONDARY_PAD2       0xFB
+#define TPS65903X_PAD2_POWERHOLD_MASK          0x20
+
 const struct omap_sysinfo sysinfo = {
        "Board: UNKNOWN(BeagleBoard X15?) REV UNKNOWN\n"
 };
@@ -58,9 +81,17 @@ static const struct dmm_lisa_map_regs beagle_x15_lisa_regs = {
        .is_ma_present  = 0x1
 };
 
+static const struct dmm_lisa_map_regs am571x_idk_lisa_regs = {
+       .dmm_lisa_map_3 = 0x80640100,
+       .is_ma_present  = 0x1
+};
+
 void emif_get_dmm_regs(const struct dmm_lisa_map_regs **dmm_lisa_regs)
 {
-       *dmm_lisa_regs = &beagle_x15_lisa_regs;
+       if (board_is_am571x_idk())
+               *dmm_lisa_regs = &am571x_idk_lisa_regs;
+       else
+               *dmm_lisa_regs = &beagle_x15_lisa_regs;
 }
 
 static const struct emif_regs beagle_x15_emif1_ddr3_532mhz_emif_regs = {
@@ -374,6 +405,8 @@ void do_board_detect(void)
                bname = "AM572x EVM";
        else if (board_is_am572x_idk())
                bname = "AM572x IDK";
+       else if (board_is_am571x_idk())
+               bname = "AM571x IDK";
 
        if (bname)
                snprintf(sysinfo.board_string, SYSINFO_BOARD_NAME_MAX_LEN,
@@ -390,15 +423,24 @@ static void setup_board_eeprom_env(void)
        if (rc)
                goto invalid_eeprom;
 
-       if (board_is_x15())
-               name = "beagle_x15";
-       else if (board_is_am572x_evm())
-               name = "am57xx_evm";
-       else if (board_is_am572x_idk())
+       if (board_is_x15()) {
+               if (board_is_x15_revb1())
+                       name = "beagle_x15_revb1";
+               else
+                       name = "beagle_x15";
+       } else if (board_is_am572x_evm()) {
+               if (board_is_am572x_evm_reva3())
+                       name = "am57xx_evm_reva3";
+               else
+                       name = "am57xx_evm";
+       } else if (board_is_am572x_idk()) {
                name = "am572x_idk";
-       else
+       } else if (board_is_am571x_idk()) {
+               name = "am571x_idk";
+       } else {
                printf("Unidentified board claims %s in eeprom header\n",
                       board_ti_get_name());
+       }
 
 invalid_eeprom:
        set_board_info_env(name);
@@ -421,6 +463,21 @@ void hw_data_init(void)
        *ctrl = &dra7xx_ctrl;
 }
 
+bool am571x_idk_needs_lcd(void)
+{
+       bool needs_lcd;
+
+       gpio_request(GPIO_ETH_LCD, "nLCD_Detect");
+       if (gpio_get_value(GPIO_ETH_LCD))
+               needs_lcd = false;
+       else
+               needs_lcd = true;
+
+       gpio_free(GPIO_ETH_LCD);
+
+       return needs_lcd;
+}
+
 int board_init(void)
 {
        gpmc_init();
@@ -429,9 +486,66 @@ int board_init(void)
        return 0;
 }
 
+void am57x_idk_lcd_detect(void)
+{
+       int r = -ENODEV;
+       char *idk_lcd = "no";
+       uint8_t buf = 0;
+
+       /* Only valid for IDKs */
+       if (board_is_x15() || board_is_am572x_evm())
+               return;
+
+       /* Only AM571x IDK has gpio control detect.. so check that */
+       if (board_is_am571x_idk() && !am571x_idk_needs_lcd())
+               goto out;
+
+       r = i2c_set_bus_num(OSD_TS_FT_BUS_ADDRESS);
+       if (r) {
+               printf("%s: Failed to set bus address to %d: %d\n",
+                      __func__, OSD_TS_FT_BUS_ADDRESS, r);
+               goto out;
+       }
+       r = i2c_probe(OSD_TS_FT_CHIP_ADDRESS);
+       if (r) {
+               /* AM572x IDK has no explicit settings for optional LCD kit */
+               if (board_is_am571x_idk()) {
+                       printf("%s: Touch screen detect failed: %d!\n",
+                              __func__, r);
+               }
+               goto out;
+       }
+
+       /* Read FT ID */
+       r = i2c_read(OSD_TS_FT_CHIP_ADDRESS, OSD_TS_FT_REG_ID, 1, &buf, 1);
+       if (r) {
+               printf("%s: Touch screen ID read %d:0x%02x[0x%02x] failed:%d\n",
+                      __func__, OSD_TS_FT_BUS_ADDRESS, OSD_TS_FT_CHIP_ADDRESS,
+                      OSD_TS_FT_REG_ID, r);
+               goto out;
+       }
+
+       switch (buf) {
+       case OSD_TS_FT_ID_5606:
+               idk_lcd = "osd101t2045";
+               break;
+       case OSD_TS_FT_ID_5x46:
+               idk_lcd = "osd101t2587";
+               break;
+       default:
+               printf("%s: Unidentifed Touch screen ID 0x%02x\n",
+                      __func__, buf);
+               /* we will let default be "no lcd" */
+       }
+out:
+       setenv("idk_lcd", idk_lcd);
+       return;
+}
+
 int board_late_init(void)
 {
        setup_board_eeprom_env();
+       u8 val;
 
        /*
         * DEV_CTRL.DEV_ON = 1 please - else palmas switches off in 8 seconds
@@ -446,6 +560,26 @@ int board_late_init(void)
        if (get_device_type() == HS_DEVICE)
                setenv("boot_fit", "1");
 
+       /*
+        * Set the GPIO7 Pad to POWERHOLD. This has higher priority
+        * over DEV_CTRL.DEV_ON bit. This can be reset in case of
+        * PMIC Power off. So to be on the safer side set it back
+        * to POWERHOLD mode irrespective of the current state.
+        */
+       palmas_i2c_read_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
+                          &val);
+       val = val | TPS65903X_PAD2_POWERHOLD_MASK;
+       palmas_i2c_write_u8(TPS65903X_CHIP_P1, TPS65903X_PRIMARY_SECONDARY_PAD2,
+                           val);
+
+       omap_die_id_serial();
+
+       am57x_idk_lcd_detect();
+
+#if !defined(CONFIG_SPL_BUILD)
+       board_ti_set_ethaddr(2);
+#endif
+
        return 0;
 }
 
@@ -461,25 +595,73 @@ void recalibrate_iodelay(void)
        const struct pad_conf_entry *pconf;
        const struct iodelay_cfg_entry *iod;
        int pconf_sz, iod_sz;
+       int ret;
 
        if (board_is_am572x_idk()) {
                pconf = core_padconf_array_essential_am572x_idk;
                pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am572x_idk);
                iod = iodelay_cfg_array_am572x_idk;
                iod_sz = ARRAY_SIZE(iodelay_cfg_array_am572x_idk);
+       } else if (board_is_am571x_idk()) {
+               pconf = core_padconf_array_essential_am571x_idk;
+               pconf_sz = ARRAY_SIZE(core_padconf_array_essential_am571x_idk);
+               iod = iodelay_cfg_array_am571x_idk;
+               iod_sz = ARRAY_SIZE(iodelay_cfg_array_am571x_idk);
        } else {
                /* Common for X15/GPEVM */
                pconf = core_padconf_array_essential_x15;
                pconf_sz = ARRAY_SIZE(core_padconf_array_essential_x15);
-               iod = iodelay_cfg_array_x15;
-               iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15);
+               /* There never was an SR1.0 X15.. So.. */
+               if (omap_revision() == DRA752_ES1_1) {
+                       iod = iodelay_cfg_array_x15_sr1_1;
+                       iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr1_1);
+               } else {
+                       /* Since full production should switch to SR2.0  */
+                       iod = iodelay_cfg_array_x15_sr2_0;
+                       iod_sz = ARRAY_SIZE(iodelay_cfg_array_x15_sr2_0);
+               }
        }
 
-       __recalibrate_iodelay(pconf, pconf_sz, iod, iod_sz);
+       /* Setup I/O isolation */
+       ret = __recalibrate_iodelay_start();
+       if (ret)
+               goto err;
+
+       /* Do the muxing here */
+       do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
+
+       /* Now do the weird minor deltas that should be safe */
+       if (board_is_x15() || board_is_am572x_evm()) {
+               if (board_is_x15_revb1() || board_is_am572x_evm_reva3()) {
+                       pconf = core_padconf_array_delta_x15_sr2_0;
+                       pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr2_0);
+               } else {
+                       pconf = core_padconf_array_delta_x15_sr1_1;
+                       pconf_sz = ARRAY_SIZE(core_padconf_array_delta_x15_sr1_1);
+               }
+               do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
+       }
+
+       if (board_is_am571x_idk()) {
+               if (am571x_idk_needs_lcd()) {
+                       pconf = core_padconf_array_vout_am571x_idk;
+                       pconf_sz = ARRAY_SIZE(core_padconf_array_vout_am571x_idk);
+               } else {
+                       pconf = core_padconf_array_icss1eth_am571x_idk;
+                       pconf_sz = ARRAY_SIZE(core_padconf_array_icss1eth_am571x_idk);
+               }
+               do_set_mux32((*ctrl)->control_padconf_core_base, pconf, pconf_sz);
+       }
+
+       /* Setup IOdelay configuration */
+       ret = do_set_iodelay((*ctrl)->iodelay_config_base, iod, iod_sz);
+err:
+       /* Closeup.. remove isolation */
+       __recalibrate_iodelay_end(ret);
 }
 #endif
 
-#if !defined(CONFIG_SPL_BUILD) && defined(CONFIG_GENERIC_MMC)
+#if defined(CONFIG_MMC)
 int board_mmc_init(bd_t *bis)
 {
        omap_mmc_init(0, 0, 0, -1, -1);
@@ -538,7 +720,7 @@ int usb_gadget_handle_interrupts(int index)
 #endif /* CONFIG_USB_DWC3 */
 
 #if defined(CONFIG_USB_DWC3) || defined(CONFIG_USB_XHCI_OMAP)
-int board_usb_init(int index, enum usb_init_type init)
+int omap_xhci_board_usb_init(int index, enum usb_init_type init)
 {
        enable_usb_clocks(index);
        switch (index) {
@@ -572,7 +754,7 @@ int board_usb_init(int index, enum usb_init_type init)
        return 0;
 }
 
-int board_usb_cleanup(int index, enum usb_init_type init)
+int omap_xhci_board_usb_cleanup(int index, enum usb_init_type init)
 {
 #ifdef CONFIG_USB_DWC3
        switch (index) {
@@ -713,8 +895,8 @@ int board_eth_init(bd_t *bis)
        ctrl_val |= 0x22;
        writel(ctrl_val, (*ctrl)->control_core_control_io1);
 
-       /* The phy address for the AM572x IDK are different than x15 */
-       if (board_is_am572x_idk()) {
+       /* The phy address for the AM57xx IDK are different than x15 */
+       if (board_is_am572x_idk() || board_is_am571x_idk()) {
                cpsw_data.slave_data[0].phy_addr = 0;
                cpsw_data.slave_data[1].phy_addr = 1;
        }
@@ -783,14 +965,23 @@ int ft_board_setup(void *blob, bd_t *bd)
 #ifdef CONFIG_SPL_LOAD_FIT
 int board_fit_config_name_match(const char *name)
 {
-       if (board_is_x15() && !strcmp(name, "am57xx-beagle-x15"))
+       if (board_is_x15()) {
+               if (board_is_x15_revb1()) {
+                       if (!strcmp(name, "am57xx-beagle-x15-revb1"))
+                               return 0;
+               } else if (!strcmp(name, "am57xx-beagle-x15")) {
+                       return 0;
+               }
+       } else if (board_is_am572x_evm() &&
+                  !strcmp(name, "am57xx-beagle-x15")) {
                return 0;
-       else if (board_is_am572x_evm() && !strcmp(name, "am57xx-beagle-x15"))
+       } else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk")) {
                return 0;
-       else if (board_is_am572x_idk() && !strcmp(name, "am572x-idk"))
+       } else if (board_is_am571x_idk() && !strcmp(name, "am571x-idk")) {
                return 0;
-       else
-               return -1;
+       }
+
+       return -1;
 }
 #endif