Commit e2efda24 authored by Viresh Kumar's avatar Viresh Kumar

ARM/gemini/time: Migrate to new 'set-state' interface

Migrate gemini driver to the new 'set-state' interface provided by
clockevents core, the earlier 'set-mode' interface is marked obsolete
now.

This also enables us to implement callbacks for new states of clockevent
devices, for example: ONESHOT_STOPPED.
Acked-by: default avatarHans Ulli Kroll <ulli.kroll@googlemail.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
parent 947d9cf5
...@@ -59,49 +59,48 @@ static int gemini_timer_set_next_event(unsigned long cycles, ...@@ -59,49 +59,48 @@ static int gemini_timer_set_next_event(unsigned long cycles,
return 0; return 0;
} }
static void gemini_timer_set_mode(enum clock_event_mode mode, static int gemini_timer_shutdown(struct clock_event_device *evt)
struct clock_event_device *evt) {
u32 cr;
/*
* Disable also for oneshot: the set_next() call will arm the timer
* instead.
*/
cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
cr &= ~TIMER_2_CR_ENABLE;
cr &= ~TIMER_2_CR_INT;
writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
return 0;
}
static int gemini_timer_set_periodic(struct clock_event_device *evt)
{ {
u32 period = DIV_ROUND_CLOSEST(tick_rate, HZ); u32 period = DIV_ROUND_CLOSEST(tick_rate, HZ);
u32 cr; u32 cr;
switch (mode) { /* Start the timer */
case CLOCK_EVT_MODE_PERIODIC: writel(period, TIMER_COUNT(IO_ADDRESS(GEMINI_TIMER2_BASE)));
/* Start the timer */ writel(period, TIMER_LOAD(IO_ADDRESS(GEMINI_TIMER2_BASE)));
writel(period, cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
TIMER_COUNT(IO_ADDRESS(GEMINI_TIMER2_BASE))); cr |= TIMER_2_CR_ENABLE;
writel(period, cr |= TIMER_2_CR_INT;
TIMER_LOAD(IO_ADDRESS(GEMINI_TIMER2_BASE))); writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE))); return 0;
cr |= TIMER_2_CR_ENABLE;
cr |= TIMER_2_CR_INT;
writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
break;
case CLOCK_EVT_MODE_ONESHOT:
case CLOCK_EVT_MODE_UNUSED:
case CLOCK_EVT_MODE_SHUTDOWN:
case CLOCK_EVT_MODE_RESUME:
/*
* Disable also for oneshot: the set_next() call will
* arm the timer instead.
*/
cr = readl(TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
cr &= ~TIMER_2_CR_ENABLE;
cr &= ~TIMER_2_CR_INT;
writel(cr, TIMER_CR(IO_ADDRESS(GEMINI_TIMER_BASE)));
break;
default:
break;
}
} }
/* Use TIMER2 as clock event */ /* Use TIMER2 as clock event */
static struct clock_event_device gemini_clockevent = { static struct clock_event_device gemini_clockevent = {
.name = "TIMER2", .name = "TIMER2",
.rating = 300, /* Reasonably fast and accurate clock event */ /* Reasonably fast and accurate clock event */
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .rating = 300,
.set_next_event = gemini_timer_set_next_event, .features = CLOCK_EVT_FEAT_PERIODIC |
.set_mode = gemini_timer_set_mode, CLOCK_EVT_FEAT_ONESHOT,
.set_next_event = gemini_timer_set_next_event,
.set_state_shutdown = gemini_timer_shutdown,
.set_state_periodic = gemini_timer_set_periodic,
.set_state_oneshot = gemini_timer_shutdown,
.tick_resume = gemini_timer_shutdown,
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment