// SPDX-License-Identifier: GPL-2.0 /* * Precise Delay Loops for S390 * * Copyright IBM Corp. 1999, 2008 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>, */ #include <linux/processor.h> #include <linux/delay.h> #include <asm/div64.h> #include <asm/timex.h> void __delay(unsigned long loops) { /* * Loop 'loops' times. Callers must not assume a specific * amount of time passes before this function returns. */ asm volatile("0: brct %0,0b" : : "d" ((loops/2) + 1)); } EXPORT_SYMBOL(__delay); static void delay_loop(unsigned long delta) { unsigned long end; end = get_tod_clock_monotonic() + delta; while (!tod_after(get_tod_clock_monotonic(), end)) cpu_relax(); } void __udelay(unsigned long usecs) { delay_loop(usecs << 12); } EXPORT_SYMBOL(__udelay); void __ndelay(unsigned long nsecs) { nsecs <<= 9; do_div(nsecs, 125); delay_loop(nsecs); } EXPORT_SYMBOL(__ndelay);