diff options
| -rw-r--r-- | drivers/char/watchdog/rm9k_wdt.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/drivers/char/watchdog/rm9k_wdt.c b/drivers/char/watchdog/rm9k_wdt.c index 1aad9138f714..22aab8703eda 100644 --- a/drivers/char/watchdog/rm9k_wdt.c +++ b/drivers/char/watchdog/rm9k_wdt.c | |||
| @@ -111,6 +111,30 @@ static irqreturn_t wdt_gpi_irqhdl(int irq, void *ctxt, struct pt_regs *regs) | |||
| 111 | 111 | ||
| 112 | 112 | ||
| 113 | /* Watchdog functions */ | 113 | /* Watchdog functions */ |
| 114 | static void wdt_gpi_start(void) | ||
| 115 | { | ||
| 116 | u32 reg; | ||
| 117 | |||
| 118 | lock_titan_regs(); | ||
| 119 | reg = titan_readl(CPGIG1ER); | ||
| 120 | titan_writel(reg | (0x100 << wd_ctr), CPGIG1ER); | ||
| 121 | iob(); | ||
| 122 | unlock_titan_regs(); | ||
| 123 | } | ||
| 124 | |||
| 125 | static void wdt_gpi_stop(void) | ||
| 126 | { | ||
| 127 | u32 reg; | ||
| 128 | |||
| 129 | lock_titan_regs(); | ||
| 130 | reg = titan_readl(CPCCR) & ~(0xf << (wd_ctr * 4)); | ||
| 131 | titan_writel(reg, CPCCR); | ||
| 132 | reg = titan_readl(CPGIG1ER); | ||
| 133 | titan_writel(reg & ~(0x100 << wd_ctr), CPGIG1ER); | ||
| 134 | iob(); | ||
| 135 | unlock_titan_regs(); | ||
| 136 | } | ||
| 137 | |||
| 114 | static void wdt_gpi_set_timeout(unsigned int to) | 138 | static void wdt_gpi_set_timeout(unsigned int to) |
| 115 | { | 139 | { |
| 116 | u32 reg; | 140 | u32 reg; |
| @@ -134,7 +158,6 @@ static void wdt_gpi_set_timeout(unsigned int to) | |||
| 134 | static int wdt_gpi_open(struct inode *i, struct file *f) | 158 | static int wdt_gpi_open(struct inode *i, struct file *f) |
| 135 | { | 159 | { |
| 136 | int res; | 160 | int res; |
| 137 | u32 reg; | ||
| 138 | 161 | ||
| 139 | if (unlikely(0 > atomic_dec_if_positive(&opencnt))) | 162 | if (unlikely(0 > atomic_dec_if_positive(&opencnt))) |
| 140 | return -EBUSY; | 163 | return -EBUSY; |
| @@ -152,12 +175,7 @@ static int wdt_gpi_open(struct inode *i, struct file *f) | |||
| 152 | return res; | 175 | return res; |
| 153 | 176 | ||
| 154 | wdt_gpi_set_timeout(timeout); | 177 | wdt_gpi_set_timeout(timeout); |
| 155 | 178 | wdt_gpi_start(); | |
| 156 | lock_titan_regs(); | ||
| 157 | reg = titan_readl(CPGIG1ER); | ||
| 158 | titan_writel(reg | (0x100 << wd_ctr), CPGIG1ER); | ||
| 159 | iob(); | ||
| 160 | unlock_titan_regs(); | ||
| 161 | 179 | ||
| 162 | printk(KERN_INFO "%s: watchdog started, timeout = %u seconds\n", | 180 | printk(KERN_INFO "%s: watchdog started, timeout = %u seconds\n", |
| 163 | wdt_gpi_name, timeout); | 181 | wdt_gpi_name, timeout); |
| @@ -173,15 +191,7 @@ static int wdt_gpi_release(struct inode *i, struct file *f) | |||
| 173 | locked = 1; | 191 | locked = 1; |
| 174 | } else { | 192 | } else { |
| 175 | if (expect_close) { | 193 | if (expect_close) { |
| 176 | u32 reg; | 194 | wdt_gpi_stop(); |
| 177 | |||
| 178 | lock_titan_regs(); | ||
| 179 | reg = titan_readl(CPCCR) & ~(0xf << (wd_ctr * 4)); | ||
| 180 | titan_writel(reg, CPCCR); | ||
| 181 | reg = titan_readl(CPGIG1ER); | ||
| 182 | titan_writel(reg & ~(0x100 << wd_ctr), CPGIG1ER); | ||
| 183 | iob(); | ||
| 184 | unlock_titan_regs(); | ||
| 185 | free_irq(wd_irq, &miscdev); | 195 | free_irq(wd_irq, &miscdev); |
| 186 | printk(KERN_INFO "%s: watchdog stopped\n", wdt_gpi_name); | 196 | printk(KERN_INFO "%s: watchdog stopped\n", wdt_gpi_name); |
| 187 | } else { | 197 | } else { |
| @@ -293,17 +303,9 @@ wdt_gpi_ioctl(struct file *f, unsigned int cmd, unsigned long arg) | |||
| 293 | static int | 303 | static int |
| 294 | wdt_gpi_notify(struct notifier_block *this, unsigned long code, void *unused) | 304 | wdt_gpi_notify(struct notifier_block *this, unsigned long code, void *unused) |
| 295 | { | 305 | { |
| 296 | if(code == SYS_DOWN || code == SYS_HALT) { | 306 | if (code == SYS_DOWN || code == SYS_HALT) |
| 297 | u32 reg; | 307 | wdt_gpi_stop(); |
| 298 | 308 | ||
| 299 | lock_titan_regs(); | ||
| 300 | reg = titan_readl(CPCCR) & ~(0xf << (wd_ctr * 4)); | ||
| 301 | titan_writel(reg, CPCCR); | ||
| 302 | reg = titan_readl(CPGIG1ER); | ||
| 303 | titan_writel(reg & ~(0x100 << wd_ctr), CPGIG1ER); | ||
| 304 | iob(); | ||
| 305 | unlock_titan_regs(); | ||
| 306 | } | ||
| 307 | return NOTIFY_DONE; | 309 | return NOTIFY_DONE; |
| 308 | } | 310 | } |
| 309 | 311 | ||
