Message ID | CACRpkdaS3bJwnJMJHRSEukiD4r+62h-0HzL7bKF_Ppa4TFy-xw@mail.gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Oct 19, 2012 at 11:37:48AM +0200, Linus Walleij wrote: > @@ -93,6 +94,8 @@ static void twd_timer_stop(struct clock_event_device *clk) > { > twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk); > disable_percpu_irq(clk->irq); > + if (twd_clk) > + clk_disable(twd_clk); While we're here, can we please ensure that the CLK API is properly respected, and use IS_ERR(twd_clk) to determine of the clock is valid or not (and not use IS_ERR_OR_NULL()).
On Fri, Oct 19, 2012 at 11:40 AM, Russell King - ARM Linux <linux@arm.linux.org.uk> wrote: > On Fri, Oct 19, 2012 at 11:37:48AM +0200, Linus Walleij wrote: >> @@ -93,6 +94,8 @@ static void twd_timer_stop(struct clock_event_device *clk) >> { >> twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk); >> disable_percpu_irq(clk->irq); >> + if (twd_clk) >> + clk_disable(twd_clk); > > While we're here, can we please ensure that the CLK API is properly > respected, and use IS_ERR(twd_clk) to determine of the clock is valid > or not (and not use IS_ERR_OR_NULL()). OK I'll refine this thing if it works for Freescale. I'm under the impression that the use of IS_ERR_OR_NULL() in the setup() section below the changed code is correct however, since it'll catch the situation where the clock API is disabled (and returns rate 0) and then proceed to calibrate the rate properly? Yours, Linus Walleij
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index e1f9069..1ac637b 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -31,6 +31,7 @@ static void __iomem *twd_base; static struct clk *twd_clk; static unsigned long twd_timer_rate; +static bool initial_setup_called; static struct clock_event_device __percpu **twd_evt; static int twd_ppi; @@ -93,6 +94,8 @@ static void twd_timer_stop(struct clock_event_device *clk) { twd_set_mode(CLOCK_EVT_MODE_UNUSED, clk); disable_percpu_irq(clk->irq); + if (twd_clk) + clk_disable(twd_clk); } #ifdef CONFIG_COMMON_CLK @@ -273,8 +276,21 @@ static int __cpuinit twd_timer_setup(struct clock_event_device *clk) { struct clock_event_device **this_cpu_clk; - if (!twd_clk) - twd_clk = twd_get_clock(); + /* + * If the basic setup has been done before, don't bother + * with yet again looking up the clock and register the clock + * source. + */ + if (initial_setup_called) { + if (twd_clk) + clk_enable(twd_clk); + __raw_writel(0, twd_base + TWD_TIMER_CONTROL); + enable_percpu_irq(clk->irq, 0); + return 0; + } + initial_setup_called = true; + + twd_clk = twd_get_clock(); if (!IS_ERR_OR_NULL(twd_clk))