|
@@ -28,6 +28,7 @@
|
|
|
* MA 02111-1307 USA
|
|
|
*/
|
|
|
#include <common.h>
|
|
|
+#include <asm/armv7.h>
|
|
|
#include <asm/arch/cpu.h>
|
|
|
#include <asm/arch/sys_proto.h>
|
|
|
#include <asm/sizes.h>
|
|
@@ -35,6 +36,8 @@
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
+u32 *const omap4_revision = (u32 *)OMAP4_SRAM_SCRATCH_OMAP4_REV;
|
|
|
+
|
|
|
void do_set_mux(u32 base, struct pad_conf_entry const *array, int size)
|
|
|
{
|
|
|
int i;
|
|
@@ -72,6 +75,66 @@ static void set_mux_conf_regs(void)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static u32 cortex_a9_rev(void)
|
|
|
+{
|
|
|
+
|
|
|
+ unsigned int rev;
|
|
|
+
|
|
|
+ /* Read Main ID Register (MIDR) */
|
|
|
+ asm ("mrc p15, 0, %0, c0, c0, 0" : "=r" (rev));
|
|
|
+
|
|
|
+ return rev;
|
|
|
+}
|
|
|
+
|
|
|
+static void init_omap4_revision(void)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * For some of the ES2/ES1 boards ID_CODE is not reliable:
|
|
|
+ * Also, ES1 and ES2 have different ARM revisions
|
|
|
+ * So use ARM revision for identification
|
|
|
+ */
|
|
|
+ unsigned int arm_rev = cortex_a9_rev();
|
|
|
+
|
|
|
+ switch (arm_rev) {
|
|
|
+ case MIDR_CORTEX_A9_R0P1:
|
|
|
+ *omap4_revision = OMAP4430_ES1_0;
|
|
|
+ break;
|
|
|
+ case MIDR_CORTEX_A9_R1P2:
|
|
|
+ switch (readl(CONTROL_ID_CODE)) {
|
|
|
+ case OMAP4_CONTROL_ID_CODE_ES2_0:
|
|
|
+ *omap4_revision = OMAP4430_ES2_0;
|
|
|
+ break;
|
|
|
+ case OMAP4_CONTROL_ID_CODE_ES2_1:
|
|
|
+ *omap4_revision = OMAP4430_ES2_1;
|
|
|
+ break;
|
|
|
+ case OMAP4_CONTROL_ID_CODE_ES2_2:
|
|
|
+ *omap4_revision = OMAP4430_ES2_2;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ *omap4_revision = OMAP4430_ES2_0;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MIDR_CORTEX_A9_R1P3:
|
|
|
+ *omap4_revision = OMAP4430_ES2_3;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ *omap4_revision = OMAP4430_SILICON_ID_INVALID;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void omap_rev_string(char *omap4_rev_string)
|
|
|
+{
|
|
|
+ u32 omap4_rev = omap_revision();
|
|
|
+ u32 omap4_variant = (omap4_rev & 0xFFFF0000) >> 16;
|
|
|
+ u32 major_rev = (omap4_rev & 0x00000F00) >> 8;
|
|
|
+ u32 minor_rev = (omap4_rev & 0x000000F0) >> 4;
|
|
|
+
|
|
|
+ sprintf(omap4_rev_string, "OMAP%x ES%x.%x", omap4_variant, major_rev,
|
|
|
+ minor_rev);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Routine: s_init
|
|
|
* Description: Does early system init of watchdog, muxing, andclocks
|
|
@@ -88,6 +151,7 @@ static void set_mux_conf_regs(void)
|
|
|
*/
|
|
|
void s_init(void)
|
|
|
{
|
|
|
+ init_omap4_revision();
|
|
|
watchdog_init();
|
|
|
set_mux_conf_regs();
|
|
|
}
|