diff options
Diffstat (limited to 'acpi-video-Unregister-the-backlight-device-if-a-raw-.patch')
-rw-r--r-- | acpi-video-Unregister-the-backlight-device-if-a-raw-.patch | 130 |
1 files changed, 130 insertions, 0 deletions
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 + |