Merge branch 'for_3.2/pm-cleanup-2' of git://github.com/khilman/linux-omap-pm into...
[pandora-kernel.git] / arch / arm / mach-omap2 / id.c
index 37efb86..7f47092 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "control.h"
 
-static struct omap_chip_id omap_chip;
 static unsigned int omap_revision;
 
 u32 omap_features;
@@ -39,19 +38,6 @@ unsigned int omap_rev(void)
 }
 EXPORT_SYMBOL(omap_rev);
 
-/**
- * omap_chip_is - test whether currently running OMAP matches a chip type
- * @oc: omap_chip_t to test against
- *
- * Test whether the currently-running OMAP chip matches the supplied
- * chip type 'oc'.  Returns 1 upon a match; 0 upon failure.
- */
-int omap_chip_is(struct omap_chip_id oci)
-{
-       return (oci.oc & omap_chip.oc) ? 1 : 0;
-}
-EXPORT_SYMBOL(omap_chip_is);
-
 int omap_type(void)
 {
        u32 val = 0;
@@ -201,8 +187,11 @@ static void __init omap3_check_features(void)
        OMAP3_CHECK_FEATURE(status, ISP);
        if (cpu_is_omap3630())
                omap_features |= OMAP3_HAS_192MHZ_CLK;
-       if (!cpu_is_omap3505() && !cpu_is_omap3517())
+       if (cpu_is_omap3430() || cpu_is_omap3630())
                omap_features |= OMAP3_HAS_IO_WAKEUP;
+       if (cpu_is_omap3630() || omap_rev() == OMAP3430_REV_ES3_1 ||
+           omap_rev() == OMAP3430_REV_ES3_1_2)
+               omap_features |= OMAP3_HAS_IO_CHAIN_CTRL;
 
        omap_features |= OMAP3_HAS_SDRC;
 
@@ -242,14 +231,12 @@ static void __init ti816x_check_features(void)
        omap_features = OMAP3_HAS_NEON;
 }
 
-static void __init omap3_check_revision(void)
+static void __init omap3_check_revision(const char **cpu_rev)
 {
        u32 cpuid, idcode;
        u16 hawkeye;
        u8 rev;
 
-       omap_chip.oc = CHIP_IS_OMAP3430;
-
        /*
         * We cannot access revision registers on ES1.0.
         * If the processor type is Cortex-A8 and the revision is 0x0
@@ -258,7 +245,7 @@ static void __init omap3_check_revision(void)
        cpuid = read_cpuid(CPUID_ID);
        if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
                omap_revision = OMAP3430_REV_ES1_0;
-               omap_chip.oc |= CHIP_IS_OMAP3430ES1;
+               *cpu_rev = "1.0";
                return;
        }
 
@@ -279,77 +266,85 @@ static void __init omap3_check_revision(void)
                case 0: /* Take care of early samples */
                case 1:
                        omap_revision = OMAP3430_REV_ES2_0;
-                       omap_chip.oc |= CHIP_IS_OMAP3430ES2;
+                       *cpu_rev = "2.0";
                        break;
                case 2:
                        omap_revision = OMAP3430_REV_ES2_1;
-                       omap_chip.oc |= CHIP_IS_OMAP3430ES2;
+                       *cpu_rev = "2.1";
                        break;
                case 3:
                        omap_revision = OMAP3430_REV_ES3_0;
-                       omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
+                       *cpu_rev = "3.0";
                        break;
                case 4:
                        omap_revision = OMAP3430_REV_ES3_1;
-                       omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
+                       *cpu_rev = "3.1";
                        break;
                case 7:
                /* FALLTHROUGH */
                default:
                        /* Use the latest known revision as default */
                        omap_revision = OMAP3430_REV_ES3_1_2;
-
-                       /* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */
-                       omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
+                       *cpu_rev = "3.1.2";
                }
                break;
        case 0xb868:
-               /* Handle OMAP35xx/AM35xx devices
+               /*
+                * Handle OMAP/AM 3505/3517 devices
                 *
-                * Set the device to be OMAP3505 here. Actual device
+                * Set the device to be OMAP3517 here. Actual device
                 * is identified later based on the features.
-                *
-                * REVISIT: AM3505/AM3517 should have their own CHIP_IS
                 */
-               omap_revision = OMAP3505_REV(rev);
-               omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
+               switch (rev) {
+               case 0:
+                       omap_revision = OMAP3517_REV_ES1_0;
+                       *cpu_rev = "1.0";
+                       break;
+               case 1:
+               /* FALLTHROUGH */
+               default:
+                       omap_revision = OMAP3517_REV_ES1_1;
+                       *cpu_rev = "1.1";
+               }
                break;
        case 0xb891:
                /* Handle 36xx devices */
