]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/s390/lib/delay.c
Merge branch 'ioat-md-accel-for-linus' of git://lost.foo-projects.org/~dwillia2/git/iop
[linux-2.6-omap-h63xx.git] / arch / s390 / lib / delay.c
index 02854449b74ba64dea7230b606f72b63c3890218..70f2a862b670649e296d1c6e5277f01241161a11 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/delay.h>
 #include <linux/timex.h>
 #include <linux/irqflags.h>
+#include <linux/interrupt.h>
 
 void __delay(unsigned long loops)
 {
@@ -35,7 +36,11 @@ void __udelay(unsigned long usecs)
 {
        u64 end, time, jiffy_timer = 0;
        unsigned long flags, cr0, mask, dummy;
+       int irq_context;
 
+       irq_context = in_interrupt();
+       if (!irq_context)
+               local_bh_disable();
        local_irq_save(flags);
        if (raw_irqs_disabled_flags(flags)) {
                jiffy_timer = S390_lowcore.jiffy_timer;
@@ -62,6 +67,8 @@ void __udelay(unsigned long usecs)
                __ctl_load(cr0, 0, 0);
                S390_lowcore.jiffy_timer = jiffy_timer;
        }
+       if (!irq_context)
+               _local_bh_enable();
        set_clock_comparator(S390_lowcore.jiffy_timer);
        local_irq_restore(flags);
 }