diff options
Diffstat (limited to 'arch/x86/kernel/apb_timer.c')
-rw-r--r-- | arch/x86/kernel/apb_timer.c | 29 |
1 files changed, 10 insertions, 19 deletions
diff --git a/arch/x86/kernel/apb_timer.c b/arch/x86/kernel/apb_timer.c index cefacbad1531..456316f6c868 100644 --- a/arch/x86/kernel/apb_timer.c +++ b/arch/x86/kernel/apb_timer.c | |||
@@ -215,26 +215,18 @@ void apbt_setup_secondary_clock(void) | |||
215 | * cpu timers during the offline process due to the ordering of notification. | 215 | * cpu timers during the offline process due to the ordering of notification. |
216 | * the extra interrupt is harmless. | 216 | * the extra interrupt is harmless. |
217 | */ | 217 | */ |
218 | static int apbt_cpuhp_notify(struct notifier_block *n, | 218 | static int apbt_cpu_dead(unsigned int cpu) |
219 | unsigned long action, void *hcpu) | ||
220 | { | 219 | { |
221 | unsigned long cpu = (unsigned long)hcpu; | ||
222 | struct apbt_dev *adev = &per_cpu(cpu_apbt_dev, cpu); | 220 | struct apbt_dev *adev = &per_cpu(cpu_apbt_dev, cpu); |
223 | 221 | ||
224 | switch (action & ~CPU_TASKS_FROZEN) { | 222 | dw_apb_clockevent_pause(adev->timer); |
225 | case CPU_DEAD: | 223 | if (system_state == SYSTEM_RUNNING) { |
226 | dw_apb_clockevent_pause(adev->timer); | 224 | pr_debug("skipping APBT CPU %u offline\n", cpu); |
227 | if (system_state == SYSTEM_RUNNING) { | 225 | } else { |
228 | pr_debug("skipping APBT CPU %lu offline\n", cpu); | 226 | pr_debug("APBT clockevent for cpu %u offline\n", cpu); |
229 | } else { | 227 | dw_apb_clockevent_stop(adev->timer); |
230 | pr_debug("APBT clockevent for cpu %lu offline\n", cpu); | ||
231 | dw_apb_clockevent_stop(adev->timer); | ||
232 | } | ||
233 | break; | ||
234 | default: | ||
235 | pr_debug("APBT notified %lu, no action\n", action); | ||
236 | } | 228 | } |
237 | return NOTIFY_OK; | 229 | return 0; |
238 | } | 230 | } |
239 | 231 | ||
240 | static __init int apbt_late_init(void) | 232 | static __init int apbt_late_init(void) |
@@ -242,9 +234,8 @@ static __init int apbt_late_init(void) | |||
242 | if (intel_mid_timer_options == INTEL_MID_TIMER_LAPIC_APBT || | 234 | if (intel_mid_timer_options == INTEL_MID_TIMER_LAPIC_APBT || |
243 | !apb_timer_block_enabled) | 235 | !apb_timer_block_enabled) |
244 | return 0; | 236 | return 0; |
245 | /* This notifier should be called after workqueue is ready */ | 237 | return cpuhp_setup_state(CPUHP_X86_APB_DEAD, "X86_APB_DEAD", NULL, |
246 | hotcpu_notifier(apbt_cpuhp_notify, -20); | 238 | apbt_cpu_dead); |
247 | return 0; | ||
248 | } | 239 | } |
249 | fs_initcall(apbt_late_init); | 240 | fs_initcall(apbt_late_init); |
250 | #else | 241 | #else |