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

MIPS: Make __{,n,u}delay declarations match definitions and generic delay.h

At some recent point arch/mips/include/asm/delay.h has started being
included into csrc-octeon.c where the __?delay() functions are defined.
This causes a compile failure due to conflicting declarations and
definitions of the functions.

It turns out that the generic definitions in arch/mips/lib/delay.c also
conflict.

Proposed fix: Declare the functions to take unsigned long parameters
just like asm-generic (and x86) does. Update __delay to agree
(__ndelay and __udelay need no change).

Bonus: Get rid of 'inline' from __delay() definition, as it is globally
visible, and the compiler should be making this decision itself (it does
in fact inline the function without being told to).

Signed-off-by: David Daney <david.daney@cavium.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/4354/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

authored by

David Daney and committed by
Ralf Baechle
5210edcd ddffeb8c

+8 -4
+3 -3
arch/mips/include/asm/delay.h
··· 13 13 14 14 #include <linux/param.h> 15 15 16 - extern void __delay(unsigned int loops); 17 - extern void __ndelay(unsigned int ns); 18 - extern void __udelay(unsigned int us); 16 + extern void __delay(unsigned long loops); 17 + extern void __ndelay(unsigned long ns); 18 + extern void __udelay(unsigned long us); 19 19 20 20 #define ndelay(ns) __ndelay(ns) 21 21 #define udelay(us) __udelay(us)
+5 -1
arch/mips/lib/delay.c
··· 15 15 #include <asm/compiler.h> 16 16 #include <asm/war.h> 17 17 18 - inline void __delay(unsigned int loops) 18 + void __delay(unsigned long loops) 19 19 { 20 20 __asm__ __volatile__ ( 21 21 " .set noreorder \n" 22 22 " .align 3 \n" 23 23 "1: bnez %0, 1b \n" 24 + #if __SIZEOF_LONG__ == 4 24 25 " subu %0, 1 \n" 26 + #else 27 + " dsubu %0, 1 \n" 28 + #endif 25 29 " .set reorder \n" 26 30 : "=r" (loops) 27 31 : "0" (loops));