Message ID | 1366376372-4776-2-git-send-email-seth.forshee@canonical.com |
---|---|
State | New |
Headers | show |
Blech! How long do we get to carry this one ? Whomever applied this patch should also change the commit subject to include "(no-up)" so I don't have to think about why it isn't getting upstreamed for every subsequent release.
Ack and applied to Raring master-next. Also updated the commit subject to mark it as "no-up" per Tim's suggestion. Thanks, Leann On 04/19/2013 05:59 AM, Seth Forshee wrote: > The AML implementation for brightness control on several ThinkPads > contains a workaround to meet a Windows 8 requirement of 101 brightness > levels [1]. The 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. > > [1] http://msdn.microsoft.com/en-us/library/windows/hardware/jj128256.aspx > > Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=51231 > BugLink: http://bugs.launchpad.net/bugs/1098216 > Signed-off-by: Seth Forshee <seth.forshee@canonical.com> > --- > drivers/acpi/blacklist.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 70 insertions(+) > > diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c > index cb96296..13baad6 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,69 @@ 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 > + * behavior fixes the problem. > + */ > + { > + .callback = dmi_disable_osi_win8, > + .ident = "Lenovo ThinkPad L430", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L430"), > + }, > + }, > + { > + .callback = dmi_disable_osi_win8, > + .ident = "Lenovo ThinkPad T430s", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430s"), > + }, > + }, > + { > + .callback = dmi_disable_osi_win8, > + .ident = "Lenovo ThinkPad T530", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T530"), > + }, > + }, > + { > + .callback = dmi_disable_osi_win8, > + .ident = "Lenovo ThinkPad W530", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W530"), > + }, > + }, > + { > + .callback = dmi_disable_osi_win8, > + .ident = "Lenovo ThinkPad X1 Carbon", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X1 Carbon"), > + }, > + }, > + { > + .callback = dmi_disable_osi_win8, > + .ident = "Lenovo ThinkPad X230", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), > + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X230"), > + }, > + }, > + { > + .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"), > + }, > + }, > + > + /* > * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. > * Linux ignores it, except for the machines enumerated below. > */
diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c index cb96296..13baad6 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,69 @@ 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 + * behavior fixes the problem. + */ + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad L430", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L430"), + }, + }, + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad T430s", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430s"), + }, + }, + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad T530", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T530"), + }, + }, + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad W530", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W530"), + }, + }, + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad X1 Carbon", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X1 Carbon"), + }, + }, + { + .callback = dmi_disable_osi_win8, + .ident = "Lenovo ThinkPad X230", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X230"), + }, + }, + { + .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"), + }, + }, + + /* * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. * Linux ignores it, except for the machines enumerated below. */
The AML implementation for brightness control on several ThinkPads contains a workaround to meet a Windows 8 requirement of 101 brightness levels [1]. The 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. [1] http://msdn.microsoft.com/en-us/library/windows/hardware/jj128256.aspx Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=51231 BugLink: http://bugs.launchpad.net/bugs/1098216 Signed-off-by: Seth Forshee <seth.forshee@canonical.com> --- drivers/acpi/blacklist.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+)