Lines Matching +full:1000 +full:base +full:- +full:t

1 // SPDX-License-Identifier: GPL-2.0
5 * (c) Copyright 2019-2020 Texas Instruments Inc.
25 #define MAX_HEARTBEAT 1000
59 * @base - base io address of WD device
60 * @freq - source clock frequency of WDT
61 * @wdd - hold watchdog device as is in WDT core
64 void __iomem *base; member
75 timer_margin = (u64)wdd->timeout * wdt->freq; in rti_wdt_start()
79 writel_relaxed(timer_margin, wdt->base + RTIDWDPRLD); in rti_wdt_start()
88 wdd->min_hw_heartbeat_ms = 500 * wdd->timeout; in rti_wdt_start()
91 writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL); in rti_wdt_start()
94 writel_relaxed(RTIWWDSIZE_50P, wdt->base + RTIWWDSIZECTRL); in rti_wdt_start()
96 readl_relaxed(wdt->base + RTIWWDSIZECTRL); in rti_wdt_start()
99 writel_relaxed(WDENABLE_KEY, wdt->base + RTIDWDCTRL); in rti_wdt_start()
108 writel_relaxed(WDKEY_SEQ0, wdt->base + RTIWDKEY); in rti_wdt_ping()
110 writel_relaxed(WDKEY_SEQ1, wdt->base + RTIWDKEY); in rti_wdt_ping()
126 wdd->min_hw_heartbeat_ms = 500 * heartbeat; in rti_wdt_setup_hw_hb()
131 wdd->min_hw_heartbeat_ms = 750 * heartbeat; in rti_wdt_setup_hw_hb()
136 wdd->min_hw_heartbeat_ms = 875 * heartbeat; in rti_wdt_setup_hw_hb()
141 wdd->min_hw_heartbeat_ms = 935 * heartbeat; in rti_wdt_setup_hw_hb()
146 wdd->min_hw_heartbeat_ms = 969 * heartbeat; in rti_wdt_setup_hw_hb()
150 return -EINVAL; in rti_wdt_setup_hw_hb()
163 val = readl_relaxed(wdt->base + RTIWDSTATUS); in rti_wdt_get_timeleft_ms()
167 timer_counter = readl_relaxed(wdt->base + RTIDWDCNTR); in rti_wdt_get_timeleft_ms()
169 timer_counter *= 1000; in rti_wdt_get_timeleft_ms()
171 do_div(timer_counter, wdt->freq); in rti_wdt_get_timeleft_ms()
178 return rti_wdt_get_timeleft_ms(wdd) / 1000; in rti_wdt_get_timeleft()
196 struct device *dev = &pdev->dev; in rti_wdt_probe()
205 return -ENOMEM; in rti_wdt_probe()
211 wdt->freq = clk_get_rate(clk); in rti_wdt_probe()
215 if (!wdt->freq) { in rti_wdt_probe()
217 return -EINVAL; in rti_wdt_probe()
222 * Adjust frequency down in this case so that we don't pet in rti_wdt_probe()
225 if (wdt->freq < 32768) in rti_wdt_probe()
226 wdt->freq = wdt->freq * 9 / 10; in rti_wdt_probe()
232 pm_runtime_disable(&pdev->dev); in rti_wdt_probe()
238 wdd = &wdt->wdd; in rti_wdt_probe()
239 wdd->info = &rti_wdt_info; in rti_wdt_probe()
240 wdd->ops = &rti_wdt_ops; in rti_wdt_probe()
241 wdd->min_timeout = 1; in rti_wdt_probe()
242 wdd->max_hw_heartbeat_ms = (WDT_PRELOAD_MAX << WDT_PRELOAD_SHIFT) / in rti_wdt_probe()
243 wdt->freq * 1000; in rti_wdt_probe()
244 wdd->parent = dev; in rti_wdt_probe()
251 wdt->base = devm_ioremap_resource(dev, wdt_mem); in rti_wdt_probe()
252 if (IS_ERR(wdt->base)) { in rti_wdt_probe()
253 ret = PTR_ERR(wdt->base); in rti_wdt_probe()
257 if (readl(wdt->base + RTIDWDCTRL) == WDENABLE_KEY) { in rti_wdt_probe()
262 set_bit(WDOG_HW_RUNNING, &wdd->status); in rti_wdt_probe()
264 heartbeat_ms = readl(wdt->base + RTIDWDPRLD); in rti_wdt_probe()
266 heartbeat_ms *= 1000; in rti_wdt_probe()
267 do_div(heartbeat_ms, wdt->freq); in rti_wdt_probe()
268 if (heartbeat_ms != heartbeat * 1000) in rti_wdt_probe()
272 heartbeat /= 1000; in rti_wdt_probe()
274 wsize = readl(wdt->base + RTIWWDSIZECTRL); in rti_wdt_probe()
281 last_ping = heartbeat_ms - time_left_ms; in rti_wdt_probe()
302 pm_runtime_put_sync(&pdev->dev); in rti_wdt_probe()
303 pm_runtime_disable(&pdev->dev); in rti_wdt_probe()
312 watchdog_unregister_device(&wdt->wdd); in rti_wdt_remove()
313 pm_runtime_put(&pdev->dev); in rti_wdt_remove()
314 pm_runtime_disable(&pdev->dev); in rti_wdt_remove()
320 { .compatible = "ti,j7-rti-wdt", },
327 .name = "rti-wdt",
336 MODULE_AUTHOR("Tero Kristo <t-kristo@ti.com>");
346 MODULE_ALIAS("platform:rti-wdt");