@@ -62,6 +62,12 @@
static int (*omap_clk_soc_init)(void);
/*
+ * prcm_data_init: points to a function that does the SoC-specific
+ * PRCM data (pwrdm/clkdm/hwmod) initializations
+ */
+static void (*prcm_data_init)(void);
+
+/*
* The machine specific code may provide the extra mapping besides the
* default mapping provided here.
*/
@@ -375,19 +381,24 @@ static void __init __maybe_unused omap_common_late_init(void)
}
#ifdef CONFIG_SOC_OMAP2420
-void __init omap2420_init_early(void)
+static void __init omap2420_prcm_data_init(void)
{
- omap2_set_globals_tap(OMAP242X_CLASS, OMAP2_L4_IO_ADDRESS(0x48014000));
- omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE),
- OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE));
- omap2_control_base_init();
- omap2xxx_check_revision();
omap2_prcm_base_init();
omap2xxx_voltagedomains_init();
omap242x_powerdomains_init();
omap242x_clockdomains_init();
omap2420_hwmod_init();
omap_hwmod_init_postsetup();
+}
+
+void __init omap2420_init_early(void)
+{
+ omap2_set_globals_tap(OMAP242X_CLASS, OMAP2_L4_IO_ADDRESS(0x48014000));
+ omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE),
+ OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE));
+ omap2_control_base_init();
+ omap2xxx_check_revision();
+ prcm_data_init = omap2420_prcm_data_init;
omap_clk_soc_init = omap2420_dt_clk_init;
rate_table = omap2420_rate_table;
}
@@ -401,19 +412,24 @@ void __init omap2420_init_late(void)
#endif
#ifdef CONFIG_SOC_OMAP2430
-void __init omap2430_init_early(void)
+static void __init omap2430_prcm_data_init(void)
{
- omap2_set_globals_tap(OMAP243X_CLASS, OMAP2_L4_IO_ADDRESS(0x4900a000));
- omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE),
- OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE));
- omap2_control_base_init();
- omap2xxx_check_revision();
omap2_prcm_base_init();
omap2xxx_voltagedomains_init();
omap243x_powerdomains_init();
omap243x_clockdomains_init();
omap2430_hwmod_init();
omap_hwmod_init_postsetup();
+}
+
+void __init omap2430_init_early(void)
+{
+ omap2_set_globals_tap(OMAP243X_CLASS, OMAP2_L4_IO_ADDRESS(0x4900a000));
+ omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE),
+ OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE));
+ omap2_control_base_init();
+ omap2xxx_check_revision();
+ prcm_data_init = omap2430_prcm_data_init;
omap_clk_soc_init = omap2430_dt_clk_init;
rate_table = omap2430_rate_table;
}
@@ -431,22 +447,8 @@ void __init omap2430_init_late(void)
* same machine_id for 34xx and 36xx beagle.. Will get fixed with DT.
*/
#ifdef CONFIG_ARCH_OMAP3
-void __init omap3_init_early(void)
+static void __init omap3_prcm_data_init(void)
{
- omap2_set_globals_tap(OMAP343X_CLASS, OMAP2_L4_IO_ADDRESS(0x4830A000));
- omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE),
- OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE));
- /* XXX: remove these once OMAP3 is DT only */
- if (!of_have_populated_dt()) {
- omap2_set_globals_control(
- OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE));
- omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE));
- omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE),
- NULL);
- }
- omap2_control_base_init();
- omap3xxx_check_revision();
- omap3xxx_check_features();
omap2_prcm_base_init();
/* XXX: remove these once OMAP3 is DT only */
if (!of_have_populated_dt()) {
@@ -471,6 +473,25 @@ void __init omap3_init_early(void)
}
}
+void __init omap3_init_early(void)
+{
+ omap2_set_globals_tap(OMAP343X_CLASS, OMAP2_L4_IO_ADDRESS(0x4830A000));
+ omap2_set_globals_sdrc(OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE),
+ OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE));
+ /* XXX: remove these once OMAP3 is DT only */
+ if (!of_have_populated_dt()) {
+ omap2_set_globals_control(
+ OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE));
+ omap2_set_globals_prm(OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE));
+ omap2_set_globals_cm(OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE),
+ NULL);
+ }
+ omap2_control_base_init();
+ omap3xxx_check_revision();
+ omap3xxx_check_features();
+ prcm_data_init = omap3_prcm_data_init;
+}
+
void __init omap3430_init_early(void)
{
omap3_init_early();
@@ -542,13 +563,8 @@ void __init ti81xx_init_late(void)
#endif
#ifdef CONFIG_SOC_TI81XX
-void __init ti814x_init_early(void)
+void __init ti81xx_prcm_data_init(void)
{
- omap2_set_globals_tap(TI814X_CLASS,
- OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE));
- omap2_control_base_init();
- omap3xxx_check_revision();
- ti81xx_check_features();
omap2_prcm_base_init();
omap3xxx_voltagedomains_init();
omap3xxx_powerdomains_init();
@@ -559,6 +575,16 @@ void __init ti814x_init_early(void)
omap_clk_soc_init = ti81xx_dt_clk_init;
}
+void __init ti814x_init_early(void)
+{
+ omap2_set_globals_tap(TI814X_CLASS,
+ OMAP2_L4_IO_ADDRESS(TI81XX_TAP_BASE));
+ omap2_control_base_init();
+ omap3xxx_check_revision();
+ ti81xx_check_features();
+ prcm_data_init = ti81xx_prcm_data_init;
+}
+
void __init ti816x_init_early(void)
{
omap2_set_globals_tap(TI816X_CLASS,
@@ -566,18 +592,20 @@ void __init ti816x_init_early(void)
omap2_control_base_init();
omap3xxx_check_revision();
ti81xx_check_features();
- omap2_prcm_base_init();
- omap3xxx_voltagedomains_init();
- omap3xxx_powerdomains_init();
- ti81xx_clockdomains_init();
- ti81xx_hwmod_init();
- omap_hwmod_init_postsetup();
- if (of_have_populated_dt())
- omap_clk_soc_init = ti81xx_dt_clk_init;
+ prcm_data_init = ti81xx_prcm_data_init;
}
#endif
#ifdef CONFIG_SOC_AM33XX
+void __init am33xx_prcm_data_init(void)
+{
+ omap2_prcm_base_init();
+ am33xx_powerdomains_init();
+ am33xx_clockdomains_init();
+ am33xx_hwmod_init();
+ omap_hwmod_init_postsetup();
+}
+
void __init am33xx_init_early(void)
{
omap2_set_globals_tap(AM335X_CLASS,
@@ -585,11 +613,7 @@ void __init am33xx_init_early(void)
omap2_control_base_init();
omap3xxx_check_revision();
am33xx_check_features();
- omap2_prcm_base_init();
- am33xx_powerdomains_init();
- am33xx_clockdomains_init();
- am33xx_hwmod_init();
- omap_hwmod_init_postsetup();
+ prcm_data_init = am33xx_prcm_data_init;
omap_clk_soc_init = am33xx_dt_clk_init;
}
@@ -600,6 +624,15 @@ void __init am33xx_init_late(void)
#endif
#ifdef CONFIG_SOC_AM43XX
+void __init am43xx_prcm_data_init(void)
+{
+ omap2_prcm_base_init();
+ am43xx_powerdomains_init();
+ am43xx_clockdomains_init();
+ am43xx_hwmod_init();
+ omap_hwmod_init_postsetup();
+}
+
void __init am43xx_init_early(void)
{
omap2_set_globals_tap(AM335X_CLASS,
@@ -607,12 +640,8 @@ void __init am43xx_init_early(void)
omap2_control_base_init();
omap3xxx_check_revision();
am33xx_check_features();
- omap2_prcm_base_init();
- am43xx_powerdomains_init();
- am43xx_clockdomains_init();
- am43xx_hwmod_init();
- omap_hwmod_init_postsetup();
omap_l2_cache_init();
+ prcm_data_init = am43xx_prcm_data_init;
omap_clk_soc_init = am43xx_dt_clk_init;
}
@@ -623,13 +652,8 @@ void __init am43xx_init_late(void)
#endif
#ifdef CONFIG_ARCH_OMAP4
-void __init omap4430_init_early(void)
+void __init omap4430_prcm_data_init(void)
{
- omap2_set_globals_tap(OMAP443X_CLASS,
- OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE));
- omap2_control_base_init();
- omap4xxx_check_revision();
- omap4xxx_check_features();
omap2_prcm_base_init();
omap4_pm_init_early();
omap44xx_voltagedomains_init();
@@ -637,7 +661,17 @@ void __init omap4430_init_early(void)
omap44xx_clockdomains_init();
omap44xx_hwmod_init();
omap_hwmod_init_postsetup();
+}
+
+void __init omap4430_init_early(void)
+{
+ omap2_set_globals_tap(OMAP443X_CLASS,
+ OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE));
+ omap2_control_base_init();
+ omap4xxx_check_revision();
+ omap4xxx_check_features();
omap_l2_cache_init();
+ prcm_data_init = omap4430_prcm_data_init;
omap_clk_soc_init = omap4xxx_dt_clk_init;
}
@@ -650,11 +684,8 @@ void __init omap4430_init_late(void)
#endif
#ifdef CONFIG_SOC_OMAP5
-void __init omap5_init_early(void)
+void __init omap5_prcm_data_init(void)
{
- omap2_set_globals_tap(OMAP54XX_CLASS,
- OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE));
- omap2_control_base_init();
omap4_pm_init_early();
omap2_prcm_base_init();
omap5xxx_check_revision();
@@ -663,6 +694,15 @@ void __init omap5_init_early(void)
omap54xx_clockdomains_init();
omap54xx_hwmod_init();
omap_hwmod_init_postsetup();
+}
+
+void __init omap5_init_early(void)
+{
+ omap2_set_globals_tap(OMAP54XX_CLASS,
+ OMAP2_L4_IO_ADDRESS(OMAP54XX_SCM_BASE));
+ omap2_control_base_init();
+ omap5xxx_check_revision();
+ prcm_data_init = omap5_prcm_data_init;
omap_clk_soc_init = omap5xxx_dt_clk_init;
}
@@ -675,17 +715,22 @@ void __init omap5_init_late(void)
#endif
#ifdef CONFIG_SOC_DRA7XX
-void __init dra7xx_init_early(void)
+void __init dra7xx_prcm_data_init(void)
{
- omap2_set_globals_tap(-1, OMAP2_L4_IO_ADDRESS(DRA7XX_TAP_BASE));
- omap2_control_base_init();
omap4_pm_init_early();
omap2_prcm_base_init();
- dra7xxx_check_revision();
dra7xx_powerdomains_init();
dra7xx_clockdomains_init();
dra7xx_hwmod_init();
omap_hwmod_init_postsetup();
+}
+
+void __init dra7xx_init_early(void)
+{
+ omap2_set_globals_tap(-1, OMAP2_L4_IO_ADDRESS(DRA7XX_TAP_BASE));
+ omap2_control_base_init();
+ dra7xxx_check_revision();
+ prcm_data_init = dra7xx_prcm_data_init;
omap_clk_soc_init = dra7xx_dt_clk_init;
}
@@ -713,6 +758,11 @@ int __init omap_clk_init(void)
{
int ret = 0;
+ if (!prcm_data_init)
+ return 0;
+
+ prcm_data_init();
+
if (!omap_clk_soc_init)
return 0;
@@ -137,7 +137,6 @@
#include <linux/mutex.h>
#include <linux/spinlock.h>
#include <linux/slab.h>
-#include <linux/bootmem.h>
#include <linux/cpu.h>
#include <linux/of.h>
#include <linux/of_address.h>
@@ -2738,7 +2737,7 @@ static int __init _alloc_links(struct omap_hwmod_link **ml,
sz = sizeof(struct omap_hwmod_link) * LINKS_PER_OCP_IF;
*sl = NULL;
- *ml = memblock_virt_alloc(sz, 0);
+ *ml = kmalloc(sz, GFP_KERNEL);
*sl = (void *)(*ml) + sizeof(struct omap_hwmod_link);
@@ -2855,7 +2854,7 @@ static int __init _alloc_linkspace(struct omap_hwmod_ocp_if **ois)
pr_debug("omap_hwmod: %s: allocating %d byte linkspace (%d links)\n",
__func__, sz, max_ls);
- linkspace = memblock_virt_alloc(sz, 0);
+ linkspace = kmalloc(sz, GFP_KERNEL);
return 0;
}
@@ -22,7 +22,6 @@
#include <linux/of_address.h>
#include <linux/list.h>
#include <linux/regmap.h>
-#include <linux/bootmem.h>
#include "clock.h"
@@ -247,7 +246,7 @@ void __init omap2_clk_legacy_provider_init(int index, void __iomem *mem)
{
struct clk_iomap *io;
- io = memblock_virt_alloc(sizeof(*io), 0);
+ io = kzalloc(sizeof(*io), GFP_KERNEL);
io->mem = mem;
This avoids the need to use memblock_virt_alloc in the code. Done in preparation of adding generic PM domains to OMAP platform codebase; generic PM domain registration doesn't work during early_init. Signed-off-by: Tero Kristo <t-kristo@ti.com> --- arch/arm/mach-omap2/io.c | 180 ++++++++++++++++++++++++-------------- arch/arm/mach-omap2/omap_hwmod.c | 5 +- drivers/clk/ti/clk.c | 3 +- 3 files changed, 118 insertions(+), 70 deletions(-)