diff options
Diffstat (limited to 'drivers/clocksource/arm_arch_timer.c')
-rw-r--r-- | drivers/clocksource/arm_arch_timer.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c index 28bce3f4f81d..57700541f951 100644 --- a/drivers/clocksource/arm_arch_timer.c +++ b/drivers/clocksource/arm_arch_timer.c | |||
@@ -8,6 +8,9 @@ | |||
8 | * it under the terms of the GNU General Public License version 2 as | 8 | * it under the terms of the GNU General Public License version 2 as |
9 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
10 | */ | 10 | */ |
11 | |||
12 | #define pr_fmt(fmt) "arm_arch_timer: " fmt | ||
13 | |||
11 | #include <linux/init.h> | 14 | #include <linux/init.h> |
12 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
13 | #include <linux/device.h> | 16 | #include <linux/device.h> |
@@ -370,16 +373,33 @@ static bool arch_timer_has_nonsecure_ppi(void) | |||
370 | arch_timer_ppi[PHYS_NONSECURE_PPI]); | 373 | arch_timer_ppi[PHYS_NONSECURE_PPI]); |
371 | } | 374 | } |
372 | 375 | ||
376 | static u32 check_ppi_trigger(int irq) | ||
377 | { | ||
378 | u32 flags = irq_get_trigger_type(irq); | ||
379 | |||
380 | if (flags != IRQF_TRIGGER_HIGH && flags != IRQF_TRIGGER_LOW) { | ||
381 | pr_warn("WARNING: Invalid trigger for IRQ%d, assuming level low\n", irq); | ||
382 | pr_warn("WARNING: Please fix your firmware\n"); | ||
383 | flags = IRQF_TRIGGER_LOW; | ||
384 | } | ||
385 | |||
386 | return flags; | ||
387 | } | ||
388 | |||
373 | static int arch_timer_starting_cpu(unsigned int cpu) | 389 | static int arch_timer_starting_cpu(unsigned int cpu) |
374 | { | 390 | { |
375 | struct clock_event_device *clk = this_cpu_ptr(arch_timer_evt); | 391 | struct clock_event_device *clk = this_cpu_ptr(arch_timer_evt); |
392 | u32 flags; | ||
376 | 393 | ||
377 | __arch_timer_setup(ARCH_CP15_TIMER, clk); | 394 | __arch_timer_setup(ARCH_CP15_TIMER, clk); |
378 | 395 | ||
379 | enable_percpu_irq(arch_timer_ppi[arch_timer_uses_ppi], 0); | 396 | flags = check_ppi_trigger(arch_timer_ppi[arch_timer_uses_ppi]); |
397 | enable_percpu_irq(arch_timer_ppi[arch_timer_uses_ppi], flags); | ||
380 | 398 | ||
381 | if (arch_timer_has_nonsecure_ppi()) | 399 | if (arch_timer_has_nonsecure_ppi()) { |
382 | enable_percpu_irq(arch_timer_ppi[PHYS_NONSECURE_PPI], 0); | 400 | flags = check_ppi_trigger(arch_timer_ppi[PHYS_NONSECURE_PPI]); |
401 | enable_percpu_irq(arch_timer_ppi[PHYS_NONSECURE_PPI], flags); | ||
402 | } | ||
383 | 403 | ||
384 | arch_counter_set_user_access(); | 404 | arch_counter_set_user_access(); |
385 | if (evtstrm_enable) | 405 | if (evtstrm_enable) |