-               omap_chip.oc |= CHIP_IS_OMAP3630ES1;
 
                switch(rev) {
                case 0: /* Take care of early samples */
                        omap_revision = OMAP3630_REV_ES1_0;
+                       *cpu_rev = "1.0";
                        break;
                case 1:
                        omap_revision = OMAP3630_REV_ES1_1;
-                       omap_chip.oc |= CHIP_IS_OMAP3630ES1_1;
+                       *cpu_rev = "1.1";
                        break;
                case 2:
+               /* FALLTHROUGH */
                default:
-                       omap_revision =  OMAP3630_REV_ES1_2;
-                       omap_chip.oc |= CHIP_IS_OMAP3630ES1_2;
+                       omap_revision = OMAP3630_REV_ES1_2;
+                       *cpu_rev = "1.2";
                }
                break;
        case 0xb81e:
-               omap_chip.oc = CHIP_IS_TI816X;
-
                switch (rev) {
                case 0:
                        omap_revision = TI8168_REV_ES1_0;
+                       *cpu_rev = "1.0";
                        break;
                case 1:
+               /* FALLTHROUGH */
+               default:
                        omap_revision = TI8168_REV_ES1_1;
+                       *cpu_rev = "1.1";
                        break;
-               default:
-                       omap_revision =  TI8168_REV_ES1_1;
                }
                break;
        default:
-               /* Unknown default to latest silicon rev as default*/
-               omap_revision =  OMAP3630_REV_ES1_2;
-               omap_chip.oc |= CHIP_IS_OMAP3630ES1_2;
+               /* Unknown default to latest silicon rev as default */
+               omap_revision = OMAP3630_REV_ES1_2;
+               *cpu_rev = "1.2";
+               pr_warn("Warning: unknown chip type; assuming OMAP3630ES1.2\n");
        }
 }
 
@@ -382,24 +377,20 @@ static void __init omap4_check_revision(void)
                switch (rev) {
                case 0:
                        omap_revision = OMAP4430_REV_ES1_0;
-                       omap_chip.oc |= CHIP_IS_OMAP4430ES1;
                        break;
                case 1:
                default:
                        omap_revision = OMAP4430_REV_ES2_0;
-                       omap_chip.oc |= CHIP_IS_OMAP4430ES2;
                }
                break;
        case 0xb95c:
                switch (rev) {
                case 3:
                        omap_revision = OMAP4430_REV_ES2_1;
-                       omap_chip.oc |= CHIP_IS_OMAP4430ES2_1;
                        break;
                case 4:
                default:
                        omap_revision = OMAP4430_REV_ES2_2;
-                       omap_chip.oc |= CHIP_IS_OMAP4430ES2_2;
                }
                break;
        case 0xb94e:
@@ -407,14 +398,12 @@ static void __init omap4_check_revision(void)
                case 0:
                default:
                        omap_revision = OMAP4460_REV_ES1_0;
-                       omap_chip.oc |= CHIP_IS_OMAP4460ES1_0;
                        break;
                }
                break;
        default:
                /* Unknown default to latest silicon rev as default */
                omap_revision = OMAP4430_REV_ES2_2;
