Lines Matching full:wdt

52 #define wdt_enabled (!(wdt->mr & AT91_WDT_WDDIS))
54 #define wdt_read(wdt, field) \ argument
55 readl_relaxed((wdt)->reg_base + (field))
60 static void wdt_write(struct sama5d4_wdt *wdt, u32 field, u32 val) in wdt_write() argument
67 while (time_before(jiffies, wdt->last_ping + WDT_DELAY)) in wdt_write()
69 writel_relaxed(val, wdt->reg_base + field); in wdt_write()
70 wdt->last_ping = jiffies; in wdt_write()
73 static void wdt_write_nosleep(struct sama5d4_wdt *wdt, u32 field, u32 val) in wdt_write_nosleep() argument
75 if (time_before(jiffies, wdt->last_ping + WDT_DELAY)) in wdt_write_nosleep()
77 writel_relaxed(val, wdt->reg_base + field); in wdt_write_nosleep()
78 wdt->last_ping = jiffies; in wdt_write_nosleep()
83 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); in sama5d4_wdt_start() local
85 if (wdt->sam9x60_support) { in sama5d4_wdt_start()
86 writel_relaxed(wdt->ir, wdt->reg_base + AT91_SAM9X60_IER); in sama5d4_wdt_start()
87 wdt->mr &= ~AT91_SAM9X60_WDDIS; in sama5d4_wdt_start()
89 wdt->mr &= ~AT91_WDT_WDDIS; in sama5d4_wdt_start()
91 wdt_write(wdt, AT91_WDT_MR, wdt->mr); in sama5d4_wdt_start()
98 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); in sama5d4_wdt_stop() local
100 if (wdt->sam9x60_support) { in sama5d4_wdt_stop()
101 writel_relaxed(wdt->ir, wdt->reg_base + AT91_SAM9X60_IDR); in sama5d4_wdt_stop()
102 wdt->mr |= AT91_SAM9X60_WDDIS; in sama5d4_wdt_stop()
104 wdt->mr |= AT91_WDT_WDDIS; in sama5d4_wdt_stop()
106 wdt_write(wdt, AT91_WDT_MR, wdt->mr); in sama5d4_wdt_stop()
113 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); in sama5d4_wdt_ping() local
115 wdt_write(wdt, AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT); in sama5d4_wdt_ping()
123 struct sama5d4_wdt *wdt = watchdog_get_drvdata(wdd); in sama5d4_wdt_set_timeout() local
126 if (wdt->sam9x60_support) { in sama5d4_wdt_set_timeout()
127 wdt_write(wdt, AT91_SAM9X60_WLR, in sama5d4_wdt_set_timeout()
134 wdt->mr &= ~AT91_WDT_WDV; in sama5d4_wdt_set_timeout()
135 wdt->mr |= AT91_WDT_SET_WDV(value); in sama5d4_wdt_set_timeout()
145 wdt_write(wdt, AT91_WDT_MR, wdt->mr & ~AT91_WDT_WDDIS); in sama5d4_wdt_set_timeout()
167 struct sama5d4_wdt *wdt = platform_get_drvdata(dev_id); in sama5d4_wdt_irq_handler() local
170 if (wdt->sam9x60_support) in sama5d4_wdt_irq_handler()
171 reg = wdt_read(wdt, AT91_SAM9X60_ISR); in sama5d4_wdt_irq_handler()
173 reg = wdt_read(wdt, AT91_WDT_SR); in sama5d4_wdt_irq_handler()
184 static int of_sama5d4_wdt_init(struct device_node *np, struct sama5d4_wdt *wdt) in of_sama5d4_wdt_init() argument
188 if (wdt->sam9x60_support) in of_sama5d4_wdt_init()
189 wdt->mr = AT91_SAM9X60_WDDIS; in of_sama5d4_wdt_init()
191 wdt->mr = AT91_WDT_WDDIS; in of_sama5d4_wdt_init()
195 wdt->need_irq = true; in of_sama5d4_wdt_init()
198 wdt->mr |= AT91_WDT_WDIDLEHLT; in of_sama5d4_wdt_init()
201 wdt->mr |= AT91_WDT_WDDBGHLT; in of_sama5d4_wdt_init()
206 static int sama5d4_wdt_init(struct sama5d4_wdt *wdt) in sama5d4_wdt_init() argument
218 reg = wdt_read(wdt, AT91_WDT_MR); in sama5d4_wdt_init()
219 if (wdt->sam9x60_support && (!(reg & AT91_SAM9X60_WDDIS))) in sama5d4_wdt_init()
220 wdt_write_nosleep(wdt, AT91_WDT_MR, in sama5d4_wdt_init()
222 else if (!wdt->sam9x60_support && in sama5d4_wdt_init()
224 wdt_write_nosleep(wdt, AT91_WDT_MR, in sama5d4_wdt_init()
228 if (wdt->sam9x60_support) { in sama5d4_wdt_init()
229 if (wdt->need_irq) in sama5d4_wdt_init()
230 wdt->ir = AT91_SAM9X60_PERINT; in sama5d4_wdt_init()
232 wdt->mr |= AT91_SAM9X60_PERIODRST; in sama5d4_wdt_init()
234 wdt_write(wdt, AT91_SAM9X60_IER, wdt->ir); in sama5d4_wdt_init()
235 wdt_write(wdt, AT91_SAM9X60_WLR, AT91_SAM9X60_SET_COUNTER(val)); in sama5d4_wdt_init()
237 wdt->mr |= AT91_WDT_SET_WDD(WDT_SEC2TICKS(MAX_WDT_TIMEOUT)); in sama5d4_wdt_init()
238 wdt->mr |= AT91_WDT_SET_WDV(val); in sama5d4_wdt_init()
240 if (wdt->need_irq) in sama5d4_wdt_init()
241 wdt->mr |= AT91_WDT_WDFIEN; in sama5d4_wdt_init()
243 wdt->mr |= AT91_WDT_WDRSTEN; in sama5d4_wdt_init()
246 wdt_write_nosleep(wdt, AT91_WDT_MR, wdt->mr); in sama5d4_wdt_init()
255 struct sama5d4_wdt *wdt; in sama5d4_wdt_probe() local
260 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); in sama5d4_wdt_probe()
261 if (!wdt) in sama5d4_wdt_probe()
264 wdd = &wdt->wdd; in sama5d4_wdt_probe()
270 wdt->last_ping = jiffies; in sama5d4_wdt_probe()
271 wdt->sam9x60_support = of_device_is_compatible(dev->of_node, in sama5d4_wdt_probe()
272 "microchip,sam9x60-wdt"); in sama5d4_wdt_probe()
274 watchdog_set_drvdata(wdd, wdt); in sama5d4_wdt_probe()
280 wdt->reg_base = regs; in sama5d4_wdt_probe()
282 ret = of_sama5d4_wdt_init(dev->of_node, wdt); in sama5d4_wdt_probe()
286 if (wdt->need_irq) { in sama5d4_wdt_probe()
290 wdt->need_irq = false; in sama5d4_wdt_probe()
294 if (wdt->need_irq) { in sama5d4_wdt_probe()
306 ret = sama5d4_wdt_init(wdt); in sama5d4_wdt_probe()
317 platform_set_drvdata(pdev, wdt); in sama5d4_wdt_probe()
327 .compatible = "atmel,sama5d4-wdt",
330 .compatible = "microchip,sam9x60-wdt",
339 struct sama5d4_wdt *wdt = dev_get_drvdata(dev); in sama5d4_wdt_suspend_late() local
341 if (watchdog_active(&wdt->wdd)) in sama5d4_wdt_suspend_late()
342 sama5d4_wdt_stop(&wdt->wdd); in sama5d4_wdt_suspend_late()
349 struct sama5d4_wdt *wdt = dev_get_drvdata(dev); in sama5d4_wdt_resume_early() local
356 sama5d4_wdt_init(wdt); in sama5d4_wdt_resume_early()
358 if (watchdog_active(&wdt->wdd)) in sama5d4_wdt_resume_early()
359 sama5d4_wdt_start(&wdt->wdd); in sama5d4_wdt_resume_early()