]> git.sur5r.net Git - u-boot/commitdiff
omap4/5: Add support for booting with CH.
authorSricharan <r.sricharan@ti.com>
Tue, 15 Nov 2011 14:50:03 +0000 (09:50 -0500)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Tue, 15 Nov 2011 21:25:50 +0000 (22:25 +0100)
Configuration header(CH) is 512 byte header attached to an OMAP
boot image that will help ROM code to initialize clocks, SDRAM
etc and copy U-Boot directly into SDRAM. CH can help us in
by-passing SPL and directly boot U-boot, hence it's an alternative
for SPL. However, we intend to support both CH and SPL for OMAP4/5.

Initialization done through CH is limited and is not equivalent
to that done by SPL. So U-Boot has to distinguish between the
two cases and handle them accordingly. This patch takes care
of doing this.

Signed-off-by: sricharan <r.sricharan@ti.com>
Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
16 files changed:
arch/arm/cpu/armv7/omap-common/clocks-common.c
arch/arm/cpu/armv7/omap-common/hwinit-common.c
arch/arm/cpu/armv7/omap-common/lowlevel_init.S
arch/arm/cpu/armv7/omap-common/spl.c
arch/arm/cpu/armv7/omap4/clocks.c
arch/arm/cpu/armv7/omap5/clocks.c
arch/arm/include/asm/arch-omap4/clocks.h
arch/arm/include/asm/arch-omap4/omap.h
arch/arm/include/asm/arch-omap4/sys_proto.h
arch/arm/include/asm/arch-omap5/clocks.h
arch/arm/include/asm/arch-omap5/omap.h
arch/arm/include/asm/arch-omap5/sys_proto.h
arch/arm/include/asm/omap_common.h
board/ti/omap5_evm/mux_data.h
board/ti/sdp4430/sdp4430_mux_data.h
include/configs/omap4_common.h

index c726093fd27de7e164a30c8029efe17a0e27958a..f64a10bfcba05dccc822ada192cfd09d4f4350e3 100644 (file)
@@ -115,17 +115,46 @@ static inline void wait_for_lock(u32 *const base)
        }
 }
 
+inline u32 check_for_lock(u32 *const base)
+{
+       struct dpll_regs *const dpll_regs = (struct dpll_regs *)base;
+       u32 lock = readl(&dpll_regs->cm_idlest_dpll) & ST_DPLL_CLK_MASK;
+
+       return lock;
+}
+
 static void do_setup_dpll(u32 *const base, const struct dpll_params *params,
-                               u8 lock)
+                               u8 lock, char *dpll)
 {
-       u32 temp;
+       u32 temp, M, N;
        struct dpll_regs *const dpll_regs = (struct dpll_regs *)base;
 
+       temp = readl(&dpll_regs->cm_clksel_dpll);
+
+       if (check_for_lock(base)) {
+               /*
+                * The Dpll has already been locked by rom code using CH.
+                * Check if M,N are matching with Ideal nominal opp values.
+                * If matches, skip the rest otherwise relock.
+                */
+               M = (temp & CM_CLKSEL_DPLL_M_MASK) >> CM_CLKSEL_DPLL_M_SHIFT;
+               N = (temp & CM_CLKSEL_DPLL_N_MASK) >> CM_CLKSEL_DPLL_N_SHIFT;
+               if ((M != (params->m)) || (N != (params->n))) {
+                       debug("\n %s Dpll locked, but not for ideal M = %d,"
+                               "N = %d values, current values are M = %d,"
+                               "N= %d" , dpll, params->m, params->n,
+                               M, N);
+               } else {
+                       /* Dpll locked with ideal values for nominal opps. */
+                       debug("\n %s Dpll already locked with ideal"
+                                               "nominal opp values", dpll);
+                       goto setup_post_dividers;
+               }
+       }
+
        bypass_dpll(base);
 
        /* Set M & N */
-       temp = readl(&dpll_regs->cm_clksel_dpll);
-
        temp &= ~CM_CLKSEL_DPLL_M_MASK;
        temp |= (params->m << CM_CLKSEL_DPLL_M_SHIFT) & CM_CLKSEL_DPLL_M_MASK;
 
@@ -138,6 +167,7 @@ static void do_setup_dpll(u32 *const base, const struct dpll_params *params,
        if (lock)
                do_lock_dpll(base);
 
+setup_post_dividers:
        setup_post_dividers(base, params);
 
        /* Wait till the DPLL locks */
@@ -216,7 +246,8 @@ void configure_mpu_dpll(void)
        }
 
        params = get_mpu_dpll_params();
-       do_setup_dpll(&prcm->cm_clkmode_dpll_mpu, params, DPLL_LOCK);
+
+       do_setup_dpll(&prcm->cm_clkmode_dpll_mpu, params, DPLL_LOCK, "mpu");
        debug("MPU DPLL locked\n");
 }
 
