Merge branch 'for_3.2/pm-cleanup-2' of git://github.com/khilman/linux-omap-pm into...
authorTony Lindgren <tony@atomide.com>
Sat, 5 Nov 2011 00:40:52 +0000 (17:40 -0700)
committerTony Lindgren <tony@atomide.com>
Sat, 5 Nov 2011 00:40:52 +0000 (17:40 -0700)
1  2 
arch/arm/mach-omap2/id.c
arch/arm/mach-omap2/pm34xx.c
arch/arm/plat-omap/include/plat/cpu.h

diff --combined arch/arm/mach-omap2/id.c
@@@ -28,6 -28,7 +28,6 @@@
  
  #include "control.h"
  
 -static struct omap_chip_id omap_chip;
  static unsigned int omap_revision;
  
  u32 omap_features;
@@@ -38,6 -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;
@@@ -187,8 -201,11 +187,11 @@@ static void __init omap3_check_features
        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;
  
@@@ -228,12 -245,14 +231,12 @@@ static void __init ti816x_check_feature
        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
        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;
        }
  
                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");
        }
  }
  
@@@ -374,20 -385,24 +377,20 @@@ static void __init omap4_check_revision
                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:
                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,
        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 */
   */
  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().
        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())
                else
                        ti816x_check_features();
  
 -              omap3_cpuinfo();
 +              omap3_cpuinfo(cpu_rev);
                return;
        } else if (cpu_is_omap44xx()) {
                omap4_check_revision();
        } 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");
  }
  
  /*
@@@ -55,7 -55,7 +55,7 @@@
  static suspend_state_t suspend_state = PM_SUSPEND_ON;
  static inline bool is_suspending(void)
  {
 -      return (suspend_state != PM_SUSPEND_ON);
 +      return (suspend_state != PM_SUSPEND_ON) && console_suspend_enabled;
  }
  #else
  static inline bool is_suspending(void)
@@@ -99,31 -99,27 +99,27 @@@ static void omap3_enable_io_chain(void
  {
        int timeout = 0;
  
-       if (omap_rev() >= OMAP3430_REV_ES3_1) {
-               omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD,
-                                    PM_WKEN);
-               /* Do a readback to assure write has been done */
-               omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN);
-               while (!(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN) &
-                        OMAP3430_ST_IO_CHAIN_MASK)) {
-                       timeout++;
-                       if (timeout > 1000) {
-                               printk(KERN_ERR "Wake up daisy chain "
-                                      "activation failed.\n");
-                               return;
-                       }
-                       omap2_prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK,
-                                            WKUP_MOD, PM_WKEN);
+       omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD,
+                                  PM_WKEN);
+       /* Do a readback to assure write has been done */
+       omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN);
+       while (!(omap2_prm_read_mod_reg(WKUP_MOD, PM_WKEN) &
+                OMAP3430_ST_IO_CHAIN_MASK)) {
+               timeout++;
+               if (timeout > 1000) {
+                       pr_err("Wake up daisy chain activation failed.\n");
+                       return;
                }
+               omap2_prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN_MASK,
+                                          WKUP_MOD, PM_WKEN);
        }
  }
  
  static void omap3_disable_io_chain(void)
  {
-       if (omap_rev() >= OMAP3430_REV_ES3_1)
-               omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD,
-                                      PM_WKEN);
+       omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN_MASK, WKUP_MOD,
+                                    PM_WKEN);
  }
  
  static void omap3_core_save_context(void)
@@@ -363,7 -359,6 +359,6 @@@ void omap_sram_idle(void
                printk(KERN_ERR "Invalid mpu state in sram_idle\n");
                return;
        }
-       pwrdm_pre_transition();
  
        /* NEON control */
        if (pwrdm_read_pwrst(neon_pwrdm) == PWRDM_POWER_ON)
            (per_next_state < PWRDM_POWER_ON ||
             core_next_state < PWRDM_POWER_ON)) {
                omap2_prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN);
-               omap3_enable_io_chain();
+               if (omap3_has_io_chain_ctrl())
+                       omap3_enable_io_chain();
        }
  
        /* Block console output in case it is on one of the OMAP UARTs */
                        if (!console_trylock())
                                goto console_still_active;
  
