Skip to content

Commit

Permalink
ACPI: video: Add new hw_changes_brightness quirk, set it on PB Easyno…
Browse files Browse the repository at this point in the history
…te MZ35

[ Upstream commit 4f7f964 ]

Some machines change the brightness themselves when a brightness hotkey
gets pressed, despite us telling them not to. This causes the brightness to
go two steps up / down when the hotkey is pressed. This is esp. a problem
on older machines with only a few brightness levels.

This commit adds a new hw_changes_brightness quirk which makes
acpi_video_device_notify() only call backlight_force_update(...,
BACKLIGHT_UPDATE_HOTKEY) and not do anything else, notifying userspace
that the brightness was changed and leaving it at that fixing the dual
step problem.

BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=204077
Reported-by: Kacper Piwiński <cosiekvfj@o2.pl>
Tested-by: Kacper Piwiński <cosiekvfj@o2.pl>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Hans de Goede authored and Greg Kroah-Hartman committed Oct 1, 2019
1 parent 46beb6e commit 3717f4a
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions drivers/acpi/acpi_video.c
Original file line number Diff line number Diff line change
@@ -73,6 +73,12 @@ module_param(report_key_events, int, 0644);
MODULE_PARM_DESC(report_key_events,
"0: none, 1: output changes, 2: brightness changes, 3: all");

static int hw_changes_brightness = -1;
module_param(hw_changes_brightness, int, 0644);
MODULE_PARM_DESC(hw_changes_brightness,
"Set this to 1 on buggy hw which changes the brightness itself when "
"a hotkey is pressed: -1: auto, 0: normal 1: hw-changes-brightness");

/*
* Whether the struct acpi_video_device_attrib::device_id_scheme bit should be
* assumed even if not actually set.
@@ -418,6 +424,14 @@ static int video_set_report_key_events(const struct dmi_system_id *id)
return 0;
}

static int video_hw_changes_brightness(
const struct dmi_system_id *d)
{
if (hw_changes_brightness == -1)
hw_changes_brightness = 1;
return 0;
}

static const struct dmi_system_id video_dmi_table[] = {
/*
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
@@ -542,6 +556,21 @@ static const struct dmi_system_id video_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
},
},
/*
* Some machines change the brightness themselves when a brightness
* hotkey gets pressed, despite us telling them not to. In this case
* acpi_video_device_notify() should only call backlight_force_update(
* BACKLIGHT_UPDATE_HOTKEY) and not do anything else.
*/
{
/* https://bugzilla.kernel.org/show_bug.cgi?id=204077 */
.callback = video_hw_changes_brightness,
.ident = "Packard Bell EasyNote MZ35",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Packard Bell"),
DMI_MATCH(DMI_PRODUCT_NAME, "EasyNote MZ35"),
},
},
{}
};

@@ -1625,6 +1654,14 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
bus = video_device->video;
input = bus->input;

if (hw_changes_brightness > 0) {
if (video_device->backlight)
backlight_force_update(video_device->backlight,
BACKLIGHT_UPDATE_HOTKEY);
acpi_notifier_call_chain(device, event, 0);
return;
}

switch (event) {
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
brightness_switch_event(video_device, event);

0 comments on commit 3717f4a

Please sign in to comment.