powerpc: Fix delay functions for 601 processors
My earlier merge of delay.h introduced a timebase-based udelay for 32-bit machines but also broke the 601, which doesn't have the timebase register. This fixes it by using the 601's RTC register on the 601, and also moves __delay() and udelay() to be out-of-line in arch/powerpc/kernel/time.c. These functions aren't really performance critical, after all. Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
@@ -130,6 +130,34 @@ unsigned long tb_last_stamp;
|
||||
*/
|
||||
DEFINE_PER_CPU(unsigned long, last_jiffy);
|
||||
|
||||
void __delay(unsigned long loops)
|
||||
{
|
||||
unsigned long start;
|
||||
int diff;
|
||||
|
||||
if (__USE_RTC()) {
|
||||
start = get_rtcl();
|
||||
do {
|
||||
/* the RTCL register wraps at 1000000000 */
|
||||
diff = get_rtcl() - start;
|
||||
if (diff < 0)
|
||||
diff += 1000000000;
|
||||
} while (diff < loops);
|
||||
} else {
|
||||
start = get_tbl();
|
||||
while (get_tbl() - start < loops)
|
||||
HMT_low();
|
||||
HMT_medium();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(__delay);
|
||||
|
||||
void udelay(unsigned long usecs)
|
||||
{
|
||||
__delay(tb_ticks_per_usec * usecs);
|
||||
}
|
||||
EXPORT_SYMBOL(udelay);
|
||||
|
||||
static __inline__ void timer_check_rtc(void)
|
||||
{
|
||||
/*
|
||||
|
Reference in New Issue
Block a user