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:
Henrique de Moraes Holschuh 2009-12-15 21:51:06 -02:00 коммит произвёл Len Brown
Родитель 792979c803
Коммит d89a727aff
1 изменённых файлов: 10 добавлений и 4 удалений

Просмотреть файл

@ -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;