thinkpad-acpi: remove HKEY disable functionality
The HKEY disable functionality basically cripples the entire event model of the ThinkPad firmware and of the thinkpad-acpi driver. Remove this functionality from the driver. HKEY must be enabled at all times while thinkpad-acpi is loaded, and disabled otherwise. For sysfs, according to the sysfs ABI and the thinkpad-acpi sysfs rules of engagement, we will just remove the attributes. This will be done in two stages: disable their function now, after two kernel releases, remove the attributes. For procfs, we call WARN(). If nothing triggers it, I will simply remove the enable/disable commands entirely in the future along with the sysfs attributes. I don't expect much, if any fallout from this. There really isn't any reason to mess with hotkey_enable or with the enable/disable commands to /proc/acpi/ibm/hotkey, and this has been true for years... Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
committed by
Len Brown
parent
73a94d86a8
commit
2586d5663d
@@ -179,17 +179,14 @@ system. Enabling the hotkey functionality of thinkpad-acpi signals the
|
|||||||
firmware that such a driver is present, and modifies how the ThinkPad
|
firmware that such a driver is present, and modifies how the ThinkPad
|
||||||
firmware will behave in many situations.
|
firmware will behave in many situations.
|
||||||
|
|
||||||
The driver enables the hot key feature automatically when loaded. The
|
The driver enables the HKEY ("hot key") event reporting automatically
|
||||||
feature can later be disabled and enabled back at runtime. The driver
|
when loaded, and disables it when it is removed.
|
||||||
will also restore the hot key feature to its previous state and mask
|
|
||||||
when it is unloaded.
|
|
||||||
|
|
||||||
When the hotkey feature is enabled and the hot key mask is set (see
|
The driver will report HKEY events in the following format:
|
||||||
below), the driver will report HKEY events in the following format:
|
|
||||||
|
|
||||||
ibm/hotkey HKEY 00000080 0000xxxx
|
ibm/hotkey HKEY 00000080 0000xxxx
|
||||||
|
|
||||||
Some of these events refer to hot key presses, but not all.
|
Some of these events refer to hot key presses, but not all of them.
|
||||||
|
|
||||||
The driver will generate events over the input layer for hot keys and
|
The driver will generate events over the input layer for hot keys and
|
||||||
radio switches, and over the ACPI netlink layer for other events. The
|
radio switches, and over the ACPI netlink layer for other events. The
|
||||||
@@ -221,13 +218,17 @@ procfs notes:
|
|||||||
|
|
||||||
The following commands can be written to the /proc/acpi/ibm/hotkey file:
|
The following commands can be written to the /proc/acpi/ibm/hotkey file:
|
||||||
|
|
||||||
echo enable > /proc/acpi/ibm/hotkey -- enable the hot keys feature
|
|
||||||
echo disable > /proc/acpi/ibm/hotkey -- disable the hot keys feature
|
|
||||||
echo 0xffffffff > /proc/acpi/ibm/hotkey -- enable all hot keys
|
echo 0xffffffff > /proc/acpi/ibm/hotkey -- enable all hot keys
|
||||||
echo 0 > /proc/acpi/ibm/hotkey -- disable all possible hot keys
|
echo 0 > /proc/acpi/ibm/hotkey -- disable all possible hot keys
|
||||||
... any other 8-hex-digit mask ...
|
... any other 8-hex-digit mask ...
|
||||||
echo reset > /proc/acpi/ibm/hotkey -- restore the original mask
|
echo reset > /proc/acpi/ibm/hotkey -- restore the original mask
|
||||||
|
|
||||||
|
The following commands have been deprecated and will cause the kernel
|
||||||
|
to log a warning:
|
||||||
|
|
||||||
|
echo enable > /proc/acpi/ibm/hotkey -- does nothing
|
||||||
|
echo disable > /proc/acpi/ibm/hotkey -- returns an error
|
||||||
|
|
||||||
The procfs interface does not support NVRAM polling control. So as to
|
The procfs interface does not support NVRAM polling control. So as to
|
||||||
maintain maximum bug-to-bug compatibility, it does not report any masks,
|
maintain maximum bug-to-bug compatibility, it does not report any masks,
|
||||||
nor does it allow one to manipulate the hot key mask when the firmware
|
nor does it allow one to manipulate the hot key mask when the firmware
|
||||||
@@ -236,12 +237,9 @@ does not support masks at all, even if NVRAM polling is in use.
|
|||||||
sysfs notes:
|
sysfs notes:
|
||||||
|
|
||||||
hotkey_bios_enabled:
|
hotkey_bios_enabled:
|
||||||
Returns the status of the hot keys feature when
|
DEPRECATED, WILL BE REMOVED SOON.
|
||||||
thinkpad-acpi was loaded. Upon module unload, the hot
|
|
||||||
key feature status will be restored to this value.
|
|
||||||
|
|
||||||
0: hot keys were disabled
|
Returns 0.
|
||||||
1: hot keys were enabled (unusual)
|
|
||||||
|
|
||||||
hotkey_bios_mask:
|
hotkey_bios_mask:
|
||||||
Returns the hot keys mask when thinkpad-acpi was loaded.
|
Returns the hot keys mask when thinkpad-acpi was loaded.
|
||||||
@@ -249,13 +247,10 @@ sysfs notes:
|
|||||||
to this value.
|
to this value.
|
||||||
|
|
||||||
hotkey_enable:
|
hotkey_enable:
|
||||||
Enables/disables the hot keys feature in the ACPI
|
DEPRECATED, WILL BE REMOVED SOON.
|
||||||
firmware, and reports current status of the hot keys
|
|
||||||
feature. Has no effect on the NVRAM hot key polling
|
|
||||||
functionality.
|
|
||||||
|
|
||||||
0: disables the hot keys feature / feature disabled
|
0: returns -EPERM
|
||||||
1: enables the hot keys feature / feature enabled
|
1: does nothing
|
||||||
|
|
||||||
hotkey_mask:
|
hotkey_mask:
|
||||||
bit mask to enable driver-handling (and depending on
|
bit mask to enable driver-handling (and depending on
|
||||||
@@ -1535,3 +1530,7 @@ Sysfs interface changelog:
|
|||||||
|
|
||||||
0x020200: Add poll()/select() support to the following attributes:
|
0x020200: Add poll()/select() support to the following attributes:
|
||||||
hotkey_radio_sw, wakeup_hotunplug_complete, wakeup_reason
|
hotkey_radio_sw, wakeup_hotunplug_complete, wakeup_reason
|
||||||
|
|
||||||
|
0x020300: hotkey enable/disable support removed, attributes
|
||||||
|
hotkey_bios_enabled and hotkey_enable deprecated and
|
||||||
|
marked for removal.
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define TPACPI_VERSION "0.22"
|
#define TPACPI_VERSION "0.22"
|
||||||
#define TPACPI_SYSFS_VERSION 0x020200
|
#define TPACPI_SYSFS_VERSION 0x020300
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Changelog:
|
* Changelog:
|
||||||
@@ -1424,7 +1424,6 @@ static enum { /* Reasons for waking up */
|
|||||||
|
|
||||||
static int hotkey_autosleep_ack;
|
static int hotkey_autosleep_ack;
|
||||||
|
|
||||||
static int hotkey_orig_status;
|
|
||||||
static u32 hotkey_orig_mask;
|
static u32 hotkey_orig_mask;
|
||||||
static u32 hotkey_all_mask;
|
static u32 hotkey_all_mask;
|
||||||
static u32 hotkey_reserved_mask;
|
static u32 hotkey_reserved_mask;
|
||||||
@@ -1571,9 +1570,9 @@ static int hotkey_status_get(int *status)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hotkey_status_set(int status)
|
static int hotkey_status_set(bool enable)
|
||||||
{
|
{
|
||||||
if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", status))
|
if (!acpi_evalf(hkey_handle, NULL, "MHKC", "vd", enable ? 1 : 0))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1889,6 +1888,9 @@ static ssize_t hotkey_enable_show(struct device *dev,
|
|||||||
{
|
{
|
||||||
int res, status;
|
int res, status;
|
||||||
|
|
||||||
|
printk_deprecated_attribute("hotkey_enable",
|
||||||
|
"Hotkey reporting is always enabled");
|
||||||
|
|
||||||
res = hotkey_status_get(&status);
|
res = hotkey_status_get(&status);
|
||||||
if (res)
|
if (res)
|
||||||
return res;
|
return res;
|
||||||
@@ -1901,14 +1903,17 @@ static ssize_t hotkey_enable_store(struct device *dev,
|
|||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned long t;
|
unsigned long t;
|
||||||
int res;
|
|
||||||
|
printk_deprecated_attribute("hotkey_enable",
|
||||||
|
"Hotkeys can be disabled through hotkey_mask");
|
||||||
|
|
||||||
if (parse_strtoul(buf, 1, &t))
|
if (parse_strtoul(buf, 1, &t))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
res = hotkey_status_set(t);
|
if (t == 0)
|
||||||
|
return -EPERM;
|
||||||
|
|
||||||
return (res) ? res : count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device_attribute dev_attr_hotkey_enable =
|
static struct device_attribute dev_attr_hotkey_enable =
|
||||||
@@ -1964,7 +1969,7 @@ static ssize_t hotkey_bios_enabled_show(struct device *dev,
|
|||||||
struct device_attribute *attr,
|
struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
return snprintf(buf, PAGE_SIZE, "%d\n", hotkey_orig_status);
|
return sprintf(buf, "0\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct device_attribute dev_attr_hotkey_bios_enabled =
|
static struct device_attribute dev_attr_hotkey_bios_enabled =
|
||||||
@@ -2243,7 +2248,7 @@ static void hotkey_exit(void)
|
|||||||
"restoring original hot key mask\n");
|
"restoring original hot key mask\n");
|
||||||
/* no short-circuit boolean operator below! */
|
/* no short-circuit boolean operator below! */
|
||||||
if ((hotkey_mask_set(hotkey_orig_mask) |
|
if ((hotkey_mask_set(hotkey_orig_mask) |
|
||||||
hotkey_status_set(hotkey_orig_status)) != 0)
|
hotkey_status_set(false)) != 0)
|
||||||
printk(TPACPI_ERR
|
printk(TPACPI_ERR
|
||||||
"failed to restore hot key mask "
|
"failed to restore hot key mask "
|
||||||
"to BIOS defaults\n");
|
"to BIOS defaults\n");
|
||||||
@@ -2438,10 +2443,6 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
|||||||
|
|
||||||
/* hotkey_source_mask *must* be zero for
|
/* hotkey_source_mask *must* be zero for
|
||||||
* the first hotkey_mask_get */
|
* the first hotkey_mask_get */
|
||||||
res = hotkey_status_get(&hotkey_orig_status);
|
|
||||||
if (res)
|
|
||||||
goto err_exit;
|
|
||||||
|
|
||||||
if (tp_features.hotkey_mask) {
|
if (tp_features.hotkey_mask) {
|
||||||
res = hotkey_mask_get();
|
res = hotkey_mask_get();
|
||||||
if (res)
|
if (res)
|
||||||
@@ -2581,7 +2582,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dbg_printk(TPACPI_DBG_INIT, "enabling hot key handling\n");
|
dbg_printk(TPACPI_DBG_INIT, "enabling hot key handling\n");
|
||||||
res = hotkey_status_set(1);
|
res = hotkey_status_set(true);
|
||||||
if (res) {
|
if (res) {
|
||||||
hotkey_exit();
|
hotkey_exit();
|
||||||
return res;
|
return res;
|
||||||
@@ -2926,9 +2927,17 @@ static int hotkey_read(char *p)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hotkey_enabledisable_warn(void)
|
||||||
|
{
|
||||||
|
tpacpi_log_usertask("procfs hotkey enable/disable");
|
||||||
|
WARN(1, TPACPI_WARN
|
||||||
|
"hotkey enable/disable functionality has been "
|
||||||
|
"removed from the driver. Hotkeys are always enabled.\n");
|
||||||
|
}
|
||||||
|
|
||||||
static int hotkey_write(char *buf)
|
static int hotkey_write(char *buf)
|
||||||
{
|
{
|
||||||
int res, status;
|
int res;
|
||||||
u32 mask;
|
u32 mask;
|
||||||
char *cmd;
|
char *cmd;
|
||||||
|
|
||||||
@@ -2938,17 +2947,16 @@ static int hotkey_write(char *buf)
|
|||||||
if (mutex_lock_killable(&hotkey_mutex))
|
if (mutex_lock_killable(&hotkey_mutex))
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
|
|
||||||
status = -1;
|
|
||||||
mask = hotkey_mask;
|
mask = hotkey_mask;
|
||||||
|
|
||||||
res = 0;
|
res = 0;
|
||||||
while ((cmd = next_cmd(&buf))) {
|
while ((cmd = next_cmd(&buf))) {
|
||||||
if (strlencmp(cmd, "enable") == 0) {
|
if (strlencmp(cmd, "enable") == 0) {
|
||||||
status = 1;
|
hotkey_enabledisable_warn();
|
||||||
} else if (strlencmp(cmd, "disable") == 0) {
|
} else if (strlencmp(cmd, "disable") == 0) {
|
||||||
status = 0;
|
hotkey_enabledisable_warn();
|
||||||
|
res = -EPERM;
|
||||||
} else if (strlencmp(cmd, "reset") == 0) {
|
} else if (strlencmp(cmd, "reset") == 0) {
|
||||||
status = hotkey_orig_status;
|
|
||||||
mask = hotkey_orig_mask;
|
mask = hotkey_orig_mask;
|
||||||
} else if (sscanf(cmd, "0x%x", &mask) == 1) {
|
} else if (sscanf(cmd, "0x%x", &mask) == 1) {
|
||||||
/* mask set */
|
/* mask set */
|
||||||
@@ -2959,9 +2967,6 @@ static int hotkey_write(char *buf)
|
|||||||
goto errexit;
|
goto errexit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (status != -1)
|
|
||||||
res = hotkey_status_set(status);
|
|
||||||
|
|
||||||
if (!res && mask != hotkey_mask)
|
if (!res && mask != hotkey_mask)
|
||||||
res = hotkey_mask_set(mask);
|
res = hotkey_mask_set(mask);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user