aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrique de Moraes Holschuh <hmh@hmh.eng.br>2008-01-08 10:02:55 -0500
committerLen Brown <len.brown@intel.com>2008-02-01 22:26:08 -0500
commit50ebec09f1a79df27afeceb14a3059944f327e1d (patch)
tree4d368a7c03f4e08bc6a0368385bacceffced6931
parent013c40e457ac573b29daa0e369c2ba6729c23557 (diff)
ACPI: thinkpad-acpi: add poll() support to some sysfs attributes
Implement poll()/select() support through sysfs_notify() for some key attributes which userspace might want to poll() or select() on. In order to let userspace know poll()/select() support is available for an attribute, the thinkpad-acpi sysfs interface version is also bumped up. Further changes that add poll()/select() capabilities to any pre-existing attributes will also increment the sysfs interface version. Signed-off-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--Documentation/thinkpad-acpi.txt9
-rw-r--r--drivers/misc/thinkpad_acpi.c36
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
343input layer notes: 349input layer notes:
344 350
345A Hot key is mapped to a single input layer EV_KEY event, possibly 351A 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
13640x020200: 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) ------------------------------------ */
1647static ssize_t hotkey_radio_sw_show(struct device *dev, 1647static 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,
1659static struct device_attribute dev_attr_hotkey_radio_sw = 1659static 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
1662static 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 -------------------------------------------- */
1663static ssize_t hotkey_report_mode_show(struct device *dev, 1670static 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,
1671static struct device_attribute dev_attr_hotkey_report_mode = 1678static 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) -------------------------------------- */
1675static ssize_t hotkey_wakeup_reason_show(struct device *dev, 1682static 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,
1682static struct device_attribute dev_attr_hotkey_wakeup_reason = 1689static 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 ------------------------------------- */ 1692void 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) -------------------------- */
1686static ssize_t hotkey_wakeup_hotunplug_complete_show(struct device *dev, 1700static 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
1711void 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
1699static struct attribute *hotkey_attributes[] __initdata = { 1720static 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