diff options
author | Ingo Molnar <mingo@elte.hu> | 2010-04-08 13:36:36 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-04-08 13:37:18 +0200 |
commit | ca7e0c612005937a4a5a75d3fed90459993de65c (patch) | |
tree | b574fc0f0189b52ffc87ba20c418228db556faa1 /arch/x86/kernel/hpet.c | |
parent | 8141d0050d76e5695011b5ab577ec66fb51a998c (diff) | |
parent | f5284e7635787224dda1a2bf82a4c56b1c75671f (diff) | |
download | talos-obmc-linux-ca7e0c612005937a4a5a75d3fed90459993de65c.tar.gz talos-obmc-linux-ca7e0c612005937a4a5a75d3fed90459993de65c.zip |
Merge branch 'linus' into perf/core
Semantic conflict: arch/x86/kernel/cpu/perf_event_intel_ds.c
Merge reason: pick up latest fixes, fix the conflict
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/hpet.c')
-rw-r--r-- | arch/x86/kernel/hpet.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index ee4fa1bfcb33..23b4ecdffa9b 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c @@ -4,6 +4,7 @@ #include <linux/sysdev.h> #include <linux/delay.h> #include <linux/errno.h> +#include <linux/slab.h> #include <linux/hpet.h> #include <linux/init.h> #include <linux/cpu.h> @@ -399,9 +400,15 @@ static int hpet_next_event(unsigned long delta, * then we might have a real hardware problem. We can not do * much about it here, but at least alert the user/admin with * a prominent warning. + * An erratum on some chipsets (ICH9,..), results in comparator read + * immediately following a write returning old value. Workaround + * for this is to read this value second time, when first + * read returns old value. */ - WARN_ONCE(hpet_readl(HPET_Tn_CMP(timer)) != cnt, + if (unlikely((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt)) { + WARN_ONCE(hpet_readl(HPET_Tn_CMP(timer)) != cnt, KERN_WARNING "hpet: compare register read back failed.\n"); + } return (s32)(hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0; } @@ -1143,6 +1150,7 @@ int hpet_set_periodic_freq(unsigned long freq) do_div(clc, freq); clc >>= hpet_clockevent.shift; hpet_pie_delta = clc; + hpet_pie_limit = 0; } return 1; } |