2012-03-05 11:49:33 +00:00
/*
* Delay loops based on the OpenRISC implementation .
*
* Copyright ( C ) 2012 ARM Limited
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*
* Author : Will Deacon < will . deacon @ arm . com >
*/
# include <linux/delay.h>
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/timex.h>
2017-10-13 14:32:56 +01:00
# include <clocksource/arm_arch_timer.h>
# define USECS_TO_CYCLES(time_usecs) \
xloops_to_cycles ( ( time_usecs ) * 0x10C7UL )
static inline unsigned long xloops_to_cycles ( unsigned long xloops )
{
return ( xloops * loops_per_jiffy * HZ ) > > 32 ;
}
2012-03-05 11:49:33 +00:00
void __delay ( unsigned long cycles )
{
cycles_t start = get_cycles ( ) ;
2017-10-13 14:32:56 +01:00
if ( arch_timer_evtstrm_available ( ) ) {
const cycles_t timer_evt_period =
USECS_TO_CYCLES ( ARCH_TIMER_EVT_STREAM_PERIOD_US ) ;
while ( ( get_cycles ( ) - start + timer_evt_period ) < cycles )
wfe ( ) ;
}
2012-03-05 11:49:33 +00:00
while ( ( get_cycles ( ) - start ) < cycles )
cpu_relax ( ) ;
}
EXPORT_SYMBOL ( __delay ) ;
inline void __const_udelay ( unsigned long xloops )
{
2017-10-13 14:32:56 +01:00
__delay ( xloops_to_cycles ( xloops ) ) ;
2012-03-05 11:49:33 +00:00
}
EXPORT_SYMBOL ( __const_udelay ) ;
void __udelay ( unsigned long usecs )
{
__const_udelay ( usecs * 0x10C7UL ) ; /* 2**32 / 1000000 (rounded up) */
}
EXPORT_SYMBOL ( __udelay ) ;
void __ndelay ( unsigned long nsecs )
{
__const_udelay ( nsecs * 0x5UL ) ; /* 2**32 / 1000000000 (rounded up) */
}
EXPORT_SYMBOL ( __ndelay ) ;