OMAP2xxx clock: pre-initialize struct clks early

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Saturday, May 2, 2009 - 5:03 pm

Gitweb:     http://git.kernel.org/linus/c8088112fd96ad8b0f0bcd2f168fe6a17bf3cb41
Commit:     c8088112fd96ad8b0f0bcd2f168fe6a17bf3cb41
Parent:     577c9c456f0e1371cbade38eaf91ae8e8a308555
Author:     Paul Walmsley <paul@pwsan.com>
AuthorDate: Wed Apr 22 19:48:53 2009 -0600
Committer:  paul <paul@twilight.(none)>
CommitDate: Wed Apr 22 19:48:53 2009 -0600

    OMAP2xxx clock: pre-initialize struct clks early
    
    Commit 3f0a820c4c0b4670fb5f164baa5582e23c2ef118 breaks OMAP2xxx boot
    during initial propagate_rate() on osc_ck and sys_ck.  Fix by
    pre-initializing all struct clks before running any other clock init
    code.  Incorporates review comments from Russell King
    <rmk+kernel@arm.linux.org.uk>.
    
    Resolves
    
    <1>Unable to handle kernel NULL pointer dereference at virtual address 00000000
    <1>pgd = c0004000
    <1>[00000000] *pgd=00000000
    Internal error: Oops: 5 [#1]
    Modules linked in:
    CPU: 0    Not tainted  (2.6.29-omap1 #37)
    PC is at propagate_rate+0x10/0x60
    LR is at omap2_clk_init+0x30/0x218
    ...
    
    Signed-off-by: Paul Walmsley <paul@pwsan.com>
    Tested-by: Jarkko Nikula <jarkko.nikula@nokia.com>
    Cc: Russell King <rmk+kernel@arm.linux.org.uk>
---
 arch/arm/mach-omap2/clock24xx.c |    6 +++---
 arch/arm/plat-omap/clock.c      |    7 +++++++
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/arch/arm/mach-omap2/clock24xx.c b/arch/arm/mach-omap2/clock24xx.c
index 1e839c5..984fb86 100644
--- a/arch/arm/mach-omap2/clock24xx.c
+++ b/arch/arm/mach-omap2/clock24xx.c
@@ -720,14 +720,14 @@ int __init omap2_clk_init(void)
 
 	clk_init(&omap2_clk_functions);
 
+	for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
+		clk_init_one(c->lk.clk);
+
 	osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
 	propagate_rate(&osc_ck);
 	sys_ck.rate = omap2_sys_clk_recalc(&sys_ck);
 	propagate_rate(&sys_ck);
 
-	for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
-		clk_init_one(c->lk.clk);
-
 	cpu_mask = 0;
 	if (cpu_is_omap2420())
 		cpu_mask |= CK_242X;
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c
index 2e06145..29efc27 100644
--- a/arch/arm/plat-omap/clock.c
+++ b/arch/arm/plat-omap/clock.c
@@ -239,6 +239,13 @@ void recalculate_root_clocks(void)
 	}
 }
 
+/**
+ * clk_init_one - initialize any fields in the struct clk before clk init
+ * @clk: struct clk * to initialize
+ *
+ * Initialize any struct clk fields needed before normal clk initialization
+ * can run.  No return value.
+ */
 void clk_init_one(struct clk *clk)
 {
 	INIT_LIST_HEAD(&clk->children);
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
OMAP2xxx clock: pre-initialize struct clks early, Linux Kernel Mailing ..., (Sat May 2, 5:03 pm)