• Home
  • Raw
  • Download

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
116 val = readl_relaxed(wdt->base + SPRD_WDT_INT_RAW); in sprd_wdt_load_value()
126 sprd_wdt_unlock(wdt->base); in sprd_wdt_load_value()
128 SPRD_WDT_LOW_VALUE_MASK, wdt->base + SPRD_WDT_LOAD_HIGH); in sprd_wdt_load_value()
130 wdt->base + SPRD_WDT_LOAD_LOW); in sprd_wdt_load_value()
133 wdt->base + SPRD_WDT_IRQ_LOAD_HIGH); in sprd_wdt_load_value()
135 wdt->base + SPRD_WDT_IRQ_LOAD_LOW); in sprd_wdt_load_value()
136 sprd_wdt_lock(wdt->base); in sprd_wdt_load_value()
141 static int sprd_wdt_enable(struct sprd_wdt *wdt) in sprd_wdt_enable() argument
146 ret = clk_prepare_enable(wdt->enable); in sprd_wdt_enable()
149 ret = clk_prepare_enable(wdt->rtc_enable); in sprd_wdt_enable()
151 clk_disable_unprepare(wdt->enable); in sprd_wdt_enable()
155 sprd_wdt_unlock(wdt->base); in sprd_wdt_enable()
156 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL); in sprd_wdt_enable()
158 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_enable()
159 sprd_wdt_lock(wdt->base); in sprd_wdt_enable()
165 struct sprd_wdt *wdt = _data; in sprd_wdt_disable() local
167 sprd_wdt_unlock(wdt->base); in sprd_wdt_disable()
168 writel_relaxed(0x0, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_disable()
169 sprd_wdt_lock(wdt->base); in sprd_wdt_disable()
171 clk_disable_unprepare(wdt->rtc_enable); in sprd_wdt_disable()
172 clk_disable_unprepare(wdt->enable); in sprd_wdt_disable()
177 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_start() local
181 ret = sprd_wdt_load_value(wdt, wdd->timeout, wdd->pretimeout); in sprd_wdt_start()
185 sprd_wdt_unlock(wdt->base); in sprd_wdt_start()
186 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL); in sprd_wdt_start()
188 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_start()
189 sprd_wdt_lock(wdt->base); in sprd_wdt_start()
197 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_stop() local
200 sprd_wdt_unlock(wdt->base); in sprd_wdt_stop()
201 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL); in sprd_wdt_stop()
204 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL); in sprd_wdt_stop()
205 sprd_wdt_lock(wdt->base); in sprd_wdt_stop()
212 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_set_timeout() local
219 return sprd_wdt_load_value(wdt, timeout, wdd->pretimeout); in sprd_wdt_set_timeout()
225 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_set_pretimeout() local
232 return sprd_wdt_load_value(wdt, wdd->timeout, new_pretimeout); in sprd_wdt_set_pretimeout()
237 struct sprd_wdt *wdt = to_sprd_wdt(wdd); in sprd_wdt_get_timeleft() local
240 val = sprd_wdt_get_cnt_value(wdt); in sprd_wdt_get_timeleft()
264 struct sprd_wdt *wdt; in sprd_wdt_probe() local
267 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); in sprd_wdt_probe()
268 if (!wdt) in sprd_wdt_probe()
271 wdt->base = devm_platform_ioremap_resource(pdev, 0); in sprd_wdt_probe()
272 if (IS_ERR(wdt->base)) in sprd_wdt_probe()
273 return PTR_ERR(wdt->base); in sprd_wdt_probe()
275 wdt->enable = devm_clk_get(dev, "enable"); in sprd_wdt_probe()
276 if (IS_ERR(wdt->enable)) { in sprd_wdt_probe()
278 return PTR_ERR(wdt->enable); in sprd_wdt_probe()
281 wdt->rtc_enable = devm_clk_get(dev, "rtc_enable"); in sprd_wdt_probe()
282 if (IS_ERR(wdt->rtc_enable)) { in sprd_wdt_probe()
284 return PTR_ERR(wdt->rtc_enable); in sprd_wdt_probe()
287 wdt->irq = platform_get_irq(pdev, 0); in sprd_wdt_probe()
288 if (wdt->irq < 0) in sprd_wdt_probe()
289 return wdt->irq; in sprd_wdt_probe()
291 ret = devm_request_irq(dev, wdt->irq, sprd_wdt_isr, IRQF_NO_SUSPEND, in sprd_wdt_probe()
292 "sprd-wdt", (void *)wdt); in sprd_wdt_probe()
298 wdt->wdd.info = &sprd_wdt_info; in sprd_wdt_probe()
299 wdt->wdd.ops = &sprd_wdt_ops; in sprd_wdt_probe()
300 wdt->wdd.parent = dev; in sprd_wdt_probe()
301 wdt->wdd.min_timeout = SPRD_WDT_MIN_TIMEOUT; in sprd_wdt_probe()
302 wdt->wdd.max_timeout = SPRD_WDT_MAX_TIMEOUT; in sprd_wdt_probe()
303 wdt->wdd.timeout = SPRD_WDT_MAX_TIMEOUT; in sprd_wdt_probe()
305 ret = sprd_wdt_enable(wdt); in sprd_wdt_probe()
307 dev_err(dev, "failed to enable wdt\n"); in sprd_wdt_probe()
310 ret = devm_add_action_or_reset(dev, sprd_wdt_disable, wdt); in sprd_wdt_probe()
312 dev_err(dev, "Failed to add wdt disable action\n"); in sprd_wdt_probe()
316 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT); in sprd_wdt_probe()
317 watchdog_init_timeout(&wdt->wdd, 0, dev); in sprd_wdt_probe()
319 ret = devm_watchdog_register_device(dev, &wdt->wdd); in sprd_wdt_probe()
321 sprd_wdt_disable(wdt); in sprd_wdt_probe()
324 platform_set_drvdata(pdev, wdt); in sprd_wdt_probe()
331 struct sprd_wdt *wdt = dev_get_drvdata(dev); in sprd_wdt_pm_suspend() local
333 if (watchdog_active(&wdt->wdd)) in sprd_wdt_pm_suspend()
334 sprd_wdt_stop(&wdt->wdd); in sprd_wdt_pm_suspend()
335 sprd_wdt_disable(wdt); in sprd_wdt_pm_suspend()
342 struct sprd_wdt *wdt = dev_get_drvdata(dev); in sprd_wdt_pm_resume() local
345 ret = sprd_wdt_enable(wdt); in sprd_wdt_pm_resume()
349 if (watchdog_active(&wdt->wdd)) in sprd_wdt_pm_resume()
350 ret = sprd_wdt_start(&wdt->wdd); in sprd_wdt_pm_resume()
361 { .compatible = "sprd,sp9860-wdt", },
369 .name = "sprd-wdt",