static int armada370_start(struct watchdog_device *wdt_dev) { struct orion_watchdog *dev = watchdog_get_drvdata(wdt_dev); u32 reg; /* Set watchdog duration */ writel(dev->clk_rate * wdt_dev->timeout, dev->reg + dev->data->wdt_counter_offset); /* Clear the watchdog expiration bit */ atomic_io_modify(dev->reg + TIMER_A370_STATUS, WDT_A370_EXPIRED, 0); /* Enable watchdog timer */ atomic_io_modify(dev->reg + TIMER_CTRL, dev->data->wdt_enable_bit, dev->data->wdt_enable_bit); /* Enable reset on watchdog */ reg = readl(dev->rstout); reg |= dev->data->rstout_enable_bit; writel(reg, dev->rstout); return 0; }
static int da9062_wdt_stop(struct watchdog_device *wdd) { struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd); int ret; ret = da9062_reset_watchdog_timer(wdt); if (ret) { dev_err(wdt->hw->dev, "Failed to ping the watchdog (err = %d)\n", ret); return ret; } ret = regmap_update_bits(wdt->hw->regmap, DA9062AA_CONTROL_D, DA9062AA_TWDSCALE_MASK, DA9062_TWDSCALE_DISABLE); if (ret) dev_err(wdt->hw->dev, "Watchdog failed to stop (err = %d)\n", ret); return ret; }
static int wm831x_wdt_stop(struct watchdog_device *wdt_dev) { struct wm831x_wdt_drvdata *driver_data = watchdog_get_drvdata(wdt_dev); struct wm831x *wm831x = driver_data->wm831x; int ret; mutex_lock(&driver_data->lock); ret = wm831x_reg_unlock(wm831x); if (ret == 0) { ret = wm831x_set_bits(wm831x, WM831X_WATCHDOG, WM831X_WDOG_ENA, 0); wm831x_reg_lock(wm831x); } else { dev_err(wm831x->dev, "Failed to unlock security key: %d\n", ret); } mutex_unlock(&driver_data->lock); return ret; }
static int rn5t618_wdt_set_timeout(struct watchdog_device *wdt_dev, unsigned int t) { struct rn5t618_wdt *wdt = watchdog_get_drvdata(wdt_dev); int ret, i; for (i = 0; i < ARRAY_SIZE(rn5t618_wdt_map); i++) { if (rn5t618_wdt_map[i].time + 1 >= t) break; } if (i == ARRAY_SIZE(rn5t618_wdt_map)) return -EINVAL; ret = regmap_update_bits(wdt->rn5t618->regmap, RN5T618_WATCHDOG, RN5T618_WATCHDOG_WDOGTIM_M, rn5t618_wdt_map[i].reg_val); if (!ret) wdt_dev->timeout = rn5t618_wdt_map[i].time; return ret; }
static int wdt_start(struct watchdog_device *wd) { struct device *dev = watchdog_get_drvdata(wd); int ret, in_size; int timeout = wd->timeout; struct ipc_wd_start { u32 pretimeout; u32 timeout; } ipc_wd_start = { timeout - MID_WDT_PRETIMEOUT, timeout }; /* * SCU expects the input size for watchdog IPC to * be based on 4 bytes */ in_size = DIV_ROUND_UP(sizeof(ipc_wd_start), 4); ret = wdt_command(SCU_WATCHDOG_START, (u32 *)&ipc_wd_start, in_size); if (ret) dev_crit(dev, "error starting watchdog: %d\n", ret); return ret; }
/** * mei_wd_ops_set_timeout - wd set timeout command from the watchdog core. * * @wd_dev: watchdog device struct * @timeout: timeout value to set * * Return: 0 if success, negative errno code for failure */ static int mei_wd_ops_set_timeout(struct watchdog_device *wd_dev, unsigned int timeout) { struct mei_device *dev; dev = watchdog_get_drvdata(wd_dev); if (!dev) return -ENODEV; /* Check Timeout value */ if (timeout < MEI_WD_MIN_TIMEOUT || timeout > MEI_WD_MAX_TIMEOUT) return -EINVAL; mutex_lock(&dev->device_lock); dev->wd_timeout = timeout; wd_dev->timeout = timeout; mei_wd_set_start_timeout(dev, dev->wd_timeout); mutex_unlock(&dev->device_lock); return 0; }
static int stm32_iwdg_start(struct watchdog_device *wdd) { struct stm32_iwdg *wdt = watchdog_get_drvdata(wdd); u32 val = FLAG_PVU | FLAG_RVU; u32 reload; int ret; dev_dbg(wdd->parent, "%s\n", __func__); /* prescaler fixed to 256 */ reload = clamp_t(unsigned int, ((wdd->timeout * wdt->rate) / 256) - 1, RLR_MIN, RLR_MAX); /* enable write access */ reg_write(wdt->regs, IWDG_KR, KR_KEY_EWA); /* set prescaler & reload registers */ reg_write(wdt->regs, IWDG_PR, PR_256); /* prescaler fix to 256 */ reg_write(wdt->regs, IWDG_RLR, reload); reg_write(wdt->regs, IWDG_KR, KR_KEY_ENABLE); /* wait for the registers to be updated (max 100ms) */ ret = readl_relaxed_poll_timeout(wdt->regs + IWDG_SR, val, !(val & (FLAG_PVU | FLAG_RVU)), SLEEP_US, TIMEOUT_US); if (ret) { dev_err(wdd->parent, "Fail to set prescaler or reload registers\n"); return ret; } /* reload watchdog */ reg_write(wdt->regs, IWDG_KR, KR_KEY_RELOAD); return 0; }
static int armada_37xx_wdt_start(struct watchdog_device *wdt) { struct armada_37xx_watchdog *dev = watchdog_get_drvdata(wdt); /* select counter 1 as watchdog counter */ regmap_write(dev->cpu_misc, WDT_TIMER_SELECT, WDT_TIMER_SELECT_VAL); /* init counter 0 as retrigger counter for counter 1 */ init_counter(dev, CNTR_ID_RETRIGGER, CNTR_CTRL_MODE_ONESHOT, 0); set_counter_value(dev, CNTR_ID_RETRIGGER, 0); /* init counter 1 to be retriggerable by counter 0 end count */ init_counter(dev, CNTR_ID_WDOG, CNTR_CTRL_MODE_HWSIG, CNTR_CTRL_TRIG_SRC_PREV_CNTR); set_counter_value(dev, CNTR_ID_WDOG, dev->timeout); /* enable counter 1 */ counter_enable(dev, CNTR_ID_WDOG); /* start counter 1 by forcing immediate end count on counter 0 */ counter_enable(dev, CNTR_ID_RETRIGGER); return 0; }
static int kempld_wdt_start(struct watchdog_device *wdd) { struct kempld_wdt_data *wdt_data = watchdog_get_drvdata(wdd); struct kempld_device_data *pld = wdt_data->pld; u8 status; int ret; ret = kempld_wdt_set_timeout(wdd, wdd->timeout); if (ret) return ret; kempld_get_mutex(pld); status = kempld_read8(pld, KEMPLD_WDT_CFG); status |= KEMPLD_WDT_CFG_ENABLE; kempld_write8(pld, KEMPLD_WDT_CFG, status); status = kempld_read8(pld, KEMPLD_WDT_CFG); kempld_release_mutex(pld); /* Check if the watchdog was enabled */ if (!(status & KEMPLD_WDT_CFG_ENABLE)) return -EACCES; return 0; }
static unsigned int orion_wdt_get_timeleft(struct watchdog_device *wdt_dev) { struct orion_watchdog *dev = watchdog_get_drvdata(wdt_dev); return readl(dev->reg + dev->data->wdt_counter_offset) / dev->clk_rate; }
static int orion_wdt_enabled(struct watchdog_device *wdt_dev) { struct orion_watchdog *dev = watchdog_get_drvdata(wdt_dev); return dev->data->enabled(dev); }
static int orion_wdt_stop(struct watchdog_device *wdt_dev) { struct orion_watchdog *dev = watchdog_get_drvdata(wdt_dev); return dev->data->stop(wdt_dev); }
static int retu_wdt_ping(struct watchdog_device *wdog) { struct retu_wdt_dev *wdev = watchdog_get_drvdata(wdog); return retu_write(wdev->rdev, RETU_REG_WATCHDOG, wdog->timeout); }
static void da9055_wdt_unref(struct watchdog_device *wdt_dev) { struct da9055_wdt_data *driver_data = watchdog_get_drvdata(wdt_dev); kref_put(&driver_data->kref, da9055_wdt_release_resources); }
static void da9055_wdt_ref(struct watchdog_device *wdt_dev) { struct da9055_wdt_data *driver_data = watchdog_get_drvdata(wdt_dev); kref_get(&driver_data->kref); }
static int menf21bmc_wdt_ping(struct watchdog_device *wdt) { struct menf21bmc_wdt *drv_data = watchdog_get_drvdata(wdt); return i2c_smbus_write_byte(drv_data->i2c_client, BMC_CMD_WD_TRIG); }
static int uniphier_watchdog_stop(struct watchdog_device *w) { struct uniphier_wdt_dev *wdev = watchdog_get_drvdata(w); return __uniphier_watchdog_stop(wdev->regmap); }