/*ARGSUSED*/ int wdogioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) { int error = 0; int request; switch (cmd) { case SIOWDOGSETMODE: request = *(int *)data; switch (request) { case WDOGM_RESET: wdog_wr_csr(SHREG_WTCSR_R | WTCSR_WT); break; case WDOGM_INTR: wdog_wr_csr(SHREG_WTCSR_R & ~WTCSR_WT); break; default: error = EINVAL; break; } break; case SIORESETWDOG: wdog_wr_cnt(0); /* reset to zero */ break; case SIOSTARTWDOG: wdog_wr_csr(WTCSR_WT | WTCSR_CKS_4096); wdog_wr_cnt(0); /* reset to zero */ wdog_wr_csr(SHREG_WTCSR_R | WTCSR_TME); /* start!!! */ break; case SIOSTOPWDOG: wdog_wr_csr(SHREG_WTCSR_R & ~WTCSR_TME); /* stop */ break; case SIOSETWDOG: request = *(int *)data; if (request > 2) { error = EINVAL; break; } break; default: error = EINVAL; break; } return (error); }
int wdogintr(void *arg) { struct trapframe *frame = arg; wdog_wr_csr(SHREG_WTCSR_R & ~WTCSR_IOVF); /* clear overflow bit */ wdog_wr_cnt(0); /* reset to zero */ printf("wdog trapped: spc = %x\n", frame->tf_spc); return (0); }
int sh4_clock_intr(void *arg) /* trap frame */ { #if (NWDOG > 0) uint32_t i; i = (uint32_t)SHREG_WTCNT_R; if (i > maxwdog) maxwdog = i; wdog_wr_cnt(0); /* reset to zero */ #endif /* clear underflow status */ _reg_bclr_2(SH4_TCR0, TCR_UNF); hardclock(arg); return (1); }