Lines Matching +full:reset +full:- +full:synchronized
1 // SPDX-License-Identifier: GPL-2.0
17 #include <linux/reset.h>
65 ndelay(priv->delay); in rzg2l_wdt_wait_delay()
80 writel_relaxed(val, priv->base + reg); in rzg2l_wdt_write()
81 /* Registers other than the WDTINT is always synchronized with WDT_CLK */ in rzg2l_wdt_write()
93 /* 2 consecutive overflow cycle needed to trigger reset */ in rzg2l_wdt_init_timeout()
94 time_out = (wdev->timeout * (MICRO / 2)) / in rzg2l_wdt_init_timeout()
95 rzg2l_wdt_get_cycle_usec(priv->osc_clk_rate, 0); in rzg2l_wdt_init_timeout()
104 ret = pm_runtime_resume_and_get(wdev->parent); in rzg2l_wdt_start()
108 ret = reset_control_deassert(priv->rstc); in rzg2l_wdt_start()
110 pm_runtime_put(wdev->parent); in rzg2l_wdt_start()
131 ret = reset_control_assert(priv->rstc); in rzg2l_wdt_stop()
135 ret = pm_runtime_put(wdev->parent); in rzg2l_wdt_stop()
146 wdev->timeout = timeout; in rzg2l_wdt_set_timeout()
149 * If the watchdog is active, reset the module for updating the WDTSET in rzg2l_wdt_set_timeout()
151 * to reset the module) so that it is updated with new timeout values. in rzg2l_wdt_set_timeout()
183 ret = pm_runtime_resume_and_get(wdev->parent); in rzg2l_wdt_restart()
187 if (priv->devtype == WDT_RZG2L) { in rzg2l_wdt_restart()
188 ret = reset_control_deassert(priv->rstc); in rzg2l_wdt_restart()
192 /* Generate Reset (WDTRSTB) Signal on parity error */ in rzg2l_wdt_restart()
199 ret = reset_control_reset(priv->rstc); in rzg2l_wdt_restart()
203 wdev->timeout = 0; in rzg2l_wdt_restart()
214 /* Wait 2 consecutive overflow cycles for reset */ in rzg2l_wdt_restart()
215 mdelay(DIV_ROUND_UP(2 * 0xFFFFF * 1000, priv->osc_clk_rate)); in rzg2l_wdt_restart()
248 pm_runtime_disable(wdev->parent); in rzg2l_wdt_pm_disable()
253 struct device *dev = &pdev->dev; in rzg2l_wdt_probe()
260 return -ENOMEM; in rzg2l_wdt_probe()
262 priv->base = devm_platform_ioremap_resource(pdev, 0); in rzg2l_wdt_probe()
263 if (IS_ERR(priv->base)) in rzg2l_wdt_probe()
264 return PTR_ERR(priv->base); in rzg2l_wdt_probe()
267 priv->osc_clk = devm_clk_get(&pdev->dev, "oscclk"); in rzg2l_wdt_probe()
268 if (IS_ERR(priv->osc_clk)) in rzg2l_wdt_probe()
269 return dev_err_probe(&pdev->dev, PTR_ERR(priv->osc_clk), "no oscclk"); in rzg2l_wdt_probe()
271 priv->osc_clk_rate = clk_get_rate(priv->osc_clk); in rzg2l_wdt_probe()
272 if (!priv->osc_clk_rate) in rzg2l_wdt_probe()
273 return dev_err_probe(&pdev->dev, -EINVAL, "oscclk rate is 0"); in rzg2l_wdt_probe()
276 priv->pclk = devm_clk_get(&pdev->dev, "pclk"); in rzg2l_wdt_probe()
277 if (IS_ERR(priv->pclk)) in rzg2l_wdt_probe()
278 return dev_err_probe(&pdev->dev, PTR_ERR(priv->pclk), "no pclk"); in rzg2l_wdt_probe()
280 pclk_rate = clk_get_rate(priv->pclk); in rzg2l_wdt_probe()
282 return dev_err_probe(&pdev->dev, -EINVAL, "pclk rate is 0"); in rzg2l_wdt_probe()
284 priv->delay = F2CYCLE_NSEC(priv->osc_clk_rate) * 6 + F2CYCLE_NSEC(pclk_rate) * 9; in rzg2l_wdt_probe()
286 priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); in rzg2l_wdt_probe()
287 if (IS_ERR(priv->rstc)) in rzg2l_wdt_probe()
288 return dev_err_probe(&pdev->dev, PTR_ERR(priv->rstc), in rzg2l_wdt_probe()
289 "failed to get cpg reset"); in rzg2l_wdt_probe()
291 priv->devtype = (uintptr_t)of_device_get_match_data(dev); in rzg2l_wdt_probe()
293 pm_runtime_irq_safe(&pdev->dev); in rzg2l_wdt_probe()
294 pm_runtime_enable(&pdev->dev); in rzg2l_wdt_probe()
296 priv->wdev.info = &rzg2l_wdt_ident; in rzg2l_wdt_probe()
297 priv->wdev.ops = &rzg2l_wdt_ops; in rzg2l_wdt_probe()
298 priv->wdev.parent = dev; in rzg2l_wdt_probe()
299 priv->wdev.min_timeout = 1; in rzg2l_wdt_probe()
300 priv->wdev.max_timeout = rzg2l_wdt_get_cycle_usec(priv->osc_clk_rate, 0xfff) / in rzg2l_wdt_probe()
302 priv->wdev.timeout = WDT_DEFAULT_TIMEOUT; in rzg2l_wdt_probe()
304 watchdog_set_drvdata(&priv->wdev, priv); in rzg2l_wdt_probe()
305 ret = devm_add_action_or_reset(&pdev->dev, rzg2l_wdt_pm_disable, &priv->wdev); in rzg2l_wdt_probe()
309 watchdog_set_nowayout(&priv->wdev, nowayout); in rzg2l_wdt_probe()
310 watchdog_stop_on_unregister(&priv->wdev); in rzg2l_wdt_probe()
312 ret = watchdog_init_timeout(&priv->wdev, 0, dev); in rzg2l_wdt_probe()
316 return devm_watchdog_register_device(&pdev->dev, &priv->wdev); in rzg2l_wdt_probe()
320 { .compatible = "renesas,rzg2l-wdt", .data = (void *)WDT_RZG2L },
321 { .compatible = "renesas,rzv2m-wdt", .data = (void *)WDT_RZV2M },