| From bf8b29c8f7f8269e99eca8b19048ed5b34b51810 Mon Sep 17 00:00:00 2001 |
| From: Henrique de Moraes Holschuh <hmh@hmh.eng.br> |
| Date: Thu, 25 Feb 2010 21:28:56 -0300 |
| Subject: thinkpad-acpi: document HKEY event 3006 |
| |
| From: Henrique de Moraes Holschuh <hmh@hmh.eng.br> |
| |
| commit bf8b29c8f7f8269e99eca8b19048ed5b34b51810 upstream. |
| |
| Event 0x3006 is used to help power management of the ODD in the |
| UltraBay. The EC generates this event when the ODD eject button is |
| pressed (even if the bay is powered down). |
| |
| Normally, Linux doesn't need this as we keep the SATA link powered |
| up (which wastes power). The EC powers up the bay by itself when the |
| ODD eject button is pressed, and the SATA PHY reports the hotplug. |
| |
| However, we could also power that SATA link down (and for that matter, |
| also power down the Ultrabay) if the ODD is left idle for a while with |
| no disk inside, and use event 0x3006 to know when we need that SATA link |
| powered back up. |
| |
| For now, just stop asking for more information when event 0x3006 is |
| seen, there is no point in pestering users about it anymore. |
| |
| Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/platform/x86/thinkpad_acpi.c | 10 ++++++++-- |
| 1 file changed, 8 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/platform/x86/thinkpad_acpi.c |
| +++ b/drivers/platform/x86/thinkpad_acpi.c |
| @@ -3630,13 +3630,19 @@ static void hotkey_notify(struct ibm_str |
| break; |
| case 3: |
| /* 0x3000-0x3FFF: bay-related wakeups */ |
| - if (hkey == TP_HKEY_EV_BAYEJ_ACK) { |
| + switch (hkey) { |
| + case TP_HKEY_EV_BAYEJ_ACK: |
| hotkey_autosleep_ack = 1; |
| printk(TPACPI_INFO |
| "bay ejected\n"); |
| hotkey_wakeup_hotunplug_complete_notify_change(); |
| known_ev = true; |
| - } else { |
| + break; |
| + case TP_HKEY_EV_OPTDRV_EJ: |
| + /* FIXME: kick libata if SATA link offline */ |
| + known_ev = true; |
| + break; |
| + default: |
| known_ev = false; |
| } |
| break; |