]> git.sur5r.net Git - u-boot/commitdiff
linux/compat.h: Properly implement ndelay fallback
authormario.six@gdsys.cc <mario.six@gdsys.cc>
Fri, 18 Nov 2016 13:40:37 +0000 (14:40 +0100)
committerTom Rini <trini@konsulko.com>
Mon, 28 Nov 2016 20:10:34 +0000 (15:10 -0500)
Commit c68c62 ("i2c: mvtwsi: Make delay times frequency-dependent")
extensively used the ndelay function with a calculated parameter
which is dependant on the configured frequency of the I2C bus. If
standard speed is employed, the parameter is usually 10000 (10000ns
period length for 100kHz frequency).

But, since the arm architecture does not implement a proper version of
ndelay, the fallback default from include/linux/compat.h is used,
which defines every ndelay as udelay(1). This causes problems for
slower speeds on arm, since the delay time is now 9us too short for
the desired frequency, which leads to random failures of the I2C
interface.

To remedy this, we implement a proper, parameter-aware ndelay fallback
for architectures that don't implement a real ndelay function.

Reported-By: Jason Brown <Jason.brown@apcon.com>
To: Tom Rini <trini@konsulko.com>
To: Heiko Schocher <hs@denx.de>
Signed-off-by: Mario Six <mario.six@gdsys.cc>
include/linux/compat.h

index c7fd649f5ea79d7fe9e22443f60b24c73b87828f..533983faffc15deecff35587ae934c9c36a2f6a4 100644 (file)
@@ -15,7 +15,7 @@ struct p_current{
 
 extern struct p_current *current;
 
-#define ndelay(x)      udelay(1)
+#define ndelay(x)      udelay((x) < 1000 ? 1 : (x)/1000)
 
 #define dev_dbg(dev, fmt, args...)             \
        debug(fmt, ##args)