Lines Matching +full:min +full:- +full:freq

1 // SPDX-License-Identifier: GPL-2.0
5 * (c) Copyright 2019-2020 Texas Instruments Inc.
66 * @base - base io address of WD device
67 * @freq - source clock frequency of WDT
68 * @wdd - hold watchdog device as is in WDT core
72 unsigned long freq; member
82 ret = pm_runtime_resume_and_get(wdd->parent); in rti_wdt_start()
87 timer_margin = (u64)wdd->timeout * wdt->freq; in rti_wdt_start()
91 writel_relaxed(timer_margin, wdt->base + RTIDWDPRLD); in rti_wdt_start()
100 wdd->min_hw_heartbeat_ms = 500 * wdd->timeout; in rti_wdt_start()
103 writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL); in rti_wdt_start()
106 writel_relaxed(RTIWWDSIZE_50P, wdt->base + RTIWWDSIZECTRL); in rti_wdt_start()
108 readl_relaxed(wdt->base + RTIWWDSIZECTRL); in rti_wdt_start()
111 writel_relaxed(WDENABLE_KEY, wdt->base + RTIDWDCTRL); in rti_wdt_start()
120 writel_relaxed(WDKEY_SEQ0, wdt->base + RTIWDKEY); in rti_wdt_ping()
122 writel_relaxed(WDKEY_SEQ1, wdt->base + RTIWDKEY); in rti_wdt_ping()
137 /* 50% open window => 50% min heartbeat */ in rti_wdt_setup_hw_hb()
138 wdd->min_hw_heartbeat_ms = 500 * heartbeat; in rti_wdt_setup_hw_hb()
142 /* 25% open window => 75% min heartbeat */ in rti_wdt_setup_hw_hb()
143 wdd->min_hw_heartbeat_ms = 750 * heartbeat; in rti_wdt_setup_hw_hb()
147 /* 12.5% open window => 87.5% min heartbeat */ in rti_wdt_setup_hw_hb()
148 wdd->min_hw_heartbeat_ms = 875 * heartbeat; in rti_wdt_setup_hw_hb()
152 /* 6.5% open window => 93.5% min heartbeat */ in rti_wdt_setup_hw_hb()
153 wdd->min_hw_heartbeat_ms = 935 * heartbeat; in rti_wdt_setup_hw_hb()
157 /* 3.125% open window => 96.9% min heartbeat */ in rti_wdt_setup_hw_hb()
158 wdd->min_hw_heartbeat_ms = 969 * heartbeat; in rti_wdt_setup_hw_hb()
162 return -EINVAL; in rti_wdt_setup_hw_hb()
175 val = readl_relaxed(wdt->base + RTIWDSTATUS); in rti_wdt_get_timeleft_ms()
179 timer_counter = readl_relaxed(wdt->base + RTIDWDCNTR); in rti_wdt_get_timeleft_ms()
183 do_div(timer_counter, wdt->freq); in rti_wdt_get_timeleft_ms()
208 struct device *dev = &pdev->dev; in rti_wdt_probe()
221 return -ENOMEM; in rti_wdt_probe()
227 wdt->freq = clk_get_rate(clk); in rti_wdt_probe()
231 if (!wdt->freq) { in rti_wdt_probe()
233 return -EINVAL; in rti_wdt_probe()
241 if (wdt->freq < 32768) in rti_wdt_probe()
242 wdt->freq = wdt->freq * 9 / 10; in rti_wdt_probe()
247 pm_runtime_disable(&pdev->dev); in rti_wdt_probe()
253 wdd = &wdt->wdd; in rti_wdt_probe()
254 wdd->info = &rti_wdt_info; in rti_wdt_probe()
255 wdd->ops = &rti_wdt_ops; in rti_wdt_probe()
256 wdd->min_timeout = 1; in rti_wdt_probe()
257 wdd->max_hw_heartbeat_ms = (WDT_PRELOAD_MAX << WDT_PRELOAD_SHIFT) / in rti_wdt_probe()
258 wdt->freq * 1000; in rti_wdt_probe()
259 wdd->parent = dev; in rti_wdt_probe()
265 wdt->base = devm_platform_ioremap_resource(pdev, 0); in rti_wdt_probe()
266 if (IS_ERR(wdt->base)) { in rti_wdt_probe()
267 ret = PTR_ERR(wdt->base); in rti_wdt_probe()
271 if (readl(wdt->base + RTIDWDCTRL) == WDENABLE_KEY) { in rti_wdt_probe()
277 set_bit(WDOG_HW_RUNNING, &wdd->status); in rti_wdt_probe()
279 heartbeat_ms = readl(wdt->base + RTIDWDPRLD); in rti_wdt_probe()
282 do_div(heartbeat_ms, wdt->freq); in rti_wdt_probe()
290 wsize = readl(wdt->base + RTIWWDSIZECTRL); in rti_wdt_probe()
297 last_ping = heartbeat_ms - time_left_ms; in rti_wdt_probe()
304 node = of_parse_phandle(pdev->dev.of_node, "memory-region", 0); in rti_wdt_probe()
314 * Readout the Power-on(PON) reason and pass to bootstatus. in rti_wdt_probe()
320 ret = -EINVAL; in rti_wdt_probe()
326 dev_err(dev, "Failed to map memory-region.\n"); in rti_wdt_probe()
327 ret = -ENOMEM; in rti_wdt_probe()
334 wdd->bootstatus |= WDIOF_CARDRESET; in rti_wdt_probe()
352 pm_runtime_put_sync(&pdev->dev); in rti_wdt_probe()
357 pm_runtime_put_sync(&pdev->dev); in rti_wdt_probe()
358 pm_runtime_disable(&pdev->dev); in rti_wdt_probe()
367 watchdog_unregister_device(&wdt->wdd); in rti_wdt_remove()
369 if (!pm_runtime_suspended(&pdev->dev)) in rti_wdt_remove()
370 pm_runtime_put(&pdev->dev); in rti_wdt_remove()
372 pm_runtime_disable(&pdev->dev); in rti_wdt_remove()
376 { .compatible = "ti,j7-rti-wdt", },
383 .name = "rti-wdt",
392 MODULE_AUTHOR("Tero Kristo <t-kristo@ti.com>");
402 MODULE_ALIAS("platform:rti-wdt");