Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 177993
b: refs/heads/master
c: 9b0fd11
h: refs/heads/master
i:
  177991: 06e41c5
v: v3
  • Loading branch information
Andres Salomon authored and Linus Torvalds committed Dec 18, 2009
1 parent a4a8330 commit 4011817
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 23 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 55639353a0035052d9ea6cfe4dde0ac7fcbb2c9f
refs/heads/master: 9b0fd1149747b117e7c3e9917fdea03b774ae3d0
2 changes: 1 addition & 1 deletion trunk/drivers/watchdog/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ config ALIM7101_WDT

config GEODE_WDT
tristate "AMD Geode CS5535/CS5536 Watchdog"
depends on MGEODE_LX
depends on CS5535_MFGPT
help
This driver enables a watchdog capability built into the
CS5535/CS5536 companion chips for the AMD Geode GX and LX
Expand Down
40 changes: 19 additions & 21 deletions trunk/drivers/watchdog/geodewdt.c
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -46,36 +47,36 @@ 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)
{
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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 4011817

Please sign in to comment.