diff options
author | Josh Boyer <jwboyer@fedoraproject.org> | 2014-06-03 10:03:36 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@fedoraproject.org> | 2014-06-03 10:14:23 -0400 |
commit | e6a4d30f1b5f845c8871fd6cc0f41737995431a3 (patch) | |
tree | 3761305fcfcb53150827196a1c00d417af8a5e1e | |
parent | 51fdf98b4786bf43e0b3ae63faca3d2a4888de8f (diff) | |
download | kernel-e6a4d30f1b5f845c8871fd6cc0f41737995431a3.tar.gz kernel-e6a4d30f1b5f845c8871fd6cc0f41737995431a3.tar.xz kernel-e6a4d30f1b5f845c8871fd6cc0f41737995431a3.zip |
Use native backlight for newer laptop models with nvidia and ati GPUs (rhbz 1093171)
From: Hans de Goede <hdegoede@redhat.com>
-rw-r--r-- | acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch | 45 | ||||
-rw-r--r-- | acpi-video-Unregister-the-backlight-device-if-a-raw-.patch | 130 | ||||
-rw-r--r-- | backlight-Add-backlight-device-un-registration-notif.patch | 132 | ||||
-rw-r--r-- | kernel.spec | 9 | ||||
-rw-r--r-- | nouveau-Don-t-check-acpi_video_backlight_support-bef.patch | 79 |
5 files changed, 394 insertions, 1 deletions
diff --git a/acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch b/acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch new file mode 100644 index 000000000..f3d36889f --- /dev/null +++ b/acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch @@ -0,0 +1,45 @@ +Bugzilla: 1093171 +Upstream-status: Queued for 3.16 + +From 7ac976d0109433d1ad0812f4f6889a904d9a0c40 Mon Sep 17 00:00:00 2001 +From: Hans de Goede <hdegoede@redhat.com> +Date: Mon, 2 Jun 2014 17:41:10 +0200 +Subject: [PATCH 13/14] acpi-video: Add use native backlight quirk for the + ThinkPad W530 + +Like all of the other *30 ThinkPad models, the W530 has a broken acpi-video +backlight control. Note in order for this to actually fix things on the +ThinkPad W530 the commit titled: +"nouveau: Don't check acpi_video_backlight_support() before registering backlight" +is also needed. + +https://bugzilla.redhat.com/show_bug.cgi?id=1093171 + +Cc: stable@vger.kernel.org +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/acpi/video.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c +index ab7cd65ce21e..dcb0ef4c22f6 100644 +--- a/drivers/acpi/video.c ++++ b/drivers/acpi/video.c +@@ -468,6 +468,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { + }, + { + .callback = video_set_use_native_backlight, ++ .ident = "ThinkPad W530", ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad W530"), ++ }, ++ }, ++ { ++ .callback = video_set_use_native_backlight, + .ident = "ThinkPad X230", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), +-- +1.9.0 + diff --git a/acpi-video-Unregister-the-backlight-device-if-a-raw-.patch b/acpi-video-Unregister-the-backlight-device-if-a-raw-.patch new file mode 100644 index 000000000..f922d4235 --- /dev/null +++ b/acpi-video-Unregister-the-backlight-device-if-a-raw-.patch @@ -0,0 +1,130 @@ +Bugzilla: 1093171 +Upstream-status: Queued for 3.16 + +From 7f5b3e9378c0adfdb1cf2ffde6c4f890e05517c7 Mon Sep 17 00:00:00 2001 +From: Hans de Goede <hdegoede@redhat.com> +Date: Mon, 2 Jun 2014 17:41:09 +0200 +Subject: [PATCH 12/14] acpi-video: Unregister the backlight device if a raw + one shows up later + +When video.use_native_backlight=1 and non intel gfx are in use, the raw +backlight device of the gfx driver will show up after acpi-video has done its +acpi_video_verify_backlight_support() check. + +This causes video.use_native_backlight=1 to not have the desired result. + +This patch fixes this by adding a backlight notifier and when a raw +backlight is registered or unregistered re-doing the +acpi_video_verify_backlight_support() check. + +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/acpi/video.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 57 insertions(+) + +diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c +index d4d6ea3ac77a..ab7cd65ce21e 100644 +--- a/drivers/acpi/video.c ++++ b/drivers/acpi/video.c +@@ -151,6 +151,7 @@ struct acpi_video_enumerated_device { + struct acpi_video_bus { + struct acpi_device *device; + bool backlight_registered; ++ bool backlight_notifier_registered; + u8 dos_setting; + struct acpi_video_enumerated_device *attached_array; + u8 attached_count; +@@ -162,6 +163,7 @@ struct acpi_video_bus { + struct input_dev *input; + char phys[32]; /* for input device */ + struct notifier_block pm_nb; ++ struct notifier_block backlight_nb; + }; + + struct acpi_video_device_flags { +@@ -1732,6 +1734,9 @@ static int acpi_video_bus_register_backlight(struct acpi_video_bus *video) + { + struct acpi_video_device *dev; + ++ if (video->backlight_registered) ++ return 0; ++ + if (!acpi_video_verify_backlight_support()) + return 0; + +@@ -1876,6 +1881,56 @@ static void acpi_video_bus_remove_notify_handler(struct acpi_video_bus *video) + video->input = NULL; + } + ++static int acpi_video_backlight_notify(struct notifier_block *nb, ++ unsigned long val, void *bd) ++{ ++ struct backlight_device *backlight = bd; ++ struct acpi_video_bus *video; ++ ++ /* acpi_video_verify_backlight_support only cares about raw devices */ ++ if (backlight->props.type != BACKLIGHT_RAW) ++ return NOTIFY_DONE; ++ ++ video = container_of(nb, struct acpi_video_bus, backlight_nb); ++ ++ switch (val) { ++ case BACKLIGHT_REGISTERED: ++ if (!acpi_video_verify_backlight_support()) ++ acpi_video_bus_unregister_backlight(video); ++ break; ++ case BACKLIGHT_UNREGISTERED: ++ acpi_video_bus_register_backlight(video); ++ break; ++ } ++ ++ return NOTIFY_OK; ++} ++ ++static int acpi_video_bus_add_backlight_notify_handler( ++ struct acpi_video_bus *video) ++{ ++ int error; ++ ++ video->backlight_nb.notifier_call = acpi_video_backlight_notify; ++ video->backlight_nb.priority = 0; ++ error = backlight_register_notifier(&video->backlight_nb); ++ if (error == 0) ++ video->backlight_notifier_registered = true; ++ ++ return error; ++} ++ ++static int acpi_video_bus_remove_backlight_notify_handler( ++ struct acpi_video_bus *video) ++{ ++ if (!video->backlight_notifier_registered) ++ return 0; ++ ++ video->backlight_notifier_registered = false; ++ ++ return backlight_unregister_notifier(&video->backlight_nb); ++} ++ + static int acpi_video_bus_put_devices(struct acpi_video_bus *video) + { + struct acpi_video_device *dev, *next; +@@ -1957,6 +2012,7 @@ static int acpi_video_bus_add(struct acpi_device *device) + + acpi_video_bus_register_backlight(video); + acpi_video_bus_add_notify_handler(video); ++ acpi_video_bus_add_backlight_notify_handler(video); + + return 0; + +@@ -1980,6 +2036,7 @@ static int acpi_video_bus_remove(struct acpi_device *device) + + video = acpi_driver_data(device); + ++ acpi_video_bus_remove_backlight_notify_handler(video); + acpi_video_bus_remove_notify_handler(video); + acpi_video_bus_unregister_backlight(video); + acpi_video_bus_put_devices(video); +-- +1.9.0 + diff --git a/backlight-Add-backlight-device-un-registration-notif.patch b/backlight-Add-backlight-device-un-registration-notif.patch new file mode 100644 index 000000000..a411bb9cb --- /dev/null +++ b/backlight-Add-backlight-device-un-registration-notif.patch @@ -0,0 +1,132 @@ +Bugzilla: 1093171 +Upstream-status: Queued for 3.16 + +From ee515e61a002b4d571407173ac8bbadadc114cf0 Mon Sep 17 00:00:00 2001 +From: Hans de Goede <hdegoede@redhat.com> +Date: Mon, 2 Jun 2014 17:41:08 +0200 +Subject: [PATCH 11/14] backlight: Add backlight device (un)registration + notification + +Some firmware drivers, ie acpi-video want to get themselves out of the +way (in some cases) when their also is a raw backlight device available. + +Due to module loading ordering being unknown, acpi-video cannot be certain +that the backlight_device_registered(BACKLIGHT_RAW) it does for this is +the final verdict wrt there being a BACKLIGHT_RAW device. + +By adding notification acpi-video can listen for backlight devices showing +up after it has loaded, and unregister its backlight device if desired. + +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/video/backlight/backlight.c | 40 +++++++++++++++++++++++++++++++++++++ + include/linux/backlight.h | 7 +++++++ + 2 files changed, 47 insertions(+) + +diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c +index bd2172c2d650..428089009cd5 100644 +--- a/drivers/video/backlight/backlight.c ++++ b/drivers/video/backlight/backlight.c +@@ -23,6 +23,7 @@ + + static struct list_head backlight_dev_list; + static struct mutex backlight_dev_list_mutex; ++static struct blocking_notifier_head backlight_notifier; + + static const char *const backlight_types[] = { + [BACKLIGHT_RAW] = "raw", +@@ -370,6 +371,9 @@ struct backlight_device *backlight_device_register(const char *name, + list_add(&new_bd->entry, &backlight_dev_list); + mutex_unlock(&backlight_dev_list_mutex); + ++ blocking_notifier_call_chain(&backlight_notifier, ++ BACKLIGHT_REGISTERED, new_bd); ++ + return new_bd; + } + EXPORT_SYMBOL(backlight_device_register); +@@ -413,6 +417,10 @@ void backlight_device_unregister(struct backlight_device *bd) + pmac_backlight = NULL; + mutex_unlock(&pmac_backlight_mutex); + #endif ++ ++ blocking_notifier_call_chain(&backlight_notifier, ++ BACKLIGHT_UNREGISTERED, bd); ++ + mutex_lock(&bd->ops_lock); + bd->ops = NULL; + mutex_unlock(&bd->ops_lock); +@@ -438,6 +446,36 @@ static int devm_backlight_device_match(struct device *dev, void *res, + } + + /** ++ * backlight_register_notifier - get notified of backlight (un)registration ++ * @nb: notifier block with the notifier to call on backlight (un)registration ++ * ++ * @return 0 on success, otherwise a negative error code ++ * ++ * Register a notifier to get notified when backlight devices get registered ++ * or unregistered. ++ */ ++int backlight_register_notifier(struct notifier_block *nb) ++{ ++ return blocking_notifier_chain_register(&backlight_notifier, nb); ++} ++EXPORT_SYMBOL(backlight_register_notifier); ++ ++/** ++ * backlight_unregister_notifier - unregister a backlight notifier ++ * @nb: notifier block to unregister ++ * ++ * @return 0 on success, otherwise a negative error code ++ * ++ * Register a notifier to get notified when backlight devices get registered ++ * or unregistered. ++ */ ++int backlight_unregister_notifier(struct notifier_block *nb) ++{ ++ return blocking_notifier_chain_unregister(&backlight_notifier, nb); ++} ++EXPORT_SYMBOL(backlight_unregister_notifier); ++ ++/** + * devm_backlight_device_register - resource managed backlight_device_register() + * @dev: the device to register + * @name: the name of the device +@@ -544,6 +582,8 @@ static int __init backlight_class_init(void) + backlight_class->pm = &backlight_class_dev_pm_ops; + INIT_LIST_HEAD(&backlight_dev_list); + mutex_init(&backlight_dev_list_mutex); ++ BLOCKING_INIT_NOTIFIER_HEAD(&backlight_notifier); ++ + return 0; + } + +diff --git a/include/linux/backlight.h b/include/linux/backlight.h +index 72647429adf6..adb14a8616df 100644 +--- a/include/linux/backlight.h ++++ b/include/linux/backlight.h +@@ -40,6 +40,11 @@ enum backlight_type { + BACKLIGHT_TYPE_MAX, + }; + ++enum backlight_notification { ++ BACKLIGHT_REGISTERED, ++ BACKLIGHT_UNREGISTERED, ++}; ++ + struct backlight_device; + struct fb_info; + +@@ -133,6 +138,8 @@ extern void devm_backlight_device_unregister(struct device *dev, + extern void backlight_force_update(struct backlight_device *bd, + enum backlight_update_reason reason); + extern bool backlight_device_registered(enum backlight_type type); ++extern int backlight_register_notifier(struct notifier_block *nb); ++extern int backlight_unregister_notifier(struct notifier_block *nb); + + #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev) + +-- +1.9.0 + diff --git a/kernel.spec b/kernel.spec index 4bd07a5d3..ede3b16be 100644 --- a/kernel.spec +++ b/kernel.spec @@ -653,7 +653,10 @@ Patch26006: acpi-video-Don-t-register-acpi_video_resume-notifier.patch Patch26007: acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch Patch26008: acer-wmi-Switch-to-acpi_video_unregister_backlight.patch Patch26009: acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch - +Patch26010: nouveau-Don-t-check-acpi_video_backlight_support-bef.patch +Patch26011: backlight-Add-backlight-device-un-registration-notif.patch +Patch26012: acpi-video-Unregister-the-backlight-device-if-a-raw-.patch +Patch26013: acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch # END OF PATCH DEFINITIONS %endif @@ -1383,6 +1386,10 @@ ApplyPatch acpi-video-Don-t-register-acpi_video_resume-notifier.patch ApplyPatch acpi-video-Add-an-acpi_video_unregister_backlight-fu.patch ApplyPatch acer-wmi-Switch-to-acpi_video_unregister_backlight.patch ApplyPatch acer-wmi-Add-Aspire-5741-to-video_vendor_dmi_table.patch +ApplyPatch nouveau-Don-t-check-acpi_video_backlight_support-bef.patch +ApplyPatch backlight-Add-backlight-device-un-registration-notif.patch +ApplyPatch acpi-video-Unregister-the-backlight-device-if-a-raw-.patch +ApplyPatch acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch # END OF PATCH APPLICATIONS diff --git a/nouveau-Don-t-check-acpi_video_backlight_support-bef.patch b/nouveau-Don-t-check-acpi_video_backlight_support-bef.patch new file mode 100644 index 000000000..b6ed45c39 --- /dev/null +++ b/nouveau-Don-t-check-acpi_video_backlight_support-bef.patch @@ -0,0 +1,79 @@ +Bugzilla: 1093171 +Upstream-status: Queued for 3.16 + +From abf17f7885656ccc181a608d2a9ee770b23d9e23 Mon Sep 17 00:00:00 2001 +From: Hans de Goede <hdegoede@redhat.com> +Date: Mon, 2 Jun 2014 17:41:07 +0200 +Subject: [PATCH 10/14] nouveau: Don't check acpi_video_backlight_support() + before registering backlight + +acpi_video_backlight_support() is supposed to be called by other (vendor +specific) firmware backlight controls, not by native / raw backlight controls +like nv_backlight. + +Userspace will normally prefer firmware interfaces over raw interfaces, so +if acpi_video backlight support is present it will use that even if +nv_backlight is registered as well. + +Except when video.use_native_backlight is present on the kernel cmdline +(or enabled through a dmi based quirk). As the name indicates the goal here +is to make only the raw interface available to userspace so that it will use +that (it only does this when it sees a win8 compliant bios). + +This is done by: +1) Not registering any acpi_video# backlight devices; and +2) Making acpi_video_backlight_support() return true so that other firmware +drivers, ie acer_wmi, thinkpad_acpi, dell_laptop, etc. Don't register their +own vender specific interfaces. + +Currently nouveau breaks this setup, as when acpi_video_backlight_support() +returns true, it does not register itself, resulting in no backlight control +at all. + +This is esp. going to be a problem with 3.16 which will default to +video.use_native_backlight=1, and thus nouveau based laptops with a win8 bios +will get no backlight control at all. + +This also likely explains why the previous attempt to make +video.use_native_backlight=1 the default was not a success, as without this +patch having a default of video.use_native_backlight=1 will cause regressions. + +Note this effectively reverts commit 5bead799 + +Also see: https://bugzilla.redhat.com/show_bug.cgi?id=1093171 + +Signed-off-by: Hans de Goede <hdegoede@redhat.com> +--- + drivers/gpu/drm/nouveau/nouveau_backlight.c | 9 --------- + 1 file changed, 9 deletions(-) + +diff --git a/drivers/gpu/drm/nouveau/nouveau_backlight.c b/drivers/gpu/drm/nouveau/nouveau_backlight.c +index 630f6e84fc01..2c1e4aad7da3 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_backlight.c ++++ b/drivers/gpu/drm/nouveau/nouveau_backlight.c +@@ -31,7 +31,6 @@ + */ + + #include <linux/backlight.h> +-#include <linux/acpi.h> + + #include "nouveau_drm.h" + #include "nouveau_reg.h" +@@ -222,14 +221,6 @@ nouveau_backlight_init(struct drm_device *dev) + struct nouveau_device *device = nv_device(drm->device); + struct drm_connector *connector; + +-#ifdef CONFIG_ACPI +- if (acpi_video_backlight_support()) { +- NV_INFO(drm, "ACPI backlight interface available, " +- "not registering our own\n"); +- return 0; +- } +-#endif +- + list_for_each_entry(connector, &dev->mode_config.connector_list, head) { + if (connector->connector_type != DRM_MODE_CONNECTOR_LVDS && + connector->connector_type != DRM_MODE_CONNECTOR_eDP) +-- +1.9.0 + |