From: Paul Walmsley Date: Wed, 7 Jan 2009 15:23:45 +0000 (+0200) Subject: OMAP clock: add OMAP chip family-specific clk_register() option X-Git-Tag: v2.6.28-omap1~30 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=12081fce83c10221ccd1b282e3e2fbe56f742e21;p=linux-2.6-omap-h63xx.git OMAP clock: add OMAP chip family-specific clk_register() option Provide a mechanism for OMAP chip family (e.g., OMAP1, 2, 3) clock code to define a clk_register function via struct clk_functions. This is currently only used for OMAP2/3, to handle clock->clockdomain registration. Signed-off-by: Paul Walmsley Signed-off-by: Tony Lindgren --- diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c index 0946a5a956c..5f54e7eabe2 100644 --- a/arch/arm/mach-omap2/clock.c +++ b/arch/arm/mach-omap2/clock.c @@ -1085,3 +1085,9 @@ void omap2_clk_disable_unused(struct clk *clk) _omap2_clk_disable(clk); } #endif + +int omap2_clk_register(struct clk *clk) +{ + omap2_init_clk_clkdm(clk); + return 0; +} diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index a026ec9923c..f4d489f4cd1 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h @@ -37,6 +37,7 @@ #define OMAP3XXX_EN_DPLL_LOCKED 0x7 int omap2_clk_init(void); +int omap2_clk_register(struct clk *clk); int omap2_clk_enable(struct clk *clk); void omap2_clk_disable(struct clk *clk); long omap2_clk_round_rate(struct clk *clk, unsigned long rate); diff --git a/arch/arm/mach-omap2/clock24xx.c b/arch/arm/mach-omap2/clock24xx.c index 67974d61d4b..9e311aa0cb5 100644 --- a/arch/arm/mach-omap2/clock24xx.c +++ b/arch/arm/mach-omap2/clock24xx.c @@ -450,6 +450,7 @@ void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) #endif static struct clk_functions omap2_clk_functions = { + .clk_register = omap2_clk_register, .clk_enable = omap2_clk_enable, .clk_disable = omap2_clk_disable, .clk_round_rate = omap2_clk_round_rate, @@ -578,13 +579,11 @@ int __init omap2_clk_init(void) if ((*clkp)->flags & CLOCK_IN_OMAP242X && cpu_is_omap2420()) { clk_register(*clkp); - omap2_init_clk_clkdm(*clkp); continue; } if ((*clkp)->flags & CLOCK_IN_OMAP243X && cpu_is_omap2430()) { clk_register(*clkp); - omap2_init_clk_clkdm(*clkp); continue; } } diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c index 917664df1ac..824144e313d 100644 --- a/arch/arm/mach-omap2/clock34xx.c +++ b/arch/arm/mach-omap2/clock34xx.c @@ -633,6 +633,7 @@ static void omap3_clkoutx2_recalc(struct clk *clk, unsigned long parent_rate, #if defined(CONFIG_ARCH_OMAP3) static struct clk_functions omap2_clk_functions = { + .clk_register = omap2_clk_register, .clk_enable = omap2_clk_enable, .clk_disable = omap2_clk_disable, .clk_round_rate = omap2_clk_round_rate, @@ -729,10 +730,8 @@ int __init omap2_clk_init(void) for (clkp = onchip_34xx_clks; clkp < onchip_34xx_clks + ARRAY_SIZE(onchip_34xx_clks); clkp++) { - if ((*clkp)->flags & cpu_clkflg) { + if ((*clkp)->flags & cpu_clkflg) clk_register(*clkp); - omap2_init_clk_clkdm(*clkp); - } } /* REVISIT: Not yet ready for OMAP3 */ diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 8d43d78f012..bdf2cd444da 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c @@ -439,10 +439,17 @@ void recalculate_root_clocks(void) int clk_register(struct clk *clk) { + int ret; + if (clk == NULL || IS_ERR(clk)) return -EINVAL; mutex_lock(&clocks_mutex); + if (arch_clock->clk_register) { + ret = arch_clock->clk_register(clk); + if (ret) + goto cr_out; + } list_add(&clk->node, &clocks); if (!clk->children.next) INIT_LIST_HEAD(&clk->children); @@ -450,9 +457,11 @@ int clk_register(struct clk *clk) omap_clk_add_child(clk->parent, clk); if (clk->init) clk->init(clk); + ret = 0; +cr_out: mutex_unlock(&clocks_mutex); - return 0; + return ret; } EXPORT_SYMBOL(clk_register); diff --git a/arch/arm/plat-omap/include/mach/clock.h b/arch/arm/plat-omap/include/mach/clock.h index 2a30268fe97..db57b71a67b 100644 --- a/arch/arm/plat-omap/include/mach/clock.h +++ b/arch/arm/plat-omap/include/mach/clock.h @@ -117,6 +117,7 @@ struct clk { struct cpufreq_frequency_table; struct clk_functions { + int (*clk_register)(struct clk *clk); int (*clk_enable)(struct clk *clk); void (*clk_disable)(struct clk *clk); long (*clk_round_rate)(struct clk *clk, unsigned long rate);