thinkpad-acpi: sync input device EV_SW initial state
Before we register the input device, sync the input layer EV_SW state through a call to input_report_switch(), to avoid issuing a gratuitous event for the initial state of these switches. This fixes some annoyances caused by the interaction with rfkill and EV_SW SW_RFKILL_ALL events. Reported-by: Kevin Locke <kevin@kevinlocke.name> Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Cc: Alan Jenkins <alan-jenkins@tuffmail.co.uk> Cc: Johannes Berg <johannes@sipsolutions.net> Cc: Dmitry Torokhov <dtor@mail.ru> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
Родитель
792979c803
Коммит
d89a727aff
|
@ -3186,6 +3186,8 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||||
int res, i;
|
int res, i;
|
||||||
int status;
|
int status;
|
||||||
int hkeyv;
|
int hkeyv;
|
||||||
|
bool radiosw_state = false;
|
||||||
|
bool tabletsw_state = false;
|
||||||
|
|
||||||
unsigned long quirks;
|
unsigned long quirks;
|
||||||
|
|
||||||
|
@ -3291,6 +3293,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||||
#ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
|
#ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES
|
||||||
if (dbg_wlswemul) {
|
if (dbg_wlswemul) {
|
||||||
tp_features.hotkey_wlsw = 1;
|
tp_features.hotkey_wlsw = 1;
|
||||||
|
radiosw_state = !!tpacpi_wlsw_emulstate;
|
||||||
printk(TPACPI_INFO
|
printk(TPACPI_INFO
|
||||||
"radio switch emulation enabled\n");
|
"radio switch emulation enabled\n");
|
||||||
} else
|
} else
|
||||||
|
@ -3298,6 +3301,7 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||||
/* Not all thinkpads have a hardware radio switch */
|
/* Not all thinkpads have a hardware radio switch */
|
||||||
if (acpi_evalf(hkey_handle, &status, "WLSW", "qd")) {
|
if (acpi_evalf(hkey_handle, &status, "WLSW", "qd")) {
|
||||||
tp_features.hotkey_wlsw = 1;
|
tp_features.hotkey_wlsw = 1;
|
||||||
|
radiosw_state = !!status;
|
||||||
printk(TPACPI_INFO
|
printk(TPACPI_INFO
|
||||||
"radio switch found; radios are %s\n",
|
"radio switch found; radios are %s\n",
|
||||||
enabled(status, 0));
|
enabled(status, 0));
|
||||||
|
@ -3309,11 +3313,11 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||||
/* For X41t, X60t, X61t Tablets... */
|
/* For X41t, X60t, X61t Tablets... */
|
||||||
if (!res && acpi_evalf(hkey_handle, &status, "MHKG", "qd")) {
|
if (!res && acpi_evalf(hkey_handle, &status, "MHKG", "qd")) {
|
||||||
tp_features.hotkey_tablet = 1;
|
tp_features.hotkey_tablet = 1;
|
||||||
|
tabletsw_state = !!(status & TP_HOTKEY_TABLET_MASK);
|
||||||
printk(TPACPI_INFO
|
printk(TPACPI_INFO
|
||||||
"possible tablet mode switch found; "
|
"possible tablet mode switch found; "
|
||||||
"ThinkPad in %s mode\n",
|
"ThinkPad in %s mode\n",
|
||||||
(status & TP_HOTKEY_TABLET_MASK)?
|
(tabletsw_state) ? "tablet" : "laptop");
|
||||||
"tablet" : "laptop");
|
|
||||||
res = add_to_attr_set(hotkey_dev_attributes,
|
res = add_to_attr_set(hotkey_dev_attributes,
|
||||||
&dev_attr_hotkey_tablet_mode.attr);
|
&dev_attr_hotkey_tablet_mode.attr);
|
||||||
}
|
}
|
||||||
|
@ -3364,9 +3368,13 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||||
|
|
||||||
if (tp_features.hotkey_wlsw) {
|
if (tp_features.hotkey_wlsw) {
|
||||||
input_set_capability(tpacpi_inputdev, EV_SW, SW_RFKILL_ALL);
|
input_set_capability(tpacpi_inputdev, EV_SW, SW_RFKILL_ALL);
|
||||||
|
input_report_switch(tpacpi_inputdev,
|
||||||
|
SW_RFKILL_ALL, radiosw_state);
|
||||||
}
|
}
|
||||||
if (tp_features.hotkey_tablet) {
|
if (tp_features.hotkey_tablet) {
|
||||||
input_set_capability(tpacpi_inputdev, EV_SW, SW_TABLET_MODE);
|
input_set_capability(tpacpi_inputdev, EV_SW, SW_TABLET_MODE);
|
||||||
|
input_report_switch(tpacpi_inputdev,
|
||||||
|
SW_TABLET_MODE, tabletsw_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do not issue duplicate brightness change events to
|
/* Do not issue duplicate brightness change events to
|
||||||
|
@ -3433,8 +3441,6 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
|
||||||
tpacpi_inputdev->close = &hotkey_inputdev_close;
|
tpacpi_inputdev->close = &hotkey_inputdev_close;
|
||||||
|
|
||||||
hotkey_poll_setup_safe(true);
|
hotkey_poll_setup_safe(true);
|
||||||
tpacpi_send_radiosw_update();
|
|
||||||
tpacpi_input_send_tabletsw();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче