2.6.7-mm6, port ACPI sleep workaround to new DMI probing
cover 2.6.7-mm6, port ACPI sleep workaround to new DMI probing
This patch moves Toshiba ACPI sleep workaround out of dmi_scan.c
Please consider applying.
Signed-off-by Andrey Panin <[email protected]>
arch/i386/kernel/dmi_scan.c | 14 -------------- drivers/acpi/sleep/main.c | 29 +++++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 16 deletions(-)
arch/i386/kernel/dmi_scan.c +0 -14
@@ -195,16 +195,6 @@ static __init int broken_toshiba_keyboarreturn 0 ; } -/* -* Toshiba fails to preserve interrupts over S1 -*/ - -static __init int init_ints_after_s1 (struct dmi_blacklist *d) -{ -printk (KERN_WARNING "Toshiba with broken S1 detected.\n" ); - dmi_broken |=BROKEN_INIT_AFTER_S1 ; -return 0 ; -}#ifdef CONFIG_ACPI_SLEEP static __init int reset_videomode_after_s3 (struct dmi_blacklist *d)
@@ -323,10 +313,6 @@ static __initdata struct dmi_blacklist d } }, { broken_toshiba_keyboard, "Toshiba Satellite 4030cdt", { /* Keyboard generates spurious repeats */ -MATCH (DMI_PRODUCT_NAME ,"S4030CDT/4.3" ), -NO_MATCH ,NO_MATCH ,NO_MATCH - } }, - { init_ints_after_s1, "Toshiba Satellite 4030cdt", { /* Reinitialization of 8259 is needed after S1 resume */MATCH (DMI_PRODUCT_NAME ,"S4030CDT/4.3" ),NO_MATCH ,NO_MATCH ,NO_MATCH } },
drivers/acpi/sleep/main.c +27 -2
@@ -10,6 +10,7 @@#include <linux/delay.h> #include <linux/irq.h> +#include <linux/dmi.h> #include <linux/device.h> #include <linux/suspend.h> #include <acpi/acpi_bus.h>
@@ -30,6 +31,8 @@ static u32 acpi_suspend_states[] = { [PM_SUSPEND_DISK] = ACPI_STATE_S4, }; +static int init_8259A_after_S1; +/** * acpi_pm_prepare - Do preliminary suspend work. * @pm_state: suspend state we're entering.
@@ -140,7 +143,7 @@ static int acpi_pm_finish(u32 pm_state)/* reset firmware waking vector */ acpi_set_firmware_waking_vector ((acpi_physical_address )0 ); -if (dmi_broken &BROKEN_INIT_AFTER_S1 ) { +if (init_8259A_after_S1) {printk ("Broken toshiba laptop -> kicking interrupts\n" );init_8259A (0 ); }
@@ -161,16 +164,38 @@ int acpi_suspend(u32 acpi_state)return -EINVAL ; } -static struct pm_ops acpi_pm_ops = { .prepare = acpi_pm_prepare, .enter = acpi_pm_enter, .finish = acpi_pm_finish, }; + +/* +* Toshiba fails to preserve interrupts over S1, reinitialization +* of 8259 is needed after S1 resume. +*/ +static int __init init_ints_after_s1 (struct dmi_system_id *d) +{ +printk (KERN_WARNING "%s with broken S1 detected.\n" , d->ident); + init_8259A_after_S1 =1 ; +return 0 ; +} + +static struct dmi_system_id __initdata acpisleep_dmi_table[] = { + { + .callback = init_ints_after_s1, + .ident ="Toshiba Satellite 4030cdt" , + .matches = {DMI_MATCH (DMI_PRODUCT_NAME ,"S4030CDT/4.3" ), }, + }, + { }, +}; +static int __init acpi_sleep_init (void ) {int i =0 ; + +dmi_check_system (acpisleep_dmi_table);if (acpi_disabled)return 0 ;
PATCH 1/1 2.6.7-mm6, DMI isn't broken anymore
This patch removes dmi_broken global variable which is not used anymore.
Please consider applying.
Signed-off-by Andrey Panin <[email protected]>
arch/i386/kernel/dmi_scan.c | 2 -- include/asm-i386/system.h | 6 ------ include/asm-x86_64/acpi.h | 4 ---- 3 files changed, 12 deletions(-)
arch/i386/kernel/dmi_scan.c +0 -2
@@ -11,8 +11,6 @@#include <linux/dmi.h> #include <linux/bootmem.h> -unsigned long dmi_broken; -EXPORT_SYMBOL (dmi_broken);int es7000_plat =0 ;
include/asm-i386/system.h +0 -6
@@ -465,12 +465,6 @@ struct alt_instr {void disable_hlt (void );void enable_hlt (void ); -extern unsigned long dmi_broken;extern int es7000_plat; - -#define BROKEN_ACPI_Sx 0x0001 -#define BROKEN_INIT_AFTER_S1 0x0002 -#define BROKEN_PNP_BIOS 0x0004 -#define BROKEN_CPUFREQ 0x0008#endif
include/asm-x86_64/acpi.h +0 -4
@@ -159,10 +159,6 @@ extern void acpi_reserve_bootmem(void);extern int acpi_disabled;extern int acpi_pci_disabled; -#define dmi_broken (0) -#define BROKEN_ACPI_Sx 0x0001 -#define BROKEN_INIT_AFTER_S1 0x0002 -#endif /*__KERNEL__*/ #endif /*_ASM_ACPI_H*/