Commit 3465f609 authored by Viresh Kumar's avatar Viresh Kumar Committed by Daniel Lezcano

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: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarDaniel Lezcano <daniel.lezcano@linaro.org>
parent 0fae62ea
...@@ -120,38 +120,52 @@ static int asm9260_timer_set_next_event(unsigned long delta, ...@@ -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);
}
static int asm9260_timer_shutdown(struct clock_event_device *evt)
{
__asm9260_timer_shutdown(evt);
return 0;
}
static int asm9260_timer_set_oneshot(struct clock_event_device *evt)
{
__asm9260_timer_shutdown(evt);
/* enable reset and stop on match */
writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0),
priv.base + HW_MCR + SET_REG);
return 0;
}
static int asm9260_timer_set_periodic(struct clock_event_device *evt)
{
__asm9260_timer_shutdown(evt);
switch (mode) { /* disable reset and stop on match */
case CLOCK_EVT_MODE_PERIODIC: writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0),
/* disable reset and stop on match */ priv.base + HW_MCR + CLR_REG);
writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0), /* configure match count for TC0 */
priv.base + HW_MCR + CLR_REG); writel_relaxed(priv.ticks_per_jiffy, priv.base + HW_MR0);
/* configure match count for TC0 */ /* enable TC0 */
writel_relaxed(priv.ticks_per_jiffy, priv.base + HW_MR0); writel_relaxed(BM_C0_EN, priv.base + HW_TCR + SET_REG);
/* enable TC0 */ return 0;
writel_relaxed(BM_C0_EN, priv.base + HW_TCR + SET_REG);
break;
case CLOCK_EVT_MODE_ONESHOT:
/* enable reset and stop on match */
writel_relaxed(BM_MCR_RES_EN(0) | BM_MCR_STOP_EN(0),
priv.base + HW_MCR + SET_REG);
break;
default:
break;
}
} }
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)
......
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