| From d89a727aff649f6768f7a34ee57f031ebf8bab4c Mon Sep 17 00:00:00 2001 |
| From: Henrique de Moraes Holschuh <hmh@hmh.eng.br> |
| Date: Tue, 15 Dec 2009 21:51:06 -0200 |
| Subject: thinkpad-acpi: sync input device EV_SW initial state |
| |
| From: Henrique de Moraes Holschuh <hmh@hmh.eng.br> |
| |
| commit d89a727aff649f6768f7a34ee57f031ebf8bab4c upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/platform/x86/thinkpad_acpi.c | 14 ++++++++++---- |
| 1 file changed, 10 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/platform/x86/thinkpad_acpi.c |
| +++ b/drivers/platform/x86/thinkpad_acpi.c |
| @@ -3188,6 +3188,8 @@ static int __init hotkey_init(struct ibm |
| int res, i; |
| int status; |
| int hkeyv; |
| + bool radiosw_state = false; |
| + bool tabletsw_state = false; |
| |
| unsigned long quirks; |
| |
| @@ -3293,6 +3295,7 @@ static int __init hotkey_init(struct ibm |
| #ifdef CONFIG_THINKPAD_ACPI_DEBUGFACILITIES |
| if (dbg_wlswemul) { |
| tp_features.hotkey_wlsw = 1; |
| + radiosw_state = !!tpacpi_wlsw_emulstate; |
| printk(TPACPI_INFO |
| "radio switch emulation enabled\n"); |
| } else |
| @@ -3300,6 +3303,7 @@ static int __init hotkey_init(struct ibm |
| /* Not all thinkpads have a hardware radio switch */ |
| if (acpi_evalf(hkey_handle, &status, "WLSW", "qd")) { |
| tp_features.hotkey_wlsw = 1; |
| + radiosw_state = !!status; |
| printk(TPACPI_INFO |
| "radio switch found; radios are %s\n", |
| enabled(status, 0)); |
| @@ -3311,11 +3315,11 @@ static int __init hotkey_init(struct ibm |
| /* For X41t, X60t, X61t Tablets... */ |
| if (!res && acpi_evalf(hkey_handle, &status, "MHKG", "qd")) { |
| tp_features.hotkey_tablet = 1; |
| + tabletsw_state = !!(status & TP_HOTKEY_TABLET_MASK); |
| printk(TPACPI_INFO |
| "possible tablet mode switch found; " |
| "ThinkPad in %s mode\n", |
| - (status & TP_HOTKEY_TABLET_MASK)? |
| - "tablet" : "laptop"); |
| + (tabletsw_state) ? "tablet" : "laptop"); |
| res = add_to_attr_set(hotkey_dev_attributes, |
| &dev_attr_hotkey_tablet_mode.attr); |
| } |
| @@ -3366,9 +3370,13 @@ static int __init hotkey_init(struct ibm |
| |
| if (tp_features.hotkey_wlsw) { |
| 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) { |
| 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 |
| @@ -3435,8 +3443,6 @@ static int __init hotkey_init(struct ibm |
| tpacpi_inputdev->close = &hotkey_inputdev_close; |
| |
| hotkey_poll_setup_safe(true); |
| - tpacpi_send_radiosw_update(); |
| - tpacpi_input_send_tabletsw(); |
| |
| return 0; |
| |