static void sh_wdt_start(struct sh_wdt *wdt) { unsigned long flags; u8 csr; spin_lock_irqsave(&shwdt_lock, flags); next_heartbeat = jiffies + (heartbeat * HZ); mod_timer(&wdt->timer, next_ping_period(clock_division_ratio)); csr = sh_wdt_read_csr(); csr |= WTCSR_WT | clock_division_ratio; sh_wdt_write_csr(csr); sh_wdt_write_cnt(0); csr = sh_wdt_read_csr(); csr |= WTCSR_TME; csr &= ~WTCSR_RSTS; sh_wdt_write_csr(csr); #ifdef CONFIG_CPU_SH2 csr = sh_wdt_read_rstcsr(); csr &= ~RSTCSR_RSTS; sh_wdt_write_rstcsr(csr); #endif spin_unlock_irqrestore(&shwdt_lock, flags); }
/** * sh_wdt_start - Start the Watchdog * * Starts the watchdog. */ static void sh_wdt_start(void) { timer.expires = next_ping_period(clock_division_ratio); next_heartbeat = jiffies + (sh_heartbeat * HZ); add_timer(&timer); sh_wdt_write_csr(WTCSR_WT | WTCSR_CKS_4096); sh_wdt_write_cnt(0); sh_wdt_write_csr((ctrl_inb(WTCSR) | WTCSR_TME)); }
/** * sh_wdt_ping - Ping the Watchdog * * @data: Unused * * Clears overflow bit, resets timer counter. */ static void sh_wdt_ping(unsigned long data) { if (time_before(jiffies, next_heartbeat)) { sh_wdt_write_csr((ctrl_inb(WTCSR) & ~WTCSR_IOVF)); sh_wdt_write_cnt(0); timer.expires = next_ping_period(clock_division_ratio); add_timer(&timer); } }
/** * sh_wdt_stop - Stop the Watchdog * * Stops the watchdog. */ static void sh_wdt_stop(void) { __u8 csr; del_timer(&timer); csr = sh_wdt_read_csr(); csr &= ~WTCSR_TME; sh_wdt_write_csr(csr); }
static int sh_wdt_start(struct watchdog_device *wdt_dev) { struct sh_wdt *wdt = watchdog_get_drvdata(wdt_dev); unsigned long flags; u8 csr; pm_runtime_get_sync(wdt->dev); clk_enable(wdt->clk); spin_lock_irqsave(&wdt->lock, flags); next_heartbeat = jiffies + (heartbeat * HZ); mod_timer(&wdt->timer, next_ping_period(clock_division_ratio)); csr = sh_wdt_read_csr(); csr |= WTCSR_WT | clock_division_ratio; sh_wdt_write_csr(csr); sh_wdt_write_cnt(0); /* * These processors have a bit of an inconsistent initialization * process.. starting with SH-3, RSTS was moved to WTCSR, and the * RSTCSR register was removed. * * On the SH-2 however, in addition with bits being in different * locations, we must deal with RSTCSR outright.. */ csr = sh_wdt_read_csr(); csr |= WTCSR_TME; csr &= ~WTCSR_RSTS; sh_wdt_write_csr(csr); #ifdef CONFIG_CPU_SH2 csr = sh_wdt_read_rstcsr(); csr &= ~RSTCSR_RSTS; sh_wdt_write_rstcsr(csr); #endif spin_unlock_irqrestore(&wdt->lock, flags); return 0; }
/** * sh_wdt_start - Start the Watchdog * * Starts the watchdog. */ static void sh_wdt_start(void) { __u8 csr; next_heartbeat = jiffies + (heartbeat * HZ); mod_timer(&timer, next_ping_period(clock_division_ratio)); csr = sh_wdt_read_csr(); csr |= WTCSR_WT | clock_division_ratio; sh_wdt_write_csr(csr); sh_wdt_write_cnt(0); /* * These processors have a bit of an inconsistent initialization * process.. starting with SH-3, RSTS was moved to WTCSR, and the * RSTCSR register was removed. * * On the SH-2 however, in addition with bits being in different * locations, we must deal with RSTCSR outright.. */ csr = sh_wdt_read_csr(); csr |= WTCSR_TME; csr &= ~WTCSR_RSTS; sh_wdt_write_csr(csr); #ifdef CONFIG_CPU_SH2 /* * Whoever came up with the RSTCSR semantics must've been smoking * some of the good stuff, since in addition to the WTCSR/WTCNT write * brain-damage, it's managed to f**k things up one step further.. * * If we need to clear the WOVF bit, the upper byte has to be 0xa5.. * but if we want to touch RSTE or RSTS, the upper byte has to be * 0x5a.. */ csr = sh_wdt_read_rstcsr(); csr &= ~RSTCSR_RSTS; sh_wdt_write_rstcsr(csr); #endif }
static void sh_wdt_stop(struct sh_wdt *wdt) { unsigned long flags; u8 csr; spin_lock_irqsave(&shwdt_lock, flags); del_timer(&wdt->timer); csr = sh_wdt_read_csr(); csr &= ~WTCSR_TME; sh_wdt_write_csr(csr); spin_unlock_irqrestore(&shwdt_lock, flags); }
/** * sh_wdt_ping - Ping the Watchdog * * @data: Unused * * Clears overflow bit, resets timer counter. */ static void sh_wdt_ping(unsigned long data) { if (time_before(jiffies, next_heartbeat)) { __u8 csr; csr = sh_wdt_read_csr(); csr &= ~WTCSR_IOVF; sh_wdt_write_csr(csr); sh_wdt_write_cnt(0); mod_timer(&timer, next_ping_period(clock_division_ratio)); } else { printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n"); } }
static void sh_wdt_ping(unsigned long data) { struct sh_wdt *wdt = (struct sh_wdt *)data; unsigned long flags; spin_lock_irqsave(&wdt->lock, flags); if (time_before(jiffies, next_heartbeat)) { u8 csr; csr = sh_wdt_read_csr(); csr &= ~WTCSR_IOVF; sh_wdt_write_csr(csr); sh_wdt_write_cnt(0); mod_timer(&wdt->timer, next_ping_period(clock_division_ratio)); } else dev_warn(wdt->dev, "Heartbeat lost! Will not ping " "the watchdog\n"); spin_unlock_irqrestore(&wdt->lock, flags); }
static int sh_wdt_stop(struct watchdog_device *wdt_dev) { struct sh_wdt *wdt = watchdog_get_drvdata(wdt_dev); unsigned long flags; u8 csr; spin_lock_irqsave(&wdt->lock, flags); del_timer(&wdt->timer); csr = sh_wdt_read_csr(); csr &= ~WTCSR_TME; sh_wdt_write_csr(csr); spin_unlock_irqrestore(&wdt->lock, flags); clk_disable(wdt->clk); pm_runtime_put_sync(wdt->dev); return 0; }
/** * sh_wdt_stop - Stop the Watchdog * * Stops the watchdog. */ static void sh_wdt_stop(void) { del_timer(&timer); sh_wdt_write_csr((ctrl_inb(WTCSR) & ~WTCSR_TME)); }
static void watchdog_trigger_immediate(void) { sh_wdt_write_cnt(0xFF); sh_wdt_write_csr(0xC2); }