@@ -235,7 +266,8 @@ static void setup_dplls(void)
         * Core DPLL will be locked after setting up EMIF
         * using the FREQ_UPDATE method(freq_update_core())
         */
-       do_setup_dpll(&prcm->cm_clkmode_dpll_core, params, DPLL_NO_LOCK);
+       do_setup_dpll(&prcm->cm_clkmode_dpll_core, params, DPLL_NO_LOCK,
+                                                               "core");
        /* Set the ratios for CORE_CLK, L3_CLK, L4_CLK */
        temp = (CLKSEL_CORE_X2_DIV_1 << CLKSEL_CORE_SHIFT) |
            (CLKSEL_L3_CORE_DIV_2 << CLKSEL_L3_SHIFT) |
@@ -246,13 +278,14 @@ static void setup_dplls(void)
        /* lock PER dpll */
        params = get_per_dpll_params();
        do_setup_dpll(&prcm->cm_clkmode_dpll_per,
-                       params, DPLL_LOCK);
+                       params, DPLL_LOCK, "per");
        debug("PER DPLL locked\n");
 
        /* MPU dpll */
        configure_mpu_dpll();
 }
 
+#ifdef CONFIG_SYS_CLOCKS_ENABLE_ALL
 static void setup_non_essential_dplls(void)
 {
        u32 sys_clk_khz, abe_ref_clk;
@@ -267,7 +300,7 @@ static void setup_non_essential_dplls(void)
                CM_BYPCLK_DPLL_IVA_CLKSEL_MASK, DPLL_IVA_CLKSEL_CORE_X2_DIV_2);
 
        params = get_iva_dpll_params();
-       do_setup_dpll(&prcm->cm_clkmode_dpll_iva, params, DPLL_LOCK);
+       do_setup_dpll(&prcm->cm_clkmode_dpll_iva, params, DPLL_LOCK, "iva");
 
        /*
         * USB:
@@ -287,7 +320,7 @@ static void setup_non_essential_dplls(void)
                        sd_div << CM_CLKSEL_DPLL_DPLL_SD_DIV_SHIFT);
 
        /* Now setup the dpll with the regular function */
-       do_setup_dpll(&prcm->cm_clkmode_dpll_usb, params, DPLL_LOCK);
+       do_setup_dpll(&prcm->cm_clkmode_dpll_usb, params, DPLL_LOCK, "usb");
 
        /* Configure ABE dpll */
        params = get_abe_dpll_params();
@@ -315,8 +348,9 @@ static void setup_non_essential_dplls(void)
                        CM_ABE_PLL_REF_CLKSEL_CLKSEL_MASK,
                        abe_ref_clk << CM_ABE_PLL_REF_CLKSEL_CLKSEL_SHIFT);
        /* Lock the dpll */
-       do_setup_dpll(&prcm->cm_clkmode_dpll_abe, params, DPLL_LOCK);
+       do_setup_dpll(&prcm->cm_clkmode_dpll_abe, params, DPLL_LOCK, "abe");
 }
+#endif
 
 void do_scale_tps62361(u32 reg, u32 volt_mv)
 {
@@ -561,10 +595,15 @@ void prcm_init(void)
                enable_basic_clocks();
                scale_vcores();
                setup_dplls();
+#ifdef CONFIG_SYS_CLOCKS_ENABLE_ALL
                setup_non_essential_dplls();
                enable_non_essential_clocks();
+#endif
                break;
        default:
                break;
        }
+
+       if (OMAP_INIT_CONTEXT_SPL != omap_hw_init_context())
+               enable_basic_uboot_clocks();
 }
