Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[S390] Provide arch specific mdelay implementation.

Use an own implementation instead of the common code udelay loop.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>

authored by

Heiko Carstens and committed by
Martin Schwidefsky
0cd6a403 78d81f2f

+11 -10
+4 -3
arch/s390/include/asm/delay.h
··· 14 14 #ifndef _S390_DELAY_H 15 15 #define _S390_DELAY_H 16 16 17 - extern void __udelay(unsigned long usecs); 18 - extern void udelay_simple(unsigned long usecs); 17 + extern void __udelay(unsigned long long usecs); 18 + extern void udelay_simple(unsigned long long usecs); 19 19 extern void __delay(unsigned long loops); 20 20 21 - #define udelay(n) __udelay(n) 21 + #define udelay(n) __udelay((unsigned long long) (n)) 22 + #define mdelay(n) __udelay((unsigned long long) (n) * 1000) 22 23 23 24 #endif /* defined(_S390_DELAY_H) */
+7 -7
arch/s390/lib/delay.c
··· 25 25 asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); 26 26 } 27 27 28 - static void __udelay_disabled(unsigned long usecs) 28 + static void __udelay_disabled(unsigned long long usecs) 29 29 { 30 30 unsigned long mask, cr0, cr0_saved; 31 31 u64 clock_saved; 32 32 33 33 clock_saved = local_tick_disable(); 34 - set_clock_comparator(get_clock() + ((u64) usecs << 12)); 34 + set_clock_comparator(get_clock() + (usecs << 12)); 35 35 __ctl_store(cr0_saved, 0, 0); 36 36 cr0 = (cr0_saved & 0xffff00e0) | 0x00000800; 37 37 __ctl_load(cr0 , 0, 0); ··· 46 46 set_clock_comparator(S390_lowcore.clock_comparator); 47 47 } 48 48 49 - static void __udelay_enabled(unsigned long usecs) 49 + static void __udelay_enabled(unsigned long long usecs) 50 50 { 51 51 unsigned long mask; 52 52 u64 clock_saved; 53 53 u64 end; 54 54 55 55 mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT | PSW_MASK_IO; 56 - end = get_clock() + ((u64) usecs << 12); 56 + end = get_clock() + (usecs << 12); 57 57 do { 58 58 clock_saved = 0; 59 59 if (end < S390_lowcore.clock_comparator) { ··· 72 72 /* 73 73 * Waits for 'usecs' microseconds using the TOD clock comparator. 74 74 */ 75 - void __udelay(unsigned long usecs) 75 + void __udelay(unsigned long long usecs) 76 76 { 77 77 unsigned long flags; 78 78 ··· 106 106 * Simple udelay variant. To be used on startup and reboot 107 107 * when the interrupt handler isn't working. 108 108 */ 109 - void udelay_simple(unsigned long usecs) 109 + void udelay_simple(unsigned long long usecs) 110 110 { 111 111 u64 end; 112 112 113 - end = get_clock() + ((u64) usecs << 12); 113 + end = get_clock() + (usecs << 12); 114 114 while (get_clock() < end) 115 115 cpu_relax(); 116 116 }