Lines Matching +full:j7 +full:- +full:rti +full:- +full:wdt
1 // SPDX-License-Identifier: GPL-2.0
3 * Watchdog driver for the K3 RTI module
5 * (c) Copyright 2019-2020 Texas Instruments Inc.
67 * struct to hold data for each WDT device
68 * @base - base io address of WD device
69 * @freq - source clock frequency of WDT
70 * @wdd - hold watchdog device as is in WDT core
81 struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd); in rti_wdt_start() local
84 ret = pm_runtime_resume_and_get(wdd->parent); in rti_wdt_start()
89 timer_margin = (u64)wdd->timeout * wdt->freq; in rti_wdt_start()
93 writel_relaxed(timer_margin, wdt->base + RTIDWDPRLD); in rti_wdt_start()
96 * RTI only supports a windowed mode, where the watchdog can only in rti_wdt_start()
102 wdd->min_hw_heartbeat_ms = 520 * wdd->timeout + MAX_HW_ERROR; in rti_wdt_start()
104 /* Generate NMI when wdt expires */ in rti_wdt_start()
105 writel_relaxed(RTIWWDRX_NMI, wdt->base + RTIWWDRXCTRL); in rti_wdt_start()
108 writel_relaxed(RTIWWDSIZE_50P, wdt->base + RTIWWDSIZECTRL); in rti_wdt_start()
110 readl_relaxed(wdt->base + RTIWWDSIZECTRL); in rti_wdt_start()
113 writel_relaxed(WDENABLE_KEY, wdt->base + RTIDWDCTRL); in rti_wdt_start()
119 struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd); in rti_wdt_ping() local
122 writel_relaxed(WDKEY_SEQ0, wdt->base + RTIWDKEY); in rti_wdt_ping()
124 writel_relaxed(WDKEY_SEQ1, wdt->base + RTIWDKEY); in rti_wdt_ping()
132 * RTI only supports a windowed mode, where the watchdog can only in rti_wdt_setup_hw_hb()
142 wdd->min_hw_heartbeat_ms = 520 * heartbeat + MAX_HW_ERROR; in rti_wdt_setup_hw_hb()
147 wdd->min_hw_heartbeat_ms = 770 * heartbeat + MAX_HW_ERROR; in rti_wdt_setup_hw_hb()
152 wdd->min_hw_heartbeat_ms = 895 * heartbeat + MAX_HW_ERROR; in rti_wdt_setup_hw_hb()
157 wdd->min_hw_heartbeat_ms = 955 * heartbeat + MAX_HW_ERROR; in rti_wdt_setup_hw_hb()
162 wdd->min_hw_heartbeat_ms = 989 * heartbeat + MAX_HW_ERROR; in rti_wdt_setup_hw_hb()
166 return -EINVAL; in rti_wdt_setup_hw_hb()
176 struct rti_wdt_device *wdt = watchdog_get_drvdata(wdd); in rti_wdt_get_timeleft_ms() local
179 val = readl_relaxed(wdt->base + RTIWDSTATUS); in rti_wdt_get_timeleft_ms()
183 timer_counter = readl_relaxed(wdt->base + RTIDWDCNTR); in rti_wdt_get_timeleft_ms()
187 do_div(timer_counter, wdt->freq); in rti_wdt_get_timeleft_ms()
199 .identity = "K3 RTI Watchdog",
212 struct device *dev = &pdev->dev; in rti_wdt_probe()
214 struct rti_wdt_device *wdt; in rti_wdt_probe() local
222 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); in rti_wdt_probe()
223 if (!wdt) in rti_wdt_probe()
224 return -ENOMEM; in rti_wdt_probe()
230 wdt->freq = clk_get_rate(clk); in rti_wdt_probe()
234 if (!wdt->freq) { in rti_wdt_probe()
236 return -EINVAL; in rti_wdt_probe()
242 pm_runtime_disable(&pdev->dev); in rti_wdt_probe()
246 platform_set_drvdata(pdev, wdt); in rti_wdt_probe()
248 wdd = &wdt->wdd; in rti_wdt_probe()
249 wdd->info = &rti_wdt_info; in rti_wdt_probe()
250 wdd->ops = &rti_wdt_ops; in rti_wdt_probe()
251 wdd->min_timeout = 1; in rti_wdt_probe()
252 wdd->max_hw_heartbeat_ms = (WDT_PRELOAD_MAX << WDT_PRELOAD_SHIFT) / in rti_wdt_probe()
253 wdt->freq * 1000; in rti_wdt_probe()
254 wdd->timeout = DEFAULT_HEARTBEAT; in rti_wdt_probe()
255 wdd->parent = dev; in rti_wdt_probe()
257 watchdog_set_drvdata(wdd, wdt); in rti_wdt_probe()
261 wdt->base = devm_platform_ioremap_resource(pdev, 0); in rti_wdt_probe()
262 if (IS_ERR(wdt->base)) { in rti_wdt_probe()
263 ret = PTR_ERR(wdt->base); in rti_wdt_probe()
267 if (readl(wdt->base + RTIDWDCTRL) == WDENABLE_KEY) { in rti_wdt_probe()
273 set_bit(WDOG_HW_RUNNING, &wdd->status); in rti_wdt_probe()
276 heartbeat_ms = readl(wdt->base + RTIDWDPRLD) + 1; in rti_wdt_probe()
279 do_div(heartbeat_ms, wdt->freq); in rti_wdt_probe()
287 wsize = readl(wdt->base + RTIWWDSIZECTRL); in rti_wdt_probe()
294 last_ping = heartbeat_ms - time_left_ms; in rti_wdt_probe()
301 ret = of_reserved_mem_region_to_resource(pdev->dev.of_node, 0, &res); in rti_wdt_probe()
305 * Readout the Power-on(PON) reason and pass to bootstatus. in rti_wdt_probe()
311 ret = -EINVAL; in rti_wdt_probe()
317 dev_err(dev, "Failed to map memory-region.\n"); in rti_wdt_probe()
318 ret = -ENOMEM; in rti_wdt_probe()
325 wdd->bootstatus |= WDIOF_CARDRESET; in rti_wdt_probe()
341 pm_runtime_put_sync(&pdev->dev); in rti_wdt_probe()
346 pm_runtime_put_sync(&pdev->dev); in rti_wdt_probe()
347 pm_runtime_disable(&pdev->dev); in rti_wdt_probe()
354 struct rti_wdt_device *wdt = platform_get_drvdata(pdev); in rti_wdt_remove() local
356 watchdog_unregister_device(&wdt->wdd); in rti_wdt_remove()
358 if (!pm_runtime_suspended(&pdev->dev)) in rti_wdt_remove()
359 pm_runtime_put(&pdev->dev); in rti_wdt_remove()
361 pm_runtime_disable(&pdev->dev); in rti_wdt_remove()
365 { .compatible = "ti,j7-rti-wdt", },
372 .name = "rti-wdt",
381 MODULE_AUTHOR("Tero Kristo <t-kristo@ti.com>");
382 MODULE_DESCRIPTION("K3 RTI Watchdog Driver");
391 MODULE_ALIAS("platform:rti-wdt");