| From: Boris Brezillon <boris.brezillon@bootlin.com> |
| Date: Sun, 13 May 2018 16:02:12 +0200 |
| Subject: m68k: Implement ndelay() as an inline function to force type |
| checking/casting |
| |
| commit d8441ba80c55aad435e4b98fe0d7ad5d21e46bf9 upstream. |
| |
| ndelay() is supposed to take an unsigned long, but if you define |
| ndelay() as a macro and the caller pass an unsigned long long instead |
| of an unsigned long, the unsigned long long to unsigned long cast is |
| not done and we end up with an "undefined reference to `__udivdi3'" |
| error at link time. |
| |
| Fix that by making ndelay() an inline function and then defining dummy |
| ndelay() macro that redirects to the ndelay() function (it's how most |
| archs do to implement ndelay()). |
| |
| Fixes: c8ee038bd148 ("m68k: Implement ndelay() based on the existing udelay() logic") |
| Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> |
| Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> |
| [geert: Remove comment now it is no longer a macro] |
| Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/m68k/include/asm/delay.h | 11 ++++++++--- |
| 1 file changed, 8 insertions(+), 3 deletions(-) |
| |
| --- a/arch/m68k/include/asm/delay.h |
| +++ b/arch/m68k/include/asm/delay.h |
| @@ -48,8 +48,6 @@ extern void __bad_udelay(void); |
| * The simpler m68k and ColdFire processors do not have a 32*32->64 |
| * multiply instruction. So we need to handle them a little differently. |
| * We use a bit of shifting and a single 32*32->32 multiply to get close. |
| - * This is a macro so that the const version can factor out the first |
| - * multiply and shift. |
| */ |
| #define HZSCALE (268435456 / (1000000 / HZ)) |
| |
| @@ -114,6 +112,13 @@ static inline void __udelay(unsigned lon |
| */ |
| #define HZSCALE (268435456 / (1000000 / HZ)) |
| |
| -#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000)) |
| +static inline void ndelay(unsigned long nsec) |
| +{ |
| + __delay(DIV_ROUND_UP(nsec * |
| + ((((HZSCALE) >> 11) * |
| + (loops_per_jiffy >> 11)) >> 6), |
| + 1000)); |
| +} |
| +#define ndelay(n) ndelay(n) |
| |
| #endif /* defined(_M68K_DELAY_H) */ |