+       pwrdm_pre_transition();
        /* PER */
        if (per_next_state < PWRDM_POWER_ON) {
                per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0;
        omap3_intc_prepare_idle();
  
        /*
-       * On EMU/HS devices ROM code restores a SRDC value
-       * from scratchpad which has automatic self refresh on timeout
-       * of AUTO_CNT = 1 enabled. This takes care of erratum ID i443.
-       * Hence store/restore the SDRC_POWER register here.
-       */
-       if (omap_rev() >= OMAP3430_REV_ES3_0 &&
-           omap_type() != OMAP2_DEVICE_TYPE_GP &&
+        * On EMU/HS devices ROM code restores a SRDC value
+        * from scratchpad which has automatic self refresh on timeout
+        * of AUTO_CNT = 1 enabled. This takes care of erratum ID i443.
+        * Hence store/restore the SDRC_POWER register here.
+        */
+       if (cpu_is_omap3430() && omap_rev() >= OMAP3430_REV_ES3_0 &&
+           (omap_type() == OMAP2_DEVICE_TYPE_EMU ||
+            omap_type() == OMAP2_DEVICE_TYPE_SEC) &&
            core_next_state == PWRDM_POWER_OFF)
                sdrc_pwr = sdrc_read_reg(SDRC_POWER);
  
                omap34xx_do_sram_idle(save_state);
  
        /* Restore normal SDRC POWER settings */
-       if (omap_rev() >= OMAP3430_REV_ES3_0 &&
-           omap_type() != OMAP2_DEVICE_TYPE_GP &&
+       if (cpu_is_omap3430() && omap_rev() >= OMAP3430_REV_ES3_0 &&
+           (omap_type() == OMAP2_DEVICE_TYPE_EMU ||
+            omap_type() == OMAP2_DEVICE_TYPE_SEC) &&
            core_next_state == PWRDM_POWER_OFF)
                sdrc_write_reg(sdrc_pwr, SDRC_POWER);
  
        }
        omap3_intc_resume_idle();
  
+       pwrdm_post_transition();
        /* PER */
        if (per_next_state < PWRDM_POWER_ON) {
                per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm);
@@@ -475,11 -477,10 +477,10 @@@ console_still_active
             core_next_state < PWRDM_POWER_ON)) {
                omap2_prm_clear_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD,
                                             PM_WKEN);
-               omap3_disable_io_chain();
+               if (omap3_has_io_chain_ctrl())
+                       omap3_disable_io_chain();
        }
  
-       pwrdm_post_transition();
        clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
  }
  
@@@ -870,6 -871,9 +871,9 @@@ static int __init omap3_pm_init(void
        if (!cpu_is_omap34xx())
                return -ENODEV;
  
+       if (!omap3_has_io_chain_ctrl())
+               pr_warning("PM: no software I/O chain control; some wakeups may be lost\n");
        pm_errata_configure();
  
        /* XXX prcm_setup_regs needs to be before enabling hw
  
  int omap_type(void);
  
 -struct omap_chip_id {
 -      u16 oc;
 -      u8 type;
 -};
 -
 -#define OMAP_CHIP_INIT(x)     { .oc = x }
 -
  /*
   * omap_rev bits:
   * CPU id bits        (0730, 1510, 1710, 2422...)     [31:16]
   */
  unsigned int omap_rev(void);
  
 -/*
 - * Define CPU revision bits
 - *
 - * Verbose meaning of the revision bits may be different for a silicon
 - * family. This difference can be handled separately.
 - */
 -#define OMAP_REVBITS_00               0x00
 -#define OMAP_REVBITS_01               0x01
 -#define OMAP_REVBITS_02               0x02
 -#define OMAP_REVBITS_03               0x03
 -#define OMAP_REVBITS_04               0x04
 -#define OMAP_REVBITS_05               0x05
 -
  /*
   * Get the CPU revision for OMAP devices
   */
@@@ -242,7 -262,7 +242,7 @@@ IS_OMAP_TYPE(2422, 0x2422
  IS_OMAP_TYPE(2423, 0x2423)
  IS_OMAP_TYPE(2430, 0x2430)
  IS_OMAP_TYPE(3430, 0x3430)
 -IS_OMAP_TYPE(3505, 0x3505)
 +IS_OMAP_TYPE(3505, 0x3517)
  IS_OMAP_TYPE(3517, 0x3517)
  
  #define cpu_is_omap310()              0
                                                (!omap3_has_sgx()) &&   \
                                                (omap3_has_iva()))
  # define cpu_is_omap3530()            (cpu_is_omap3430())
 -# define cpu_is_omap3505()            is_omap3505()
  # define cpu_is_omap3517()            is_omap3517()
 +# define cpu_is_omap3505()            (cpu_is_omap3517() &&           \
 +                                              !omap3_has_sgx())
  # undef cpu_is_omap3630
  # define cpu_is_omap3630()            is_omap363x()
  # define cpu_is_ti816x()              is_ti816x()
  /* Various silicon revisions for omap2 */
  #define OMAP242X_CLASS                0x24200024
  #define OMAP2420_REV_ES1_0    OMAP242X_CLASS
 -#define OMAP2420_REV_ES2_0    (OMAP242X_CLASS | (OMAP_REVBITS_01 << 8))
 +#define OMAP2420_REV_ES2_0    (OMAP242X_CLASS | (0x1 << 8))
  
  #define OMAP243X_CLASS                0x24300024
  #define OMAP2430_REV_ES1_0    OMAP243X_CLASS
  
  #define OMAP343X_CLASS                0x34300034
  #define OMAP3430_REV_ES1_0    OMAP343X_CLASS
 -#define OMAP3430_REV_ES2_0    (OMAP343X_CLASS | (OMAP_REVBITS_01 << 8))
 -#define OMAP3430_REV_ES2_1    (OMAP343X_CLASS | (OMAP_REVBITS_02 << 8))
 -#define OMAP3430_REV_ES3_0    (OMAP343X_CLASS | (OMAP_REVBITS_03 << 8))
 -#define OMAP3430_REV_ES3_1    (OMAP343X_CLASS | (OMAP_REVBITS_04 << 8))
 -#define OMAP3430_REV_ES3_1_2  (OMAP343X_CLASS | (OMAP_REVBITS_05 << 8))
 +#define OMAP3430_REV_ES2_0    (OMAP343X_CLASS | (0x1 << 8))
 +#define OMAP3430_REV_ES2_1    (OMAP343X_CLASS | (0x2 << 8))
 +#define OMAP3430_REV_ES3_0    (OMAP343X_CLASS | (0x3 << 8))
 +#define OMAP3430_REV_ES3_1    (OMAP343X_CLASS | (0x4 << 8))
 +#define OMAP3430_REV_ES3_1_2  (OMAP343X_CLASS | (0x5 << 8))
  
  #define OMAP363X_CLASS                0x36300034
  #define OMAP3630_REV_ES1_0    OMAP363X_CLASS
 -#define OMAP3630_REV_ES1_1    (OMAP363X_CLASS | (OMAP_REVBITS_01 << 8))
 -#define OMAP3630_REV_ES1_2    (OMAP363X_CLASS | (OMAP_REVBITS_02 << 8))
 +#define OMAP3630_REV_ES1_1    (OMAP363X_CLASS | (0x1 << 8))
 +#define OMAP3630_REV_ES1_2    (OMAP363X_CLASS | (0x2 << 8))
  
 -#define OMAP35XX_CLASS                0x35000034
 -#define OMAP3503_REV(v)               (OMAP35XX_CLASS | (0x3503 << 16) | (v << 8))
 -#define OMAP3515_REV(v)               (OMAP35XX_CLASS | (0x3515 << 16) | (v << 8))
 -#define OMAP3525_REV(v)               (OMAP35XX_CLASS | (0x3525 << 16) | (v << 8))
 -#define OMAP3530_REV(v)               (OMAP35XX_CLASS | (0x3530 << 16) | (v << 8))
 -#define OMAP3505_REV(v)               (OMAP35XX_CLASS | (0x3505 << 16) | (v << 8))
 -#define OMAP3517_REV(v)               (OMAP35XX_CLASS | (0x3517 << 16) | (v << 8))
 +#define OMAP3517_CLASS                0x35170034
 +#define OMAP3517_REV_ES1_0    OMAP3517_CLASS
 +#define OMAP3517_REV_ES1_1    (OMAP3517_CLASS | (0x1 << 8))
  
  #define TI816X_CLASS          0x81600034
  #define TI8168_REV_ES1_0      TI816X_CLASS
 -#define TI8168_REV_ES1_1      (TI816X_CLASS | (OMAP_REVBITS_01 << 8))
 +#define TI8168_REV_ES1_1      (TI816X_CLASS | (0x1 << 8))
  
  #define OMAP443X_CLASS                0x44300044
  #define OMAP4430_REV_ES1_0    (OMAP443X_CLASS | (0x10 << 8))
  #define OMAP446X_CLASS                0x44600044
  #define OMAP4460_REV_ES1_0    (OMAP446X_CLASS | (0x10 << 8))
  
 -/*
 - * omap_chip bits
 - *
 - * CHIP_IS_OMAP{2420,2430,3430} indicate that a particular structure is
 - * valid on all chips of that type.  CHIP_IS_OMAP3430ES{1,2} indicates
 - * something that is only valid on that particular ES revision.
 - *
 - * These bits may be ORed together to indicate structures that are
 - * available on multiple chip types.
 - *
 - * To test whether a particular structure matches the current OMAP chip type,
 - * use omap_chip_is().
 - *
 - */
 -#define CHIP_IS_OMAP2420              (1 << 0)
 -#define CHIP_IS_OMAP2430              (1 << 1)
 -#define CHIP_IS_OMAP3430              (1 << 2)
 -#define CHIP_IS_OMAP3430ES1           (1 << 3)
 -#define CHIP_IS_OMAP3430ES2           (1 << 4)
 -#define CHIP_IS_OMAP3430ES3_0         (1 << 5)
 -#define CHIP_IS_OMAP3430ES3_1         (1 << 6)
 -#define CHIP_IS_OMAP3630ES1           (1 << 7)
 -#define CHIP_IS_OMAP4430ES1           (1 << 8)
 -#define CHIP_IS_OMAP3630ES1_1           (1 << 9)
 -#define CHIP_IS_OMAP3630ES1_2           (1 << 10)
 -#define CHIP_IS_OMAP4430ES2           (1 << 11)
 -#define CHIP_IS_OMAP4430ES2_1         (1 << 12)
 -#define CHIP_IS_OMAP4430ES2_2         (1 << 13)
 -#define CHIP_IS_TI816X                        (1 << 14)
 -#define CHIP_IS_OMAP4460ES1_0         (1 << 15)
 -
 -#define CHIP_IS_OMAP24XX              (CHIP_IS_OMAP2420 | CHIP_IS_OMAP2430)
 -
 -#define CHIP_IS_OMAP4430              (CHIP_IS_OMAP4430ES1 |          \
 -                                       CHIP_IS_OMAP4430ES2 |          \
 -                                       CHIP_IS_OMAP4430ES2_1 |        \
 -                                       CHIP_IS_OMAP4430ES2_2 |        \
 -                                       CHIP_IS_OMAP4460ES1_0)
 -
 -/*
 - * "GE" here represents "greater than or equal to" in terms of ES
 - * levels.  So CHIP_GE_OMAP3430ES2 is intended to match all OMAP3430
 - * chips at ES2 and beyond, but not, for example, any OMAP lines after
 - * OMAP3.
 - */
 -#define CHIP_GE_OMAP3430ES2           (CHIP_IS_OMAP3430ES2 | \
 -                                       CHIP_IS_OMAP3430ES3_0 | \
 -                                       CHIP_GE_OMAP3430ES3_1)
 -#define CHIP_GE_OMAP3430ES3_1         (CHIP_IS_OMAP3430ES3_1 | \
 -                                       CHIP_IS_OMAP3630ES1 | \
 -                                       CHIP_GE_OMAP3630ES1_1)
 -#define CHIP_GE_OMAP3630ES1_1         (CHIP_IS_OMAP3630ES1_1 | \
 -                                       CHIP_IS_OMAP3630ES1_2)
 -
 -int omap_chip_is(struct omap_chip_id oci);
  void omap2_check_revision(void);
  
  /*
   * Runtime detection of OMAP3 features
+  *
+  * OMAP3_HAS_IO_CHAIN_CTRL: Some later members of the OMAP3 chip
+  *    family have OS-level control over the I/O chain clock.  This is
+  *    to avoid a window during which wakeups could potentially be lost
+  *    during powerdomain transitions.  If this bit is set, it
+  *    indicates that the chip does support OS-level control of this
+  *    feature.
   */
  extern u32 omap_features;
  
  #define OMAP3_HAS_192MHZ_CLK          BIT(5)
  #define OMAP3_HAS_IO_WAKEUP           BIT(6)
  #define OMAP3_HAS_SDRC                        BIT(7)
- #define OMAP4_HAS_MPU_1GHZ            BIT(8)
- #define OMAP4_HAS_MPU_1_2GHZ          BIT(9)
- #define OMAP4_HAS_MPU_1_5GHZ          BIT(10)
+ #define OMAP3_HAS_IO_CHAIN_CTRL               BIT(8)
+ #define OMAP4_HAS_MPU_1GHZ            BIT(9)
+ #define OMAP4_HAS_MPU_1_2GHZ          BIT(10)
+ #define OMAP4_HAS_MPU_1_5GHZ          BIT(11)
  
  
  #define OMAP3_HAS_FEATURE(feat,flag)                  \
@@@ -429,12 -515,11 +437,11 @@@ OMAP3_HAS_FEATURE(isp, ISP
  OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK)
  OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP)
  OMAP3_HAS_FEATURE(sdrc, SDRC)
+ OMAP3_HAS_FEATURE(io_chain_ctrl, IO_CHAIN_CTRL)
  
  /*
   * Runtime detection of OMAP4 features
   */
- extern u32 omap_features;
  #define OMAP4_HAS_FEATURE(feat, flag)                 \
  static inline unsigned int omap4_has_ ##feat(void)    \
  {                                                     \