diff options
Diffstat (limited to 'arch/s390/lib')
-rw-r--r-- | arch/s390/lib/delay.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/arch/s390/lib/delay.c b/arch/s390/lib/delay.c index 02854449b74b..70f2a862b670 100644 --- a/arch/s390/lib/delay.c +++ b/arch/s390/lib/delay.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/timex.h> | 16 | #include <linux/timex.h> |
17 | #include <linux/irqflags.h> | 17 | #include <linux/irqflags.h> |
18 | #include <linux/interrupt.h> | ||
18 | 19 | ||
19 | void __delay(unsigned long loops) | 20 | void __delay(unsigned long loops) |
20 | { | 21 | { |
@@ -35,7 +36,11 @@ void __udelay(unsigned long usecs) | |||
35 | { | 36 | { |
36 | u64 end, time, jiffy_timer = 0; | 37 | u64 end, time, jiffy_timer = 0; |
37 | unsigned long flags, cr0, mask, dummy; | 38 | unsigned long flags, cr0, mask, dummy; |
39 | int irq_context; | ||
38 | 40 | ||
41 | irq_context = in_interrupt(); | ||
42 | if (!irq_context) | ||
43 | local_bh_disable(); | ||
39 | local_irq_save(flags); | 44 | local_irq_save(flags); |
40 | if (raw_irqs_disabled_flags(flags)) { | 45 | if (raw_irqs_disabled_flags(flags)) { |
41 | jiffy_timer = S390_lowcore.jiffy_timer; | 46 | jiffy_timer = S390_lowcore.jiffy_timer; |
@@ -62,6 +67,8 @@ void __udelay(unsigned long usecs) | |||
62 | __ctl_load(cr0, 0, 0); | 67 | __ctl_load(cr0, 0, 0); |
63 | S390_lowcore.jiffy_timer = jiffy_timer; | 68 | S390_lowcore.jiffy_timer = jiffy_timer; |
64 | } | 69 | } |
70 | if (!irq_context) | ||
71 | _local_bh_enable(); | ||
65 | set_clock_comparator(S390_lowcore.jiffy_timer); | 72 | set_clock_comparator(S390_lowcore.jiffy_timer); |
66 | local_irq_restore(flags); | 73 | local_irq_restore(flags); |
67 | } | 74 | } |