diff options
-rw-r--r-- | Documentation/thinkpad-acpi.txt | 9 | ||||
-rw-r--r-- | drivers/misc/thinkpad_acpi.c | 36 |
2 files changed, 41 insertions, 4 deletions
diff --git a/Documentation/thinkpad-acpi.txt b/Documentation/thinkpad-acpi.txt index e1c4550dac99..9bbd0f541437 100644 --- a/Documentation/thinkpad-acpi.txt +++ b/Documentation/thinkpad-acpi.txt | |||
@@ -311,6 +311,8 @@ sysfs notes: | |||
311 | disabled" postition, and 1 if the switch is in the | 311 | disabled" postition, and 1 if the switch is in the |
312 | "radios enabled" position. | 312 | "radios enabled" position. |
313 | 313 | ||
314 | This attribute has poll()/select() support. | ||
315 | |||
314 | hotkey_report_mode: | 316 | hotkey_report_mode: |
315 | Returns the state of the procfs ACPI event report mode | 317 | Returns the state of the procfs ACPI event report mode |
316 | filter for hot keys. If it is set to 1 (the default), | 318 | filter for hot keys. If it is set to 1 (the default), |
@@ -332,6 +334,8 @@ sysfs notes: | |||
332 | undock. Set to zero for normal wake-ups or wake-ups | 334 | undock. Set to zero for normal wake-ups or wake-ups |
333 | due to unknown reasons. | 335 | due to unknown reasons. |
334 | 336 | ||
337 | This attribute has poll()/select() support. | ||
338 | |||
335 | wakeup_hotunplug_complete: | 339 | wakeup_hotunplug_complete: |
336 | Set to 1 if the system was waken up because of an | 340 | Set to 1 if the system was waken up because of an |
337 | undock or bay ejection request, and that request | 341 | undock or bay ejection request, and that request |
@@ -340,6 +344,8 @@ sysfs notes: | |||
340 | user's choice. Refer to HKEY events 0x4003 and | 344 | user's choice. Refer to HKEY events 0x4003 and |
341 | 0x3003, below. | 345 | 0x3003, below. |
342 | 346 | ||
347 | This attribute has poll()/select() support. | ||
348 | |||
343 | input layer notes: | 349 | input layer notes: |
344 | 350 | ||
345 | A Hot key is mapped to a single input layer EV_KEY event, possibly | 351 | A Hot key is mapped to a single input layer EV_KEY event, possibly |
@@ -1354,3 +1360,6 @@ Sysfs interface changelog: | |||
1354 | NVRAM polling patch). Some development snapshots of | 1360 | NVRAM polling patch). Some development snapshots of |
1355 | 0.18 had an earlier version that did strange things | 1361 | 0.18 had an earlier version that did strange things |
1356 | to hotkey_mask. | 1362 | to hotkey_mask. |
1363 | |||
1364 | 0x020200: Add poll()/select() support to the following attributes: | ||
1365 | hotkey_radio_sw, wakeup_hotunplug_complete, wakeup_reason | ||
diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c index e18f1e18781f..91bda316a51c 100644 --- a/drivers/misc/thinkpad_acpi.c +++ b/drivers/misc/thinkpad_acpi.c | |||
@@ -22,7 +22,7 @@ | |||
22 | */ | 22 | */ |
23 | 23 | ||
24 | #define TPACPI_VERSION "0.18" | 24 | #define TPACPI_VERSION "0.18" |
25 | #define TPACPI_SYSFS_VERSION 0x020101 | 25 | #define TPACPI_SYSFS_VERSION 0x020200 |
26 | 26 | ||
27 | /* | 27 | /* |
28 | * Changelog: | 28 | * Changelog: |
@@ -1643,7 +1643,7 @@ static struct device_attribute dev_attr_hotkey_poll_freq = | |||
1643 | 1643 | ||
1644 | #endif /* CONFIG_THINKPAD_ACPI_HOTKEY_POLL */ | 1644 | #endif /* CONFIG_THINKPAD_ACPI_HOTKEY_POLL */ |
1645 | 1645 | ||
1646 | /* sysfs hotkey radio_sw ----------------------------------------------- */ | 1646 | /* sysfs hotkey radio_sw (pollable) ------------------------------------ */ |
1647 | static ssize_t hotkey_radio_sw_show(struct device *dev, | 1647 | static ssize_t hotkey_radio_sw_show(struct device *dev, |
1648 | struct device_attribute *attr, | 1648 | struct device_attribute *attr, |
1649 | char *buf) | 1649 | char *buf) |
@@ -1659,6 +1659,13 @@ static ssize_t hotkey_radio_sw_show(struct device *dev, | |||
1659 | static struct device_attribute dev_attr_hotkey_radio_sw = | 1659 | static struct device_attribute dev_attr_hotkey_radio_sw = |
1660 | __ATTR(hotkey_radio_sw, S_IRUGO, hotkey_radio_sw_show, NULL); | 1660 | __ATTR(hotkey_radio_sw, S_IRUGO, hotkey_radio_sw_show, NULL); |
1661 | 1661 | ||
1662 | static void hotkey_radio_sw_notify_change(void) | ||
1663 | { | ||
1664 | if (tp_features.hotkey_wlsw) | ||
1665 | sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, | ||
1666 | "hotkey_radio_sw"); | ||
1667 | } | ||
1668 | |||
1662 | /* sysfs hotkey report_mode -------------------------------------------- */ | 1669 | /* sysfs hotkey report_mode -------------------------------------------- */ |
1663 | static ssize_t hotkey_report_mode_show(struct device *dev, | 1670 | static ssize_t hotkey_report_mode_show(struct device *dev, |
1664 | struct device_attribute *attr, | 1671 | struct device_attribute *attr, |
@@ -1671,7 +1678,7 @@ static ssize_t hotkey_report_mode_show(struct device *dev, | |||
1671 | static struct device_attribute dev_attr_hotkey_report_mode = | 1678 | static struct device_attribute dev_attr_hotkey_report_mode = |
1672 | __ATTR(hotkey_report_mode, S_IRUGO, hotkey_report_mode_show, NULL); | 1679 | __ATTR(hotkey_report_mode, S_IRUGO, hotkey_report_mode_show, NULL); |
1673 | 1680 | ||
1674 | /* sysfs wakeup reason ------------------------------------------------- */ | 1681 | /* sysfs wakeup reason (pollable) -------------------------------------- */ |
1675 | static ssize_t hotkey_wakeup_reason_show(struct device *dev, | 1682 | static ssize_t hotkey_wakeup_reason_show(struct device *dev, |
1676 | struct device_attribute *attr, | 1683 | struct device_attribute *attr, |
1677 | char *buf) | 1684 | char *buf) |
@@ -1682,7 +1689,14 @@ static ssize_t hotkey_wakeup_reason_show(struct device *dev, | |||
1682 | static struct device_attribute dev_attr_hotkey_wakeup_reason = | 1689 | static struct device_attribute dev_attr_hotkey_wakeup_reason = |
1683 | __ATTR(wakeup_reason, S_IRUGO, hotkey_wakeup_reason_show, NULL); | 1690 | __ATTR(wakeup_reason, S_IRUGO, hotkey_wakeup_reason_show, NULL); |
1684 | 1691 | ||
1685 | /* sysfs wakeup hotunplug_complete ------------------------------------- */ | 1692 | void hotkey_wakeup_reason_notify_change(void) |
1693 | { | ||
1694 | if (tp_features.hotkey_mask) | ||
1695 | sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, | ||
1696 | "wakeup_reason"); | ||
1697 | } | ||
1698 | |||
1699 | /* sysfs wakeup hotunplug_complete (pollable) -------------------------- */ | ||
1686 | static ssize_t hotkey_wakeup_hotunplug_complete_show(struct device *dev, | 1700 | static ssize_t hotkey_wakeup_hotunplug_complete_show(struct device *dev, |
1687 | struct device_attribute *attr, | 1701 | struct device_attribute *attr, |
1688 | char *buf) | 1702 | char *buf) |
@@ -1694,6 +1708,13 @@ static struct device_attribute dev_attr_hotkey_wakeup_hotunplug_complete = | |||
1694 | __ATTR(wakeup_hotunplug_complete, S_IRUGO, | 1708 | __ATTR(wakeup_hotunplug_complete, S_IRUGO, |
1695 | hotkey_wakeup_hotunplug_complete_show, NULL); | 1709 | hotkey_wakeup_hotunplug_complete_show, NULL); |
1696 | 1710 | ||
1711 | void hotkey_wakeup_hotunplug_complete_notify_change(void) | ||
1712 | { | ||
1713 | if (tp_features.hotkey_mask) | ||
1714 | sysfs_notify(&tpacpi_pdev->dev.kobj, NULL, | ||
1715 | "wakeup_hotunplug_complete"); | ||
1716 | } | ||
1717 | |||
1697 | /* --------------------------------------------------------------------- */ | 1718 | /* --------------------------------------------------------------------- */ |
1698 | 1719 | ||
1699 | static struct attribute *hotkey_attributes[] __initdata = { | 1720 | static struct attribute *hotkey_attributes[] __initdata = { |
@@ -2106,6 +2127,7 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
2106 | printk(TPACPI_INFO | 2127 | printk(TPACPI_INFO |
2107 | "woke up due to a hot-unplug " | 2128 | "woke up due to a hot-unplug " |
2108 | "request...\n"); | 2129 | "request...\n"); |
2130 | hotkey_wakeup_reason_notify_change(); | ||
2109 | } | 2131 | } |
2110 | break; | 2132 | break; |
2111 | case 3: | 2133 | case 3: |
@@ -2114,6 +2136,7 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
2114 | hotkey_autosleep_ack = 1; | 2136 | hotkey_autosleep_ack = 1; |
2115 | printk(TPACPI_INFO | 2137 | printk(TPACPI_INFO |
2116 | "bay ejected\n"); | 2138 | "bay ejected\n"); |
2139 | hotkey_wakeup_hotunplug_complete_notify_change(); | ||
2117 | } else { | 2140 | } else { |
2118 | unk_ev = 1; | 2141 | unk_ev = 1; |
2119 | } | 2142 | } |
@@ -2124,6 +2147,7 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
2124 | hotkey_autosleep_ack = 1; | 2147 | hotkey_autosleep_ack = 1; |
2125 | printk(TPACPI_INFO | 2148 | printk(TPACPI_INFO |
2126 | "undocked\n"); | 2149 | "undocked\n"); |
2150 | hotkey_wakeup_hotunplug_complete_notify_change(); | ||
2127 | } else { | 2151 | } else { |
2128 | unk_ev = 1; | 2152 | unk_ev = 1; |
2129 | } | 2153 | } |
@@ -2150,6 +2174,7 @@ static void hotkey_notify(struct ibm_struct *ibm, u32 event) | |||
2150 | /* 0x7000-0x7FFF: misc */ | 2174 | /* 0x7000-0x7FFF: misc */ |
2151 | if (tp_features.hotkey_wlsw && hkey == 0x7000) { | 2175 | if (tp_features.hotkey_wlsw && hkey == 0x7000) { |
2152 | tpacpi_input_send_radiosw(); | 2176 | tpacpi_input_send_radiosw(); |
2177 | hotkey_radio_sw_notify_change(); | ||
2153 | send_acpi_ev = 0; | 2178 | send_acpi_ev = 0; |
2154 | break; | 2179 | break; |
2155 | } | 2180 | } |
@@ -2193,6 +2218,9 @@ static void hotkey_resume(void) | |||
2193 | "error while trying to read hot key mask " | 2218 | "error while trying to read hot key mask " |
2194 | "from firmware\n"); | 2219 | "from firmware\n"); |
2195 | tpacpi_input_send_radiosw(); | 2220 | tpacpi_input_send_radiosw(); |
2221 | hotkey_radio_sw_notify_change(); | ||
2222 | hotkey_wakeup_reason_notify_change(); | ||
2223 | hotkey_wakeup_hotunplug_complete_notify_change(); | ||
2196 | #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL | 2224 | #ifdef CONFIG_THINKPAD_ACPI_HOTKEY_POLL |
2197 | hotkey_poll_setup_safe(0); | 2225 | hotkey_poll_setup_safe(0); |
2198 | #endif | 2226 | #endif |