|
@@ -202,6 +202,16 @@ struct cpuidle_driver omap4_idle_driver = {
|
|
|
.safe_state_index = 0,
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * For each cpu, setup the broadcast timer because local timers
|
|
|
+ * stops for the states above C1.
|
|
|
+ */
|
|
|
+static void omap_setup_broadcast_timer(void *arg)
|
|
|
+{
|
|
|
+ int cpu = smp_processor_id();
|
|
|
+ clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* omap4_idle_init - Init routine for OMAP4 idle
|
|
|
*
|
|
@@ -224,6 +234,9 @@ int __init omap4_idle_init(void)
|
|
|
if (!cpu_clkdm[0] || !cpu_clkdm[1])
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ /* Configure the broadcast timer on each cpu */
|
|
|
+ on_each_cpu(omap_setup_broadcast_timer, NULL, 1);
|
|
|
+
|
|
|
for_each_cpu(cpu_id, cpu_online_mask) {
|
|
|
dev = &per_cpu(omap4_idle_dev, cpu_id);
|
|
|
dev->cpu = cpu_id;
|