static void amdsbwd_event(void *arg, unsigned int cmd, int *error) { struct amdsbwd_softc *sc = arg; unsigned int timeout; /* convert from power-of-two-ns to WDT ticks */ cmd &= WD_INTERVAL; if (cmd < WD_TO_1SEC) cmd = 0; if (cmd) { timeout = ((uint64_t)1 << (cmd - WD_TO_1MS)) / sc->ms_per_tick; if (timeout > sc->max_ticks) timeout = sc->max_ticks; if (timeout != sc->timeout) { amdsbwd_tmr_set(sc, timeout); if (!sc->active) amdsbwd_tmr_enable(sc); } amdsbwd_tmr_reload(sc); *error = 0; } else { if (sc->active) amdsbwd_tmr_disable(sc); } }
static int amdsb_watchdog(void *unused, int period) { unsigned int timeout; struct amdsbwd_softc *sc; sc = &amdsbwd_sc; timeout = (period * 1000) / sc->ms_per_tick; if (timeout > sc->max_ticks) timeout = sc->max_ticks; if (timeout != sc->timeout) { amdsbwd_tmr_set(sc, timeout); if (!sc->active) amdsbwd_tmr_enable(sc); } amdsbwd_tmr_reload(sc); return period; }