@@ -13,14 +13,38 @@
#ifndef ASM_S390X_TIME_H
#define ASM_S390X_TIME_H
-static inline uint64_t get_clock_ms(void)
+#define STCK_SHIFT_US (63 - 51)
+#define STCK_MAX ((1UL << 52) - 1)
+
+static inline uint64_t get_clock_us(void)
{
uint64_t clk;
asm volatile(" stck %0 " : : "Q"(clk) : "memory");
- /* Bit 51 is incrememented each microsecond */
- return (clk >> (63 - 51)) / 1000;
+ return clk >> STCK_SHIFT_US;
+}
+
+static inline uint64_t get_clock_ms(void)
+{
+ return get_clock_us() / 1000;
+}
+
+static inline void udelay(unsigned long us)
+{
+ unsigned long startclk = get_clock_us();
+ unsigned long c;
+
+ do {
+ c = get_clock_us();
+ if (c < startclk)
+ c += STCK_MAX;
+ } while (c < startclk + us);
+}
+
+static inline void mdelay(unsigned long ms)
+{
+ udelay(ms * 1000);
}
#endif