MIPS: loongsoon32: Migrate to new 'set-state' interface
authorViresh Kumar <viresh.kumar@linaro.org>
Mon, 6 Jul 2015 11:12:02 +0000 (16:42 +0530)
committerRalf Baechle <ralf@linux-mips.org>
Thu, 3 Sep 2015 10:07:53 +0000 (12:07 +0200)
Migrate loongsoon32 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.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Cc: Kelvin Cheung <keguang.zhang@gmail.com>
Cc: Huacai Chen <chenhc@lemote.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: linux-mips@linux-mips.org
Cc: linaro-kernel@lists.linaro.org
Cc: Thomas Gleixner <tglx@linutronix.de>
Patchwork: https://patchwork.linux-mips.org/patch/10609/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/loongson32/common/time.c

index df0f850..0996b02 100644 (file)
@@ -126,26 +126,34 @@ static irqreturn_t ls1x_clockevent_isr(int irq, void *devid)
        return IRQ_HANDLED;
 }
 
-static void ls1x_clockevent_set_mode(enum clock_event_mode mode,
-                                    struct clock_event_device *cd)
+static int ls1x_clockevent_set_state_periodic(struct clock_event_device *cd)
 {
        raw_spin_lock(&ls1x_timer_lock);
-       switch (mode) {
-       case CLOCK_EVT_MODE_PERIODIC:
-               ls1x_pwmtimer_set_period(ls1x_jiffies_per_tick);
-               ls1x_pwmtimer_restart();
-       case CLOCK_EVT_MODE_RESUME:
-               __raw_writel(INT_EN | CNT_EN, timer_base + PWM_CTRL);
-               break;
-       case CLOCK_EVT_MODE_ONESHOT:
-       case CLOCK_EVT_MODE_SHUTDOWN:
-               __raw_writel(__raw_readl(timer_base + PWM_CTRL) & ~CNT_EN,
-                            timer_base + PWM_CTRL);
-               break;
-       default:
-               break;
-       }
+       ls1x_pwmtimer_set_period(ls1x_jiffies_per_tick);
+       ls1x_pwmtimer_restart();
+       __raw_writel(INT_EN | CNT_EN, timer_base + PWM_CTRL);
        raw_spin_unlock(&ls1x_timer_lock);
+
+       return 0;
+}
+
+static int ls1x_clockevent_tick_resume(struct clock_event_device *cd)
+{
+       raw_spin_lock(&ls1x_timer_lock);
+       __raw_writel(INT_EN | CNT_EN, timer_base + PWM_CTRL);
+       raw_spin_unlock(&ls1x_timer_lock);
+
+       return 0;
+}
+
+static int ls1x_clockevent_set_state_shutdown(struct clock_event_device *cd)
+{
+       raw_spin_lock(&ls1x_timer_lock);
+       __raw_writel(__raw_readl(timer_base + PWM_CTRL) & ~CNT_EN,
+                    timer_base + PWM_CTRL);
+       raw_spin_unlock(&ls1x_timer_lock);
+
+       return 0;
 }
 
 static int ls1x_clockevent_set_next(unsigned long evt,
@@ -160,12 +168,15 @@ static int ls1x_clockevent_set_next(unsigned long evt,
 }
 
 static struct clock_event_device ls1x_clockevent = {
-       .name           = "ls1x-pwmtimer",
-       .features       = CLOCK_EVT_FEAT_PERIODIC,
-       .rating         = 300,
-       .irq            = LS1X_TIMER_IRQ,
-       .set_next_event = ls1x_clockevent_set_next,
-       .set_mode       = ls1x_clockevent_set_mode,
+       .name                   = "ls1x-pwmtimer",
+       .features               = CLOCK_EVT_FEAT_PERIODIC,
+       .rating                 = 300,
+       .irq                    = LS1X_TIMER_IRQ,
+       .set_next_event         = ls1x_clockevent_set_next,
+       .set_state_shutdown     = ls1x_clockevent_set_state_shutdown,
+       .set_state_periodic     = ls1x_clockevent_set_state_periodic,
+       .set_state_oneshot      = ls1x_clockevent_set_state_shutdown,
+       .tick_resume            = ls1x_clockevent_tick_resume,
 };
 
 static struct irqaction ls1x_pwmtimer_irqaction = {