Commit 86c8ead5 authored by Thomas Gleixner's avatar Thomas Gleixner

Merge branch 'timers/for-arm' into timers/core

parents b22affe0 5d1d9a29
...@@ -92,6 +92,17 @@ static void err_broadcast(const struct cpumask *mask) ...@@ -92,6 +92,17 @@ static void err_broadcast(const struct cpumask *mask)
pr_crit_once("Failed to broadcast timer tick. Some CPUs may be unresponsive.\n"); pr_crit_once("Failed to broadcast timer tick. Some CPUs may be unresponsive.\n");
} }
static void tick_device_setup_broadcast_func(struct clock_event_device *dev)
{
if (!dev->broadcast)
dev->broadcast = tick_broadcast;
if (!dev->broadcast) {
pr_warn_once("%s depends on broadcast, but no broadcast function available\n",
dev->name);
dev->broadcast = err_broadcast;
}
}
/* /*
* Check, if the device is disfunctional and a place holder, which * Check, if the device is disfunctional and a place holder, which
* needs to be handled by the broadcast device. * needs to be handled by the broadcast device.
...@@ -111,13 +122,7 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu) ...@@ -111,13 +122,7 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
*/ */
if (!tick_device_is_functional(dev)) { if (!tick_device_is_functional(dev)) {
dev->event_handler = tick_handle_periodic; dev->event_handler = tick_handle_periodic;
if (!dev->broadcast) tick_device_setup_broadcast_func(dev);
dev->broadcast = tick_broadcast;
if (!dev->broadcast) {
pr_warn_once("%s depends on broadcast, but no broadcast function available\n",
dev->name);
dev->broadcast = err_broadcast;
}
cpumask_set_cpu(cpu, tick_get_broadcast_mask()); cpumask_set_cpu(cpu, tick_get_broadcast_mask());
tick_broadcast_start_periodic(tick_broadcast_device.evtdev); tick_broadcast_start_periodic(tick_broadcast_device.evtdev);
ret = 1; ret = 1;
...@@ -129,9 +134,10 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu) ...@@ -129,9 +134,10 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
*/ */
if (!(dev->features & CLOCK_EVT_FEAT_C3STOP)) { if (!(dev->features & CLOCK_EVT_FEAT_C3STOP)) {
int cpu = smp_processor_id(); int cpu = smp_processor_id();
cpumask_clear_cpu(cpu, tick_get_broadcast_mask()); cpumask_clear_cpu(cpu, tick_get_broadcast_mask());
tick_broadcast_clear_oneshot(cpu); tick_broadcast_clear_oneshot(cpu);
} else {
tick_device_setup_broadcast_func(dev);
} }
} }
raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment