Use native backlight for newer laptop models with nvidia and ati GPUs (rhbz 1093171)
From: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
51fdf98b47
commit
e6a4d30f1b
45
acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch
Normal file
45
acpi-video-Add-use-native-backlight-quirk-for-the-Th.patch
Normal file
@ -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
|
||||
|
130
acpi-video-Unregister-the-backlight-device-if-a-raw-.patch
Normal file
130
acpi-video-Unregister-the-backlight-device-if-a-raw-.patch
Normal file
@ -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
|
||||
|
132
backlight-Add-backlight-device-un-registration-notif.patch
Normal file
132
backlight-Add-backlight-device-un-registration-notif.patch
Normal file
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
79
nouveau-Don-t-check-acpi_video_backlight_support-bef.patch
Normal file
79
nouveau-Don-t-check-acpi_video_backlight_support-bef.patch
Normal file
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user