diff options
| -rw-r--r-- | drivers/platform/x86/thinkpad_acpi.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 50aa4c112b28..ffd584c35808 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
| @@ -2014,6 +2014,9 @@ static u16 *hotkey_keycode_map; | |||
| 2014 | 2014 | ||
| 2015 | static struct attribute_set *hotkey_dev_attributes; | 2015 | static struct attribute_set *hotkey_dev_attributes; |
| 2016 | 2016 | ||
| 2017 | static void tpacpi_driver_event(const unsigned int hkey_event); | ||
| 2018 | static void hotkey_driver_event(const unsigned int scancode); | ||
| 2019 | |||
| 2017 | /* HKEY.MHKG() return bits */ | 2020 | /* HKEY.MHKG() return bits */ |
| 2018 | #define TP_HOTKEY_TABLET_MASK (1 << 3) | 2021 | #define TP_HOTKEY_TABLET_MASK (1 << 3) |
| 2019 | 2022 | ||
| @@ -2168,6 +2171,35 @@ static int hotkey_user_mask_set(const u32 mask) | |||
| 2168 | return rc; | 2171 | return rc; |
| 2169 | } | 2172 | } |
| 2170 | 2173 | ||
| 2174 | /* | ||
| 2175 | * Sets the driver hotkey mask. | ||
| 2176 | * | ||
| 2177 | * Can be called even if the hotkey subdriver is inactive | ||
| 2178 | */ | ||
| 2179 | static int tpacpi_hotkey_driver_mask_set(const u32 mask) | ||
| 2180 | { | ||
| 2181 | int rc; | ||
| 2182 | |||
| 2183 | /* Do the right thing if hotkey_init has not been called yet */ | ||
| 2184 | if (!tp_features.hotkey) { | ||
| 2185 | hotkey_driver_mask = mask; | ||
| 2186 | return 0; | ||
| 2187 | } | ||
| 2188 | |||
| 2189 | mutex_lock(&hotkey_mutex); | ||
| 2190 | |||
| 2191 | HOTKEY_CONFIG_CRITICAL_START | ||
| 2192 | hotkey_driver_mask = mask; | ||
| 2193 | hotkey_source_mask |= (mask & ~hotkey_all_mask); | ||
| 2194 | HOTKEY_CONFIG_CRITICAL_END | ||
| 2195 | |||
| 2196 | rc = hotkey_mask_set((hotkey_acpi_mask | hotkey_driver_mask) & | ||
| 2197 | ~hotkey_source_mask); | ||
| 2198 | mutex_unlock(&hotkey_mutex); | ||
| 2199 | |||
| 2200 | return rc; | ||
| 2201 | } | ||
| 2202 | |||
| 2171 | static int hotkey_status_get(int *status) | 2203 | static int hotkey_status_get(int *status) |
| 2172 | { | 2204 | { |
| 2173 | if (!acpi_evalf(hkey_handle, status, "DHKC", "d")) | 2205 | if (!acpi_evalf(hkey_handle, status, "DHKC", "d")) |
| @@ -2227,6 +2259,7 @@ static void tpacpi_input_send_key(const unsigned int scancode) | |||
| 2227 | /* Do NOT call without validating scancode first */ | 2259 | /* Do NOT call without validating scancode first */ |
| 2228 | static void tpacpi_input_send_key_masked(const unsigned int scancode) | 2260 | static void tpacpi_input_send_key_masked(const unsigned int scancode) |
| 2229 | { | 2261 | { |
| 2262 | hotkey_driver_event(scancode); | ||
| 2230 | if (hotkey_user_mask & (1 << scancode)) | 2263 | if (hotkey_user_mask & (1 << scancode)) |
| 2231 | tpacpi_input_send_key(scancode); | 2264 | tpacpi_input_send_key(scancode); |
| 2232 | } | 2265 | } |
| @@ -7625,6 +7658,21 @@ static struct ibm_struct fan_driver_data = { | |||
| 7625 | **************************************************************************** | 7658 | **************************************************************************** |
| 7626 | ****************************************************************************/ | 7659 | ****************************************************************************/ |
| 7627 | 7660 | ||
| 7661 | /* | ||
| 7662 | * HKEY event callout for other subdrivers go here | ||
| 7663 | * (yes, it is ugly, but it is quick, safe, and gets the job done | ||
| 7664 | */ | ||
| 7665 | static void tpacpi_driver_event(const unsigned int hkey_event) | ||
| 7666 | { | ||
| 7667 | } | ||
| 7668 | |||
| 7669 | |||
| 7670 | |||
| 7671 | static void hotkey_driver_event(const unsigned int scancode) | ||
| 7672 | { | ||
| 7673 | tpacpi_driver_event(0x1001 + scancode); | ||
| 7674 | } | ||
| 7675 | |||
| 7628 | /* sysfs name ---------------------------------------------------------- */ | 7676 | /* sysfs name ---------------------------------------------------------- */ |
| 7629 | static ssize_t thinkpad_acpi_pdev_name_show(struct device *dev, | 7677 | static ssize_t thinkpad_acpi_pdev_name_show(struct device *dev, |
| 7630 | struct device_attribute *attr, | 7678 | struct device_attribute *attr, |
