Skip to content

Commit

Permalink
[WATCHDOG] at32ap700x_wdt.c - Add spinlock support
Browse files Browse the repository at this point in the history
Add spinlock support so that forked children can't
do different io stuff at the same time.

Signed-off-by: Hans-Christian Egtvedt <hcegtvedt@atmel.com>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Cc: Andrew Morton <akpm@linux-foundation.org>
  • Loading branch information
Wim Van Sebroeck committed Jul 5, 2007
1 parent 2840114 commit e75e657
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions drivers/char/watchdog/at32ap700x_wdt.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/watchdog.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/spinlock.h>

#define TIMEOUT_MIN 1
#define TIMEOUT_MAX 2
Expand Down Expand Up @@ -53,6 +54,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="

struct wdt_at32ap700x {
void __iomem *regs;
spinlock_t io_lock;
int timeout;
int users;
struct miscdevice miscdev;
Expand All @@ -66,9 +68,11 @@ static char expect_release;
*/
static inline void at32_wdt_stop(void)
{
spin_lock(&wdt->io_lock);
unsigned long psel = wdt_readl(wdt, CTRL) & WDT_BF(CTRL_PSEL, 0x0f);
wdt_writel(wdt, CTRL, psel | WDT_BF(CTRL_KEY, 0x55));
wdt_writel(wdt, CTRL, psel | WDT_BF(CTRL_KEY, 0xaa));
spin_unlock(&wdt->io_lock);
}

/*
Expand All @@ -79,20 +83,24 @@ static inline void at32_wdt_start(void)
/* 0xf is 2^16 divider = 2 sec, 0xe is 2^15 divider = 1 sec */
unsigned long psel = (wdt->timeout > 1) ? 0xf : 0xe;

spin_lock(&wdt->io_lock);
wdt_writel(wdt, CTRL, WDT_BIT(CTRL_EN)
| WDT_BF(CTRL_PSEL, psel)
| WDT_BF(CTRL_KEY, 0x55));
wdt_writel(wdt, CTRL, WDT_BIT(CTRL_EN)
| WDT_BF(CTRL_PSEL, psel)
| WDT_BF(CTRL_KEY, 0xaa));
spin_unlock(&wdt->io_lock);
}

/*
* Pat the watchdog timer.
*/
static inline void at32_wdt_pat(void)
{
spin_lock(&wdt->io_lock);
wdt_writel(wdt, CLR, 0x42);
spin_unlock(&wdt->io_lock);
}

/*
Expand Down Expand Up @@ -272,6 +280,7 @@ static int __init at32_wdt_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "could not map I/O memory\n");
goto err_free;
}
spin_lock_init(&wdt->io_lock);
wdt->users = 0;
wdt->miscdev.minor = WATCHDOG_MINOR;
wdt->miscdev.name = "watchdog";
Expand Down

0 comments on commit e75e657

Please sign in to comment.