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