aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorAtsushi Nemoto <anemo@mba.ocn.ne.jp>2007-10-23 21:55:42 +0900
committerRalf Baechle <ralf@linux-mips.org>2007-10-29 19:35:35 +0000
commit3a6c43a78763da67d4049745ce35122734e89fbc (patch)
tree4889b4534b28629010d7a5e191edd43601b0cfe1 /arch
parent[MIPS] time: Fix cevt-r4k.c for 64-bit kernel (diff)
downloadlinux-dev-3a6c43a78763da67d4049745ce35122734e89fbc.tar.xz
linux-dev-3a6c43a78763da67d4049745ce35122734e89fbc.zip
[MIPS] time: Make c0_compare_int_usable faster
Try increasingly longer time periods starting of at 0x10 cycles. This should be fast on hardware and work nicely with emulators. Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/mips/kernel/cevt-r4k.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c
index 7274fd2513f9..a59f67ff301e 100644
--- a/arch/mips/kernel/cevt-r4k.c
+++ b/arch/mips/kernel/cevt-r4k.c
@@ -179,7 +179,7 @@ static int c0_compare_int_pending(void)
static int c0_compare_int_usable(void)
{
- const unsigned int delta = 0x300000;
+ unsigned int delta;
unsigned int cnt;
/*
@@ -192,9 +192,15 @@ static int c0_compare_int_usable(void)
return 0;
}
- cnt = read_c0_count();
- cnt += delta;
- write_c0_compare(cnt);
+ for (delta = 0x10; delta <= 0x400000; delta <<= 1) {
+ cnt = read_c0_count();
+ cnt += delta;
+ write_c0_compare(cnt);
+ irq_disable_hazard();
+ if ((int)(read_c0_count() - cnt) < 0)
+ break;
+ /* increase delta if the timer was already expired */
+ }
while ((int)(read_c0_count() - cnt) <= 0)
; /* Wait for expiry */