|
@@ -1,6 +1,7 @@
|
|
|
-/* Watchdog timer for the Geode GX/LX with the CS5535/CS5536 companion chip
|
|
|
+/* Watchdog timer for machines with the CS5535/CS5536 companion chip
|
|
|
*
|
|
|
* Copyright (C) 2006-2007, Advanced Micro Devices, Inc.
|
|
|
+ * Copyright (C) 2009 Andres Salomon <dilinger@collabora.co.uk>
|
|
|
*
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
* modify it under the terms of the GNU General Public License
|
|
@@ -19,7 +20,7 @@
|
|
|
#include <linux/reboot.h>
|
|
|
#include <linux/uaccess.h>
|
|
|
|
|
|
-#include <asm/geode.h>
|
|
|
+#include <linux/cs5535.h>
|
|
|
|
|
|
#define GEODEWDT_HZ 500
|
|
|
#define GEODEWDT_SCALE 6
|
|
@@ -46,25 +47,25 @@ MODULE_PARM_DESC(nowayout,
|
|
|
|
|
|
static struct platform_device *geodewdt_platform_device;
|
|
|
static unsigned long wdt_flags;
|
|
|
-static int wdt_timer;
|
|
|
+static struct cs5535_mfgpt_timer *wdt_timer;
|
|
|
static int safe_close;
|
|
|
|
|
|
static void geodewdt_ping(void)
|
|
|
{
|
|
|
/* Stop the counter */
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, 0);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, 0);
|
|
|
|
|
|
/* Reset the counter */
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_COUNTER, 0);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_COUNTER, 0);
|
|
|
|
|
|
/* Enable the counter */
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, MFGPT_SETUP_CNTEN);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, MFGPT_SETUP_CNTEN);
|
|
|
}
|
|
|
|
|
|
static void geodewdt_disable(void)
|
|
|
{
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, 0);
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_COUNTER, 0);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, 0);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_COUNTER, 0);
|
|
|
}
|
|
|
|
|
|
static int geodewdt_set_heartbeat(int val)
|
|
@@ -72,10 +73,10 @@ static int geodewdt_set_heartbeat(int val)
|
|
|
if (val < 1 || val > GEODEWDT_MAX_SECONDS)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, 0);
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_CMP2, val * GEODEWDT_HZ);
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_COUNTER, 0);
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, MFGPT_SETUP_CNTEN);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, 0);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_CMP2, val * GEODEWDT_HZ);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_COUNTER, 0);
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_SETUP, MFGPT_SETUP_CNTEN);
|
|
|
|
|
|
timeout = val;
|
|
|
return 0;
|
|
@@ -215,28 +216,25 @@ static struct miscdevice geodewdt_miscdev = {
|
|
|
|
|
|
static int __devinit geodewdt_probe(struct platform_device *dev)
|
|
|
{
|
|
|
- int ret, timer;
|
|
|
-
|
|
|
- timer = geode_mfgpt_alloc_timer(MFGPT_TIMER_ANY, MFGPT_DOMAIN_WORKING);
|
|
|
+ int ret;
|
|
|
|
|
|
- if (timer == -1) {
|
|
|
+ wdt_timer = cs5535_mfgpt_alloc_timer(MFGPT_TIMER_ANY, MFGPT_DOMAIN_WORKING);
|
|
|
+ if (!wdt_timer) {
|
|
|
printk(KERN_ERR "geodewdt: No timers were available\n");
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
- wdt_timer = timer;
|
|
|
-
|
|
|
/* Set up the timer */
|
|
|
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_SETUP,
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_SETUP,
|
|
|
GEODEWDT_SCALE | (3 << 8));
|
|
|
|
|
|
/* Set up comparator 2 to reset when the event fires */
|
|
|
- geode_mfgpt_toggle_event(wdt_timer, MFGPT_CMP2, MFGPT_EVENT_RESET, 1);
|
|
|
+ cs5535_mfgpt_toggle_event(wdt_timer, MFGPT_CMP2, MFGPT_EVENT_RESET, 1);
|
|
|
|
|
|
/* Set up the initial timeout */
|
|
|
|
|
|
- geode_mfgpt_write(wdt_timer, MFGPT_REG_CMP2,
|
|
|
+ cs5535_mfgpt_write(wdt_timer, MFGPT_REG_CMP2,
|
|
|
timeout * GEODEWDT_HZ);
|
|
|
|
|
|
ret = misc_register(&geodewdt_miscdev);
|