diff options
| author | Wim Van Sebroeck <wim@iguana.be> | 2006-06-30 02:44:53 -0400 | 
|---|---|---|
| committer | Wim Van Sebroeck <wim@iguana.be> | 2006-10-03 15:34:46 -0400 | 
| commit | 3836cc0ff8c875e21a8119e7a4f0227f6e227650 (patch) | |
| tree | d12f4221d419538e626450d45af191370a7d6cbf | |
| parent | 9e0ea345ff542320882caa21ec2248e6c02d8b91 (diff) | |
[WATCHDOG] iTCO_wdt (Intel TCO Timer) driver
Convert the iTCO_wdt driver to a platform device
driver.
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
| -rw-r--r-- | drivers/char/watchdog/iTCO_wdt.c | 103 | 
1 files changed, 79 insertions, 24 deletions
diff --git a/drivers/char/watchdog/iTCO_wdt.c b/drivers/char/watchdog/iTCO_wdt.c index c1a5787fde5b..cbdfbf00cfb7 100644 --- a/drivers/char/watchdog/iTCO_wdt.c +++ b/drivers/char/watchdog/iTCO_wdt.c  | |||
| @@ -45,28 +45,29 @@ | |||
| 45 | /* Module and version information */ | 45 | /* Module and version information */ | 
| 46 | #define DRV_NAME "iTCO_wdt" | 46 | #define DRV_NAME "iTCO_wdt" | 
| 47 | #define DRV_VERSION "1.00" | 47 | #define DRV_VERSION "1.00" | 
| 48 | #define DRV_RELDATE "21-May-2006" | 48 | #define DRV_RELDATE "18-Jun-2006" | 
| 49 | #define PFX DRV_NAME ": " | 49 | #define PFX DRV_NAME ": " | 
| 50 | 50 | ||
| 51 | /* Includes */ | 51 | /* Includes */ | 
| 52 | #include <linux/config.h> /* For CONFIG_WATCHDOG_NOWAYOUT/... */ | 52 | #include <linux/config.h> /* For CONFIG_WATCHDOG_NOWAYOUT/... */ | 
| 53 | #include <linux/module.h> /* For module specific items */ | 53 | #include <linux/module.h> /* For module specific items */ | 
| 54 | #include <linux/moduleparam.h> /* For new moduleparam's */ | 54 | #include <linux/moduleparam.h> /* For new moduleparam's */ | 
| 55 | #include <linux/types.h> /* For standard types (like size_t) */ | 55 | #include <linux/types.h> /* For standard types (like size_t) */ | 
| 56 | #include <linux/errno.h> /* For the -ENODEV/... values */ | 56 | #include <linux/errno.h> /* For the -ENODEV/... values */ | 
| 57 | #include <linux/kernel.h> /* For printk/panic/... */ | 57 | #include <linux/kernel.h> /* For printk/panic/... */ | 
| 58 | #include <linux/miscdevice.h> /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */ | 58 | #include <linux/miscdevice.h> /* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */ | 
| 59 | #include <linux/watchdog.h> /* For the watchdog specific items */ | 59 | #include <linux/watchdog.h> /* For the watchdog specific items */ | 
| 60 | #include <linux/notifier.h> /* For notifier support */ | 60 | #include <linux/notifier.h> /* For notifier support */ | 
| 61 | #include <linux/reboot.h> /* For reboot_notifier stuff */ | 61 | #include <linux/reboot.h> /* For reboot_notifier stuff */ | 
| 62 | #include <linux/init.h> /* For __init/__exit/... */ | 62 | #include <linux/init.h> /* For __init/__exit/... */ | 
| 63 | #include <linux/fs.h> /* For file operations */ | 63 | #include <linux/fs.h> /* For file operations */ | 
| 64 | #include <linux/pci.h> /* For pci functions */ | 64 | #include <linux/platform_device.h> /* For platform_driver framework */ | 
| 65 | #include <linux/ioport.h> /* For io-port access */ | 65 | #include <linux/pci.h> /* For pci functions */ | 
| 66 | #include <linux/spinlock.h> /* For spin_lock/spin_unlock/... */ | 66 | #include <linux/ioport.h> /* For io-port access */ | 
| 67 | 67 | #include <linux/spinlock.h> /* For spin_lock/spin_unlock/... */ | |
| 68 | #include <asm/uaccess.h> /* For copy_to_user/put_user/... */ | 68 | |
| 69 | #include <asm/io.h> /* For inb/outb/... */ | 69 | #include <asm/uaccess.h> /* For copy_to_user/put_user/... */ | 
| 70 | #include <asm/io.h> /* For inb/outb/... */ | ||
| 70 | 71 | ||
| 71 | /* TCO related info */ | 72 | /* TCO related info */ | 
| 72 | enum iTCO_chipsets { | 73 | enum iTCO_chipsets { | 
| @@ -166,6 +167,8 @@ static struct { /* this is private data for the iTCO_wdt device */ | |||
| 166 | struct pci_dev *pdev; /* the PCI-device */ | 167 | struct pci_dev *pdev; /* the PCI-device */ | 
| 167 | } iTCO_wdt_private; | 168 | } iTCO_wdt_private; | 
| 168 | 169 | ||
| 170 | static struct platform_device *iTCO_wdt_platform_device; /* the watchdog platform device */ | ||
| 171 | |||
| 169 | /* module parameters */ | 172 | /* module parameters */ | 
| 170 | #define WATCHDOG_HEARTBEAT 30 /* 30 sec default heartbeat */ | 173 | #define WATCHDOG_HEARTBEAT 30 /* 30 sec default heartbeat */ | 
| 171 | static int heartbeat = WATCHDOG_HEARTBEAT; /* in seconds */ | 174 | static int heartbeat = WATCHDOG_HEARTBEAT; /* in seconds */ | 
| @@ -538,7 +541,7 @@ static struct notifier_block iTCO_wdt_notifier = { | |||
| 538 | * Init & exit routines | 541 | * Init & exit routines | 
| 539 | */ | 542 | */ | 
| 540 | 543 | ||
| 541 | static int __init iTCO_wdt_init(struct pci_dev *pdev, const struct pci_device_id *ent) | 544 | static int iTCO_wdt_init(struct pci_dev *pdev, const struct pci_device_id *ent, struct platform_device *dev) | 
| 542 | { | 545 | { | 
| 543 | int ret; | 546 | int ret; | 
| 544 | u32 base_address; | 547 | u32 base_address; | 
| @@ -649,7 +652,7 @@ out: | |||
| 649 | return ret; | 652 | return ret; | 
| 650 | } | 653 | } | 
| 651 | 654 | ||
| 652 | static void __exit iTCO_wdt_cleanup(void) | 655 | static void iTCO_wdt_cleanup(void) | 
| 653 | { | 656 | { | 
| 654 | /* Stop the timer before we leave */ | 657 | /* Stop the timer before we leave */ | 
| 655 | if (!nowayout) | 658 | if (!nowayout) | 
| @@ -663,7 +666,7 @@ static void __exit iTCO_wdt_cleanup(void) | |||
| 663 | iounmap(iTCO_wdt_private.gcs); | 666 | iounmap(iTCO_wdt_private.gcs); | 
| 664 | } | 667 | } | 
| 665 | 668 | ||
| 666 | static int __init iTCO_wdt_init_module(void) | 669 | static int iTCO_wdt_probe(struct platform_device *dev) | 
| 667 | { | 670 | { | 
| 668 | int found = 0; | 671 | int found = 0; | 
| 669 | struct pci_dev *pdev = NULL; | 672 | struct pci_dev *pdev = NULL; | 
| @@ -674,7 +677,7 @@ static int __init iTCO_wdt_init_module(void) | |||
| 674 | for_each_pci_dev(pdev) { | 677 | for_each_pci_dev(pdev) { | 
| 675 | ent = pci_match_id(iTCO_wdt_pci_tbl, pdev); | 678 | ent = pci_match_id(iTCO_wdt_pci_tbl, pdev); | 
| 676 | if (ent) { | 679 | if (ent) { | 
| 677 | if (!(iTCO_wdt_init(pdev, ent))) { | 680 | if (!(iTCO_wdt_init(pdev, ent, dev))) { | 
| 678 | found++; | 681 | found++; | 
| 679 | break; | 682 | break; | 
| 680 | } | 683 | } | 
| @@ -689,11 +692,62 @@ static int __init iTCO_wdt_init_module(void) | |||
| 689 | return 0; | 692 | return 0; | 
| 690 | } | 693 | } | 
| 691 | 694 | ||
| 692 | static void __exit iTCO_wdt_cleanup_module(void) | 695 | static int iTCO_wdt_remove(struct platform_device *dev) | 
| 693 | { | 696 | { | 
| 694 | if (iTCO_wdt_private.ACPIBASE) | 697 | if (iTCO_wdt_private.ACPIBASE) | 
| 695 | iTCO_wdt_cleanup(); | 698 | iTCO_wdt_cleanup(); | 
| 696 | 699 | ||
| 700 | return 0; | ||
| 701 | } | ||
| 702 | |||
| 703 | static void iTCO_wdt_shutdown(struct platform_device *dev) | ||
| 704 | { | ||
| 705 | iTCO_wdt_stop(); | ||
| 706 | } | ||
| 707 | |||
| 708 | #define iTCO_wdt_suspend NULL | ||
| 709 | #define iTCO_wdt_resume NULL | ||
| 710 | |||
| 711 | static struct platform_driver iTCO_wdt_driver = { | ||
| 712 | .probe = iTCO_wdt_probe, | ||
| 713 | .remove = iTCO_wdt_remove, | ||
| 714 | .shutdown = iTCO_wdt_shutdown, | ||
| 715 | .suspend = iTCO_wdt_suspend, | ||
| 716 | .resume = iTCO_wdt_resume, | ||
| 717 | .driver = { | ||
| 718 | .owner = THIS_MODULE, | ||
| 719 | .name = DRV_NAME, | ||
| 720 | }, | ||
| 721 | }; | ||
| 722 | |||
| 723 | static int __init iTCO_wdt_init_module(void) | ||
| 724 | { | ||
| 725 | int err; | ||
| 726 | |||
| 727 | printk(KERN_INFO PFX "Intel TCO WatchDog Timer Driver v%s (%s)\n", | ||
| 728 | DRV_VERSION, DRV_RELDATE); | ||
| 729 | |||
| 730 | err = platform_driver_register(&iTCO_wdt_driver); | ||
| 731 | if (err) | ||
| 732 | return err; | ||
| 733 | |||
| 734 | iTCO_wdt_platform_device = platform_device_register_simple(DRV_NAME, -1, NULL, 0); | ||
| 735 | if (IS_ERR(iTCO_wdt_platform_device)) { | ||
| 736 | err = PTR_ERR(iTCO_wdt_platform_device); | ||
| 737 | goto unreg_platform_driver; | ||
| 738 | } | ||
| 739 | |||
| 740 | return 0; | ||
| 741 | |||
| 742 | unreg_platform_driver: | ||
| 743 | platform_driver_unregister(&iTCO_wdt_driver); | ||
| 744 | return err; | ||
| 745 | } | ||
| 746 | |||
| 747 | static void __exit iTCO_wdt_cleanup_module(void) | ||
| 748 | { | ||
| 749 | platform_device_unregister(iTCO_wdt_platform_device); | ||
| 750 | platform_driver_unregister(&iTCO_wdt_driver); | ||
| 697 | printk(KERN_INFO PFX "Watchdog Module Unloaded.\n"); | 751 | printk(KERN_INFO PFX "Watchdog Module Unloaded.\n"); | 
| 698 | } | 752 | } | 
| 699 | 753 | ||
| @@ -702,5 +756,6 @@ module_exit(iTCO_wdt_cleanup_module); | |||
| 702 | 756 | ||
| 703 | MODULE_AUTHOR("Wim Van Sebroeck <wim@iguana.be>"); | 757 | MODULE_AUTHOR("Wim Van Sebroeck <wim@iguana.be>"); | 
| 704 | MODULE_DESCRIPTION("Intel TCO WatchDog Timer Driver"); | 758 | MODULE_DESCRIPTION("Intel TCO WatchDog Timer Driver"); | 
| 759 | MODULE_VERSION(DRV_VERSION); | ||
| 705 | MODULE_LICENSE("GPL"); | 760 | MODULE_LICENSE("GPL"); | 
| 706 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 761 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 
