diff options
Diffstat (limited to 'drivers/platform')
-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, |