-               omap_chip.oc |= CHIP_IS_OMAP4430ES2_2;
        }
 
        pr_info("OMAP%04x ES%d.%d\n", omap_rev() >> 16,
@@ -425,94 +414,33 @@ static void __init omap4_check_revision(void)
        if (omap3_has_ ##feat())                \
                printk(#feat" ");
 
-static void __init omap3_cpuinfo(void)
+static void __init omap3_cpuinfo(const char *cpu_rev)
 {
-       u8 rev = GET_OMAP_REVISION();
-       char cpu_name[16], cpu_rev[16];
+       const char *cpu_name;
 
-       /* OMAP3430 and OMAP3530 are assumed to be same.
+       /*
+        * OMAP3430 and OMAP3530 are assumed to be same.
         *
         * OMAP3525, OMAP3515 and OMAP3503 can be detected only based
         * on available features. Upon detection, update the CPU id
         * and CPU class bits.
         */
        if (cpu_is_omap3630()) {
-               strcpy(cpu_name, "OMAP3630");
-       } else if (cpu_is_omap3505()) {
-               /*
-                * AM35xx devices
-                */
-               if (omap3_has_sgx()) {
-                       omap_revision = OMAP3517_REV(rev);
-                       strcpy(cpu_name, "AM3517");
-               } else {
-                       /* Already set in omap3_check_revision() */
-                       strcpy(cpu_name, "AM3505");
-               }
+               cpu_name = "OMAP3630";
+       } else if (cpu_is_omap3517()) {
+               /* AM35xx devices */
+               cpu_name = (omap3_has_sgx()) ? "AM3517" : "AM3505";
        } else if (cpu_is_ti816x()) {
-               strcpy(cpu_name, "TI816X");
+               cpu_name = "TI816X";
        } else if (omap3_has_iva() && omap3_has_sgx()) {
                /* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
-               strcpy(cpu_name, "OMAP3430/3530");
+               cpu_name = "OMAP3430/3530";
        } else if (omap3_has_iva()) {
-               omap_revision = OMAP3525_REV(rev);
-               strcpy(cpu_name, "OMAP3525");
+               cpu_name = "OMAP3525";
        } else if (omap3_has_sgx()) {
-               omap_revision = OMAP3515_REV(rev);
-               strcpy(cpu_name, "OMAP3515");
+               cpu_name = "OMAP3515";
        } else {
-               omap_revision = OMAP3503_REV(rev);
-               strcpy(cpu_name, "OMAP3503");
-       }
-
-       if (cpu_is_omap3630() || cpu_is_ti816x()) {
-               switch (rev) {
-               case OMAP_REVBITS_00:
-                       strcpy(cpu_rev, "1.0");
-                       break;
-               case OMAP_REVBITS_01:
-                       strcpy(cpu_rev, "1.1");
-                       break;
-               case OMAP_REVBITS_02:
-                       /* FALLTHROUGH */
-               default:
-                       /* Use the latest known revision as default */
-                       strcpy(cpu_rev, "1.2");
-               }
-       } else if (cpu_is_omap3505() || cpu_is_omap3517()) {
-               switch (rev) {
-               case OMAP_REVBITS_00:
-                       strcpy(cpu_rev, "1.0");
-                       break;
-               case OMAP_REVBITS_01:
-                       /* FALLTHROUGH */
-               default:
-                       /* Use the latest known revision as default */
-                       strcpy(cpu_rev, "1.1");
-               }
-       } else {
-               switch (rev) {
-               case OMAP_REVBITS_00:
-                       strcpy(cpu_rev, "1.0");
-                       break;
-               case OMAP_REVBITS_01:
-                       strcpy(cpu_rev, "2.0");
-                       break;
-               case OMAP_REVBITS_02:
-                       strcpy(cpu_rev, "2.1");
-                       break;
-               case OMAP_REVBITS_03:
-                       strcpy(cpu_rev, "3.0");
-                       break;
-               case OMAP_REVBITS_04:
-                       strcpy(cpu_rev, "3.1");
-                       break;
-               case OMAP_REVBITS_05:
-                       /* FALLTHROUGH */
-               default:
-                       /* Use the latest known revision as default */
-                       strcpy(cpu_rev, "3.1.2");
-               }
+               cpu_name = "OMAP3503";
        }
 
        /* Print verbose information */
@@ -533,6 +461,8 @@ static void __init omap3_cpuinfo(void)
  */
 void __init omap2_check_revision(void)
 {
+       const char *cpu_rev;
+
        /*
         * At this point we have an idea about the processor revision set
         * earlier with omap2_set_globals_tap().
@@ -540,7 +470,7 @@ void __init omap2_check_revision(void)
        if (cpu_is_omap24xx()) {
                omap24xx_check_revision();
        } else if (cpu_is_omap34xx()) {
-               omap3_check_revision();
+               omap3_check_revision(&cpu_rev);
 
                /* TI816X doesn't have feature register */
                if (!cpu_is_ti816x())
@@ -548,7 +478,7 @@ void __init omap2_check_revision(void)
                else
                        ti816x_check_features();
 
-               omap3_cpuinfo();
+               omap3_cpuinfo(cpu_rev);
                return;
        } else if (cpu_is_omap44xx()) {
                omap4_check_revision();
@@ -557,22 +487,6 @@ void __init omap2_check_revision(void)
        } else {
                pr_err("OMAP revision unknown, please fix!\n");
        }
-
-       /*
-        * OK, now we know the exact revision. Initialize omap_chip bits
-        * for powerdowmain and clockdomain code.
-        */
-       if (cpu_is_omap243x()) {
-               /* Currently only supports 2430ES2.1 and 2430-all */
-               omap_chip.oc |= CHIP_IS_OMAP2430;
-               return;
-       } else if (cpu_is_omap242x()) {
-               /* Currently only supports 2420ES2.1.1 and 2420-all */
-               omap_chip.oc |= CHIP_IS_OMAP2420;
-               return;
-       }
-
-       pr_err("Uninitialized omap_chip, please fix!\n");
 }
 
 /*