Commit 347a2686 authored by Henrique de Moraes Holschuh's avatar Henrique de Moraes Holschuh Committed by Len Brown

thinkpad-acpi: issue backlight class events

Take advantage of the new events capabilities of the backlight class to
notify userspace of backlight changes.

This depends on "backlight: Allow drivers to update the core, and
generate events on changes", by Matthew Garrett.
Signed-off-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Cc: Matthew Garrett <mjg@redhat.com>
Cc: Richard Purdie <rpurdie@linux.intel.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 90765c6a
...@@ -460,6 +460,8 @@ event code Key Notes ...@@ -460,6 +460,8 @@ event code Key Notes
For Lenovo ThinkPads with a new For Lenovo ThinkPads with a new
BIOS, it has to be handled either BIOS, it has to be handled either
by the ACPI OSI, or by userspace. by the ACPI OSI, or by userspace.
The driver does the right thing,
never mess with this.
0x1011 0x10 FN+END Brightness down. See brightness 0x1011 0x10 FN+END Brightness down. See brightness
up for details. up for details.
...@@ -582,46 +584,15 @@ with hotkey_report_mode. ...@@ -582,46 +584,15 @@ with hotkey_report_mode.
Brightness hotkey notes: Brightness hotkey notes:
These are the current sane choices for brightness key mapping in Don't mess with the brightness hotkeys in a Thinkpad. If you want
thinkpad-acpi: notifications for OSD, use the sysfs backlight class event support.
For IBM and Lenovo models *without* ACPI backlight control (the ones on The driver will issue KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN events
which thinkpad-acpi will autoload its backlight interface by default, automatically for the cases were userspace has to do something to
and on which ACPI video does not export a backlight interface): implement brightness changes. When you override these events, you will
either fail to handle properly the ThinkPads that require explicit
1. Don't enable or map the brightness hotkeys in thinkpad-acpi, as action to change backlight brightness, or the ThinkPads that require
these older firmware versions unfortunately won't respect the hotkey that no action be taken to work properly.
mask for brightness keys anyway, and always reacts to them. This
usually work fine, unless X.org drivers are doing something to block
the BIOS. In that case, use (3) below. This is the default mode of
operation.
2. Enable the hotkeys, but map them to something else that is NOT
KEY_BRIGHTNESS_UP/DOWN or any other keycode that would cause
userspace to try to change the backlight level, and use that as an
on-screen-display hint.
3. IF AND ONLY IF X.org drivers find a way to block the firmware from
automatically changing the brightness, enable the hotkeys and map
them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN, and feed that to
something that calls xbacklight. thinkpad-acpi will not be able to
change brightness in that case either, so you should disable its
backlight interface.
For Lenovo models *with* ACPI backlight control:
1. Load up ACPI video and use that. ACPI video will report ACPI
events for brightness change keys. Do not mess with thinkpad-acpi
defaults in this case. thinkpad-acpi should not have anything to do
with backlight events in a scenario where ACPI video is loaded:
brightness hotkeys must be disabled, and the backlight interface is
to be kept disabled as well. This is the default mode of operation.
2. Do *NOT* load up ACPI video, enable the hotkeys in thinkpad-acpi,
and map them to KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN. Process
these keys on userspace somehow (e.g. by calling xbacklight).
The driver will do this automatically if it detects that ACPI video
has been disabled.
Bluetooth Bluetooth
...@@ -1465,3 +1436,5 @@ Sysfs interface changelog: ...@@ -1465,3 +1436,5 @@ Sysfs interface changelog:
and it is always able to disable hot keys. Very old and it is always able to disable hot keys. Very old
thinkpads are properly supported. hotkey_bios_mask thinkpads are properly supported. hotkey_bios_mask
is deprecated and marked for removal. is deprecated and marked for removal.
0x020600: Marker for backlight change event support.
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
*/ */
#define TPACPI_VERSION "0.23" #define TPACPI_VERSION "0.23"
#define TPACPI_SYSFS_VERSION 0x020500 #define TPACPI_SYSFS_VERSION 0x020600
/* /*
* Changelog: * Changelog:
...@@ -6073,6 +6073,12 @@ static int brightness_get(struct backlight_device *bd) ...@@ -6073,6 +6073,12 @@ static int brightness_get(struct backlight_device *bd)
return status & TP_EC_BACKLIGHT_LVLMSK; return status & TP_EC_BACKLIGHT_LVLMSK;
} }
static void tpacpi_brightness_notify_change(void)
{
backlight_force_update(ibm_backlight_device,
BACKLIGHT_UPDATE_HOTKEY);
}
static struct backlight_ops ibm_backlight_data = { static struct backlight_ops ibm_backlight_data = {
.get_brightness = brightness_get, .get_brightness = brightness_get,
.update_status = brightness_update_status, .update_status = brightness_update_status,
...@@ -6227,6 +6233,12 @@ static int __init brightness_init(struct ibm_init_struct *iibm) ...@@ -6227,6 +6233,12 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK; ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK;
backlight_update_status(ibm_backlight_device); backlight_update_status(ibm_backlight_device);
vdbg_printk(TPACPI_DBG_INIT | TPACPI_DBG_BRGHT,
"brightness: registering brightness hotkeys "
"as change notification\n");
tpacpi_hotkey_driver_mask_set(hotkey_driver_mask
| TP_ACPI_HKEY_BRGHTUP_MASK
| TP_ACPI_HKEY_BRGHTDWN_MASK);;
return 0; return 0;
} }
...@@ -6303,6 +6315,9 @@ static int brightness_write(char *buf) ...@@ -6303,6 +6315,9 @@ static int brightness_write(char *buf)
* Doing it this way makes the syscall restartable in case of EINTR * Doing it this way makes the syscall restartable in case of EINTR
*/ */
rc = brightness_set(level); rc = brightness_set(level);
if (!rc && ibm_backlight_device)
backlight_force_update(ibm_backlight_device,
BACKLIGHT_UPDATE_SYSFS);
return (rc == -EINTR)? -ERESTARTSYS : rc; return (rc == -EINTR)? -ERESTARTSYS : rc;
} }
...@@ -7702,6 +7717,13 @@ static struct ibm_struct fan_driver_data = { ...@@ -7702,6 +7717,13 @@ static struct ibm_struct fan_driver_data = {
*/ */
static void tpacpi_driver_event(const unsigned int hkey_event) static void tpacpi_driver_event(const unsigned int hkey_event)
{ {
if (ibm_backlight_device) {
switch (hkey_event) {
case TP_HKEY_EV_BRGHT_UP:
case TP_HKEY_EV_BRGHT_DOWN:
tpacpi_brightness_notify_change();
}
}
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment