diff options
Diffstat (limited to 'drivers/input/misc')
| -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 | } |