index 5cf4e2bb2c90b1b1fc302211ca7239a94c97b3a4..f65705db12329f54fcca00f4aa3da358d91dea14 100644 (file)
 #include <asm/arch/sys_proto.h>
 #include <asm/sizes.h>
 #include <asm/emif.h>
+#include <asm/omap_common.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+/*
+ * This is used to verify if the configuration header
+ * was executed by rom code prior to control of transfer
+ * to the bootloader. SPL is responsible for saving and
+ * passing the boot_params pointer to the u-boot.
+ */
+struct omap_boot_parameters boot_params __attribute__ ((section(".data")));
+
 #ifdef CONFIG_SPL_BUILD
 /*
  * We use static variables because global data is not ready yet.
@@ -41,12 +50,11 @@ DECLARE_GLOBAL_DATA_PTR;
  * We would not typically need to save these parameters in regular
  * U-Boot. This is needed only in SPL at the moment.
  */
-u32 omap_bootdevice = BOOT_DEVICE_MMC1;
 u32 omap_bootmode = MMCSD_MODE_FAT;
 
 u32 omap_boot_device(void)
 {
-       return omap_bootdevice;
+       return (u32) (boot_params.omap_bootdevice);
 }
 
 u32 omap_boot_mode(void)
@@ -71,12 +79,16 @@ static void set_mux_conf_regs(void)
                set_muxconf_regs_essential();
                break;
        case OMAP_INIT_CONTEXT_UBOOT_AFTER_SPL:
+#ifdef CONFIG_SYS_ENABLE_PADS_ALL
                set_muxconf_regs_non_essential();
+#endif
                break;
        case OMAP_INIT_CONTEXT_UBOOT_FROM_NOR:
        case OMAP_INIT_CONTEXT_UBOOT_AFTER_CH:
                set_muxconf_regs_essential();
+#ifdef CONFIG_SYS_ENABLE_PADS_ALL
                set_muxconf_regs_non_essential();
+#endif
                break;
        }
 }
@@ -103,6 +115,13 @@ void omap_rev_string(char *omap_rev_string)
                minor_rev);
 }
 
+#ifdef CONFIG_SPL_BUILD
+static void init_boot_params(void)
+{
+       boot_params_ptr = (u32 *) &boot_params;
+}
+#endif
+
 /*
  * Routine: s_init
  * Description: Does early system init of watchdog, muxing,  andclocks
@@ -131,6 +150,7 @@ void s_init(void)
 #ifdef CONFIG_SPL_BUILD
        /* For regular u-boot sdram_init() is called from dram_init() */
        sdram_init();
+       init_boot_params();
 #endif
 }
 
index 68732987aea188d9d3e0d1ee4c0bba5f5c14f37e..35f38acf5d09c83cba4b0bc04f62124950584055 100644 (file)
@@ -27,7 +27,7 @@
  */
 
 #include <asm/arch/omap.h>
-#ifdef CONFIG_SPL_BUILD
+
 .global save_boot_params
 save_boot_params:
        /*
@@ -43,21 +43,40 @@ save_boot_params:
        cmp     r2, r0
        blt     1f
 
+       /*
+        * store the boot params passed from rom code or saved
+        * and passed by SPL
+        */
+       cmp     r0, #0
+       beq     1f
+       ldr     r1, =boot_params
+       str     r0, [r1]
+#ifdef CONFIG_SPL_BUILD
        /* Store the boot device in omap_boot_device */
