diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-04-03 16:35:09 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-03 16:35:09 +0200 |
commit | 484cad34dd667235565c14a40e2f5a8143184aaa (patch) | |
tree | 70bb901671958960a64d7f383c902178b4b49558 /drivers/char/hpet.c | |
parent | 95a38f34635bdf06089de763b4becbc957694977 (diff) | |
parent | 67796bf7dc54c035fd97f2681a72e5d2bf2a234a (diff) | |
download | op-kernel-dev-484cad34dd667235565c14a40e2f5a8143184aaa.zip op-kernel-dev-484cad34dd667235565c14a40e2f5a8143184aaa.tar.gz |
Merge branch 'dma-debug' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/linux-2.6-iommu into x86/urgent
Diffstat (limited to 'drivers/char/hpet.c')
-rw-r--r-- | drivers/char/hpet.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 32b8bbf..50dfa3b 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c @@ -713,7 +713,7 @@ static struct ctl_table_header *sysctl_header; */ #define TICK_CALIBRATE (1000UL) -static unsigned long hpet_calibrate(struct hpets *hpetp) +static unsigned long __hpet_calibrate(struct hpets *hpetp) { struct hpet_timer __iomem *timer = NULL; unsigned long t, m, count, i, flags, start; @@ -750,6 +750,26 @@ static unsigned long hpet_calibrate(struct hpets *hpetp) return (m - start) / i; } +static unsigned long hpet_calibrate(struct hpets *hpetp) +{ + unsigned long ret = -1; + unsigned long tmp; + + /* + * Try to calibrate until return value becomes stable small value. + * If SMI interruption occurs in calibration loop, the return value + * will be big. This avoids its impact. + */ + for ( ; ; ) { + tmp = __hpet_calibrate(hpetp); + if (ret <= tmp) + break; + ret = tmp; + } + + return ret; +} + int hpet_alloc(struct hpet_data *hdp) { u64 cap, mcfg; |