summaryrefslogtreecommitdiffstats
path: root/arch/mips/include/asm/timex.h
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-09-23 13:24:10 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-09-23 13:24:10 -0700
commitdc4fea795bf7e3f80dbfa3a40b8ab89427e9aed5 (patch)
tree1926c96f145965c393a2c8ab523c327dd1a241cf /arch/mips/include/asm/timex.h
parentc8f2efc8f636506e0f0c2ba4035382076875f0c1 (diff)
parent9d23108df359e572a0dca0b631bfee9f5e0fa9ea (diff)
downloadlinux-dc4fea795bf7e3f80dbfa3a40b8ab89427e9aed5.tar.bz2
Merge branch 'master' into usb-next
We have USB fixes now in Linus's tree that we need to properly sort out with reverts and the like in the usb-next branch, so merge them together and do it by hand. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'arch/mips/include/asm/timex.h')
-rw-r--r--arch/mips/include/asm/timex.h33
1 files changed, 32 insertions, 1 deletions
diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h
index 6529704aa73a..c5424757da65 100644
--- a/arch/mips/include/asm/timex.h
+++ b/arch/mips/include/asm/timex.h
@@ -10,7 +10,9 @@
#ifdef __KERNEL__
+#include <asm/cpu-features.h>
#include <asm/mipsregs.h>
+#include <asm/cpu-type.h>
/*
* This is the clock rate of the i8253 PIT. A MIPS system may not have
@@ -33,9 +35,38 @@
typedef unsigned int cycles_t;
+/*
+ * On R4000/R4400 before version 5.0 an erratum exists such that if the
+ * cycle counter is read in the exact moment that it is matching the
+ * compare register, no interrupt will be generated.
+ *
+ * There is a suggested workaround and also the erratum can't strike if
+ * the compare interrupt isn't being used as the clock source device.
+ * However for now the implementaton of this function doesn't get these
+ * fine details right.
+ */
static inline cycles_t get_cycles(void)
{
- return 0;
+ switch (boot_cpu_type()) {
+ case CPU_R4400PC:
+ case CPU_R4400SC:
+ case CPU_R4400MC:
+ if ((read_c0_prid() & 0xff) >= 0x0050)
+ return read_c0_count();
+ break;
+
+ case CPU_R4000PC:
+ case CPU_R4000SC:
+ case CPU_R4000MC:
+ break;
+
+ default:
+ if (cpu_has_counter)
+ return read_c0_count();
+ break;
+ }
+
+ return 0; /* no usable counter */
}
#endif /* __KERNEL__ */