Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6baddba4 authored by Henrique de Moraes Holschuh's avatar Henrique de Moraes Holschuh Committed by Richard Purdie
Browse files

backlight/thinkpad-acpi: issue backlight class events



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

Signed-off-by: default avatarHenrique de Moraes Holschuh <hmh@hmh.eng.br>
Signed-off-by: default avatarRichard Purdie <rpurdie@linux.intel.com>
parent 8bea8672
Loading
Loading
Loading
Loading
+12 −39
Original line number Diff line number Diff line
@@ -460,6 +460,8 @@ event code Key Notes
				For Lenovo ThinkPads with a new
				BIOS, it has to be handled either
				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
				up for details.

@@ -582,46 +584,15 @@ with hotkey_report_mode.

Brightness hotkey notes:

These are the current sane choices for brightness key mapping in
thinkpad-acpi:
Don't mess with the brightness hotkeys in a Thinkpad.  If you want
notifications for OSD, use the sysfs backlight class event support.

For IBM and Lenovo models *without* ACPI backlight control (the ones on
which thinkpad-acpi will autoload its backlight interface by default,
and on which ACPI video does not export a backlight interface):

1. Don't enable or map the brightness hotkeys in thinkpad-acpi, as
   these older firmware versions unfortunately won't respect the hotkey
   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.
The driver will issue KEY_BRIGHTNESS_UP and KEY_BRIGHTNESS_DOWN events
automatically for the cases were userspace has to do something to
implement brightness changes.  When you override these events, you will
either fail to handle properly the ThinkPads that require explicit
action to change backlight brightness, or the ThinkPads that require
that no action be taken to work properly.


Bluetooth
@@ -1465,3 +1436,5 @@ Sysfs interface changelog:
		and it is always able to disable hot keys.  Very old
		thinkpads are properly supported.  hotkey_bios_mask
		is deprecated and marked for removal.

0x020600:	Marker for backlight change event support.
+23 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@
 */

#define TPACPI_VERSION "0.23"
#define TPACPI_SYSFS_VERSION 0x020500
#define TPACPI_SYSFS_VERSION 0x020600

/*
 *  Changelog:
@@ -6092,6 +6092,12 @@ static int brightness_get(struct backlight_device *bd)
	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 = {
	.get_brightness = brightness_get,
	.update_status  = brightness_update_status,
@@ -6246,6 +6252,12 @@ static int __init brightness_init(struct ibm_init_struct *iibm)
	ibm_backlight_device->props.brightness = b & TP_EC_BACKLIGHT_LVLMSK;
	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;
}

@@ -6322,6 +6334,9 @@ static int brightness_write(char *buf)
	 * Doing it this way makes the syscall restartable in case of EINTR
	 */
	rc = brightness_set(level);
	if (!rc && ibm_backlight_device)
		backlight_force_update(ibm_backlight_device,
					BACKLIGHT_UPDATE_SYSFS);
	return (rc == -EINTR)? -ERESTARTSYS : rc;
}

@@ -7721,6 +7736,13 @@ static struct ibm_struct fan_driver_data = {
 */
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();
		}
	}
}