[WATCHDOG] i6300esb.c: convert to platform device driver
Convert the Intel 6300ESB watchdog timer to a platform device driver. Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
This commit is contained in:
parent
04bedfa542
commit
0426fd0d88
@ -13,7 +13,7 @@
|
|||||||
*
|
*
|
||||||
* The timer is implemented in the following I/O controller hubs:
|
* The timer is implemented in the following I/O controller hubs:
|
||||||
* (See the intel documentation on http://developer.intel.com.)
|
* (See the intel documentation on http://developer.intel.com.)
|
||||||
* 6300ESB chip : document number 300641-003
|
* 6300ESB chip : document number 300641-004
|
||||||
*
|
*
|
||||||
* 2004YYZZ Ross Biro
|
* 2004YYZZ Ross Biro
|
||||||
* Initial version 0.01
|
* Initial version 0.01
|
||||||
@ -34,7 +34,7 @@
|
|||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/miscdevice.h>
|
#include <linux/miscdevice.h>
|
||||||
#include <linux/watchdog.h>
|
#include <linux/watchdog.h>
|
||||||
#include <linux/reboot.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
@ -42,7 +42,7 @@
|
|||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
/* Module and version information */
|
/* Module and version information */
|
||||||
#define ESB_VERSION "0.03"
|
#define ESB_VERSION "0.04"
|
||||||
#define ESB_MODULE_NAME "i6300ESB timer"
|
#define ESB_MODULE_NAME "i6300ESB timer"
|
||||||
#define ESB_DRIVER_NAME ESB_MODULE_NAME ", v" ESB_VERSION
|
#define ESB_DRIVER_NAME ESB_MODULE_NAME ", v" ESB_VERSION
|
||||||
#define PFX ESB_MODULE_NAME ": "
|
#define PFX ESB_MODULE_NAME ": "
|
||||||
@ -81,6 +81,8 @@ static unsigned long timer_alive;
|
|||||||
static struct pci_dev *esb_pci;
|
static struct pci_dev *esb_pci;
|
||||||
static unsigned short triggered; /* The status of the watchdog upon boot */
|
static unsigned short triggered; /* The status of the watchdog upon boot */
|
||||||
static char esb_expect_close;
|
static char esb_expect_close;
|
||||||
|
static struct platform_device *esb_platform_device;
|
||||||
|
|
||||||
|
|
||||||
/* module parameters */
|
/* module parameters */
|
||||||
/* 30 sec default heartbeat (1 < heartbeat < 2*1023) */
|
/* 30 sec default heartbeat (1 < heartbeat < 2*1023) */
|
||||||
@ -319,19 +321,6 @@ static long esb_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Notify system
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int esb_notify_sys(struct notifier_block *this,
|
|
||||||
unsigned long code, void *unused)
|
|
||||||
{
|
|
||||||
if (code == SYS_DOWN || code == SYS_HALT)
|
|
||||||
esb_timer_stop(); /* Turn the WDT off */
|
|
||||||
|
|
||||||
return NOTIFY_DONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kernel Interfaces
|
* Kernel Interfaces
|
||||||
*/
|
*/
|
||||||
@ -351,10 +340,6 @@ static struct miscdevice esb_miscdev = {
|
|||||||
.fops = &esb_fops,
|
.fops = &esb_fops,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct notifier_block esb_notifier = {
|
|
||||||
.notifier_call = esb_notify_sys,
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Data for PCI driver interface
|
* Data for PCI driver interface
|
||||||
*
|
*
|
||||||
@ -373,7 +358,7 @@ MODULE_DEVICE_TABLE(pci, esb_pci_tbl);
|
|||||||
* Init & exit routines
|
* Init & exit routines
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static unsigned char __init esb_getdevice(void)
|
static unsigned char __devinit esb_getdevice(void)
|
||||||
{
|
{
|
||||||
u8 val1;
|
u8 val1;
|
||||||
unsigned short val2;
|
unsigned short val2;
|
||||||
@ -444,7 +429,7 @@ err_devput:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init watchdog_init(void)
|
static int __devinit esb_probe(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -460,19 +445,13 @@ static int __init watchdog_init(void)
|
|||||||
"heartbeat value must be 1<heartbeat<2046, using %d\n",
|
"heartbeat value must be 1<heartbeat<2046, using %d\n",
|
||||||
heartbeat);
|
heartbeat);
|
||||||
}
|
}
|
||||||
ret = register_reboot_notifier(&esb_notifier);
|
|
||||||
if (ret != 0) {
|
|
||||||
printk(KERN_ERR PFX
|
|
||||||
"cannot register reboot notifier (err=%d)\n", ret);
|
|
||||||
goto err_unmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = misc_register(&esb_miscdev);
|
ret = misc_register(&esb_miscdev);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
printk(KERN_ERR PFX
|
printk(KERN_ERR PFX
|
||||||
"cannot register miscdev on minor=%d (err=%d)\n",
|
"cannot register miscdev on minor=%d (err=%d)\n",
|
||||||
WATCHDOG_MINOR, ret);
|
WATCHDOG_MINOR, ret);
|
||||||
goto err_notifier;
|
goto err_unmap;
|
||||||
}
|
}
|
||||||
esb_timer_stop();
|
esb_timer_stop();
|
||||||
printk(KERN_INFO PFX
|
printk(KERN_INFO PFX
|
||||||
@ -480,8 +459,6 @@ static int __init watchdog_init(void)
|
|||||||
BASEADDR, heartbeat, nowayout);
|
BASEADDR, heartbeat, nowayout);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_notifier:
|
|
||||||
unregister_reboot_notifier(&esb_notifier);
|
|
||||||
err_unmap:
|
err_unmap:
|
||||||
iounmap(BASEADDR);
|
iounmap(BASEADDR);
|
||||||
/* err_release: */
|
/* err_release: */
|
||||||
@ -493,7 +470,7 @@ err_unmap:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit watchdog_cleanup(void)
|
static int __devexit esb_remove(struct platform_device *dev)
|
||||||
{
|
{
|
||||||
/* Stop the timer before we leave */
|
/* Stop the timer before we leave */
|
||||||
if (!nowayout)
|
if (!nowayout)
|
||||||
@ -501,11 +478,58 @@ static void __exit watchdog_cleanup(void)
|
|||||||
|
|
||||||
/* Deregister */
|
/* Deregister */
|
||||||
misc_deregister(&esb_miscdev);
|
misc_deregister(&esb_miscdev);
|
||||||
unregister_reboot_notifier(&esb_notifier);
|
|
||||||
iounmap(BASEADDR);
|
iounmap(BASEADDR);
|
||||||
pci_release_region(esb_pci, 0);
|
pci_release_region(esb_pci, 0);
|
||||||
pci_disable_device(esb_pci);
|
pci_disable_device(esb_pci);
|
||||||
pci_dev_put(esb_pci);
|
pci_dev_put(esb_pci);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void esb_shutdown(struct platform_device *dev)
|
||||||
|
{
|
||||||
|
esb_timer_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_driver esb_platform_driver = {
|
||||||
|
.probe = esb_probe,
|
||||||
|
.remove = __devexit_p(esb_remove),
|
||||||
|
.shutdown = esb_shutdown,
|
||||||
|
.driver = {
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.name = ESB_MODULE_NAME,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init watchdog_init(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
printk(KERN_INFO PFX "Intel 6300ESB WatchDog Timer Driver v%s\n",
|
||||||
|
ESB_VERSION);
|
||||||
|
|
||||||
|
err = platform_driver_register(&esb_platform_driver);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
esb_platform_device = platform_device_register_simple(ESB_MODULE_NAME,
|
||||||
|
-1, NULL, 0);
|
||||||
|
if (IS_ERR(esb_platform_device)) {
|
||||||
|
err = PTR_ERR(esb_platform_device);
|
||||||
|
goto unreg_platform_driver;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unreg_platform_driver:
|
||||||
|
platform_driver_unregister(&esb_platform_driver);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit watchdog_cleanup(void)
|
||||||
|
{
|
||||||
|
platform_device_unregister(esb_platform_device);
|
||||||
|
platform_driver_unregister(&esb_platform_driver);
|
||||||
|
printk(KERN_INFO PFX "Watchdog Module Unloaded.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(watchdog_init);
|
module_init(watchdog_init);
|
||||||
|
Loading…
Reference in New Issue
Block a user