Commit 63a293e0 authored by Paul Walmsley's avatar Paul Walmsley

ARM: OMAP2+: PRM: initialize some PRM functions early

Some PRM functions will need to be called by the hwmod code early in
kernel init.  To handle this, split the PRM initialization code into
early and late phases.  The early init is handled via mach-omap2/io.c,
while the late init is handled by subsys_initcall().
Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
parent 558a0780
...@@ -51,6 +51,10 @@ ...@@ -51,6 +51,10 @@
#include "prcm_mpu44xx.h" #include "prcm_mpu44xx.h"
#include "prminst44xx.h" #include "prminst44xx.h"
#include "cminst44xx.h" #include "cminst44xx.h"
#include "prm2xxx.h"
#include "prm3xxx.h"
#include "prm44xx.h"
/* /*
* The machine specific code may provide the extra mapping besides the * The machine specific code may provide the extra mapping besides the
* default mapping provided here. * default mapping provided here.
...@@ -392,6 +396,7 @@ void __init omap2420_init_early(void) ...@@ -392,6 +396,7 @@ void __init omap2420_init_early(void)
omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE)); omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE));
omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), NULL); omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE), NULL);
omap2xxx_check_revision(); omap2xxx_check_revision();
omap2xxx_prm_init();
omap2xxx_cm_init(); omap2xxx_cm_init();
omap_common_init_early(); omap_common_init_early();
omap2xxx_voltagedomains_init(); omap2xxx_voltagedomains_init();
...@@ -422,6 +427,7 @@ void __init omap2430_init_early(void) ...@@ -422,6 +427,7 @@ void __init omap2430_init_early(void)
omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE)); omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE));
omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), NULL); omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE), NULL);
omap2xxx_check_revision(); omap2xxx_check_revision();
omap2xxx_prm_init();
omap2xxx_cm_init(); omap2xxx_cm_init();
omap_common_init_early(); omap_common_init_early();
omap2xxx_voltagedomains_init(); omap2xxx_voltagedomains_init();
...@@ -457,6 +463,7 @@ void __init omap3_init_early(void) ...@@ -457,6 +463,7 @@ void __init omap3_init_early(void)
omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), NULL); omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE), NULL);
omap3xxx_check_revision(); omap3xxx_check_revision();
omap3xxx_check_features(); omap3xxx_check_features();
omap3xxx_prm_init();
omap3xxx_cm_init(); omap3xxx_cm_init();
omap_common_init_early(); omap_common_init_early();
omap3xxx_voltagedomains_init(); omap3xxx_voltagedomains_init();
...@@ -591,6 +598,7 @@ void __init omap4430_init_early(void) ...@@ -591,6 +598,7 @@ void __init omap4430_init_early(void)
omap_cm_base_init(); omap_cm_base_init();
omap4xxx_check_revision(); omap4xxx_check_revision();
omap4xxx_check_features(); omap4xxx_check_features();
omap44xx_prm_init();
omap_common_init_early(); omap_common_init_early();
omap44xx_voltagedomains_init(); omap44xx_voltagedomains_init();
omap44xx_powerdomains_init(); omap44xx_powerdomains_init();
......
...@@ -118,14 +118,13 @@ static struct prm_ll_data omap2xxx_prm_ll_data = { ...@@ -118,14 +118,13 @@ static struct prm_ll_data omap2xxx_prm_ll_data = {
.read_reset_sources = &omap2xxx_prm_read_reset_sources, .read_reset_sources = &omap2xxx_prm_read_reset_sources,
}; };
static int __init omap2xxx_prm_init(void) int __init omap2xxx_prm_init(void)
{ {
if (!cpu_is_omap24xx()) if (!cpu_is_omap24xx())
return 0; return 0;
return prm_register(&omap2xxx_prm_ll_data); return prm_register(&omap2xxx_prm_ll_data);
} }
subsys_initcall(omap2xxx_prm_init);
static void __exit omap2xxx_prm_exit(void) static void __exit omap2xxx_prm_exit(void)
{ {
......
...@@ -126,8 +126,7 @@ extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm); ...@@ -126,8 +126,7 @@ extern int omap2xxx_clkdm_wakeup(struct clockdomain *clkdm);
extern void omap2xxx_prm_dpll_reset(void); extern void omap2xxx_prm_dpll_reset(void);
extern int __init prm2xxx_init(void); extern int __init omap2xxx_prm_init(void);
extern int __exit prm2xxx_exit(void);
#endif #endif
......
...@@ -383,27 +383,30 @@ static struct prm_ll_data omap3xxx_prm_ll_data = { ...@@ -383,27 +383,30 @@ static struct prm_ll_data omap3xxx_prm_ll_data = {
.read_reset_sources = &omap3xxx_prm_read_reset_sources, .read_reset_sources = &omap3xxx_prm_read_reset_sources,
}; };
static int __init omap3xxx_prm_init(void) int __init omap3xxx_prm_init(void)
{
if (!cpu_is_omap34xx())
return 0;
return prm_register(&omap3xxx_prm_ll_data);
}
static int __init omap3xxx_prm_late_init(void)
{ {
int ret; int ret;
if (!cpu_is_omap34xx()) if (!cpu_is_omap34xx())
return 0; return 0;
ret = prm_register(&omap3xxx_prm_ll_data);
if (ret)
return ret;
omap3xxx_prm_enable_io_wakeup(); omap3xxx_prm_enable_io_wakeup();
ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup); ret = omap_prcm_register_chain_handler(&omap3_prcm_irq_setup);
if (!ret) if (!ret)
irq_set_status_flags(omap_prcm_event_to_irq("io"), irq_set_status_flags(omap_prcm_event_to_irq("io"),
IRQ_NOAUTOEN); IRQ_NOAUTOEN);
return ret; return ret;
} }
subsys_initcall(omap3xxx_prm_init); subsys_initcall(omap3xxx_prm_late_init);
static void __exit omap3xxx_prm_exit(void) static void __exit omap3xxx_prm_exit(void)
{ {
......
...@@ -154,6 +154,7 @@ extern void omap3xxx_prm_restore_irqen(u32 *saved_mask); ...@@ -154,6 +154,7 @@ extern void omap3xxx_prm_restore_irqen(u32 *saved_mask);
extern void omap3xxx_prm_dpll3_reset(void); extern void omap3xxx_prm_dpll3_reset(void);
extern int __init omap3xxx_prm_init(void);
extern u32 omap3xxx_prm_get_reset_sources(void); extern u32 omap3xxx_prm_get_reset_sources(void);
#endif /* __ASSEMBLER */ #endif /* __ASSEMBLER */
......
...@@ -615,22 +615,24 @@ static struct prm_ll_data omap44xx_prm_ll_data = { ...@@ -615,22 +615,24 @@ static struct prm_ll_data omap44xx_prm_ll_data = {
.read_reset_sources = &omap44xx_prm_read_reset_sources, .read_reset_sources = &omap44xx_prm_read_reset_sources,
}; };
static int __init omap44xx_prm_init(void) int __init omap44xx_prm_init(void)
{ {
int ret;
if (!cpu_is_omap44xx()) if (!cpu_is_omap44xx())
return 0; return 0;
ret = prm_register(&omap44xx_prm_ll_data); return prm_register(&omap44xx_prm_ll_data);
if (ret) }
return ret;
static int __init omap44xx_prm_late_init(void)
{
if (!cpu_is_omap44xx())
return 0;
omap44xx_prm_enable_io_wakeup(); omap44xx_prm_enable_io_wakeup();
return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup); return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup);
} }
subsys_initcall(omap44xx_prm_init); subsys_initcall(omap44xx_prm_late_init);
static void __exit omap44xx_prm_exit(void) static void __exit omap44xx_prm_exit(void)
{ {
......
...@@ -771,6 +771,7 @@ extern void omap44xx_prm_ocp_barrier(void); ...@@ -771,6 +771,7 @@ extern void omap44xx_prm_ocp_barrier(void);
extern void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask); extern void omap44xx_prm_save_and_clear_irqen(u32 *saved_mask);
extern void omap44xx_prm_restore_irqen(u32 *saved_mask); extern void omap44xx_prm_restore_irqen(u32 *saved_mask);
extern int __init omap44xx_prm_init(void);
extern u32 omap44xx_prm_get_reset_sources(void); extern u32 omap44xx_prm_get_reset_sources(void);
# endif # endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment