davinci: add runtime CPU detection support
authorKevin Hilman <khilman@deeprootsystems.com>
Sat, 21 Mar 2009 00:37:21 +0000 (17:37 -0700)
committerKevin Hilman <khilman@deeprootsystems.com>
Thu, 23 Apr 2009 16:27:59 +0000 (09:27 -0700)
Signed-off-by: Kevin Hilman <khilman@deeprootsystems.com>
arch/arm/mach-davinci/id.c
arch/arm/mach-davinci/include/mach/cputype.h [new file with mode: 0644]

index bf067d6..379f2ba 100644 (file)
@@ -17,6 +17,8 @@
 
 #define JTAG_ID_BASE           0x01c40028
 
+static unsigned int davinci_revision;
+
 struct davinci_id {
        u8      variant;        /* JTAG ID bits 31:28 */
        u16     part_no;        /* JTAG ID bits 27:12 */
@@ -33,6 +35,20 @@ static struct davinci_id davinci_ids[] __initdata = {
                .manufacturer = 0x017,
                .type         = 0x64460000,
        },
+       {
+               /* DM646X */
+               .part_no      = 0xb770,
+               .variant      = 0x0,
+               .manufacturer = 0x017,
+               .type         = 0x64670000,
+       },
+       {
+               /* DM355 */
+               .part_no        = 0xb73b,
+               .variant        = 0x0,
+               .manufacturer   = 0x00f,
+               .type           = 0x03550000,
+       },
 };
 
 /*
@@ -63,6 +79,12 @@ static u8 __init davinci_get_variant(void)
        return variant;
 }
 
+unsigned int davinci_rev(void)
+{
+       return davinci_revision >> 16;
+}
+EXPORT_SYMBOL(davinci_rev);
+
 void __init davinci_check_revision(void)
 {
        int i;
@@ -75,7 +97,7 @@ void __init davinci_check_revision(void)
        /* First check only the major version in a safe way */
        for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) {
                if (part_no == (davinci_ids[i].part_no)) {
-                       system_rev = davinci_ids[i].type;
+                       davinci_revision = davinci_ids[i].type;
                        break;
                }
        }
@@ -84,10 +106,11 @@ void __init davinci_check_revision(void)
        for (i = 0; i < ARRAY_SIZE(davinci_ids); i++) {
                if (part_no == davinci_ids[i].part_no &&
                    variant == davinci_ids[i].variant) {
-                       system_rev = davinci_ids[i].type;
+                       davinci_revision = davinci_ids[i].type;
                        break;
                }
        }
 
-       printk("DaVinci DM%04x variant 0x%x\n", system_rev >> 16, variant);
+       printk(KERN_INFO "DaVinci DM%04x variant 0x%x\n",
+              davinci_rev(), variant);
 }
diff --git a/arch/arm/mach-davinci/include/mach/cputype.h b/arch/arm/mach-davinci/include/mach/cputype.h
new file mode 100644 (file)
index 0000000..27cfb1b
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * DaVinci CPU type detection
+ *
+ * Author: Kevin Hilman, Deep Root Systems, LLC
+ *
+ * Defines the cpu_is_*() macros for runtime detection of DaVinci
+ * device type.  In addtion, if support for a given device is not
+ * compiled in to the kernel, the macros return 0 so that
+ * resulting code can be optimized out.
+ *
+ * 2009 (c) Deep Root Systems, LLC. This file is licensed under
+ * the terms of the GNU General Public License version 2. This program
+ * is licensed "as is" without any warranty of any kind, whether express
+ * or implied.
+ */
+#ifndef _ASM_ARCH_CPU_H
+#define _ASM_ARCH_CPU_H
+
+extern unsigned int davinci_rev(void);
+
+#define IS_DAVINCI_CPU(type, id)                       \
+static inline int is_davinci_dm ##type(void)           \
+{                                                      \
+       return (davinci_rev() == (id)) ? 1 : 0;         \
+}
+
+IS_DAVINCI_CPU(644x, 0x6446)
+IS_DAVINCI_CPU(646x, 0x6467)
+IS_DAVINCI_CPU(355, 0x355)
+
+#ifdef CONFIG_ARCH_DAVINCI_DM644x
+#define cpu_is_davinci_dm644x() is_davinci_dm644x()
+#else
+#define cpu_is_davinci_dm644x() 0
+#endif
+
+#ifdef CONFIG_ARCH_DAVINCI_DM646x
+#define cpu_is_davinci_dm646x() is_davinci_dm646x()
+#else
+#define cpu_is_davinci_dm646x() 0
+#endif
+
+#ifdef CONFIG_ARCH_DAVINCI_DM355
+#define cpu_is_davinci_dm355() is_davinci_dm355()
+#else
+#define cpu_is_davinci_dm355() 0
+#endif
+
+#endif