aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-07-29 16:55:30 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-07-29 16:55:30 -0400
commita6408f6cb63ac0958fee7dbce7861ffb540d8a49 (patch)
treec94a835d343974171951e3b805e6bbbb02852ebc /arch/arc/kernel
parent1a81a8f2a5918956e214bb718099a89e500e7ec5 (diff)
parent4fae16dffb812f0e0d98a0b2b0856ca48ca63e6c (diff)
Merge branch 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull smp hotplug updates from Thomas Gleixner: "This is the next part of the hotplug rework. - Convert all notifiers with a priority assigned - Convert all CPU_STARTING/DYING notifiers The final removal of the STARTING/DYING infrastructure will happen when the merge window closes. Another 700 hundred line of unpenetrable maze gone :)" * 'smp-hotplug-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (70 commits) timers/core: Correct callback order during CPU hot plug leds/trigger/cpu: Move from CPU_STARTING to ONLINE level powerpc/numa: Convert to hotplug state machine arm/perf: Fix hotplug state machine conversion irqchip/armada: Avoid unused function warnings ARC/time: Convert to hotplug state machine clocksource/atlas7: Convert to hotplug state machine clocksource/armada-370-xp: Convert to hotplug state machine clocksource/exynos_mct: Convert to hotplug state machine clocksource/arm_global_timer: Convert to hotplug state machine rcu: Convert rcutree to hotplug state machine KVM/arm/arm64/vgic-new: Convert to hotplug state machine smp/cfd: Convert core to hotplug state machine x86/x2apic: Convert to CPU hotplug state machine profile: Convert to hotplug state machine timers/core: Convert to hotplug state machine hrtimer: Convert to hotplug state machine x86/tboot: Convert to hotplug state machine arm64/armv8 deprecated: Convert to hotplug state machine hwtracing/coresight-etm4x: Convert to hotplug state machine ...
Diffstat (limited to 'arch/arc/kernel')
-rw-r--r--arch/arc/kernel/time.c48
1 files changed, 18 insertions, 30 deletions
diff --git a/arch/arc/kernel/time.c b/arch/arc/kernel/time.c
index 98f22d2eb563..f927b8dc6edd 100644
--- a/arch/arc/kernel/time.c
+++ b/arch/arc/kernel/time.c
@@ -296,30 +296,23 @@ static irqreturn_t timer_irq_handler(int irq, void *dev_id)
296 return IRQ_HANDLED; 296 return IRQ_HANDLED;
297} 297}
298 298
299static int arc_timer_cpu_notify(struct notifier_block *self, 299
300 unsigned long action, void *hcpu) 300static int arc_timer_starting_cpu(unsigned int cpu)
301{ 301{
302 struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); 302 struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
303 303
304 evt->cpumask = cpumask_of(smp_processor_id()); 304 evt->cpumask = cpumask_of(smp_processor_id());
305 305
306 switch (action & ~CPU_TASKS_FROZEN) { 306 clockevents_config_and_register(evt, arc_timer_freq, 0, ARC_TIMER_MAX);
307 case CPU_STARTING: 307 enable_percpu_irq(arc_timer_irq, 0);
308 clockevents_config_and_register(evt, arc_timer_freq, 308 return 0;
309 0, ULONG_MAX);
310 enable_percpu_irq(arc_timer_irq, 0);
311 break;
312 case CPU_DYING:
313 disable_percpu_irq(arc_timer_irq);
314 break;
315 }
316
317 return NOTIFY_OK;
318} 309}
319 310
320static struct notifier_block arc_timer_cpu_nb = { 311static int arc_timer_dying_cpu(unsigned int cpu)
321 .notifier_call = arc_timer_cpu_notify, 312{
322}; 313 disable_percpu_irq(arc_timer_irq);
314 return 0;
315}
323 316
324/* 317/*
325 * clockevent setup for boot CPU 318 * clockevent setup for boot CPU
@@ -329,12 +322,6 @@ static int __init arc_clockevent_setup(struct device_node *node)
329 struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device); 322 struct clock_event_device *evt = this_cpu_ptr(&arc_clockevent_device);
330 int ret; 323 int ret;
331 324
332 ret = register_cpu_notifier(&arc_timer_cpu_nb);
333 if (ret) {
334 pr_err("Failed to register cpu notifier");
335 return ret;
336 }
337
338 arc_timer_irq = irq_of_parse_and_map(node, 0); 325 arc_timer_irq = irq_of_parse_and_map(node, 0);
339 if (arc_timer_irq <= 0) { 326 if (arc_timer_irq <= 0) {
340 pr_err("clockevent: missing irq"); 327 pr_err("clockevent: missing irq");
@@ -347,11 +334,6 @@ static int __init arc_clockevent_setup(struct device_node *node)
347 return ret; 334 return ret;
348 } 335 }
349 336
350 evt->irq = arc_timer_irq;
351 evt->cpumask = cpumask_of(smp_processor_id());
352 clockevents_config_and_register(evt, arc_timer_freq,
353 0, ARC_TIMER_MAX);
354
355 /* Needs apriori irq_set_percpu_devid() done in intc map function */ 337 /* Needs apriori irq_set_percpu_devid() done in intc map function */
356 ret = request_percpu_irq(arc_timer_irq, timer_irq_handler, 338 ret = request_percpu_irq(arc_timer_irq, timer_irq_handler,
357 "Timer0 (per-cpu-tick)", evt); 339 "Timer0 (per-cpu-tick)", evt);
@@ -360,8 +342,14 @@ static int __init arc_clockevent_setup(struct device_node *node)
360 return ret; 342 return ret;
361 } 343 }
362 344
363 enable_percpu_irq(arc_timer_irq, 0); 345 ret = cpuhp_setup_state(CPUHP_AP_ARC_TIMER_STARTING,
364 346 "AP_ARC_TIMER_STARTING",
347 arc_timer_starting_cpu,
348 arc_timer_dying_cpu);
349 if (ret) {
350 pr_err("Failed to setup hotplug state");
351 return ret;
352 }
365 return 0; 353 return 0;
366} 354}
367 355