Merge tag 'libnvdimm-for-6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm...
[linux-block.git] / arch / s390 / lib / delay.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
1da177e4 2/*
1da177e4
LT
3 * Precise Delay Loops for S390
4 *
a53c8fab 5 * Copyright IBM Corp. 1999, 2008
d3d238c7 6 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>,
1da177e4
LT
7 */
8
3da77cf3 9#include <linux/processor.h>
1da177e4 10#include <linux/delay.h>
b3966378 11#include <asm/div64.h>
3da77cf3 12#include <asm/timex.h>
1da177e4
LT
13
14void __delay(unsigned long loops)
15{
9aa10e79
HC
16 /*
17 * Loop 'loops' times. Callers must not assume a specific
18 * amount of time passes before this function returns.
19 */
94c12cc7 20 asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1));
1da177e4 21}
854508c0 22EXPORT_SYMBOL(__delay);
1da177e4 23
e0d62dcb 24static void delay_loop(unsigned long delta)
1da177e4 25{
dd6cfe55 26 unsigned long end;
d54853ef 27
e0d62dcb
HC
28 end = get_tod_clock_monotonic() + delta;
29 while (!tod_after(get_tod_clock_monotonic(), end))
30 cpu_relax();
d3d238c7 31}
d54853ef 32
dd6cfe55 33void __udelay(unsigned long usecs)
d3d238c7 34{
e0d62dcb 35 delay_loop(usecs << 12);
1da177e4 36}
1485c5c8 37EXPORT_SYMBOL(__udelay);
5a0d0e65 38
dd6cfe55 39void __ndelay(unsigned long nsecs)
b3966378 40{
b3966378
HC
41 nsecs <<= 9;
42 do_div(nsecs, 125);
e0d62dcb 43 delay_loop(nsecs);
b3966378
HC
44}
45EXPORT_SYMBOL(__ndelay);