Lines Matching refs:wdt

40 #define wdt_read(wdt, field) \
41 readl_relaxed((wdt)->base + (field))
43 writel_relaxed((val), (wdt)->base + (field))
98 struct at91wdt *wdt = (struct at91wdt *)dev_id;
100 if (wdt_read(wdt, AT91_WDT_SR)) {
112 static inline void at91_wdt_reset(struct at91wdt *wdt)
114 wdt_write(wdt, AT91_WDT_CR, AT91_WDT_KEY | AT91_WDT_WDRSTT);
122 struct at91wdt *wdt = from_timer(wdt, t, timer);
123 if (time_before(jiffies, wdt->next_heartbeat) ||
124 !watchdog_active(&wdt->wdd)) {
125 at91_wdt_reset(wdt);
126 mod_timer(&wdt->timer, jiffies + wdt->heartbeat);
134 struct at91wdt *wdt = to_wdt(wdd);
136 wdt->next_heartbeat = jiffies + wdd->timeout * HZ;
152 static int at91_wdt_init(struct platform_device *pdev, struct at91wdt *wdt)
158 u32 mask = wdt->mr_mask;
163 tmp = wdt_read(wdt, AT91_WDT_MR);
164 if ((tmp & mask) != (wdt->mr & mask)) {
166 wdt_write(wdt, AT91_WDT_MR, wdt->mr);
167 tmp = wdt_read(wdt, AT91_WDT_MR);
172 if (wdt->mr & AT91_WDT_WDDIS)
198 wdt->heartbeat = max_heartbeat / 4;
200 wdt->heartbeat = max_heartbeat / 2;
202 wdt->heartbeat = min_heartbeat;
208 if ((tmp & AT91_WDT_WDFIEN) && wdt->irq) {
209 err = devm_request_irq(dev, wdt->irq, wdt_interrupt,
211 pdev->name, wdt);
216 if ((tmp & wdt->mr_mask) != (wdt->mr & wdt->mr_mask))
219 tmp & wdt->mr_mask, wdt->mr & wdt->mr_mask);
221 timer_setup(&wdt->timer, at91_ping, 0);
230 mod_timer(&wdt->timer, jiffies + min_heartbeat);
233 if (watchdog_init_timeout(&wdt->wdd, 0, dev))
234 watchdog_init_timeout(&wdt->wdd, heartbeat, dev);
235 watchdog_set_nowayout(&wdt->wdd, wdt->nowayout);
236 err = watchdog_register_device(&wdt->wdd);
240 wdt->next_heartbeat = jiffies + wdt->wdd.timeout * HZ;
245 del_timer(&wdt->timer);
265 static int of_at91wdt_init(struct device_node *np, struct at91wdt *wdt)
272 wdt->irq = irq_of_parse_and_map(np, 0);
273 if (!wdt->irq)
274 dev_warn(wdt->wdd.parent, "failed to get IRQ from DT\n");
291 wdt->mr_mask = 0x3FFFFFFF;
292 wdt->mr = 0;
295 wdt->mr |= AT91_WDT_WDFIEN;
296 wdt->mr_mask &= ~AT91_WDT_WDRPROC;
298 wdt->mr |= AT91_WDT_WDRSTEN;
303 wdt->mr |= AT91_WDT_WDRPROC;
306 wdt->mr |= AT91_WDT_WDDIS;
307 wdt->mr_mask &= AT91_WDT_WDDIS;
311 wdt->mr |= AT91_WDT_WDIDLEHLT;
314 wdt->mr |= AT91_WDT_WDDBGHLT;
316 wdt->mr |= max | ((max - min) << 16);
321 static inline int of_at91wdt_init(struct device_node *np, struct at91wdt *wdt)
330 struct at91wdt *wdt;
332 wdt = devm_kzalloc(&pdev->dev, sizeof(*wdt), GFP_KERNEL);
333 if (!wdt)
336 wdt->mr = (WDT_HW_TIMEOUT * 256) | AT91_WDT_WDRSTEN | AT91_WDT_WDD |
338 wdt->mr_mask = 0x3FFFFFFF;
339 wdt->nowayout = nowayout;
340 wdt->wdd.parent = &pdev->dev;
341 wdt->wdd.info = &at91_wdt_info;
342 wdt->wdd.ops = &at91_wdt_ops;
343 wdt->wdd.timeout = WDT_HEARTBEAT;
344 wdt->wdd.min_timeout = 1;
345 wdt->wdd.max_timeout = 0xFFFF;
347 wdt->base = devm_platform_ioremap_resource(pdev, 0);
348 if (IS_ERR(wdt->base))
349 return PTR_ERR(wdt->base);
351 wdt->sclk = devm_clk_get(&pdev->dev, NULL);
352 if (IS_ERR(wdt->sclk))
353 return PTR_ERR(wdt->sclk);
355 err = clk_prepare_enable(wdt->sclk);
362 err = of_at91wdt_init(pdev->dev.of_node, wdt);
367 err = at91_wdt_init(pdev, wdt);
371 platform_set_drvdata(pdev, wdt);
374 wdt->wdd.timeout, wdt->nowayout);
379 clk_disable_unprepare(wdt->sclk);
386 struct at91wdt *wdt = platform_get_drvdata(pdev);
387 watchdog_unregister_device(&wdt->wdd);
390 del_timer(&wdt->timer);
391 clk_disable_unprepare(wdt->sclk);
398 { .compatible = "atmel,at91sam9260-wdt" },