diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2007-02-16 01:27:57 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-16 08:13:58 -0800 | 
| commit | d66bea57e779cd592657cca6e61345ae899b78d9 (patch) | |
| tree | 70fe41bf930ac96a59d594ba5a37272a3df775e0 | |
| parent | 169a0abbe32813af4904cc1605c0f7ea0534f77b (diff) | |
| download | olio-linux-3.10-d66bea57e779cd592657cca6e61345ae899b78d9.tar.xz olio-linux-3.10-d66bea57e779cd592657cca6e61345ae899b78d9.zip  | |
[PATCH] Allow early access to the power management timer
Allow early access to the power management timer by exposing the verified read
function and providing a helper function which checks the pmtmr_ioport
variable and returns either the pm timer readout or 0 in case the pm timer is
not available.
Create a new header file and replace also the ifdef'ed extern definition in
arch/i386/kernel/acpi/boot.c
This is a preperatory patch for the rework of the local apic timer
calibration.
No functional changes.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: john stultz <johnstul@us.ibm.com>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | arch/i386/kernel/acpi/boot.c | 5 | ||||
| -rw-r--r-- | drivers/clocksource/acpi_pm.c | 17 | ||||
| -rw-r--r-- | include/linux/acpi_pmtmr.h | 38 | 
3 files changed, 48 insertions, 12 deletions
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index e94aff6888c..56818cf5bc4 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c @@ -25,6 +25,7 @@  #include <linux/init.h>  #include <linux/acpi.h> +#include <linux/acpi_pmtmr.h>  #include <linux/efi.h>  #include <linux/cpumask.h>  #include <linux/module.h> @@ -676,10 +677,6 @@ static int __init acpi_parse_hpet(struct acpi_table_header *table)  #define	acpi_parse_hpet	NULL  #endif -#ifdef CONFIG_X86_PM_TIMER -extern u32 pmtmr_ioport; -#endif -  static int __init acpi_parse_fadt(struct acpi_table_header *table)  { diff --git a/drivers/clocksource/acpi_pm.c b/drivers/clocksource/acpi_pm.c index c7276a61695..ccaa6a39cb4 100644 --- a/drivers/clocksource/acpi_pm.c +++ b/drivers/clocksource/acpi_pm.c @@ -16,15 +16,13 @@   * This file is licensed under the GPL v2.   */ +#include <linux/acpi_pmtmr.h>  #include <linux/clocksource.h>  #include <linux/errno.h>  #include <linux/init.h>  #include <linux/pci.h>  #include <asm/io.h> -/* Number of PMTMR ticks expected during calibration run */ -#define PMTMR_TICKS_PER_SEC 3579545 -  /*   * The I/O port the PMTMR resides at.   * The location is detected during setup_arch(), @@ -32,15 +30,13 @@   */  u32 pmtmr_ioport __read_mostly; -#define ACPI_PM_MASK CLOCKSOURCE_MASK(24) /* limit it to 24 bits */ -  static inline u32 read_pmtmr(void)  {  	/* mask the output to 24 bits */  	return inl(pmtmr_ioport) & ACPI_PM_MASK;  } -static cycle_t acpi_pm_read_verified(void) +u32 acpi_pm_read_verified(void)  {  	u32 v1 = 0, v2 = 0, v3 = 0; @@ -57,7 +53,12 @@ static cycle_t acpi_pm_read_verified(void)  	} while (unlikely((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1)  			  || (v3 > v1 && v3 < v2))); -	return (cycle_t)v2; +	return v2; +} + +static cycle_t acpi_pm_read_slow(void) +{ +	return (cycle_t)acpi_pm_read_verified();  }  static cycle_t acpi_pm_read(void) @@ -88,7 +89,7 @@ __setup("acpi_pm_good", acpi_pm_good_setup);  static inline void acpi_pm_need_workaround(void)  { -	clocksource_acpi_pm.read = acpi_pm_read_verified; +	clocksource_acpi_pm.read = acpi_pm_read_slow;  	clocksource_acpi_pm.rating = 110;  } diff --git a/include/linux/acpi_pmtmr.h b/include/linux/acpi_pmtmr.h new file mode 100644 index 00000000000..1d0ef1ae803 --- /dev/null +++ b/include/linux/acpi_pmtmr.h @@ -0,0 +1,38 @@ +#ifndef _ACPI_PMTMR_H_ +#define _ACPI_PMTMR_H_ + +#include <linux/clocksource.h> + +/* Number of PMTMR ticks expected during calibration run */ +#define PMTMR_TICKS_PER_SEC 3579545 + +/* limit it to 24 bits */ +#define ACPI_PM_MASK CLOCKSOURCE_MASK(24) + +/* Overrun value */ +#define ACPI_PM_OVRRUN	(1<<24) + +#ifdef CONFIG_X86_PM_TIMER + +extern u32 acpi_pm_read_verified(void); +extern u32 pmtmr_ioport; + +static inline u32 acpi_pm_read_early(void) +{ +	if (!pmtmr_ioport) +		return 0; +	/* mask the output to 24 bits */ +	return acpi_pm_read_verified() & ACPI_PM_MASK; +} + +#else + +static inline u32 acpi_pm_read_early(void) +{ +	return 0; +} + +#endif + +#endif +  |