@@ -321,6 +321,19 @@ static int ttc_rate_change_clocksource_cb(struct notifier_block *nb,
return NOTIFY_DONE;
}
+static void ttc_ce_suspend(struct clock_event_device *ce)
+{
+ struct ttc_timer_clockevent *ttcce = to_ttc_timer_clkevent(ce);
+
+ readl_relaxed(ttcce->ttc.base_addr + TTC_ISR_OFFSET);
+ disable_irq(ce->irq);
+}
+
+static void ttc_ce_resume(struct clock_event_device *ce)
+{
+ enable_irq(ce->irq);
+}
+
static void __init ttc_setup_clocksource(struct clk *clk, void __iomem *base)
{
struct ttc_timer_clocksource *ttccs;
@@ -428,6 +441,8 @@ static void __init ttc_setup_clockevent(struct clk *clk,
ttcce->ce.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
ttcce->ce.set_next_event = ttc_set_next_event;
ttcce->ce.set_mode = ttc_set_mode;
+ ttcce->ce.suspend = ttc_ce_suspend;
+ ttcce->ce.resume = ttc_ce_resume;
ttcce->ce.rating = 200;
ttcce->ce.irq = irq;
ttcce->ce.cpumask = cpu_possible_mask;
@@ -264,6 +264,18 @@ static void twd_get_clock(struct device_node *np)
twd_timer_rate = clk_get_rate(twd_clk);
}
+static void twd_suspend(struct clock_event_device *ce)
+{
+ struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
+ disable_percpu_irq(clk->irq);
+}
+
+static void twd_resume(struct clock_event_device *ce)
+{
+ struct clock_event_device *clk = __this_cpu_ptr(twd_evt);
+ enable_percpu_irq(clk->irq, 0);
+}
+
/*
* Setup the local clock events for a CPU.
*/
@@ -300,6 +312,8 @@ static void twd_timer_setup(void)
clk->set_next_event = twd_set_next_event;
clk->irq = twd_ppi;
clk->cpumask = cpumask_of(cpu);
+ clk->suspend = twd_suspend;
+ clk->resume = twd_resume;
clockevents_config_and_register(clk, twd_timer_rate,
0xf, 0xffffffff);