On Tue, 09 Jun 2015, Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > On some systems acpi-video backlight is broken in the sense that it cannot > control the brightness of the backlight, but it must still be called on > resume to power-up the backlight after resume. > > This commit allows these systems to work by going through all the usual > backlight control moves, while not registering a sysfs backlight > interface. > > This commit also adds a quirk enabling this parameter on Toshiba Portege > R830 systems which are known to be affected by this. > > I wish there was a better way to deal with this, but we've been unable to > find one. > > Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=21012 > Buglink: https://bugs.freedesktop.org/show_bug.cgi?id=82634 > Reported-and-tested-by: Sylvain Pasche <sylvain.pasche@xxxxxxxxx> > Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > --- > Changes in v2: > -Simplify check in acpi_video_switch_brightness() > -If backlight registration fails set device->backlight to NULL, rather > then leaving the PTR_ERR in there and trying to deref this later > (this fixes a pre-existing bug) > --- > drivers/acpi/video.c | 43 +++++++++++++++++++++++++++++++++++++++---- > 1 file changed, 39 insertions(+), 4 deletions(-) > > diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c > index 518f0e1..3bc4c68 100644 > --- a/drivers/acpi/video.c > +++ b/drivers/acpi/video.c > @@ -92,6 +92,9 @@ static int use_native_backlight_param = NATIVE_BACKLIGHT_NOT_SET; > module_param_named(use_native_backlight, use_native_backlight_param, int, 0444); > static int use_native_backlight_dmi = NATIVE_BACKLIGHT_NOT_SET; > > +static int disable_backlight_sysfs_if = -1; > +module_param(disable_backlight_sysfs_if, int, 0444); Nitpick, I'd prefer positively named variables, like enable_foo to avoid the double negative !disable_foo. enable_foo and !enable_foo read much better. But up to Aaron and friends. BR, Jani. > + > static int register_count; > static struct mutex video_list_lock; > static struct list_head video_bus_head; > @@ -431,6 +434,14 @@ static int __init video_enable_native_backlight(const struct dmi_system_id *d) > return 0; > } > > +static int __init video_disable_backlight_sysfs_if( > + const struct dmi_system_id *d) > +{ > + if (disable_backlight_sysfs_if == -1) > + disable_backlight_sysfs_if = 1; > + return 0; > +} > + > static struct dmi_system_id video_dmi_table[] __initdata = { > /* > * Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121 > @@ -592,6 +603,23 @@ static struct dmi_system_id video_dmi_table[] __initdata = { > DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"), > }, > }, > + > + /* > + * Some machines have a broken acpi-video interface for brightness > + * control, but still need an acpi_video_device_lcd_set_level() call > + * on resume to turn the backlight power on. We Enable backlight > + * control on these systems, but do not register a backlight sysfs > + * as brightness control does not work. > + */ > + { > + /* https://bugs.freedesktop.org/show_bug.cgi?id=82634 */ > + .callback = video_disable_backlight_sysfs_if, > + .ident = "Toshiba Portege R830", > + .matches = { > + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), > + DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE R830"), > + }, > + }, > {} > }; > > @@ -1391,7 +1419,7 @@ acpi_video_switch_brightness(struct work_struct *work) > int result = -EINVAL; > > /* no warning message if acpi_backlight=vendor or a quirk is used */ > - if (!acpi_video_verify_backlight_support()) > + if (!device->backlight) > return; > > if (!device->brightness) > @@ -1666,8 +1694,9 @@ static int acpi_video_resume(struct notifier_block *nb, > > for (i = 0; i < video->attached_count; i++) { > video_device = video->attached_array[i].bind_info; > - if (video_device && video_device->backlight) > - acpi_video_set_brightness(video_device->backlight); > + if (video_device && video_device->brightness) > + acpi_video_device_lcd_set_level(video_device, > + video_device->brightness->curr); > } > > return NOTIFY_OK; > @@ -1716,6 +1745,10 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device) > result = acpi_video_init_brightness(device); > if (result) > return; > + > + if (disable_backlight_sysfs_if > 0) > + return; > + > name = kasprintf(GFP_KERNEL, "acpi_video%d", count); > if (!name) > return; > @@ -1738,8 +1771,10 @@ static void acpi_video_dev_register_backlight(struct acpi_video_device *device) > &acpi_backlight_ops, > &props); > kfree(name); > - if (IS_ERR(device->backlight)) > + if (IS_ERR(device->backlight)) { > + device->backlight = NULL; > return; > + } > > /* > * Save current brightness level in case we have to restore it > -- > 2.4.2 > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/dri-devel -- Jani Nikula, Intel Open Source Technology Center -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html