18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * OpenRISC Linux
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Linux architectural port borrowing liberally from similar works of
68c2ecf20Sopenharmony_ci * others.  All original copyrights apply as per the original source
78c2ecf20Sopenharmony_ci * declaration.
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci * Modifications for the OpenRISC architecture:
108c2ecf20Sopenharmony_ci * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
118c2ecf20Sopenharmony_ci *
128c2ecf20Sopenharmony_ci * Precise Delay Loops
138c2ecf20Sopenharmony_ci */
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <linux/kernel.h>
168c2ecf20Sopenharmony_ci#include <linux/export.h>
178c2ecf20Sopenharmony_ci#include <linux/init.h>
188c2ecf20Sopenharmony_ci#include <asm/param.h>
198c2ecf20Sopenharmony_ci#include <asm/delay.h>
208c2ecf20Sopenharmony_ci#include <asm/timex.h>
218c2ecf20Sopenharmony_ci#include <asm/processor.h>
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciint read_current_timer(unsigned long *timer_value)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	*timer_value = get_cycles();
268c2ecf20Sopenharmony_ci	return 0;
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_civoid __delay(unsigned long cycles)
308c2ecf20Sopenharmony_ci{
318c2ecf20Sopenharmony_ci	cycles_t start = get_cycles();
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	while ((get_cycles() - start) < cycles)
348c2ecf20Sopenharmony_ci		cpu_relax();
358c2ecf20Sopenharmony_ci}
368c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__delay);
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciinline void __const_udelay(unsigned long xloops)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	unsigned long long loops;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	loops = (unsigned long long)xloops * loops_per_jiffy * HZ;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	__delay(loops >> 32);
458c2ecf20Sopenharmony_ci}
468c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__const_udelay);
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_civoid __udelay(unsigned long usecs)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	__const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__udelay);
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_civoid __ndelay(unsigned long nsecs)
558c2ecf20Sopenharmony_ci{
568c2ecf20Sopenharmony_ci	__const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */
578c2ecf20Sopenharmony_ci}
588c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__ndelay);
59