Skip to content

Commit a87e553

Browse files
akpm00Jonas Bonn
authored and
Jonas Bonn
committed
asm-generic: delay.h fix udelay and ndelay for 8 bit args
With a non-constant 8-bit argument, a call to udelay() generates a warning: drivers/gpu/drm/radeon/atom.c: In function 'atom_op_delay': drivers/gpu/drm/radeon/atom.c:654: warning: comparison is always false due to limited range of data type The code looks like it works OK with an 8-bit arg, and the calling code is doing nothing wrong, so udelay() needs fixing. Fixing it was rather tricky. Simply typecasting `n' in the comparison with 20000 didn't change anything. Hence the divide-by-20000 trick. Using a do{}while loop didn't work because udelay() is used in ?: statements, hence the ({...}) construct. While I was there I replaced the brain-bending ?:?:?: mess with nice if/else code. Probably other architectures are generating the same warning and can use a similar change. [Taken from the x86 tree and moved to asm-generic by Jonas Bonn] Cc: Ingo Molnar <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: "H. Peter Anvin" <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Jonas Bonn <[email protected]>
1 parent 30ab2b0 commit a87e553

File tree

1 file changed

+27
-6
lines changed

1 file changed

+27
-6
lines changed

include/asm-generic/delay.h

+27-6
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,35 @@ extern void __ndelay(unsigned long nsecs);
1010
extern void __const_udelay(unsigned long xloops);
1111
extern void __delay(unsigned long loops);
1212

13+
/*
14+
* The weird n/20000 thing suppresses a "comparison is always false due to
15+
* limited range of data type" warning with non-const 8-bit arguments.
16+
*/
17+
1318
/* 0x10c7 is 2**32 / 1000000 (rounded up) */
14-
#define udelay(n) (__builtin_constant_p(n) ? \
15-
((n) > 20000 ? __bad_udelay() : __const_udelay((n) * 0x10c7ul)) : \
16-
__udelay(n))
19+
#define udelay(n) \
20+
({ \
21+
if (__builtin_constant_p(n)) { \
22+
if ((n) / 20000 >= 1) \
23+
__bad_udelay(); \
24+
else \
25+
__const_udelay((n) * 0x10c7ul); \
26+
} else { \
27+
__udelay(n); \
28+
} \
29+
})
1730

1831
/* 0x5 is 2**32 / 1000000000 (rounded up) */
19-
#define ndelay(n) (__builtin_constant_p(n) ? \
20-
((n) > 20000 ? __bad_ndelay() : __const_udelay((n) * 5ul)) : \
21-
__ndelay(n))
32+
#define ndelay(n) \
33+
({ \
34+
if (__builtin_constant_p(n)) { \
35+
if ((n) / 20000 >= 1) \
36+
__bad_ndelay(); \
37+
else \
38+
__const_udelay((n) * 5ul); \
39+
} else { \
40+
__ndelay(n); \
41+
} \
42+
})
2243

2344
#endif /* __ASM_GENERIC_DELAY_H */

0 commit comments

Comments
 (0)