clockevents/drivers/asm9260: Migrate to new 'set-state' interface
authorViresh Kumar <viresh.kumar@linaro.org>
Tue, 30 Jun 2015 09:00:48 +0000 (14:30 +0530)
committerDaniel Lezcano <daniel.lezcano@linaro.org>
Mon, 10 Aug 2015 09:40:25 +0000 (11:40 +0200)
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>
drivers/clocksource/asm9260_timer.c

index 4c2ba59..217438d 100644 (file)
@@ -120,38 +120,52 @@ static int asm9260_timer_set_next_event(unsigned long delta,
        return 0;
 }
 
-static void asm9260_timer_set_mode(enum clock_event_mode mode,
-                                   struct clock_event_device *evt)
+static inline void __asm9260_timer_shutdown(struct clock_event_device *evt)
 {
        /* stop timer0 */
        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) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               /* 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);
-               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;
-       }
+       /* 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 = {
-       .name           = DRIVER_NAME,
-       .rating         = 200,
-       .features       = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-       .set_next_event = asm9260_timer_set_next_event,
-       .set_mode       = asm9260_timer_set_mode,
+       .name                   = DRIVER_NAME,
+       .rating                 = 200,
+       .features               = CLOCK_EVT_FEAT_PERIODIC |
+                                 CLOCK_EVT_FEAT_ONESHOT,
+       .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)