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:
parent
0fae62eafe
commit
3465f60917
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue