summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@fedoraproject.org>2014-06-03 10:03:36 -0400
committerJosh Boyer <jwboyer@fedoraproject.org>2014-06-03 10:14:23 -0400
commite6a4d30f1b5f845c8871fd6cc0f41737995431a3 (patch)
tree3761305fcfcb53150827196a1c00d417af8a5e1e
parent51fdf98b4786bf43e0b3ae63faca3d2a4888de8f (diff)
downloadkernel-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.patch45
-rw-r--r--acpi-video-Unregister-the-backlight-device-if-a-raw-.patch130
-rw-r--r--backlight-Add-backlight-device-un-registration-notif.patch132
-rw-r--r--kernel.spec9
-rw-r--r--nouveau-Don-t-check-acpi_video_backlight_support-bef.patch79
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
+