From a72b0ea913ce5463179be1161d32557712649219 Mon Sep 17 00:00:00 2001 From: Seth Forshee Date: Mon, 14 Jan 2013 09:52:16 -0600 Subject: [PATCH] ACPI: Disable Windows 8 compatibility for Lenovo ThinkPad T430s and X230 The AML implementation for brightness control on these machines contains a workaround to meet the Windows 8 requirement of 101 brightness levels. This implementation is flawed, as only 16 of the brighness values reported by _BCL affect a change in brightness. _BCM silently discards the rest of the values. Disabling Windows 8 compatibility on these machines reverts them to the old behavior, making _BCL only report the 16 brightness levels which actually work. Add a quirk to do this along with a dmi callback to disable Win8 compatibility. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=51231 BugLink: http://bugs.launchpad.net/bugs/1098216 Signed-off-by: Seth Forshee --- drivers/acpi/blacklist.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index cb96296..63d6e35 100644 --- a/drivers/acpi/blacklist.c +++ b/drivers/acpi/blacklist.c @@ -193,6 +193,13 @@ static int __init dmi_disable_osi_win7(const struct dmi_system_id *d) return 0; } +static int __init dmi_disable_osi_win8(const struct dmi_system_id *d) +{ + printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); + acpi_osi_setup("!Windows 2012"); + return 0; +} + static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { { .callback = dmi_disable_osi_vista, @@ -269,6 +276,29 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { }, /* + * The following Lenovo models have a broken workaround in the + * acpi_video backlight implementation to meet the Windows 8 + * requirement of 101 backlight levels. Reverting to pre-Win8 + * behavoir fixes the problem. + */ + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad Edge E330", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Edge E330"), + }, + }, + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad E330", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad E330"), + }, + }, + + /* * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. * Linux ignores it, except for the machines enumerated below. */ -- 1.7.9.5