Skip to content

Commit

Permalink
ACPI / video: Unregister the backlight device if a raw one shows up l…
Browse files Browse the repository at this point in the history
…ater

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>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Hans de Goede authored and Rafael J. Wysocki committed May 26, 2014
1 parent 3cc6919 commit 53a92ba
Showing 1 changed file with 57 additions and 0 deletions.
57 changes: 57 additions & 0 deletions drivers/acpi/video.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down

0 comments on commit 53a92ba

Please sign in to comment.