-       ldr     r2, [r0, #BOOT_DEVICE_OFFSET]   @ r1 <- value of boot device
+       ldrb    r2, [r0, #BOOT_DEVICE_OFFSET]   @ r1 <- value of boot device
        and     r2, #BOOT_DEVICE_MASK
-       ldr     r3, =omap_bootdevice
-       str     r2, [r3]                        @ omap_boot_device <- r1
+       ldr     r3, =boot_params
+       strb    r2, [r3, #BOOT_DEVICE_OFFSET]   @ omap_boot_device <- r1
 
+       /* boot mode is passed only for devices that can raw/fat mode */
+       cmp     r2, #2
+       blt     2f
+       cmp     r2, #7
+       bgt     2f
        /* Store the boot mode (raw/FAT) in omap_boot_mode */
        ldr     r2, [r0, #DEV_DESC_PTR_OFFSET]  @ get the device descriptor ptr
        ldr     r2, [r2, #DEV_DATA_PTR_OFFSET]  @ get the pDeviceData ptr
        ldr     r2, [r2, #BOOT_MODE_OFFSET]     @ get the boot mode
        ldr     r3, =omap_bootmode
        str     r2, [r3]
+#endif
+2:
+       ldrb    r2, [r0, #CH_FLAGS_OFFSET]
+       ldr     r3, =boot_params
+       strb    r2, [r3, #CH_FLAGS_OFFSET]
 1:
        bx      lr
-#endif
+
 
 .globl lowlevel_init
 lowlevel_init:
index 2c59d2b36bd515936c0afd68bfd671e4f8b1985e..d6d7d65ecf31010baa8e2b59f0ddcff9ff398d9b 100644 (file)
@@ -38,6 +38,7 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+u32* boot_params_ptr = NULL;
 struct spl_image_info spl_image;
 
 /* Define global data structure pointer to it*/
@@ -92,12 +93,16 @@ void spl_parse_image_header(const struct image_header *header)
 
 static void jump_to_image_no_args(void)
 {
-       typedef void (*image_entry_noargs_t)(void)__attribute__ ((noreturn));
+       typedef void (*image_entry_noargs_t)(u32 *)__attribute__ ((noreturn));
        image_entry_noargs_t image_entry =
                        (image_entry_noargs_t) spl_image.entry_point;
 
        debug("image entry point: 0x%X\n", spl_image.entry_point);
-       image_entry();
+       /* Pass the saved boot_params from rom code */
+#if defined(CONFIG_VIRTIO) || defined(CONFIG_ZEBU)
+       image_entry = 0x80100000;
+#endif
+       image_entry((u32 *)&boot_params_ptr);
 }
 
 void jump_to_image_no_args(void) __attribute__ ((noreturn));
index a1098d40350b3d432dda5ef23726605de0285daf..0886f92431ad87ace2cd2823196580b8cd3693e7 100644 (file)
@@ -333,30 +333,23 @@ void enable_basic_clocks(void)
        };
 
        u32 *const clk_modules_hw_auto_essential[] = {
+               &prcm->cm_memif_emif_1_clkctrl,
+               &prcm->cm_memif_emif_2_clkctrl,
+               &prcm->cm_l4cfg_l4_cfg_clkctrl,
                &prcm->cm_wkup_gpio1_clkctrl,
                &prcm->cm_l4per_gpio2_clkctrl,
                &prcm->cm_l4per_gpio3_clkctrl,
                &prcm->cm_l4per_gpio4_clkctrl,
                &prcm->cm_l4per_gpio5_clkctrl,
                &prcm->cm_l4per_gpio6_clkctrl,
-               &prcm->cm_memif_emif_1_clkctrl,
-               &prcm->cm_memif_emif_2_clkctrl,
-               &prcm->cm_l3init_hsusbotg_clkctrl,
-               &prcm->cm_l3init_usbphy_clkctrl,
-               &prcm->cm_l4cfg_l4_cfg_clkctrl,
                0
        };
 
        u32 *const clk_modules_explicit_en_essential[] = {
-               &prcm->cm_l4per_gptimer2_clkctrl,
+               &prcm->cm_wkup_gptimer1_clkctrl,
                &prcm->cm_l3init_hsmmc1_clkctrl,
                &prcm->cm_l3init_hsmmc2_clkctrl,
-               &prcm->cm_l4per_mcspi1_clkctrl,
-               &prcm->cm_wkup_gptimer1_clkctrl,
-               &prcm->cm_l4per_i2c1_clkctrl,
-               &prcm->cm_l4per_i2c2_clkctrl,
-               &prcm->cm_l4per_i2c3_clkctrl,
-               &prcm->cm_l4per_i2c4_clkctrl,
+               &prcm->cm_l4per_gptimer2_clkctrl,
                &prcm->cm_wkup_wdtimer2_clkctrl,
                &prcm->cm_l4per_uart3_clkctrl,
                0
@@ -386,6 +379,33 @@ void enable_basic_clocks(void)
                         1);
 }
 
+void enable_basic_uboot_clocks(void)
+{
+       u32 *const clk_domains_essential[] = {
+               0
+       };
+
+       u32 *const clk_modules_hw_auto_essential[] = {
+               &prcm->cm_l3init_hsusbotg_clkctrl,
+               &prcm->cm_l3init_usbphy_clkctrl,
+               0
+       };
+
+       u32 *const clk_modules_explicit_en_essential[] = {
+               &prcm->cm_l4per_mcspi1_clkctrl,
+               &prcm->cm_l4per_i2c1_clkctrl,
+               &prcm->cm_l4per_i2c2_clkctrl,
+               &prcm->cm_l4per_i2c3_clkctrl,
+               &prcm->cm_l4per_i2c4_clkctrl,
+               0
+       };
+
+       do_enable_clocks(clk_domains_essential,
+                        clk_modules_hw_auto_essential,
+                        clk_modules_explicit_en_essential,
+                        1);
+}
+
 /*
  * Enable non-essential clock domains, modules and
  * do some additional special settings needed
index 28d3bcd8ee2dd2d9ada2e9b46e51cee43750f1ba..dd882a202e787539e6370b8160b4b166c6f0f79a 100644 (file)
@@ -273,30 +273,26 @@ void enable_basic_clocks(void)
        };
 
        u32 *const clk_modules_hw_auto_essential[] = {
+               &prcm->cm_memif_emif_1_clkctrl,
+               &prcm->cm_memif_emif_2_clkctrl,
+               &prcm->cm_l4cfg_l4_cfg_clkctrl,
                &prcm->cm_wkup_gpio1_clkctrl,
                &prcm->cm_l4per_gpio2_clkctrl,
                &prcm->cm_l4per_gpio3_clkctrl,
                &prcm->cm_l4per_gpio4_clkctrl,
                &prcm->cm_l4per_gpio5_clkctrl,
                &prcm->cm_l4per_gpio6_clkctrl,
-               &prcm->cm_memif_emif_1_clkctrl,
-               &prcm->cm_memif_emif_2_clkctrl,
-               &prcm->cm_l4cfg_l4_cfg_clkctrl,
                0
        };
 
        u32 *const clk_modules_explicit_en_essential[] = {
-               &prcm->cm_l4per_gptimer2_clkctrl,
+               &prcm->cm_wkup_gptimer1_clkctrl,
                &prcm->cm_l3init_hsmmc1_clkctrl,
                &prcm->cm_l3init_hsmmc2_clkctrl,
-               &prcm->cm_l4per_mcspi1_clkctrl,
-               &prcm->cm_wkup_gptimer1_clkctrl,
-               &prcm->cm_l4per_i2c1_clkctrl,
-               &prcm->cm_l4per_i2c2_clkctrl,
-               &prcm->cm_l4per_i2c3_clkctrl,
-               &prcm->cm_l4per_i2c4_clkctrl,
+               &prcm->cm_l4per_gptimer2_clkctrl,
                &prcm->cm_wkup_wdtimer2_clkctrl,
                &prcm->cm_l4per_uart3_clkctrl,
+               &prcm->cm_l4per_i2c1_clkctrl,
                0
        };
 
@@ -320,6 +316,30 @@ void enable_basic_clocks(void)
                         1);
 }
 
+void enable_basic_uboot_clocks(void)
+{
+       u32 *const clk_domains_essential[] = {
+               0
+       };
+
+       u32 *const clk_modules_hw_auto_essential[] = {
+               0
+       };
+
+       u32 *const clk_modules_explicit_en_essential[] = {
+               &prcm->cm_l4per_mcspi1_clkctrl,
+               &prcm->cm_l4per_i2c2_clkctrl,
+               &prcm->cm_l4per_i2c3_clkctrl,
+               &prcm->cm_l4per_i2c4_clkctrl,
+               0
+       };
+
+       do_enable_clocks(clk_domains_essential,
+                        clk_modules_hw_auto_essential,
+                        clk_modules_explicit_en_essential,
+                        1);
+}
+
 /*
  * Enable non-essential clock domains, modules and
  * do some additional special settings needed
index ba525741577377f7b6c5cba154ffa45eafd6b195..c2a9b46cfdb393bf99910b8d43e62e90501d732d 100644 (file)
@@ -698,6 +698,7 @@ void setup_sri2c(void);
 void setup_post_dividers(u32 *const base, const struct dpll_params *params);
 u32 get_sys_clk_index(void);
 void enable_basic_clocks(void);
+void enable_basic_uboot_clocks(void);
 void enable_non_essential_clocks(void);
 void do_enable_clocks(u32 *const *clk_domains,
                      u32 *const *clk_modules_hw_auto,
index 0ade8961ab0d833632bac6ab346299f5ed5f9e36..e9942574f2a3b5b185dc3e9a9ccb6fed78656d67 100644 (file)
@@ -191,5 +191,21 @@ struct control_lpddr2io_regs {
 #define DEV_DESC_PTR_OFFSET    0x4
 #define DEV_DATA_PTR_OFFSET    0x18
 #define BOOT_MODE_OFFSET       0x8
+#define RESET_REASON_OFFSET    0x9
+#define CH_FLAGS_OFFSET                0xA
 
+#define CH_FLAGS_CHSETTINGS    (0x1 << 0)
+#define CH_FLAGS_CHRAM         (0x1 << 1)
+#define CH_FLAGS_CHFLASH       (0x1 << 2)
+#define CH_FLAGS_CHMMCSD       (0x1 << 3)
+
+#ifndef __ASSEMBLY__
+struct omap_boot_parameters {
+       char *boot_message;
+       unsigned int mem_boot_descriptor;
+       unsigned char omap_bootdevice;
+       unsigned char reset_reason;
+       unsigned char ch_flags;
+};
+#endif
 #endif
index b8113e15aaa5394c5c08ada6650ecc91c31af835..4146e21818c541275c6311f094cdc8890b05363f 100644 (file)
@@ -55,6 +55,13 @@ u32 omap_sdram_size(void);
 u32 cortex_rev(void);
 void init_omap_revision(void);
 void do_io_settings(void);
+/*
+ * This is used to verify if the configuration header
+ * was executed by Romcode prior to control of transfer
+ * to the bootloader. SPL is responsible for saving and
+ * passing this to the u-boot.
+ */
+extern struct omap_boot_parameters boot_params;
 
 static inline u32 running_from_sdram(void)
 {
@@ -67,15 +74,17 @@ static inline u32 running_from_sdram(void)
 static inline u8 uboot_loaded_by_spl(void)
 {
        /*
-        * Configuration Header is not supported yet, so u-boot init running
-        * from SDRAM implies that it was loaded by SPL. When this situation
-        * changes one of these approaches could be taken:
-        * i.  Pass a magic from SPL to U-Boot and U-Boot save it at a known
-        *     location.
-        * ii. Check the OPP. CH can support only 50% OPP while SPL initializes
-        *     the DPLLs at 100% OPP.
+        * u-boot can be running from sdram either because of configuration
+        * Header or by SPL. If because of CH, then the romcode sets the
+        * CHSETTINGS executed bit to true in the boot parameter structure that
+        * it passes to the bootloader.This parameter is stored in the ch_flags
+        * variable by both SPL and u-boot.Check out for CHSETTINGS, which is a
+        * mandatory section if CH is present.
         */
-       return running_from_sdram();
+       if ((boot_params.ch_flags) & (CH_FLAGS_CHSETTINGS))
+               return 0;
+       else
+               return running_from_sdram();
 }
 /*
  * The basic hardware init of OMAP(s_init()) can happen in 4
index edcc9e9364b6e630841f3d35ce65bd7580e3f8b3..fa99f654bd8b092bcacefd625654b1a64d064596 100644 (file)
@@ -708,6 +708,7 @@ void setup_post_dividers(u32 *const base, const struct dpll_params *params);
 u32 get_sys_clk_index(void);
 void enable_basic_clocks(void);
 void enable_non_essential_clocks(void);
+void enable_basic_uboot_clocks(void);
 void do_enable_clocks(u32 *const *clk_domains,
                      u32 *const *clk_modules_hw_auto,
                      u32 *const *clk_modules_explicit_en,
index 85975de2da251ee08b87325e0e81de160d78a1b1..d811d6ec237739712118c5a0468a8865613f332c 100644 (file)
@@ -203,5 +203,21 @@ struct control_lpddr2io_regs {
 #define DEV_DESC_PTR_OFFSET    0x4
 #define DEV_DATA_PTR_OFFSET    0x18
 #define BOOT_MODE_OFFSET       0x8
+#define RESET_REASON_OFFSET     0x9
+#define CH_FLAGS_OFFSET         0xA
 
+#define CH_FLAGS_CHSETTINGS    (0x1 << 0)
+#define        CH_FLAGS_CHRAM          (0x1 << 1)
+#define CH_FLAGS_CHFLASH       (0x1 << 2)
+#define CH_FLAGS_CHMMCSD       (0x1 << 3)
+
+#ifndef __ASSEMBLY__
+struct omap_boot_parameters {
+       char *boot_message;
+       unsigned int mem_boot_descriptor;
+       unsigned char omap_bootdevice;
+       unsigned char reset_reason;
+       unsigned char ch_flags;
+};
+#endif /* __ASSEMBLY__ */
 #endif
index 3803ea9f55394e7daf47c3ec715280aaa7f5322f..c31e18ca22283da08e1c0822b92afb64d3a5157e 100644 (file)
@@ -75,15 +75,17 @@ static inline u32 running_from_sdram(void)
 static inline u8 uboot_loaded_by_spl(void)
 {
        /*
-        * Configuration Header is not supported yet, so u-boot init running
-        * from SDRAM implies that it was loaded by SPL. When this situation
-        * changes one of these approaches could be taken:
-        * i.  Pass a magic from SPL to U-Boot and U-Boot save it at a known
-        *     location.
-        * ii. Check the OPP. CH can support only 50% OPP while SPL initializes
-        *     the DPLLs at 100% OPP.
+        * u-boot can be running from sdram either because of configuration
+        * Header or by SPL. If because of CH, then the romcode sets the
+        * CHSETTINGS executed bit to true in the boot parameter structure that
+        * it passes to the bootloader.This parameter is stored in the ch_flags
+        * variable by both SPL and u-boot.Check out for CHSETTINGS, which is a
+        * mandatory section if CH is present.
         */
-       return running_from_sdram();
+       if ((boot_params.ch_flags) & (CH_FLAGS_CHSETTINGS))
+               return 0;
+       else
+               return running_from_sdram();
 }
 /*
  * The basic hardware init of OMAP(s_init()) can happen in 4
index f026805cd01e54d846f7ab712b290fa786ef045a..f1562ea4abc71c4eeaf84b53e2dd70cfdde7652c 100644 (file)
@@ -80,6 +80,7 @@ struct spl_image_info {
 
 extern struct spl_image_info spl_image;
 
+extern u32* boot_params_ptr;
 u32 omap_boot_device(void);
 u32 omap_boot_mode(void);
 
index f0334517a0733390379f40f35180090e1b4473ec..18f47292574cc85064b8afc3b14c156185c34a3d 100644 (file)
@@ -50,14 +50,6 @@ const struct pad_conf_entry core_padconf_array_essential[] = {
 {SDMMC1_DAT5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat5 */
 {SDMMC1_DAT6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat6 */
 {SDMMC1_DAT7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat7 */
-{I2C1_SCL, (PTU | IEN | M0)},                          /* i2c1_scl */
-{I2C1_SDA, (PTU | IEN | M0)},                          /* i2c1_sda */
-{I2C2_SCL, (PTU | IEN | M0)},                          /* i2c2_scl */
-{I2C2_SDA, (PTU | IEN | M0)},                          /* i2c2_sda */
-{I2C3_SCL, (PTU | IEN | M0)},                          /* i2c3_scl */
-{I2C3_SDA, (PTU | IEN | M0)},                          /* i2c3_sda */
-{I2C4_SCL, (PTU | IEN | M0)},                          /* i2c4_scl */
-{I2C4_SDA, (PTU | IEN | M0)},                          /* i2c4_sda */
 {UART3_CTS_RCTX, (PTU | IEN | M0)},                    /* uart3_tx */
 {UART3_RTS_SD, (M0)},                                  /* uart3_rts_sd */
 {UART3_RX_IRRX, (IEN | M0)},                           /* uart3_rx */
@@ -245,6 +237,14 @@ const struct pad_conf_entry core_padconf_array_non_essential[] = {
        {DPM_EMU17, (IEN | M5)},                                        /* dispc2_data2 */
        {DPM_EMU18, (IEN | M5)},                                        /* dispc2_data1 */
        {DPM_EMU19, (IEN | M5)},                                        /* dispc2_data0 */
+       {I2C1_SCL, (PTU | IEN | M0)},                           /* i2c1_scl */
+       {I2C1_SDA, (PTU | IEN | M0)},                           /* i2c1_sda */
+       {I2C2_SCL, (PTU | IEN | M0)},                           /* i2c2_scl */
+       {I2C2_SDA, (PTU | IEN | M0)},                           /* i2c2_sda */
+       {I2C3_SCL, (PTU | IEN | M0)},                           /* i2c3_scl */
+       {I2C3_SDA, (PTU | IEN | M0)},                           /* i2c3_sda */
+       {I2C4_SCL, (PTU | IEN | M0)},                           /* i2c4_scl */
+       {I2C4_SDA, (PTU | IEN | M0)}                            /* i2c4_sda */
 };
 
 const struct pad_conf_entry wkup_padconf_array_non_essential[] = {
index f36b663eff2b9209954754cee66d619c85e50512..1c6e0eeb60cd2bc8434c69e35975052e1d95a882 100644 (file)
@@ -50,14 +50,6 @@ const struct pad_conf_entry core_padconf_array_essential[] = {
 {SDMMC1_DAT5, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat5 */
 {SDMMC1_DAT6, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat6 */
 {SDMMC1_DAT7, (PTU | IEN | OFF_EN | OFF_PD | OFF_IN | M0)}, /* sdmmc1_dat7 */
-{I2C1_SCL, (PTU | IEN | M0)},                          /* i2c1_scl */
-{I2C1_SDA, (PTU | IEN | M0)},                          /* i2c1_sda */
-{I2C2_SCL, (PTU | IEN | M0)},                          /* i2c2_scl */
-{I2C2_SDA, (PTU | IEN | M0)},                          /* i2c2_sda */
-{I2C3_SCL, (PTU | IEN | M0)},                          /* i2c3_scl */
-{I2C3_SDA, (PTU | IEN | M0)},                          /* i2c3_sda */
-{I2C4_SCL, (PTU | IEN | M0)},                          /* i2c4_scl */
-{I2C4_SDA, (PTU | IEN | M0)},                          /* i2c4_sda */
 {UART3_CTS_RCTX, (PTU | IEN | M0)},                    /* uart3_tx */
 {UART3_RTS_SD, (M0)},                                  /* uart3_rts_sd */
 {UART3_RX_IRRX, (IEN | M0)},                           /* uart3_rx */
@@ -251,6 +243,15 @@ const struct pad_conf_entry core_padconf_array_non_essential[] = {
        {DPM_EMU17, (IEN | M5)},                                        /* dispc2_data2 */
        {DPM_EMU18, (IEN | M5)},                                        /* dispc2_data1 */
        {DPM_EMU19, (IEN | M5)},                                        /* dispc2_data0 */
+       {I2C1_SCL, (PTU | IEN | M0)},                                   /* i2c1_scl */
+       {I2C1_SDA, (PTU | IEN | M0)},                                   /* i2c1_sda */
+       {I2C2_SCL, (PTU | IEN | M0)},                                   /* i2c2_scl */
+       {I2C2_SDA, (PTU | IEN | M0)},                                   /* i2c2_sda */
+       {I2C3_SCL, (PTU | IEN | M0)},                                   /* i2c3_scl */
+       {I2C3_SDA, (PTU | IEN | M0)},                                   /* i2c3_sda */
+       {I2C4_SCL, (PTU | IEN | M0)},                                   /* i2c4_scl */
+       {I2C4_SDA, (PTU | IEN | M0)}                                    /* i2c4_sda */
+
 };
 
 const struct pad_conf_entry wkup_padconf_array_non_essential[] = {
index 11a33908be04f2ef65709620058136850876080b..42a8f10ade742bf0639d43d02310f73954a20308 100644 (file)
 /* Flash */
 #define CONFIG_SYS_NO_FLASH    1
 
+/* clocks */
+#define CONFIG_SYS_CLOCKS_ENABLE_ALL
+
 /* commands to include */
 #include <config_cmd_default.h>
 
 #define CONFIG_SPL_SERIAL_SUPPORT
 #define CONFIG_SPL_LDSCRIPT "arch/arm/cpu/armv7/omap-common/u-boot-spl.lds"
 
+#define CONFIG_SYS_ENABLE_PADS_ALL
+
 #endif /* __CONFIG_OMAP4_COMMON_H */