diff options
Diffstat (limited to 'drivers/watchdog/bfin_wdt.c')
| -rw-r--r-- | drivers/watchdog/bfin_wdt.c | 111 |
1 files changed, 71 insertions, 40 deletions
diff --git a/drivers/watchdog/bfin_wdt.c b/drivers/watchdog/bfin_wdt.c index 1237113dc14a..03b3e3d91e7c 100644 --- a/drivers/watchdog/bfin_wdt.c +++ b/drivers/watchdog/bfin_wdt.c | |||
| @@ -29,7 +29,8 @@ | |||
| 29 | 29 | ||
| 30 | #define stamp(fmt, args...) pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args) | 30 | #define stamp(fmt, args...) pr_debug("%s:%i: " fmt "\n", __func__, __LINE__, ## args) |
| 31 | #define stampit() stamp("here i am") | 31 | #define stampit() stamp("here i am") |
| 32 | #define pr_init(fmt, args...) ({ static const __initdata char __fmt[] = fmt; printk(__fmt, ## args); }) | 32 | #define pr_devinit(fmt, args...) ({ static const __devinitconst char __fmt[] = fmt; printk(__fmt, ## args); }) |
| 33 | #define pr_init(fmt, args...) ({ static const __initconst char __fmt[] = fmt; printk(__fmt, ## args); }) | ||
| 33 | 34 | ||
| 34 | #define WATCHDOG_NAME "bfin-wdt" | 35 | #define WATCHDOG_NAME "bfin-wdt" |
| 35 | #define PFX WATCHDOG_NAME ": " | 36 | #define PFX WATCHDOG_NAME ": " |
| @@ -377,20 +378,6 @@ static int bfin_wdt_resume(struct platform_device *pdev) | |||
| 377 | # define bfin_wdt_resume NULL | 378 | # define bfin_wdt_resume NULL |
| 378 | #endif | 379 | #endif |
| 379 | 380 | ||
| 380 | static struct platform_device bfin_wdt_device = { | ||
| 381 | .name = WATCHDOG_NAME, | ||
| 382 | .id = -1, | ||
| 383 | }; | ||
| 384 | |||
| 385 | static struct platform_driver bfin_wdt_driver = { | ||
| 386 | .driver = { | ||
| 387 | .name = WATCHDOG_NAME, | ||
| 388 | .owner = THIS_MODULE, | ||
| 389 | }, | ||
| 390 | .suspend = bfin_wdt_suspend, | ||
| 391 | .resume = bfin_wdt_resume, | ||
| 392 | }; | ||
| 393 | |||
| 394 | static const struct file_operations bfin_wdt_fops = { | 381 | static const struct file_operations bfin_wdt_fops = { |
| 395 | .owner = THIS_MODULE, | 382 | .owner = THIS_MODULE, |
| 396 | .llseek = no_llseek, | 383 | .llseek = no_llseek, |
| @@ -418,11 +405,67 @@ static struct notifier_block bfin_wdt_notifier = { | |||
| 418 | }; | 405 | }; |
| 419 | 406 | ||
| 420 | /** | 407 | /** |
| 421 | * bfin_wdt_init - Initialize module | 408 | * bfin_wdt_probe - Initialize module |
| 422 | * | 409 | * |
| 423 | * Registers the device and notifier handler. Actual device | 410 | * Registers the misc device and notifier handler. Actual device |
| 424 | * initialization is handled by bfin_wdt_open(). | 411 | * initialization is handled by bfin_wdt_open(). |
| 425 | */ | 412 | */ |
| 413 | static int __devinit bfin_wdt_probe(struct platform_device *pdev) | ||
| 414 | { | ||
| 415 | int ret; | ||
| 416 | |||
| 417 | ret = register_reboot_notifier(&bfin_wdt_notifier); | ||
| 418 | if (ret) { | ||
| 419 | pr_devinit(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", ret); | ||
| 420 | return ret; | ||
| 421 | } | ||
| 422 | |||
| 423 | ret = misc_register(&bfin_wdt_miscdev); | ||
| 424 | if (ret) { | ||
| 425 | pr_devinit(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | ||
| 426 | WATCHDOG_MINOR, ret); | ||
| 427 | unregister_reboot_notifier(&bfin_wdt_notifier); | ||
| 428 | return ret; | ||
| 429 | } | ||
| 430 | |||
| 431 | pr_devinit(KERN_INFO PFX "initialized: timeout=%d sec (nowayout=%d)\n", | ||
| 432 | timeout, nowayout); | ||
| 433 | |||
| 434 | return 0; | ||
| 435 | } | ||
| 436 | |||
| 437 | /** | ||
| 438 | * bfin_wdt_remove - Initialize module | ||
| 439 | * | ||
| 440 | * Unregisters the misc device and notifier handler. Actual device | ||
| 441 | * deinitialization is handled by bfin_wdt_close(). | ||
| 442 | */ | ||
| 443 | static int __devexit bfin_wdt_remove(struct platform_device *pdev) | ||
| 444 | { | ||
| 445 | misc_deregister(&bfin_wdt_miscdev); | ||
| 446 | unregister_reboot_notifier(&bfin_wdt_notifier); | ||
| 447 | return 0; | ||
| 448 | } | ||
| 449 | |||
| 450 | static struct platform_device *bfin_wdt_device; | ||
| 451 | |||
| 452 | static struct platform_driver bfin_wdt_driver = { | ||
| 453 | .probe = bfin_wdt_probe, | ||
| 454 | .remove = __devexit_p(bfin_wdt_remove), | ||
| 455 | .suspend = bfin_wdt_suspend, | ||
| 456 | .resume = bfin_wdt_resume, | ||
| 457 | .driver = { | ||
| 458 | .name = WATCHDOG_NAME, | ||
| 459 | .owner = THIS_MODULE, | ||
| 460 | }, | ||
| 461 | }; | ||
| 462 | |||
| 463 | /** | ||
| 464 | * bfin_wdt_init - Initialize module | ||
| 465 | * | ||
| 466 | * Checks the module params and registers the platform device & driver. | ||
| 467 | * Real work is in the platform probe function. | ||
| 468 | */ | ||
| 426 | static int __init bfin_wdt_init(void) | 469 | static int __init bfin_wdt_init(void) |
| 427 | { | 470 | { |
| 428 | int ret; | 471 | int ret; |
| @@ -436,44 +479,32 @@ static int __init bfin_wdt_init(void) | |||
| 436 | /* Since this is an on-chip device and needs no board-specific | 479 | /* Since this is an on-chip device and needs no board-specific |
| 437 | * resources, we'll handle all the platform device stuff here. | 480 | * resources, we'll handle all the platform device stuff here. |
| 438 | */ | 481 | */ |
| 439 | ret = platform_device_register(&bfin_wdt_device); | 482 | ret = platform_driver_register(&bfin_wdt_driver); |
| 440 | if (ret) | ||
| 441 | return ret; | ||
| 442 | |||
| 443 | ret = platform_driver_probe(&bfin_wdt_driver, NULL); | ||
| 444 | if (ret) | ||
| 445 | return ret; | ||
| 446 | |||
| 447 | ret = register_reboot_notifier(&bfin_wdt_notifier); | ||
| 448 | if (ret) { | 483 | if (ret) { |
| 449 | pr_init(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", ret); | 484 | pr_init(KERN_ERR PFX "unable to register driver\n"); |
| 450 | return ret; | 485 | return ret; |
| 451 | } | 486 | } |
| 452 | 487 | ||
| 453 | ret = misc_register(&bfin_wdt_miscdev); | 488 | bfin_wdt_device = platform_device_register_simple(WATCHDOG_NAME, -1, NULL, 0); |
| 454 | if (ret) { | 489 | if (IS_ERR(bfin_wdt_device)) { |
| 455 | pr_init(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", | 490 | pr_init(KERN_ERR PFX "unable to register device\n"); |
| 456 | WATCHDOG_MINOR, ret); | 491 | platform_driver_unregister(&bfin_wdt_driver); |
| 457 | unregister_reboot_notifier(&bfin_wdt_notifier); | 492 | return PTR_ERR(bfin_wdt_device); |
| 458 | return ret; | ||
| 459 | } | 493 | } |
| 460 | 494 | ||
| 461 | pr_init(KERN_INFO PFX "initialized: timeout=%d sec (nowayout=%d)\n", | ||
| 462 | timeout, nowayout); | ||
| 463 | |||
| 464 | return 0; | 495 | return 0; |
| 465 | } | 496 | } |
| 466 | 497 | ||
| 467 | /** | 498 | /** |
| 468 | * bfin_wdt_exit - Deinitialize module | 499 | * bfin_wdt_exit - Deinitialize module |
| 469 | * | 500 | * |
| 470 | * Unregisters the device and notifier handler. Actual device | 501 | * Back out the platform device & driver steps. Real work is in the |
| 471 | * deinitialization is handled by bfin_wdt_close(). | 502 | * platform remove function. |
| 472 | */ | 503 | */ |
| 473 | static void __exit bfin_wdt_exit(void) | 504 | static void __exit bfin_wdt_exit(void) |
| 474 | { | 505 | { |
| 475 | misc_deregister(&bfin_wdt_miscdev); | 506 | platform_device_unregister(bfin_wdt_device); |
| 476 | unregister_reboot_notifier(&bfin_wdt_notifier); | 507 | platform_driver_unregister(&bfin_wdt_driver); |
| 477 | } | 508 | } |
| 478 | 509 | ||
| 479 | module_init(bfin_wdt_init); | 510 | module_init(bfin_wdt_init); |
