|
@@ -43,6 +43,7 @@
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/sched_clock.h>
|
|
|
#include <linux/percpu.h>
|
|
|
+#include <linux/syscore_ops.h>
|
|
|
|
|
|
/*
|
|
|
* Timer block registers.
|
|
@@ -223,6 +224,28 @@ static struct notifier_block armada_370_xp_timer_cpu_nb = {
|
|
|
.notifier_call = armada_370_xp_timer_cpu_notify,
|
|
|
};
|
|
|
|
|
|
+static u32 timer0_ctrl_reg, timer0_local_ctrl_reg;
|
|
|
+
|
|
|
+static int armada_370_xp_timer_suspend(void)
|
|
|
+{
|
|
|
+ timer0_ctrl_reg = readl(timer_base + TIMER_CTRL_OFF);
|
|
|
+ timer0_local_ctrl_reg = readl(local_base + TIMER_CTRL_OFF);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void armada_370_xp_timer_resume(void)
|
|
|
+{
|
|
|
+ writel(0xffffffff, timer_base + TIMER0_VAL_OFF);
|
|
|
+ writel(0xffffffff, timer_base + TIMER0_RELOAD_OFF);
|
|
|
+ writel(timer0_ctrl_reg, timer_base + TIMER_CTRL_OFF);
|
|
|
+ writel(timer0_local_ctrl_reg, local_base + TIMER_CTRL_OFF);
|
|
|
+}
|
|
|
+
|
|
|
+struct syscore_ops armada_370_xp_timer_syscore_ops = {
|
|
|
+ .suspend = armada_370_xp_timer_suspend,
|
|
|
+ .resume = armada_370_xp_timer_resume,
|
|
|
+};
|
|
|
+
|
|
|
static void __init armada_370_xp_timer_common_init(struct device_node *np)
|
|
|
{
|
|
|
u32 clr = 0, set = 0;
|
|
@@ -285,6 +308,8 @@ static void __init armada_370_xp_timer_common_init(struct device_node *np)
|
|
|
/* Immediately configure the timer on the boot CPU */
|
|
|
if (!res)
|
|
|
armada_370_xp_timer_setup(this_cpu_ptr(armada_370_xp_evt));
|
|
|
+
|
|
|
+ register_syscore_ops(&armada_370_xp_timer_syscore_ops);
|
|
|
}
|
|
|
|
|
|
static void __init armada_xp_timer_init(struct device_node *np)
|