From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel.lezcano@linaro.org (Daniel Lezcano) Date: Thu, 22 May 2014 18:56:57 +0200 Subject: [PATCH] ARM AT91: clocksource tcb_clksrc.c: make tc_mode interrupt safe In-Reply-To: <537E26E4.9050602@atmel.com> References: <1399543585-17016-1-git-send-email-david@protonic.nl> <20140522133241.GO3582@piout.net> <537E26E4.9050602@atmel.com> Message-ID: <537E2C59.1000109@linaro.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 05/22/2014 06:33 PM, Nicolas Ferre wrote: > On 22/05/2014 15:32, Alexandre Belloni : >> On 08/05/2014 at 12:06:25 +0200, David Jander wrote : >>> tc_mode() can be called from interrupt context and thus must not call >>> clk_*prepare*() functions. >>> >>> Signed-off-by: David Jander >> >> Acked-by: Alexandre Belloni > > Ok, indeed. We keep the clocks prepared for the system lifetime. > > Acked-by: Nicolas Ferre > > Daniel, can you please take this fix (do you want me to re-send it)? It is ok, I applied it as a 3.15 fix. Thanks -- Daniel >>> --- >>> drivers/clocksource/tcb_clksrc.c | 8 ++++---- >>> 1 file changed, 4 insertions(+), 4 deletions(-) >>> >>> diff --git a/drivers/clocksource/tcb_clksrc.c b/drivers/clocksource/tcb_clksrc.c >>> index 00fdd11..a8d7ea1 100644 >>> --- a/drivers/clocksource/tcb_clksrc.c >>> +++ b/drivers/clocksource/tcb_clksrc.c >>> @@ -100,7 +100,7 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d) >>> || tcd->clkevt.mode == CLOCK_EVT_MODE_ONESHOT) { >>> __raw_writel(0xff, regs + ATMEL_TC_REG(2, IDR)); >>> __raw_writel(ATMEL_TC_CLKDIS, regs + ATMEL_TC_REG(2, CCR)); >>> - clk_disable_unprepare(tcd->clk); >>> + clk_disable(tcd->clk); >>> } >>> >>> switch (m) { >>> @@ -109,7 +109,7 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d) >>> * of oneshot, we get lower overhead and improved accuracy. >>> */ >>> case CLOCK_EVT_MODE_PERIODIC: >>> - clk_prepare_enable(tcd->clk); >>> + clk_enable(tcd->clk); >>> >>> /* slow clock, count up to RC, then irq and restart */ >>> __raw_writel(timer_clock >>> @@ -126,7 +126,7 @@ static void tc_mode(enum clock_event_mode m, struct clock_event_device *d) >>> break; >>> >>> case CLOCK_EVT_MODE_ONESHOT: >>> - clk_prepare_enable(tcd->clk); >>> + clk_enable(tcd->clk); >>> >>> /* slow clock, count up to RC, then irq and stop */ >>> __raw_writel(timer_clock | ATMEL_TC_CPCSTOP >>> @@ -194,7 +194,7 @@ static int __init setup_clkevents(struct atmel_tc *tc, int clk32k_divisor_idx) >>> ret = clk_prepare_enable(t2_clk); >>> if (ret) >>> return ret; >>> - clk_disable_unprepare(t2_clk); >>> + clk_disable(t2_clk); >>> >>> clkevt.regs = tc->regs; >>> clkevt.clk = t2_clk; >>> -- >>> 1.9.1 >>> >>> >>> _______________________________________________ >>> linux-arm-kernel mailing list >>> linux-arm-kernel at lists.infradead.org >>> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel >> > > -- Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog