Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit acbf6d21 authored by David Jander's avatar David Jander Committed by Daniel Lezcano
Browse files

clocksource: tcb_clksrc: Make tc_mode interrupt safe



tc_mode() can be called from interrupt context and thus must not call
clk_*prepare*() functions.

Signed-off-by: default avatarDavid Jander <david@protonic.nl>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
Acked-by: default avatarAlexandre Belloni <alexandre.belloni@free-electrons.com>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
parent f214be50
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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;