.init_irq       = omap2_init_irq,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = omap_2430sdp_init,
+       .init_late      = omap2430_init_late,
        .timer          = &omap2_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_3430sdp_init,
+       .init_late      = omap3430_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_sdp_init,
+       .init_late      = omap3630_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = gic_init_irq,
        .handle_irq     = gic_handle_irq,
        .init_machine   = omap_4430sdp_init,
+       .init_late      = omap4430_init_late,
        .timer          = &omap4_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = am3517_crane_init,
+       .init_late      = am35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = am3517_evm_init,
+       .init_late      = am35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap2_init_irq,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = omap_apollon_init,
+       .init_late      = omap2420_init_late,
        .timer          = &omap2_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = cm_t35_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = cm_t3730_init,
+       .init_late     = omap3630_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = cm_t3517_init,
+       .init_late      = am35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = devkit8000_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_secure_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap_init_irq,
        .handle_irq     = gic_handle_irq,
        .init_machine   = omap4_init,
+       .init_late      = omap4430_init_late,
        .timer          = &omap4_timer,
        .dt_compat      = omap4_boards_compat,
        .restart        = omap_prcm_restart,
 
        .init_irq       = omap2_init_irq,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = omap_h4_init,
+       .init_late      = omap2420_init_late,
        .timer          = &omap2_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = igep_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = igep_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_ldp_init,
+       .init_late      = omap3430_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap2_init_irq,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = n8x0_init_machine,
+       .init_late      = omap2420_init_late,
        .timer          = &omap2_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap2_init_irq,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = n8x0_init_machine,
+       .init_late      = omap2420_init_late,
        .timer          = &omap2_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap2_init_irq,
        .handle_irq     = omap2_intc_handle_irq,
        .init_machine   = n8x0_init_machine,
+       .init_late      = omap2420_init_late,
        .timer          = &omap2_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap3_beagle_init,
+       .init_late      = omap3_init_late,
        .timer          = &omap3_secure_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap3_evm_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap3logic_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap3logic_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap3pandora_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq               = omap3_init_irq,
        .handle_irq             = omap3_intc_handle_irq,
        .init_machine           = omap3_stalker_init,
+       .init_late              = omap35xx_init_late,
        .timer                  = &omap3_secure_timer,
        .restart                = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap3_touchbook_init,
+       .init_late      = omap3430_init_late,
        .timer          = &omap3_secure_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = gic_init_irq,
        .handle_irq     = gic_handle_irq,
        .init_machine   = omap4_panda_init,
+       .init_late      = omap4430_init_late,
        .timer          = &omap4_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = overo_init,
+       .init_late      = omap35xx_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = rm680_init,
+       .init_late      = omap3630_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = rm680_init,
+       .init_late      = omap3630_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = rx51_init,
+       .init_late      = omap3430_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = ti81xx_init_irq,
        .timer          = &omap3_timer,
        .init_machine   = ti81xx_evm_init,
+       .init_late      = ti81xx_init_late,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = ti81xx_init_irq,
        .timer          = &omap3_timer,
        .init_machine   = ti81xx_evm_init,
+       .init_late      = ti81xx_init_late,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_zoom_init,
+       .init_late      = omap3430_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
        .init_irq       = omap3_init_irq,
        .handle_irq     = omap3_intc_handle_irq,
        .init_machine   = omap_zoom_init,
+       .init_late      = omap3630_init_late,
        .timer          = &omap3_timer,
        .restart        = omap_prcm_restart,
 MACHINE_END
 
 }
 #endif
 
+#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP2)
+int omap2_pm_init(void);
+#else
+static inline int omap2_pm_init(void)
+{
+       return 0;
+}
+#endif
+
+#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3)
+int omap3_pm_init(void);
+#else
+static inline int omap3_pm_init(void)
+{
+       return 0;
+}
+#endif
+
+#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4)
+int omap4_pm_init(void);
+#else
+static inline int omap4_pm_init(void)
+{
+       return 0;
+}
+#endif
+
+#ifdef CONFIG_OMAP_MUX
+int omap_mux_late_init(void);
+#else
+static inline int omap_mux_late_init(void)
+{
+       return 0;
+}
+#endif
+
 extern void omap2_init_common_infrastructure(void);
 
 extern struct sys_timer omap2_timer;
 void am35xx_init_early(void);
 void ti81xx_init_early(void);
 void omap4430_init_early(void);
