diff options
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/misc/wistron_btns.c | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index 6d7e865f9007..b64798d838a2 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -149,7 +149,7 @@ err: | |||
149 | return -ENOMEM; | 149 | return -ENOMEM; |
150 | } | 150 | } |
151 | 151 | ||
152 | static void __exit unmap_bios(void) | 152 | static inline void unmap_bios(void) |
153 | { | 153 | { |
154 | iounmap(bios_code_map_base); | 154 | iounmap(bios_code_map_base); |
155 | iounmap(bios_data_map_base); | 155 | iounmap(bios_data_map_base); |
@@ -180,7 +180,7 @@ static void __init bios_attach(void) | |||
180 | call_bios(®s); | 180 | call_bios(®s); |
181 | } | 181 | } |
182 | 182 | ||
183 | static void __exit bios_detach(void) | 183 | static void bios_detach(void) |
184 | { | 184 | { |
185 | struct regs regs; | 185 | struct regs regs; |
186 | 186 | ||
@@ -342,31 +342,43 @@ static int __init select_keymap(void) | |||
342 | 342 | ||
343 | /* Input layer interface */ | 343 | /* Input layer interface */ |
344 | 344 | ||
345 | static struct input_dev input_dev = { | 345 | static struct input_dev *input_dev; |
346 | .name = "Wistron laptop buttons", | ||
347 | }; | ||
348 | 346 | ||
349 | static void __init setup_input_dev(void) | 347 | static int __init setup_input_dev(void) |
350 | { | 348 | { |
351 | const struct key_entry *key; | 349 | const struct key_entry *key; |
350 | int error; | ||
351 | |||
352 | input_dev = input_allocate_device(); | ||
353 | if (!input_dev) | ||
354 | return -ENOMEM; | ||
355 | |||
356 | input_dev->name = "Wistron laptop buttons"; | ||
357 | input_dev->phys = "wistron/input0"; | ||
358 | input_dev->id.bustype = BUS_HOST; | ||
352 | 359 | ||
353 | for (key = keymap; key->type != KE_END; key++) { | 360 | for (key = keymap; key->type != KE_END; key++) { |
354 | if (key->type == KE_KEY) { | 361 | if (key->type == KE_KEY) { |
355 | input_dev.evbit[LONG(EV_KEY)] = BIT(EV_KEY); | 362 | input_dev->evbit[LONG(EV_KEY)] = BIT(EV_KEY); |
356 | input_dev.keybit[LONG(key->keycode)] | 363 | set_bit(key->keycode, input_dev->keybit); |
357 | |= BIT(key->keycode); | ||
358 | } | 364 | } |
359 | } | 365 | } |
360 | 366 | ||
361 | input_register_device(&input_dev); | 367 | error = input_register_device(input_dev); |
368 | if (error) { | ||
369 | input_free_device(input_dev); | ||
370 | return error; | ||
371 | } | ||
372 | |||
373 | return 0; | ||
362 | } | 374 | } |
363 | 375 | ||
364 | static void report_key(unsigned keycode) | 376 | static void report_key(unsigned keycode) |
365 | { | 377 | { |
366 | input_report_key(&input_dev, keycode, 1); | 378 | input_report_key(input_dev, keycode, 1); |
367 | input_sync(&input_dev); | 379 | input_sync(input_dev); |
368 | input_report_key(&input_dev, keycode, 0); | 380 | input_report_key(input_dev, keycode, 0); |
369 | input_sync(&input_dev); | 381 | input_sync(input_dev); |
370 | } | 382 | } |
371 | 383 | ||
372 | /* Driver core */ | 384 | /* Driver core */ |
@@ -437,11 +449,14 @@ static int __init wb_module_init(void) | |||
437 | err = select_keymap(); | 449 | err = select_keymap(); |
438 | if (err) | 450 | if (err) |
439 | return err; | 451 | return err; |
452 | |||
440 | err = map_bios(); | 453 | err = map_bios(); |
441 | if (err) | 454 | if (err) |
442 | return err; | 455 | return err; |
456 | |||
443 | bios_attach(); | 457 | bios_attach(); |
444 | cmos_address = bios_get_cmos_address(); | 458 | cmos_address = bios_get_cmos_address(); |
459 | |||
445 | if (have_wifi) { | 460 | if (have_wifi) { |
446 | u16 wifi = bios_get_default_setting(WIFI); | 461 | u16 wifi = bios_get_default_setting(WIFI); |
447 | if (wifi & 1) | 462 | if (wifi & 1) |
@@ -452,6 +467,7 @@ static int __init wb_module_init(void) | |||
452 | if (have_wifi) | 467 | if (have_wifi) |
453 | bios_set_state(WIFI, wifi_enabled); | 468 | bios_set_state(WIFI, wifi_enabled); |
454 | } | 469 | } |
470 | |||
455 | if (have_bluetooth) { | 471 | if (have_bluetooth) { |
456 | u16 bt = bios_get_default_setting(BLUETOOTH); | 472 | u16 bt = bios_get_default_setting(BLUETOOTH); |
457 | if (bt & 1) | 473 | if (bt & 1) |
@@ -463,7 +479,12 @@ static int __init wb_module_init(void) | |||
463 | bios_set_state(BLUETOOTH, bluetooth_enabled); | 479 | bios_set_state(BLUETOOTH, bluetooth_enabled); |
464 | } | 480 | } |
465 | 481 | ||
466 | setup_input_dev(); | 482 | err = setup_input_dev(); |
483 | if (err) { | ||
484 | bios_detach(); | ||
485 | unmap_bios(); | ||
486 | return err; | ||
487 | } | ||
467 | 488 | ||
468 | poll_bios(1); /* Flush stale event queue and arm timer */ | 489 | poll_bios(1); /* Flush stale event queue and arm timer */ |
469 | 490 | ||
@@ -473,7 +494,7 @@ static int __init wb_module_init(void) | |||
473 | static void __exit wb_module_exit(void) | 494 | static void __exit wb_module_exit(void) |
474 | { | 495 | { |
475 | del_timer_sync(&poll_timer); | 496 | del_timer_sync(&poll_timer); |
476 | input_unregister_device(&input_dev); | 497 | input_unregister_device(input_dev); |
477 | bios_detach(); | 498 | bios_detach(); |
478 | unmap_bios(); | 499 | unmap_bios(); |
479 | } | 500 | } |