clockevents/drivers/asm9260: Migrate to new 'set-state' interface

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

As a default the timer was stopped when entering in the set_mode(RESUME)
function, now this is done explicitly with the new API.

This also enables us to implement callbacks for new states of clockevent
devices, for example: ONESHOT_STOPPED.

Cc: Oleksij Rempel <linux@rempel-privat.de>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
This commit is contained in:
Viresh Kumar 2015-06-30 14:30:48 +05:30 committed by Daniel Lezcano
parent 0fae62eafe
commit 3465f60917
1 changed files with 39 additions and 25 deletions

View File

@ -120,38 +120,52 @@ static int asm9260_timer_set_next_event(unsigned long delta,
return 0; return 0;
} }
static void asm9260_timer_set_mode(enum clock_event_mode mode, static inline void __asm9260_timer_shutdown(struct clock_event_device *evt)
struct clock_event_device *evt)
{ {
/* stop timer0 */ /* stop timer0 */
writel_relaxed(BM_C0_EN, priv.base + HW_TCR + CLR_REG); writel_relaxed(BM_C0_EN, priv.base + HW_TCR + CLR_REG);
}
switch (mode) { static int asm9260_timer_shutdown(struct clock_event_device *evt)
case CLOCK_EVT_MODE_PERIODIC: {
/* disable reset and stop on match */ __asm9260_timer_shutdown(evt);
writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0), return 0;
priv.base + HW_MCR + CLR_REG); }
/* configure match count for TC0 */
writel_relaxed(priv.ticks_per_jiffy, priv.base + HW_MR0); static int asm9260_timer_set_oneshot(struct clock_event_device *evt)
/* enable TC0 */ {
writel_relaxed(BM_C0_EN, priv.base + HW_TCR + SET_REG); __asm9260_timer_shutdown(evt);
break;
case CLOCK_EVT_MODE_ONESHOT: /* enable reset and stop on match */
/* enable reset and stop on match */ writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0),
writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0), priv.base + HW_MCR + SET_REG);
priv.base + HW_MCR + SET_REG); return 0;
break; }
default:
break; static int asm9260_timer_set_periodic(struct clock_event_device *evt)
} {
__asm9260_timer_shutdown(evt);
/* disable reset and stop on match */
writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0),
priv.base + HW_MCR + CLR_REG);
/* configure match count for TC0 */
writel_relaxed(priv.ticks_per_jiffy, priv.base + HW_MR0);
/* enable TC0 */
writel_relaxed(BM_C0_EN, priv.base + HW_TCR + SET_REG);
return 0;
} }
static struct clock_event_device event_dev = { static struct clock_event_device event_dev = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.rating = 200, .rating = 200,
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, .features = CLOCK_EVT_FEAT_PERIODIC |
.set_next_event = asm9260_timer_set_next_event, CLOCK_EVT_FEAT_ONESHOT,
.set_mode = asm9260_timer_set_mode, .set_next_event = asm9260_timer_set_next_event,
.set_state_shutdown = asm9260_timer_shutdown,
.set_state_periodic = asm9260_timer_set_periodic,
.set_state_oneshot = asm9260_timer_set_oneshot,
.tick_resume = asm9260_timer_shutdown,
}; };
static irqreturn_t asm9260_timer_interrupt(int irq, void *dev_id) static irqreturn_t asm9260_timer_interrupt(int irq, void *dev_id)