+void omap3_init_late(void);    /* Do not use this one */
+void omap4430_init_late(void);
+void omap2420_init_late(void);
+void omap2430_init_late(void);
+void omap3430_init_late(void);
+void omap35xx_init_late(void);
+void omap3630_init_late(void);
+void am35xx_init_late(void);
+void ti81xx_init_late(void);
+void omap4430_init_late(void);
+int omap2_common_pm_late_init(void);
 void omap_prcm_restart(char, const char *);
 
 /*
 
        omap_hwmod_init_postsetup();
        omap2420_clk_init();
 }
+
+void __init omap2420_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap2_pm_init();
+}
 #endif
 
 #ifdef CONFIG_SOC_OMAP2430
        omap_hwmod_init_postsetup();
        omap2430_clk_init();
 }
+
+void __init omap2430_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap2_pm_init();
+}
 #endif
 
 /*
        omap_hwmod_init_postsetup();
        omap3xxx_clk_init();
 }
+
+void __init omap3_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap3_pm_init();
+}
+
+void __init omap3430_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap3_pm_init();
+}
+
+void __init omap35xx_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap3_pm_init();
+}
+
+void __init omap3630_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap3_pm_init();
+}
+
+void __init am35xx_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap3_pm_init();
+}
+
+void __init ti81xx_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap3_pm_init();
+}
 #endif
 
 #ifdef CONFIG_ARCH_OMAP4
        omap_hwmod_init_postsetup();
        omap4xxx_clk_init();
 }
+
+void __init omap4430_init_late(void)
+{
+       omap_mux_late_init();
+       omap2_common_pm_late_init();
+       omap4_pm_init();
+}
 #endif
 
 void __init omap_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
 
 }
 
 /* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
-static int __init omap_mux_late_init(void)
+int __init omap_mux_late_init(void)
 {
        struct omap_mux_partition *partition;
        int ret;
 
        return 0;
 }
-late_initcall(omap_mux_late_init);
 
 static void __init omap_mux_package_fixup(struct omap_mux *p,
                                        struct omap_mux *superset)
 
 }
 postcore_initcall(omap2_common_pm_init);
 
-static int __init omap2_common_pm_late_init(void)
+int __init omap2_common_pm_late_init(void)
 {
        /*
         * In the case of DT, the PMIC and SR initialization will be done using
 
        return 0;
 }
-late_initcall(omap2_common_pm_late_init);
 
                                WKUP_MOD, PM_WKEN);
 }
 
-static int __init omap2_pm_init(void)
+int __init omap2_pm_init(void)
 {
        u32 l;
 
-       if (!cpu_is_omap24xx())
-               return -ENODEV;
-
        printk(KERN_INFO "Power Management for OMAP2 initializing\n");
        l = omap2_prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET);
        printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
         * These routines need to be in SRAM as that's the only
         * memory the MPU can see when it wakes up.
         */
-       if (cpu_is_omap24xx()) {
-               omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
-                                                omap24xx_idle_loop_suspend_sz);
+       omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
+                                        omap24xx_idle_loop_suspend_sz);
 
-               omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
-                                                   omap24xx_cpu_suspend_sz);
-       }
+       omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
+                                           omap24xx_cpu_suspend_sz);
 
        arm_pm_idle = omap2_pm_idle;
 
        return 0;
 }
-
-late_initcall(omap2_pm_init);
 
        }
 }
 
-static int __init omap3_pm_init(void)
+int __init omap3_pm_init(void)
 {
        struct power_state *pwrst, *tmp;
        struct clockdomain *neon_clkdm, *per_clkdm, *mpu_clkdm, *core_clkdm;
        int ret;
 
-       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");
 
 err1:
        return ret;
 }
-
-late_initcall(omap3_pm_init);
 
  * Initializes all powerdomain and clockdomain target states
  * and all PRCM settings.
  */
-static int __init omap4_pm_init(void)
+int __init omap4_pm_init(void)
 {
        int ret;
        struct clockdomain *emif_clkdm, *mpuss_clkdm, *l3_1_clkdm, *l4wkup;
        struct clockdomain *ducati_clkdm, *l3_2_clkdm, *l4_per_clkdm;
 
-       if (!cpu_is_omap44xx())
-               return -ENODEV;
-
        if (omap_rev() == OMAP4430_REV_ES1_0) {
                WARN(1, "Power Management not supported on OMAP4430 ES1.0\n");
                return -ENODEV;
 err2:
        return ret;
 }
-late_initcall(omap4_pm_init);