Lines Matching refs:wdt
84 struct sprd_wdt *wdt = (struct sprd_wdt *)dev_id;
86 sprd_wdt_unlock(wdt->base);
87 writel_relaxed(SPRD_WDT_INT_CLEAR_BIT, wdt->base + SPRD_WDT_INT_CLR);
88 sprd_wdt_lock(wdt->base);
89 watchdog_notify_pretimeout(&wdt->wdd);
93 static u32 sprd_wdt_get_cnt_value(struct sprd_wdt *wdt)
97 val = readl_relaxed(wdt->base + SPRD_WDT_CNT_HIGH) <<
99 val |= readl_relaxed(wdt->base + SPRD_WDT_CNT_LOW) &
105 static int sprd_wdt_load_value(struct sprd_wdt *wdt, u32 timeout,
119 val = readl_relaxed(wdt->base + SPRD_WDT_INT_RAW);
129 sprd_wdt_unlock(wdt->base);
131 SPRD_WDT_LOW_VALUE_MASK, wdt->base + SPRD_WDT_LOAD_HIGH);
133 wdt->base + SPRD_WDT_LOAD_LOW);
136 wdt->base + SPRD_WDT_IRQ_LOAD_HIGH);
138 wdt->base + SPRD_WDT_IRQ_LOAD_LOW);
139 sprd_wdt_lock(wdt->base);
144 static int sprd_wdt_enable(struct sprd_wdt *wdt)
149 ret = clk_prepare_enable(wdt->enable);
152 ret = clk_prepare_enable(wdt->rtc_enable);
154 clk_disable_unprepare(wdt->enable);
158 sprd_wdt_unlock(wdt->base);
159 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL);
161 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL);
162 sprd_wdt_lock(wdt->base);
168 struct sprd_wdt *wdt = _data;
170 sprd_wdt_unlock(wdt->base);
171 writel_relaxed(0x0, wdt->base + SPRD_WDT_CTRL);
172 sprd_wdt_lock(wdt->base);
174 clk_disable_unprepare(wdt->rtc_enable);
175 clk_disable_unprepare(wdt->enable);
180 struct sprd_wdt *wdt = to_sprd_wdt(wdd);
184 ret = sprd_wdt_load_value(wdt, wdd->timeout, wdd->pretimeout);
188 sprd_wdt_unlock(wdt->base);
189 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL);
191 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL);
192 sprd_wdt_lock(wdt->base);
200 struct sprd_wdt *wdt = to_sprd_wdt(wdd);
203 sprd_wdt_unlock(wdt->base);
204 val = readl_relaxed(wdt->base + SPRD_WDT_CTRL);
207 writel_relaxed(val, wdt->base + SPRD_WDT_CTRL);
208 sprd_wdt_lock(wdt->base);
215 struct sprd_wdt *wdt = to_sprd_wdt(wdd);
222 return sprd_wdt_load_value(wdt, timeout, wdd->pretimeout);
228 struct sprd_wdt *wdt = to_sprd_wdt(wdd);
235 return sprd_wdt_load_value(wdt, wdd->timeout, new_pretimeout);
240 struct sprd_wdt *wdt = to_sprd_wdt(wdd);
243 val = sprd_wdt_get_cnt_value(wdt);
267 struct sprd_wdt *wdt;
270 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL);
271 if (!wdt)
274 wdt->base = devm_platform_ioremap_resource(pdev, 0);
275 if (IS_ERR(wdt->base))
276 return PTR_ERR(wdt->base);
278 wdt->enable = devm_clk_get(dev, "enable");
279 if (IS_ERR(wdt->enable)) {
281 return PTR_ERR(wdt->enable);
284 wdt->rtc_enable = devm_clk_get(dev, "rtc_enable");
285 if (IS_ERR(wdt->rtc_enable)) {
287 return PTR_ERR(wdt->rtc_enable);
290 wdt->irq = platform_get_irq(pdev, 0);
291 if (wdt->irq < 0)
292 return wdt->irq;
294 ret = devm_request_irq(dev, wdt->irq, sprd_wdt_isr, IRQF_NO_SUSPEND,
295 "sprd-wdt", (void *)wdt);
301 wdt->wdd.info = &sprd_wdt_info;
302 wdt->wdd.ops = &sprd_wdt_ops;
303 wdt->wdd.parent = dev;
304 wdt->wdd.min_timeout = SPRD_WDT_MIN_TIMEOUT;
305 wdt->wdd.max_timeout = SPRD_WDT_MAX_TIMEOUT;
306 wdt->wdd.timeout = SPRD_WDT_MAX_TIMEOUT;
308 ret = sprd_wdt_enable(wdt);
310 dev_err(dev, "failed to enable wdt\n");
313 ret = devm_add_action_or_reset(dev, sprd_wdt_disable, wdt);
315 dev_err(dev, "Failed to add wdt disable action\n");
319 watchdog_set_nowayout(&wdt->wdd, WATCHDOG_NOWAYOUT);
320 watchdog_init_timeout(&wdt->wdd, 0, dev);
322 ret = devm_watchdog_register_device(dev, &wdt->wdd);
324 sprd_wdt_disable(wdt);
327 platform_set_drvdata(pdev, wdt);
334 struct sprd_wdt *wdt = dev_get_drvdata(dev);
336 if (watchdog_active(&wdt->wdd))
337 sprd_wdt_stop(&wdt->wdd);
338 sprd_wdt_disable(wdt);
345 struct sprd_wdt *wdt = dev_get_drvdata(dev);
348 ret = sprd_wdt_enable(wdt);
352 if (watchdog_active(&wdt->wdd))
353 ret = sprd_wdt_start(&wdt->wdd);
364 { .compatible = "sprd,sp9860-wdt", },
372 .name = "sprd-wdt",