From 2139cca802c8ade7571d78caef58475bac7771a7 Mon Sep 17 00:00:00 2001 From: Yasunori Goto Date: Thu, 2 Apr 2009 16:58:31 -0700 Subject: [PATCH] --- yaml --- r: 139706 b: refs/heads/master c: 303d379c54fc9ed553562e36c1cbd1791a3f5d17 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/char/hpet.c | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 5eff974e1615..67d3f41e48d2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1f80769ffd36e74357fe896dc43dddf1af1510f3 +refs/heads/master: 303d379c54fc9ed553562e36c1cbd1791a3f5d17 diff --git a/trunk/drivers/char/hpet.c b/trunk/drivers/char/hpet.c index 32b8bbf5003e..50dfa3bc71ce 100644 --- a/trunk/drivers/char/hpet.c +++ b/trunk/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;