diff options
-rw-r--r-- | drivers/input/misc/wistron_btns.c | 114 |
1 files changed, 68 insertions, 46 deletions
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c index b77e2692ba3a..a05b8557842f 100644 --- a/drivers/input/misc/wistron_btns.c +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -174,7 +174,7 @@ static u16 bios_pop_queue(void) | |||
174 | return regs.eax; | 174 | return regs.eax; |
175 | } | 175 | } |
176 | 176 | ||
177 | static void __init bios_attach(void) | 177 | static void __devinit bios_attach(void) |
178 | { | 178 | { |
179 | struct regs regs; | 179 | struct regs regs; |
180 | 180 | ||
@@ -194,7 +194,7 @@ static void bios_detach(void) | |||
194 | call_bios(®s); | 194 | call_bios(®s); |
195 | } | 195 | } |
196 | 196 | ||
197 | static u8 __init bios_get_cmos_address(void) | 197 | static u8 __devinit bios_get_cmos_address(void) |
198 | { | 198 | { |
199 | struct regs regs; | 199 | struct regs regs; |
200 | 200 | ||
@@ -206,7 +206,7 @@ static u8 __init bios_get_cmos_address(void) | |||
206 | return regs.ecx; | 206 | return regs.ecx; |
207 | } | 207 | } |
208 | 208 | ||
209 | static u16 __init bios_get_default_setting(u8 subsys) | 209 | static u16 __devinit bios_get_default_setting(u8 subsys) |
210 | { | 210 | { |
211 | struct regs regs; | 211 | struct regs regs; |
212 | 212 | ||
@@ -367,7 +367,7 @@ static int __init select_keymap(void) | |||
367 | 367 | ||
368 | static struct input_dev *input_dev; | 368 | static struct input_dev *input_dev; |
369 | 369 | ||
370 | static int __init setup_input_dev(void) | 370 | static int __devinit setup_input_dev(void) |
371 | { | 371 | { |
372 | const struct key_entry *key; | 372 | const struct key_entry *key; |
373 | int error; | 373 | int error; |
@@ -466,6 +466,52 @@ static void poll_bios(unsigned long discard) | |||
466 | mod_timer(&poll_timer, jiffies + HZ / POLL_FREQUENCY); | 466 | mod_timer(&poll_timer, jiffies + HZ / POLL_FREQUENCY); |
467 | } | 467 | } |
468 | 468 | ||
469 | static int __devinit wistron_probe(struct platform_device *dev) | ||
470 | { | ||
471 | int err = setup_input_dev(); | ||
472 | if (err) | ||
473 | return err; | ||
474 | |||
475 | bios_attach(); | ||
476 | cmos_address = bios_get_cmos_address(); | ||
477 | |||
478 | if (have_wifi) { | ||
479 | u16 wifi = bios_get_default_setting(WIFI); | ||
480 | if (wifi & 1) | ||
481 | wifi_enabled = (wifi & 2) ? 1 : 0; | ||
482 | else | ||
483 | have_wifi = 0; | ||
484 | |||
485 | if (have_wifi) | ||
486 | bios_set_state(WIFI, wifi_enabled); | ||
487 | } | ||
488 | |||
489 | if (have_bluetooth) { | ||
490 | u16 bt = bios_get_default_setting(BLUETOOTH); | ||
491 | if (bt & 1) | ||
492 | bluetooth_enabled = (bt & 2) ? 1 : 0; | ||
493 | else | ||
494 | have_bluetooth = 0; | ||
495 | |||
496 | if (have_bluetooth) | ||
497 | bios_set_state(BLUETOOTH, bluetooth_enabled); | ||
498 | } | ||
499 | |||
500 | poll_bios(1); /* Flush stale event queue and arm timer */ | ||
501 | |||
502 | return 0; | ||
503 | } | ||
504 | |||
505 | static int __devexit wistron_remove(struct platform_device *dev) | ||
506 | { | ||
507 | del_timer_sync(&poll_timer); | ||
508 | input_unregister_device(input_dev); | ||
509 | bios_detach(); | ||
510 | |||
511 | return 0; | ||
512 | } | ||
513 | |||
514 | #ifdef CONFIG_PM | ||
469 | static int wistron_suspend(struct platform_device *dev, pm_message_t state) | 515 | static int wistron_suspend(struct platform_device *dev, pm_message_t state) |
470 | { | 516 | { |
471 | del_timer_sync(&poll_timer); | 517 | del_timer_sync(&poll_timer); |
@@ -491,13 +537,20 @@ static int wistron_resume(struct platform_device *dev) | |||
491 | 537 | ||
492 | return 0; | 538 | return 0; |
493 | } | 539 | } |
540 | #else | ||
541 | #define wistron_suspend NULL | ||
542 | #define wistron_resume NULL | ||
543 | #endif | ||
494 | 544 | ||
495 | static struct platform_driver wistron_driver = { | 545 | static struct platform_driver wistron_driver = { |
496 | .suspend = wistron_suspend, | ||
497 | .resume = wistron_resume, | ||
498 | .driver = { | 546 | .driver = { |
499 | .name = "wistron-bios", | 547 | .name = "wistron-bios", |
548 | .owner = THIS_MODULE, | ||
500 | }, | 549 | }, |
550 | .probe = wistron_probe, | ||
551 | .remove = __devexit_p(wistron_remove), | ||
552 | .suspend = wistron_suspend, | ||
553 | .resume = wistron_resume, | ||
501 | }; | 554 | }; |
502 | 555 | ||
503 | static int __init wb_module_init(void) | 556 | static int __init wb_module_init(void) |
@@ -512,55 +565,27 @@ static int __init wb_module_init(void) | |||
512 | if (err) | 565 | if (err) |
513 | return err; | 566 | return err; |
514 | 567 | ||
515 | bios_attach(); | ||
516 | cmos_address = bios_get_cmos_address(); | ||
517 | |||
518 | err = platform_driver_register(&wistron_driver); | 568 | err = platform_driver_register(&wistron_driver); |
519 | if (err) | 569 | if (err) |
520 | goto err_detach_bios; | 570 | goto err_unmap_bios; |
521 | 571 | ||
522 | wistron_device = platform_device_register_simple("wistron-bios", -1, NULL, 0); | 572 | wistron_device = platform_device_alloc("wistron-bios", -1); |
523 | if (IS_ERR(wistron_device)) { | 573 | if (!wistron_device) { |
524 | err = PTR_ERR(wistron_device); | 574 | err = -ENOMEM; |
525 | goto err_unregister_driver; | 575 | goto err_unregister_driver; |
526 | } | 576 | } |
527 | 577 | ||
528 | if (have_wifi) { | 578 | err = platform_device_add(wistron_device); |
529 | u16 wifi = bios_get_default_setting(WIFI); | ||
530 | if (wifi & 1) | ||
531 | wifi_enabled = (wifi & 2) ? 1 : 0; | ||
532 | else | ||
533 | have_wifi = 0; | ||
534 | |||
535 | if (have_wifi) | ||
536 | bios_set_state(WIFI, wifi_enabled); | ||
537 | } | ||
538 | |||
539 | if (have_bluetooth) { | ||
540 | u16 bt = bios_get_default_setting(BLUETOOTH); | ||
541 | if (bt & 1) | ||
542 | bluetooth_enabled = (bt & 2) ? 1 : 0; | ||
543 | else | ||
544 | have_bluetooth = 0; | ||
545 | |||
546 | if (have_bluetooth) | ||
547 | bios_set_state(BLUETOOTH, bluetooth_enabled); | ||
548 | } | ||
549 | |||
550 | err = setup_input_dev(); | ||
551 | if (err) | 579 | if (err) |
552 | goto err_unregister_device; | 580 | goto err_free_device; |
553 | |||
554 | poll_bios(1); /* Flush stale event queue and arm timer */ | ||
555 | 581 | ||
556 | return 0; | 582 | return 0; |
557 | 583 | ||
558 | err_unregister_device: | 584 | err_free_device: |
559 | platform_device_unregister(wistron_device); | 585 | platform_device_put(wistron_device); |
560 | err_unregister_driver: | 586 | err_unregister_driver: |
561 | platform_driver_unregister(&wistron_driver); | 587 | platform_driver_unregister(&wistron_driver); |
562 | err_detach_bios: | 588 | err_unmap_bios: |
563 | bios_detach(); | ||
564 | unmap_bios(); | 589 | unmap_bios(); |
565 | 590 | ||
566 | return err; | 591 | return err; |
@@ -568,11 +593,8 @@ static int __init wb_module_init(void) | |||
568 | 593 | ||
569 | static void __exit wb_module_exit(void) | 594 | static void __exit wb_module_exit(void) |
570 | { | 595 | { |
571 | del_timer_sync(&poll_timer); | ||
572 | input_unregister_device(input_dev); | ||
573 | platform_device_unregister(wistron_device); | 596 | platform_device_unregister(wistron_device); |
574 | platform_driver_unregister(&wistron_driver); | 597 | platform_driver_unregister(&wistron_driver); |
575 | bios_detach(); | ||
576 | unmap_bios(); | 598 | unmap_bios(); |
577 | } | 599 | } |
578 | 600 | ||