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: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Cc: Matthew Garrett <mjg@redhat.com> Cc: Richard Purdie <rpurdie@linux.intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
90765c6aee
commit
347a26860e
@ -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.
|
|||||||
|
|
||||||
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:
|
|||||||
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 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
* 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 = {
|
|||||||
*/
|
*/
|
||||||
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user