2013-02-21 17:45:54 +00:00
|
|
|
Fix the usage of get_c0_compare_int: override cp0_compare_irq if the returned
|
|
|
|
value is in the MIPS CPU IRQ range to ensure that c0_compare_int_usable()
|
|
|
|
still works.
|
|
|
|
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
|
|
|
|
|
|
|
|
--- a/arch/mips/kernel/cevt-r4k.c
|
|
|
|
+++ b/arch/mips/kernel/cevt-r4k.c
|
2013-03-03 13:58:52 +00:00
|
|
|
@@ -173,20 +173,23 @@ int __cpuinit r4k_clockevent_init(void)
|
2013-02-21 17:45:54 +00:00
|
|
|
struct clock_event_device *cd;
|
|
|
|
unsigned int irq;
|
|
|
|
|
|
|
|
- if (!cpu_has_counter || !mips_hpt_frequency)
|
|
|
|
- return -ENXIO;
|
|
|
|
-
|
|
|
|
- if (!c0_compare_int_usable())
|
|
|
|
- return -ENXIO;
|
|
|
|
-
|
|
|
|
/*
|
|
|
|
* With vectored interrupts things are getting platform specific.
|
|
|
|
* get_c0_compare_int is a hook to allow a platform to return the
|
|
|
|
* interrupt number of it's liking.
|
|
|
|
*/
|
|
|
|
irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
|
|
|
|
- if (get_c0_compare_int)
|
|
|
|
+ if (get_c0_compare_int) {
|
|
|
|
irq = get_c0_compare_int();
|
|
|
|
+ if ((irq >= MIPS_CPU_IRQ_BASE) && (irq < MIPS_CPU_IRQ_BASE + 8))
|
|
|
|
+ cp0_compare_irq = irq - MIPS_CPU_IRQ_BASE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!cpu_has_counter || !mips_hpt_frequency)
|
|
|
|
+ return -ENXIO;
|
|
|
|
+
|
|
|
|
+ if (!c0_compare_int_usable())
|
|
|
|
+ return -ENXIO;
|
|
|
|
|
|
|
|
cd = &per_cpu(mips_clockevent_device, cpu);
|
|
|
|
|