diff options
author | Maxim Mikityanskiy <maxtram95@gmail.com> | 2012-12-15 12:31:34 -0500 |
---|---|---|
committer | Matthew Garrett <matthew.garrett@nebula.com> | 2013-02-24 17:49:54 -0500 |
commit | da8506288fc4b2cc62d0ba477c2fe2a16f8891b0 (patch) | |
tree | 83b2a000ad38cf0c88362223fe137aa821bdae3c /drivers/platform/x86 | |
parent | b0d3bb53beaba866ce80424fb512b1669ed88da0 (diff) |
msi-wmi: Make keys and backlight independent
Introduced function msi_wmi_backlight_setup() that initializes backlight
device. Made driver load and work if only one WMI (only for hotkeys or
only for backlight) is present.
Signed-off-by: Maxim Mikityanskiy <maxtram95@gmail.com>
Signed-off-by: Matthew Garrett <matthew.garrett@nebula.com>
Diffstat (limited to 'drivers/platform/x86')
-rw-r--r-- | drivers/platform/x86/msi-wmi.c | 101 |
1 files changed, 64 insertions, 37 deletions
diff --git a/drivers/platform/x86/msi-wmi.c b/drivers/platform/x86/msi-wmi.c index 112ec1488ea8..3a6061985e4d 100644 --- a/drivers/platform/x86/msi-wmi.c +++ b/drivers/platform/x86/msi-wmi.c | |||
@@ -60,6 +60,8 @@ static struct key_entry msi_wmi_keymap[] = { | |||
60 | }; | 60 | }; |
61 | static ktime_t last_pressed[ARRAY_SIZE(msi_wmi_keymap) - 1]; | 61 | static ktime_t last_pressed[ARRAY_SIZE(msi_wmi_keymap) - 1]; |
62 | 62 | ||
63 | static const char *event_wmi_guid; | ||
64 | |||
63 | static struct backlight_device *backlight; | 65 | static struct backlight_device *backlight; |
64 | 66 | ||
65 | static int backlight_map[] = { 0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF }; | 67 | static int backlight_map[] = { 0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF }; |
@@ -184,7 +186,7 @@ static void msi_wmi_notify(u32 value, void *context) | |||
184 | 186 | ||
185 | if (key->type == KE_KEY && | 187 | if (key->type == KE_KEY && |
186 | /* Brightness is served via acpi video driver */ | 188 | /* Brightness is served via acpi video driver */ |
187 | (!acpi_video_backlight_support() || | 189 | (backlight || |
188 | (key->code != MSI_KEY_BRIGHTNESSUP && | 190 | (key->code != MSI_KEY_BRIGHTNESSUP && |
189 | key->code != MSI_KEY_BRIGHTNESSDOWN))) { | 191 | key->code != MSI_KEY_BRIGHTNESSDOWN))) { |
190 | pr_debug("Send key: 0x%X - " | 192 | pr_debug("Send key: 0x%X - " |
@@ -202,6 +204,31 @@ msi_wmi_notify_exit: | |||
202 | kfree(response.pointer); | 204 | kfree(response.pointer); |
203 | } | 205 | } |
204 | 206 | ||
207 | static int __init msi_wmi_backlight_setup(void) | ||
208 | { | ||
209 | int err; | ||
210 | struct backlight_properties props; | ||
211 | |||
212 | memset(&props, 0, sizeof(struct backlight_properties)); | ||
213 | props.type = BACKLIGHT_PLATFORM; | ||
214 | props.max_brightness = ARRAY_SIZE(backlight_map) - 1; | ||
215 | backlight = backlight_device_register(DRV_NAME, NULL, NULL, | ||
216 | &msi_backlight_ops, | ||
217 | &props); | ||
218 | if (IS_ERR(backlight)) | ||
219 | return PTR_ERR(backlight); | ||
220 | |||
221 | err = bl_get(NULL); | ||
222 | if (err < 0) { | ||
223 | backlight_device_unregister(backlight); | ||
224 | return err; | ||
225 | } | ||
226 | |||
227 | backlight->props.brightness = err; | ||
228 | |||
229 | return 0; | ||
230 | } | ||
231 | |||
205 | static int __init msi_wmi_input_setup(void) | 232 | static int __init msi_wmi_input_setup(void) |
206 | { | 233 | { |
207 | int err; | 234 | int err; |
@@ -238,60 +265,60 @@ static int __init msi_wmi_init(void) | |||
238 | { | 265 | { |
239 | int err; | 266 | int err; |
240 | 267 | ||
241 | if (!wmi_has_guid(MSIWMI_EVENT_GUID)) { | 268 | if (wmi_has_guid(MSIWMI_EVENT_GUID)) { |
242 | pr_err("This machine doesn't have MSI-hotkeys through WMI\n"); | 269 | err = msi_wmi_input_setup(); |
243 | return -ENODEV; | 270 | if (err) { |
244 | } | 271 | pr_err("Unable to setup input device\n"); |
245 | err = wmi_install_notify_handler(MSIWMI_EVENT_GUID, | 272 | return err; |
246 | msi_wmi_notify, NULL); | 273 | } |
247 | if (ACPI_FAILURE(err)) | ||
248 | return -EINVAL; | ||
249 | 274 | ||
250 | err = msi_wmi_input_setup(); | 275 | err = wmi_install_notify_handler(MSIWMI_EVENT_GUID, |
251 | if (err) | 276 | msi_wmi_notify, NULL); |
252 | goto err_uninstall_notifier; | 277 | if (ACPI_FAILURE(err)) { |
253 | 278 | pr_err("Unable to setup WMI notify handler\n"); | |
254 | if (!acpi_video_backlight_support()) { | ||
255 | struct backlight_properties props; | ||
256 | memset(&props, 0, sizeof(struct backlight_properties)); | ||
257 | props.type = BACKLIGHT_PLATFORM; | ||
258 | props.max_brightness = ARRAY_SIZE(backlight_map) - 1; | ||
259 | backlight = backlight_device_register(DRV_NAME, NULL, NULL, | ||
260 | &msi_backlight_ops, | ||
261 | &props); | ||
262 | if (IS_ERR(backlight)) { | ||
263 | err = PTR_ERR(backlight); | ||
264 | goto err_free_input; | 279 | goto err_free_input; |
265 | } | 280 | } |
266 | 281 | ||
267 | err = bl_get(NULL); | 282 | pr_debug("Event handler installed\n"); |
268 | if (err < 0) | 283 | event_wmi_guid = MSIWMI_EVENT_GUID; |
269 | goto err_free_backlight; | 284 | } |
285 | |||
286 | if (wmi_has_guid(MSIWMI_BIOS_GUID) && !acpi_video_backlight_support()) { | ||
287 | err = msi_wmi_backlight_setup(); | ||
288 | if (err) { | ||
289 | pr_err("Unable to setup backlight device\n"); | ||
290 | goto err_uninstall_handler; | ||
291 | } | ||
292 | pr_debug("Backlight device created\n"); | ||
293 | } | ||
270 | 294 | ||
271 | backlight->props.brightness = err; | 295 | if (!event_wmi_guid && !backlight) { |
296 | pr_err("This machine doesn't have neither MSI-hotkeys nor backlight through WMI\n"); | ||
297 | return -ENODEV; | ||
272 | } | 298 | } |
273 | pr_debug("Event handler installed\n"); | ||
274 | 299 | ||
275 | return 0; | 300 | return 0; |
276 | 301 | ||
277 | err_free_backlight: | 302 | err_uninstall_handler: |
278 | backlight_device_unregister(backlight); | 303 | if (event_wmi_guid) |
304 | wmi_remove_notify_handler(event_wmi_guid); | ||
279 | err_free_input: | 305 | err_free_input: |
280 | sparse_keymap_free(msi_wmi_input_dev); | 306 | if (event_wmi_guid) { |
281 | input_unregister_device(msi_wmi_input_dev); | 307 | sparse_keymap_free(msi_wmi_input_dev); |
282 | err_uninstall_notifier: | 308 | input_unregister_device(msi_wmi_input_dev); |
283 | wmi_remove_notify_handler(MSIWMI_EVENT_GUID); | 309 | } |
284 | return err; | 310 | return err; |
285 | } | 311 | } |
286 | 312 | ||
287 | static void __exit msi_wmi_exit(void) | 313 | static void __exit msi_wmi_exit(void) |
288 | { | 314 | { |
289 | if (wmi_has_guid(MSIWMI_EVENT_GUID)) { | 315 | if (event_wmi_guid) { |
290 | wmi_remove_notify_handler(MSIWMI_EVENT_GUID); | 316 | wmi_remove_notify_handler(event_wmi_guid); |
291 | sparse_keymap_free(msi_wmi_input_dev); | 317 | sparse_keymap_free(msi_wmi_input_dev); |
292 | input_unregister_device(msi_wmi_input_dev); | 318 | input_unregister_device(msi_wmi_input_dev); |
293 | backlight_device_unregister(backlight); | ||
294 | } | 319 | } |
320 | if (backlight) | ||
321 | backlight_device_unregister(backlight); | ||
295 | } | 322 | } |
296 | 323 | ||
297 | module_init(msi_wmi_init); | 324 | module_init(msi_wmi_init); |