ACPI: thinkpad-acpi: issue input events for tablet swivel events

Issue EV_SW SW_TABLET_MODE events for HKEY events 0x5009 and 0x500A on the
X41t/X60t/X61t.  As usual, we suppress the HKEY events on the netlink
interface to avoid sending duplicate events to userspace.

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:
Henrique de Moraes Holschuh 2008-02-16 02:17:55 -02:00 committed by Len Brown
parent d7c1d17dfe
commit b3ec6f911a
2 changed files with 22 additions and 4 deletions

View File

@ -491,6 +491,8 @@ generate input device EV_KEY events.
Non hot-key ACPI HKEY event map: Non hot-key ACPI HKEY event map:
0x5001 Lid closed 0x5001 Lid closed
0x5002 Lid opened 0x5002 Lid opened
0x5009 Tablet swivel: switched to tablet mode
0x500A Tablet swivel: switched to normal mode
0x7000 Radio Switch may have changed state 0x7000 Radio Switch may have changed state
The above events are not propagated by the driver, except for legacy The above events are not propagated by the driver, except for legacy
@ -505,8 +507,6 @@ The above events are never propagated by the driver.
0x3003 Bay ejection (see 0x2x05) complete, can sleep again 0x3003 Bay ejection (see 0x2x05) complete, can sleep again
0x4003 Undocked (see 0x2x04), can sleep again 0x4003 Undocked (see 0x2x04), can sleep again
0x5009 Tablet swivel: switched to tablet mode
0x500A Tablet swivel: switched to normal mode
0x500B Tablet pen insterted into its storage bay 0x500B Tablet pen insterted into its storage bay
0x500C Tablet pen removed from its storage bay 0x500C Tablet pen removed from its storage bay
0x5010 Brightness level changed (newer Lenovo BIOSes) 0x5010 Brightness level changed (newer Lenovo BIOSes)

View File

@ -1172,6 +1172,17 @@ static void tpacpi_input_send_radiosw(void)
mutex_unlock(&tpacpi_inputdev_send_mutex); mutex_unlock(&tpacpi_inputdev_send_mutex);
} }
static void tpacpi_input_send_tabletsw(unsigned int state)
{
mutex_lock(&tpacpi_inputdev_send_mutex);
input_report_switch(tpacpi_inputdev,
SW_TABLET_MODE, !!state);
input_sync(tpacpi_inputdev);
mutex_unlock(&tpacpi_inputdev_send_mutex);
}
static void tpacpi_input_send_key(unsigned int scancode) static void tpacpi_input_send_key(unsigned int scancode)
{ {
unsigned int keycode; unsigned int keycode;
@ -2020,6 +2031,10 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
set_bit(EV_SW, tpacpi_inputdev->evbit); set_bit(EV_SW, tpacpi_inputdev->evbit);
set_bit(SW_RADIO, tpacpi_inputdev->swbit); set_bit(SW_RADIO, tpacpi_inputdev->swbit);
} }
if (thinkpad_id.vendor == PCI_VENDOR_ID_LENOVO) {
set_bit(EV_SW, tpacpi_inputdev->evbit);
set_bit(SW_TABLET_MODE, tpacpi_inputdev->swbit);
}
dbg_printk(TPACPI_DBG_INIT, dbg_printk(TPACPI_DBG_INIT,
"enabling hot key handling\n"); "enabling hot key handling\n");
@ -2169,11 +2184,14 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event)
/* 0x5000-0x5FFF: human interface helpers */ /* 0x5000-0x5FFF: human interface helpers */
switch (hkey) { switch (hkey) {
case 0x5010: /* Lenovo new BIOS: brightness changed */ case 0x5010: /* Lenovo new BIOS: brightness changed */
case 0x5009: /* X61t: swivel up (tablet mode) */
case 0x500a: /* X61t: swivel down (normal mode) */
case 0x500b: /* X61t: tablet pen inserted into bay */ case 0x500b: /* X61t: tablet pen inserted into bay */
case 0x500c: /* X61t: tablet pen removed from bay */ case 0x500c: /* X61t: tablet pen removed from bay */
break; break;
case 0x5009: /* X61t: swivel up (tablet mode) */
case 0x500a: /* X61t: swivel down (normal mode) */
tpacpi_input_send_tabletsw((hkey == 0x5009));
send_acpi_ev = 0;
break;
case 0x5001: case 0x5001:
case 0x5002: case 0x5002:
/* LID switch events. Do not propagate */ /* LID switch events. Do not propagate */