1/* delay.h: FRV delay code 2 * 3 * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. 4 * Written by David Howells (dhowells@redhat.com) 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License 8 * as published by the Free Software Foundation; either version 9 * 2 of the License, or (at your option) any later version. 10 */ 11 12#ifndef _ASM_DELAY_H 13#define _ASM_DELAY_H 14 15#include <asm/param.h> 16#include <asm/timer-regs.h> 17 18/* 19 * delay loop - runs at __core_clock_speed_HZ / 2 [there are 2 insns in the loop] 20 */ 21extern unsigned long __delay_loops_MHz; 22 23static inline void __delay(unsigned long loops) 24{ 25 asm volatile("1: subicc %0,#1,%0,icc0 \n" 26 " bnc icc0,#2,1b \n" 27 : "=r" (loops) 28 : "0" (loops) 29 : "icc0" 30 ); 31} 32 33/* 34 * Use only for very small delays ( < 1 msec). Should probably use a 35 * lookup table, really, as the multiplications take much too long with 36 * short delays. This is a "reasonable" implementation, though (and the 37 * first constant multiplications gets optimized away if the delay is 38 * a constant) 39 */ 40 41extern unsigned long loops_per_jiffy; 42 43static inline void udelay(unsigned long usecs) 44{ 45 __delay(usecs * __delay_loops_MHz); 46} 47 48#define ndelay(n) udelay((n) * 5) 49 50#endif /* _ASM_DELAY_H */ 51