Lines Matching full:wdt

83 	struct sprd_wdt *wdt = (struct sprd_wdt *)dev_id;  in sprd_wdt_isr()  local
85 sprd_wdt_unlock(wdt->base); in sprd_wdt_isr()
86 writel_relaxed(SPRD_WDT_INT_CLEAR_BIT, wdt->base + SPRD_WDT_INT_CLR); in sprd_wdt_isr()
87 sprd_wdt_lock(wdt->base); in sprd_wdt_isr()
88 watchdog_notify_pretimeout(&wdt->wdd); in sprd_wdt_isr()
92 static u32 sprd_wdt_get_cnt_value(struct sprd_wdt *wdt) in sprd_wdt_get_cnt_value() argument
96 val = readl_relaxed(wdt->base + SPRD_WDT_CNT_HIGH) << in sprd_wdt_get_cnt_value()
98 val |= readl_relaxed(wdt->base + SPRD_WDT_CNT_LOW) & in sprd_wdt_get_cnt_value()
104 static int sprd_wdt_load_value(struct sprd_wdt *wdt, u32 timeout, in sprd_wdt_load_value() argument
111 sprd_wdt_unlock(wdt->base); in sprd_wdt_load_value()
113 SPRD_WDT_LOW_VALUE_MASK, wdt->base + SPRD_WDT_LOAD_HIGH); in sprd_wdt_load_value()
115 wdt->base + SPRD_WDT_LOAD_LOW); in sprd_wdt_load_value()
118 wdt->base + SPRD_WDT_IRQ_LOAD_HIGH); in sprd_wdt_load_value()
120 wdt->base + SPRD_WDT_IRQ_LOAD_LOW); in sprd_wdt_load_value()
121 sprd_wdt_lock(wdt->base); in sprd_wdt_load_value()
128 val = readl_relaxed(wdt->base + SPRD_WDT_INT_RAW); in sprd_wdt_load_value()
140 static int sprd_wdt_enable(struct sprd_wdt *wdt) in sprd_wdt_enable() argument
145 ret = clk_prepare_enable(wdt->enable); in sprd_wdt_enable()
148 ret = clk_prepare_enable(wdt->rtc_enable); in sprd_wdt_enable()
150 clk_disable_unprepare(wdt->enable); in sprd_wdt_enable()
154 sprd_wdt_unlock(wdt->base); in sprd_wdt_enable()
155 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL); in sprd_wdt_enable()
157 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_enable()
158 sprd_wdt_lock(wdt->base); in sprd_wdt_enable()
164 struct sprd_wdt *wdt = _data; in sprd_wdt_disable() local
166 sprd_wdt_unlock(wdt->base); in sprd_wdt_disable()
167 writel_relaxed(0x0, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_disable()
168 sprd_wdt_lock(wdt->base); in sprd_wdt_disable()
170 clk_disable_unprepare(wdt->rtc_enable); in sprd_wdt_disable()
171 clk_disable_unprepare(wdt->enable); in sprd_wdt_disable()
176 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_start() local
180 ret = sprd_wdt_load_value(wdt, wdd->timeout, wdd->pretimeout); in sprd_wdt_start()
184 sprd_wdt_unlock(wdt->base); in sprd_wdt_start()
185 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL); in sprd_wdt_start()
187 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_start()
188 sprd_wdt_lock(wdt->base); in sprd_wdt_start()
196 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_stop() local
199 sprd_wdt_unlock(wdt->base); in sprd_wdt_stop()
200 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL); in sprd_wdt_stop()
203 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_stop()
204 sprd_wdt_lock(wdt->base); in sprd_wdt_stop()
211 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_set_timeout() local
218 return sprd_wdt_load_value(wdt, timeout, wdd->pretimeout); in sprd_wdt_set_timeout()
224 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_set_pretimeout() local
231 return sprd_wdt_load_value(wdt, wdd->timeout, new_pretimeout); in sprd_wdt_set_pretimeout()
236 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_get_timeleft() local
239 val = sprd_wdt_get_cnt_value(wdt); in sprd_wdt_get_timeleft()
263 struct sprd_wdt *wdt; in sprd_wdt_probe() local
266 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); in sprd_wdt_probe()
267 if (!wdt) in sprd_wdt_probe()
270 wdt->base = devm_platform_ioremap_resource(pdev, 0); in sprd_wdt_probe()
271 if (IS_ERR(wdt->base)) in sprd_wdt_probe()
272 return PTR_ERR(wdt->base); in sprd_wdt_probe()
274 wdt->enable = devm_clk_get(dev, "enable"); in sprd_wdt_probe()
275 if (IS_ERR(wdt->enable)) { in sprd_wdt_probe()
277 return PTR_ERR(wdt->enable); in sprd_wdt_probe()
280 wdt->rtc_enable = devm_clk_get(dev, "rtc_enable"); in sprd_wdt_probe()
281 if (IS_ERR(wdt->rtc_enable)) { in sprd_wdt_probe()
283 return PTR_ERR(wdt->rtc_enable); in sprd_wdt_probe()
286 wdt->irq = platform_get_irq(pdev, 0); in sprd_wdt_probe()
287 if (wdt->irq < 0) in sprd_wdt_probe()
288 return wdt->irq; in sprd_wdt_probe()
290 ret = devm_request_irq(dev, wdt->irq, sprd_wdt_isr, IRQF_NO_SUSPEND, in sprd_wdt_probe()
291 "sprd-wdt", (void *)wdt); in sprd_wdt_probe()
297 wdt->wdd.info = &sprd_wdt_info; in sprd_wdt_probe()
298 wdt->wdd.ops = &sprd_wdt_ops; in sprd_wdt_probe()
299 wdt->wdd.parent = dev; in sprd_wdt_probe()
300 wdt->wdd.min_timeout = SPRD_WDT_MIN_TIMEOUT; in sprd_wdt_probe()
301 wdt->wdd.max_timeout = SPRD_WDT_MAX_TIMEOUT; in sprd_wdt_probe()
302 wdt->wdd.timeout = SPRD_WDT_MAX_TIMEOUT; in sprd_wdt_probe()
304 ret = sprd_wdt_enable(wdt); in sprd_wdt_probe()
306 dev_err(dev, "failed to enable wdt\n"); in sprd_wdt_probe()
309 ret = devm_add_action_or_reset(dev, sprd_wdt_disable, wdt); in sprd_wdt_probe()
311 dev_err(dev, "Failed to add wdt disable action\n"); in sprd_wdt_probe()
315 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT); in sprd_wdt_probe()
316 watchdog_init_timeout(&wdt->wdd, 0, dev); in sprd_wdt_probe()
318 ret = devm_watchdog_register_device(dev, &wdt->wdd); in sprd_wdt_probe()
320 sprd_wdt_disable(wdt); in sprd_wdt_probe()
323 platform_set_drvdata(pdev, wdt); in sprd_wdt_probe()
330 struct sprd_wdt *wdt = dev_get_drvdata(dev); in sprd_wdt_pm_suspend() local
332 if (watchdog_active(&wdt->wdd)) in sprd_wdt_pm_suspend()
333 sprd_wdt_stop(&wdt->wdd); in sprd_wdt_pm_suspend()
334 sprd_wdt_disable(wdt); in sprd_wdt_pm_suspend()
341 struct sprd_wdt *wdt = dev_get_drvdata(dev); in sprd_wdt_pm_resume() local
344 ret = sprd_wdt_enable(wdt); in sprd_wdt_pm_resume()
348 if (watchdog_active(&wdt->wdd)) { in sprd_wdt_pm_resume()
349 ret = sprd_wdt_start(&wdt->wdd); in sprd_wdt_pm_resume()
351 sprd_wdt_disable(wdt); in sprd_wdt_pm_resume()
365 { .compatible = "sprd,sp9860-wdt", },
373 .name = "sprd-wdt",