|
@@ -9,6 +9,33 @@
|
|
|
#include <asm/memory.h>
|
|
|
#include <asm/param.h> /* HZ */
|
|
|
|
|
|
+/*
|
|
|
+ * Loop (or tick) based delay:
|
|
|
+ *
|
|
|
+ * loops = loops_per_jiffy * jiffies_per_sec * delay_us / us_per_sec
|
|
|
+ *
|
|
|
+ * where:
|
|
|
+ *
|
|
|
+ * jiffies_per_sec = HZ
|
|
|
+ * us_per_sec = 1000000
|
|
|
+ *
|
|
|
+ * Therefore the constant part is HZ / 1000000 which is a small
|
|
|
+ * fractional number. To make this usable with integer math, we
|
|
|
+ * scale up this constant by 2^31, perform the actual multiplication,
|
|
|
+ * and scale the result back down by 2^31 with a simple shift:
|
|
|
+ *
|
|
|
+ * loops = (loops_per_jiffy * delay_us * UDELAY_MULT) >> 31
|
|
|
+ *
|
|
|
+ * where:
|
|
|
+ *
|
|
|
+ * UDELAY_MULT = 2^31 * HZ / 1000000
|
|
|
+ * = (2^31 / 1000000) * HZ
|
|
|
+ * = 2147.483648 * HZ
|
|
|
+ * = 2147 * HZ + 483648 * HZ / 1000000
|
|
|
+ *
|
|
|
+ * 31 is the biggest scale shift value that won't overflow 32 bits for
|
|
|
+ * delay_us * UDELAY_MULT assuming HZ <= 1000 and delay_us <= 2000.
|
|
|
+ */
|
|
|
#define MAX_UDELAY_MS 2
|
|
|
#define UDELAY_MULT UL(2147 * HZ + 483648 * HZ / 1000000)
|
|
|
#define UDELAY_SHIFT 31
|