Symbol: dw_wdt
drivers/watchdog/dw_wdt.c
100
#define to_dw_wdt(wdd) container_of(wdd, struct dw_wdt, wdd)
drivers/watchdog/dw_wdt.c
102
static inline int dw_wdt_is_enabled(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
104
return readl(dw_wdt->regs + WDOG_CONTROL_REG_OFFSET) &
drivers/watchdog/dw_wdt.c
108
static void dw_wdt_update_mode(struct dw_wdt *dw_wdt, enum dw_wdt_rmod rmod)
drivers/watchdog/dw_wdt.c
112
val = readl(dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
drivers/watchdog/dw_wdt.c
117
writel(val, dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
drivers/watchdog/dw_wdt.c
119
dw_wdt->rmod = rmod;
drivers/watchdog/dw_wdt.c
122
static unsigned int dw_wdt_find_best_top(struct dw_wdt *dw_wdt,
drivers/watchdog/dw_wdt.c
133
if (dw_wdt->timeouts[idx].sec >= timeout)
drivers/watchdog/dw_wdt.c
140
*top_val = dw_wdt->timeouts[idx].top_val;
drivers/watchdog/dw_wdt.c
142
return dw_wdt->timeouts[idx].sec;
drivers/watchdog/dw_wdt.c
145
static unsigned int dw_wdt_get_min_timeout(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
154
if (dw_wdt->timeouts[idx].sec)
drivers/watchdog/dw_wdt.c
158
return dw_wdt->timeouts[idx].sec;
drivers/watchdog/dw_wdt.c
161
static unsigned int dw_wdt_get_max_timeout_ms(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
163
struct dw_wdt_timeout *timeout = &dw_wdt->timeouts[DW_WDT_NUM_TOPS - 1];
drivers/watchdog/dw_wdt.c
171
static unsigned int dw_wdt_get_timeout(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
173
int top_val = readl(dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET) & 0xF;
drivers/watchdog/dw_wdt.c
177
if (dw_wdt->timeouts[idx].top_val == top_val)
drivers/watchdog/dw_wdt.c
185
return dw_wdt->timeouts[idx].sec * dw_wdt->rmod;
drivers/watchdog/dw_wdt.c
190
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
192
writel(WDOG_COUNTER_RESTART_KICK_VALUE, dw_wdt->regs +
drivers/watchdog/dw_wdt.c
200
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
212
timeout = dw_wdt_find_best_top(dw_wdt, DIV_ROUND_UP(top_s, dw_wdt->rmod),
drivers/watchdog/dw_wdt.c
214
if (dw_wdt->rmod == DW_WDT_RMOD_IRQ)
drivers/watchdog/dw_wdt.c
226
dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET);
drivers/watchdog/dw_wdt.c
238
wdd->timeout = timeout * dw_wdt->rmod;
drivers/watchdog/dw_wdt.c
247
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
254
dw_wdt_update_mode(dw_wdt, req ? DW_WDT_RMOD_IRQ : DW_WDT_RMOD_RESET);
drivers/watchdog/dw_wdt.c
260
static void dw_wdt_arm_system_reset(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
262
u32 val = readl(dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
drivers/watchdog/dw_wdt.c
265
if (dw_wdt->rmod == DW_WDT_RMOD_IRQ)
drivers/watchdog/dw_wdt.c
271
writel(val, dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
drivers/watchdog/dw_wdt.c
276
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
279
dw_wdt_ping(&dw_wdt->wdd);
drivers/watchdog/dw_wdt.c
280
dw_wdt_arm_system_reset(dw_wdt);
drivers/watchdog/dw_wdt.c
287
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
289
if (!dw_wdt->rst) {
drivers/watchdog/dw_wdt.c
294
reset_control_assert(dw_wdt->rst);
drivers/watchdog/dw_wdt.c
295
reset_control_deassert(dw_wdt->rst);
drivers/watchdog/dw_wdt.c
303
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
305
writel(0, dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET);
drivers/watchdog/dw_wdt.c
306
dw_wdt_update_mode(dw_wdt, DW_WDT_RMOD_RESET);
drivers/watchdog/dw_wdt.c
307
if (dw_wdt_is_enabled(dw_wdt))
drivers/watchdog/dw_wdt.c
309
dw_wdt->regs + WDOG_COUNTER_RESTART_REG_OFFSET);
drivers/watchdog/dw_wdt.c
311
dw_wdt_arm_system_reset(dw_wdt);
drivers/watchdog/dw_wdt.c
321
struct dw_wdt *dw_wdt = to_dw_wdt(wdd);
drivers/watchdog/dw_wdt.c
325
val = readl(dw_wdt->regs + WDOG_CURRENT_COUNT_REG_OFFSET);
drivers/watchdog/dw_wdt.c
326
sec = val / dw_wdt->rate;
drivers/watchdog/dw_wdt.c
328
if (dw_wdt->rmod == DW_WDT_RMOD_IRQ) {
drivers/watchdog/dw_wdt.c
329
val = readl(dw_wdt->regs + WDOG_INTERRUPT_STATUS_REG_OFFSET);
drivers/watchdog/dw_wdt.c
362
struct dw_wdt *dw_wdt = devid;
drivers/watchdog/dw_wdt.c
369
val = readl(dw_wdt->regs + WDOG_INTERRUPT_STATUS_REG_OFFSET);
drivers/watchdog/dw_wdt.c
373
watchdog_notify_pretimeout(&dw_wdt->wdd);
drivers/watchdog/dw_wdt.c
380
struct dw_wdt *dw_wdt = dev_get_drvdata(dev);
drivers/watchdog/dw_wdt.c
382
dw_wdt->control = readl(dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
drivers/watchdog/dw_wdt.c
383
dw_wdt->timeout = readl(dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET);
drivers/watchdog/dw_wdt.c
385
clk_disable_unprepare(dw_wdt->pclk);
drivers/watchdog/dw_wdt.c
386
clk_disable_unprepare(dw_wdt->clk);
drivers/watchdog/dw_wdt.c
393
struct dw_wdt *dw_wdt = dev_get_drvdata(dev);
drivers/watchdog/dw_wdt.c
394
int err = clk_prepare_enable(dw_wdt->clk);
drivers/watchdog/dw_wdt.c
399
err = clk_prepare_enable(dw_wdt->pclk);
drivers/watchdog/dw_wdt.c
401
clk_disable_unprepare(dw_wdt->clk);
drivers/watchdog/dw_wdt.c
405
writel(dw_wdt->timeout, dw_wdt->regs + WDOG_TIMEOUT_RANGE_REG_OFFSET);
drivers/watchdog/dw_wdt.c
406
writel(dw_wdt->control, dw_wdt->regs + WDOG_CONTROL_REG_OFFSET);
drivers/watchdog/dw_wdt.c
408
dw_wdt_ping(&dw_wdt->wdd);
drivers/watchdog/dw_wdt.c
423
static void dw_wdt_handle_tops(struct dw_wdt *dw_wdt, const u32 *tops)
drivers/watchdog/dw_wdt.c
437
tout.sec = tops[val] / dw_wdt->rate;
drivers/watchdog/dw_wdt.c
439
do_div(msec, dw_wdt->rate);
drivers/watchdog/dw_wdt.c
447
dst = &dw_wdt->timeouts[tidx];
drivers/watchdog/dw_wdt.c
455
dw_wdt->timeouts[val] = tout;
drivers/watchdog/dw_wdt.c
459
static int dw_wdt_init_timeouts(struct dw_wdt *dw_wdt, struct device *dev)
drivers/watchdog/dw_wdt.c
470
data = readl(dw_wdt->regs + WDOG_COMP_PARAMS_1_REG_OFFSET);
drivers/watchdog/dw_wdt.c
486
dw_wdt_handle_tops(dw_wdt, tops);
drivers/watchdog/dw_wdt.c
487
if (!dw_wdt->timeouts[DW_WDT_NUM_TOPS - 1].sec) {
drivers/watchdog/dw_wdt.c
518
static void dw_wdt_dbgfs_init(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
520
struct device *dev = dw_wdt->wdd.parent;
drivers/watchdog/dw_wdt.c
529
regset->base = dw_wdt->regs;
drivers/watchdog/dw_wdt.c
531
dw_wdt->dbgfs_dir = debugfs_create_dir(dev_name(dev), NULL);
drivers/watchdog/dw_wdt.c
533
debugfs_create_regset32("registers", 0444, dw_wdt->dbgfs_dir, regset);
drivers/watchdog/dw_wdt.c
536
static void dw_wdt_dbgfs_clear(struct dw_wdt *dw_wdt)
drivers/watchdog/dw_wdt.c
538
debugfs_remove_recursive(dw_wdt->dbgfs_dir);
drivers/watchdog/dw_wdt.c
543
static void dw_wdt_dbgfs_init(struct dw_wdt *dw_wdt) {}
drivers/watchdog/dw_wdt.c
544
static void dw_wdt_dbgfs_clear(struct dw_wdt *dw_wdt) {}
drivers/watchdog/dw_wdt.c
552
struct dw_wdt *dw_wdt;
drivers/watchdog/dw_wdt.c
555
dw_wdt = devm_kzalloc(dev, sizeof(*dw_wdt), GFP_KERNEL);
drivers/watchdog/dw_wdt.c
556
if (!dw_wdt)
drivers/watchdog/dw_wdt.c
559
dw_wdt->regs = devm_platform_ioremap_resource(pdev, 0);
drivers/watchdog/dw_wdt.c
560
if (IS_ERR(dw_wdt->regs))
drivers/watchdog/dw_wdt.c
561
return PTR_ERR(dw_wdt->regs);
drivers/watchdog/dw_wdt.c
569
dw_wdt->clk = devm_clk_get_enabled(dev, "tclk");
drivers/watchdog/dw_wdt.c
570
if (IS_ERR(dw_wdt->clk)) {
drivers/watchdog/dw_wdt.c
571
dw_wdt->clk = devm_clk_get_enabled(dev, NULL);
drivers/watchdog/dw_wdt.c
572
if (IS_ERR(dw_wdt->clk))
drivers/watchdog/dw_wdt.c
573
return PTR_ERR(dw_wdt->clk);
drivers/watchdog/dw_wdt.c
576
dw_wdt->rate = clk_get_rate(dw_wdt->clk);
drivers/watchdog/dw_wdt.c
577
if (dw_wdt->rate == 0)
drivers/watchdog/dw_wdt.c
587
dw_wdt->pclk = devm_clk_get_optional_enabled(dev, "pclk");
drivers/watchdog/dw_wdt.c
588
if (IS_ERR(dw_wdt->pclk))
drivers/watchdog/dw_wdt.c
589
return PTR_ERR(dw_wdt->pclk);
drivers/watchdog/dw_wdt.c
591
dw_wdt->rst = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
drivers/watchdog/dw_wdt.c
592
if (IS_ERR(dw_wdt->rst))
drivers/watchdog/dw_wdt.c
593
return PTR_ERR(dw_wdt->rst);
drivers/watchdog/dw_wdt.c
596
dw_wdt_update_mode(dw_wdt, DW_WDT_RMOD_RESET);
drivers/watchdog/dw_wdt.c
608
pdev->name, dw_wdt);
drivers/watchdog/dw_wdt.c
612
dw_wdt->wdd.info = &dw_wdt_pt_ident;
drivers/watchdog/dw_wdt.c
617
dw_wdt->wdd.info = &dw_wdt_ident;
drivers/watchdog/dw_wdt.c
620
reset_control_deassert(dw_wdt->rst);
drivers/watchdog/dw_wdt.c
622
ret = dw_wdt_init_timeouts(dw_wdt, dev);
drivers/watchdog/dw_wdt.c
626
wdd = &dw_wdt->wdd;
drivers/watchdog/dw_wdt.c
628
wdd->min_timeout = dw_wdt_get_min_timeout(dw_wdt);
drivers/watchdog/dw_wdt.c
629
wdd->max_hw_heartbeat_ms = dw_wdt_get_max_timeout_ms(dw_wdt);
drivers/watchdog/dw_wdt.c
632
watchdog_set_drvdata(wdd, dw_wdt);
drivers/watchdog/dw_wdt.c
641
if (dw_wdt_is_enabled(dw_wdt)) {
drivers/watchdog/dw_wdt.c
642
wdd->timeout = dw_wdt_get_timeout(dw_wdt);
drivers/watchdog/dw_wdt.c
651
platform_set_drvdata(pdev, dw_wdt);
drivers/watchdog/dw_wdt.c
660
dw_wdt_dbgfs_init(dw_wdt);
drivers/watchdog/dw_wdt.c
665
reset_control_assert(dw_wdt->rst);
drivers/watchdog/dw_wdt.c
671
struct dw_wdt *dw_wdt = platform_get_drvdata(pdev);
drivers/watchdog/dw_wdt.c
673
dw_wdt_dbgfs_clear(dw_wdt);
drivers/watchdog/dw_wdt.c
675
watchdog_unregister_device(&dw_wdt->wdd);
drivers/watchdog/dw_wdt.c
676
reset_control_assert(dw_wdt->rst);