ARM AT91: clocksource tcb_clksrc.c: make tc_mode interrupt safe
PATCH 1/1 ARM AT91: clocksource tcb_clksrc.c: make tc_mode interrupt safe
tc_mode() can be called from interrupt context and thus must not call clk_*prepare*() functions.
--- drivers/clocksource/tcb_clksrc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/clocksource/tcb_clksrc.c +4 -4
@@ -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;
Signature · 1 line
1.9.1
PATCH 1/1 ARM AT91: clocksource tcb_clksrc.c: make tc_mode interrupt safe
Quoted 4 lines · David Jander
tc_mode()can be called from interrupt context and thus must not call clk_*prepare*() functions.Signed-off-by David Jander <[email protected]>
Quoted 52 lines
--- drivers/clocksource/tcb_clksrc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)drivers/clocksource/tcb_clksrc.c +4
-4@@ -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;Signature · 7 lines
1.9.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 3 lines
Alexandre Belloni, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
PATCH 1/1 ARM AT91: clocksource tcb_clksrc.c: make tc_mode interrupt safe
On 22/05/2014 15:32, Alexandre Belloni :
Quoted 7 lines · David Jander
Quoted 4 lines
tc_mode()can be called from interrupt context and thus must not call clk_*prepare*() functions.Signed-off-by David Jander <[email protected]>
Ok, indeed. We keep the clocks prepared for the system lifetime.
Daniel, can you please take this fix (do you want me to re-send it)?
Bye,
Quoted 53 lines
Quoted 52 lines
--- drivers/clocksource/tcb_clksrc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)drivers/clocksource/tcb_clksrc.c +4
-4@@ -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;Signature · 7 lines
1.9.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel at lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Signature · 1 line
Nicolas Ferre
PATCH 1/1 ARM AT91: clocksource tcb_clksrc.c: make tc_mode interrupt safe
Quoted 7 lines · Nicolas Ferre
On 22/05/2014 15:32, Alexandre Belloni :
Quoted 6 lines · David Jander
Quoted 4 lines
tc_mode()can be called from interrupt context and thus must not call clk_*prepare*() functions.Signed-off-by David Jander <[email protected]>
Quoted 7 lines
Quoted 1 line
Ok, indeed. We keep the clocks prepared for the system lifetime.
Acked-by Nicolas Ferre <[email protected]>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
Quoted 55 lines
Quoted 53 lines
Quoted 52 lines
--- drivers/clocksource/tcb_clksrc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)drivers/clocksource/tcb_clksrc.c +4
-5@@ -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
Signature · 5 lines
<http://www.linaro.org/> Linaro.org ? Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog