aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/watchdog
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2012-01-22 04:01:16 -0500
committerRyan Mallon <rmallon@gmail.com>2012-03-13 20:41:11 -0400
commit73303d129201de7af7fa837597e9c470c5efa71f (patch)
tree0990de666d5c3cb4a95182b4f163cd0086e40e37 /drivers/watchdog
parent0fd1958050e92c859152e775e548284582335d25 (diff)
ep93xx: Convert the watchdog driver into a platform device.
Convert the ep93xx watchdog driver into a platform device and remove it's dependency on <mach/hardware.h>. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> Signed-off-by: Ryan Mallon <rmallon@gmail.com> Signed-off-by: Wim Van Sebroeck <wim@iguana.be> Reviewed-by: Mika Westerberg <mika.westerberg@iki.fi> Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'drivers/watchdog')
-rw-r--r--drivers/watchdog/ep93xx_wdt.c51
1 files changed, 37 insertions, 14 deletions
diff --git a/drivers/watchdog/ep93xx_wdt.c b/drivers/watchdog/ep93xx_wdt.c
index 726b7df61fd0..09cd888db619 100644
--- a/drivers/watchdog/ep93xx_wdt.c
+++ b/drivers/watchdog/ep93xx_wdt.c
@@ -23,6 +23,7 @@
23 * - Add a few missing ioctls 23 * - Add a few missing ioctls
24 */ 24 */
25 25
26#include <linux/platform_device.h>
26#include <linux/module.h> 27#include <linux/module.h>
27#include <linux/fs.h> 28#include <linux/fs.h>
28#include <linux/miscdevice.h> 29#include <linux/miscdevice.h>
@@ -30,7 +31,6 @@
30#include <linux/timer.h> 31#include <linux/timer.h>
31#include <linux/uaccess.h> 32#include <linux/uaccess.h>
32#include <linux/io.h> 33#include <linux/io.h>
33#include <mach/hardware.h>
34 34
35#define WDT_VERSION "0.3" 35#define WDT_VERSION "0.3"
36#define PFX "ep93xx_wdt: " 36#define PFX "ep93xx_wdt: "
@@ -41,6 +41,7 @@
41static int nowayout = WATCHDOG_NOWAYOUT; 41static int nowayout = WATCHDOG_NOWAYOUT;
42static int timeout = WDT_TIMEOUT; 42static int timeout = WDT_TIMEOUT;
43 43
44static void __iomem *mmio_base;
44static struct timer_list timer; 45static struct timer_list timer;
45static unsigned long next_heartbeat; 46static unsigned long next_heartbeat;
46static unsigned long wdt_status; 47static unsigned long wdt_status;
@@ -49,26 +50,25 @@ static unsigned long boot_status;
49#define WDT_IN_USE 0 50#define WDT_IN_USE 0
50#define WDT_OK_TO_CLOSE 1 51#define WDT_OK_TO_CLOSE 1
51 52
52#define EP93XX_WDT_REG(x) (EP93XX_WATCHDOG_BASE + (x)) 53#define EP93XX_WATCHDOG 0x00
53#define EP93XX_WDT_WATCHDOG EP93XX_WDT_REG(0x00) 54#define EP93XX_WDSTATUS 0x04
54#define EP93XX_WDT_WDSTATUS EP93XX_WDT_REG(0x04)
55 55
56/* reset the wdt every ~200ms */ 56/* reset the wdt every ~200ms */
57#define WDT_INTERVAL (HZ/5) 57#define WDT_INTERVAL (HZ/5)
58 58
59static void wdt_enable(void) 59static void wdt_enable(void)
60{ 60{
61 __raw_writew(0xaaaa, EP93XX_WDT_WATCHDOG); 61 writel(0xaaaa, mmio_base + EP93XX_WATCHDOG);
62} 62}
63 63
64static void wdt_disable(void) 64static void wdt_disable(void)
65{ 65{
66 __raw_writew(0xaa55, EP93XX_WDT_WATCHDOG); 66 writel(0xaa55, mmio_base + EP93XX_WATCHDOG);
67} 67}
68 68
69static inline void wdt_ping(void) 69static inline void wdt_ping(void)
70{ 70{
71 __raw_writew(0x5555, EP93XX_WDT_WATCHDOG); 71 writel(0x5555, mmio_base + EP93XX_WATCHDOG);
72} 72}
73 73
74static void wdt_startup(void) 74static void wdt_startup(void)
@@ -206,18 +206,32 @@ static void ep93xx_timer_ping(unsigned long data)
206 mod_timer(&timer, jiffies + WDT_INTERVAL); 206 mod_timer(&timer, jiffies + WDT_INTERVAL);
207} 207}
208 208
209static int __init ep93xx_wdt_init(void) 209static int __devinit ep93xx_wdt_probe(struct platform_device *pdev)
210{ 210{
211 struct resource *res;
212 unsigned long val;
211 int err; 213 int err;
212 214
215 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
216 if (!res)
217 return -ENXIO;
218
219 if (!devm_request_mem_region(&pdev->dev, res->start,
220 resource_size(res), pdev->name))
221 return -EBUSY;
222
223 mmio_base = devm_ioremap(&pdev->dev, res->start, resource_size(res));
224 if (!mmio_base)
225 return -ENXIO;
226
213 err = misc_register(&ep93xx_wdt_miscdev); 227 err = misc_register(&ep93xx_wdt_miscdev);
214 228
215 boot_status = __raw_readl(EP93XX_WDT_WATCHDOG) & 0x01 ? 1 : 0; 229 val = readl(mmio_base + EP93XX_WATCHDOG);
230 boot_status = val & 0x01 ? 1 : 0;
216 231
217 printk(KERN_INFO PFX "EP93XX watchdog, driver version " 232 printk(KERN_INFO PFX "EP93XX watchdog, driver version "
218 WDT_VERSION "%s\n", 233 WDT_VERSION "%s\n",
219 (__raw_readl(EP93XX_WDT_WATCHDOG) & 0x08) 234 (val & 0x08) ? " (nCS1 disable detected)" : "");
220 ? " (nCS1 disable detected)" : "");
221 235
222 if (timeout < 1 || timeout > 3600) { 236 if (timeout < 1 || timeout > 3600) {
223 timeout = WDT_TIMEOUT; 237 timeout = WDT_TIMEOUT;
@@ -230,14 +244,23 @@ static int __init ep93xx_wdt_init(void)
230 return err; 244 return err;
231} 245}
232 246
233static void __exit ep93xx_wdt_exit(void) 247static int __devexit ep93xx_wdt_remove(struct platform_device *pdev)
234{ 248{
235 wdt_shutdown(); 249 wdt_shutdown();
236 misc_deregister(&ep93xx_wdt_miscdev); 250 misc_deregister(&ep93xx_wdt_miscdev);
251 return 0;
237} 252}
238 253
239module_init(ep93xx_wdt_init); 254static struct platform_driver ep93xx_wdt_driver = {
240module_exit(ep93xx_wdt_exit); 255 .driver = {
256 .owner = THIS_MODULE,
257 .name = "ep93xx-wdt",
258 },
259 .probe = ep93xx_wdt_probe,
260 .remove = __devexit_p(ep93xx_wdt_remove),
261};
262
263module_platform_driver(ep93xx_wdt_driver);
241 264
242module_param(nowayout, int, 0); 265module_param(nowayout, int, 0);
243MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started"); 266MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");