mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
ACPI: video: Add new hw_changes_brightness quirk, set it on PB Easynote MZ35
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>
This commit is contained in:
parent
a131c2bf16
commit
4f7f96453b
1 changed files with 37 additions and 0 deletions
|
@ -60,6 +60,12 @@ module_param(report_key_events, int, 0644);
|
||||||
MODULE_PARM_DESC(report_key_events,
|
MODULE_PARM_DESC(report_key_events,
|
||||||
"0: none, 1: output changes, 2: brightness changes, 3: all");
|
"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
|
* Whether the struct acpi_video_device_attrib::device_id_scheme bit should be
|
||||||
* assumed even if not actually set.
|
* assumed even if not actually set.
|
||||||
|
@ -405,6 +411,14 @@ static int video_set_report_key_events(const struct dmi_system_id *id)
|
||||||
return 0;
|
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[] = {
|
static const struct dmi_system_id video_dmi_table[] = {
|
||||||
/*
|
/*
|
||||||
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
|
* Broken _BQC workaround http://bugzilla.kernel.org/show_bug.cgi?id=13121
|
||||||
|
@ -529,6 +543,21 @@ static const struct dmi_system_id video_dmi_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "Vostro V131"),
|
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"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1612,6 +1641,14 @@ static void acpi_video_device_notify(acpi_handle handle, u32 event, void *data)
|
||||||
bus = video_device->video;
|
bus = video_device->video;
|
||||||
input = bus->input;
|
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) {
|
switch (event) {
|
||||||
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
|
case ACPI_VIDEO_NOTIFY_CYCLE_BRIGHTNESS: /* Cycle brightness */
|
||||||
brightness_switch_event(video_device, event);
|
brightness_switch_event(video_device, event);
|
||||||
|
|
Loading…
Add table
Reference in a new issue