Lines Matching +full:ext +full:- +full:reset +full:- +full:output

1 // SPDX-License-Identifier: GPL-2.0
14 * ---- -----
15 * Registers: 32-bit 16-bit
34 #define DRIVER_NAME "imx2-wdt"
37 #define IMX2_WDT_WCR_WT (0xFF << 8) /* -> Watchdog Timeout Field */
38 #define IMX2_WDT_WCR_WDA BIT(5) /* -> External Reset WDOG_B */
39 #define IMX2_WDT_WCR_SRS BIT(4) /* -> Software Reset Signal */
40 #define IMX2_WDT_WCR_WRE BIT(3) /* -> WDOG Reset Enable */
41 #define IMX2_WDT_WCR_WDE BIT(2) /* -> Watchdog Enable */
42 #define IMX2_WDT_WCR_WDZST BIT(0) /* -> Watchdog timer Suspend */
45 #define IMX2_WDT_SEQ1 0x5555 /* -> service sequence 1 */
46 #define IMX2_WDT_SEQ2 0xAAAA /* -> service sequence 2 */
48 #define IMX2_WDT_WRSR 0x04 /* Reset Status Register */
49 #define IMX2_WDT_WRSR_TOUT BIT(1) /* -> Reset due to Timeout */
52 #define IMX2_WDT_WICR_WIE BIT(15) /* -> Interrupt Enable */
53 #define IMX2_WDT_WICR_WTIS BIT(14) /* -> Interrupt Status */
54 #define IMX2_WDT_WICR_WICT 0xFF /* -> Interrupt Count Timeout */
61 #define WDOG_SEC_TO_COUNT(s) ((s * 2 - 1) << 8)
98 /* Use internal reset or external - not both */ in imx2_wdt_restart()
99 if (wdev->ext_reset) in imx2_wdt_restart()
100 wcr_enable |= IMX2_WDT_WCR_SRS; /* do not assert int reset */ in imx2_wdt_restart()
102 wcr_enable |= IMX2_WDT_WCR_WDA; /* do not assert ext-reset */ in imx2_wdt_restart()
105 regmap_write(wdev->regmap, IMX2_WDT_WCR, wcr_enable); in imx2_wdt_restart()
113 regmap_write(wdev->regmap, IMX2_WDT_WCR, wcr_enable); in imx2_wdt_restart()
114 regmap_write(wdev->regmap, IMX2_WDT_WCR, wcr_enable); in imx2_wdt_restart()
116 /* wait for reset to assert... */ in imx2_wdt_restart()
127 regmap_read(wdev->regmap, IMX2_WDT_WCR, &val); in imx2_wdt_setup()
129 /* Suspend timer in low power mode, write once-only */ in imx2_wdt_setup()
131 /* Strip the old watchdog Time-Out value */ in imx2_wdt_setup()
133 /* Generate internal chip-level reset if WDOG times out */ in imx2_wdt_setup()
134 if (!wdev->ext_reset) in imx2_wdt_setup()
136 /* Or if external-reset assert WDOG_B reset only on time-out */ in imx2_wdt_setup()
141 /* Set the watchdog's Time-Out value */ in imx2_wdt_setup()
142 val |= WDOG_SEC_TO_COUNT(wdog->timeout); in imx2_wdt_setup()
144 regmap_write(wdev->regmap, IMX2_WDT_WCR, val); in imx2_wdt_setup()
148 regmap_write(wdev->regmap, IMX2_WDT_WCR, val); in imx2_wdt_setup()
155 regmap_read(wdev->regmap, IMX2_WDT_WCR, &val); in imx2_wdt_is_running()
164 if (!wdev->clk_is_on) in imx2_wdt_ping()
167 regmap_write(wdev->regmap, IMX2_WDT_WSR, IMX2_WDT_SEQ1); in imx2_wdt_ping()
168 regmap_write(wdev->regmap, IMX2_WDT_WSR, IMX2_WDT_SEQ2); in imx2_wdt_ping()
177 regmap_update_bits(wdev->regmap, IMX2_WDT_WCR, IMX2_WDT_WCR_WT, in __imx2_wdt_set_timeout()
188 wdog->timeout = new_timeout; in imx2_wdt_set_timeout()
198 return -EINVAL; in imx2_wdt_set_pretimeout()
200 wdog->pretimeout = new_pretimeout; in imx2_wdt_set_pretimeout()
202 regmap_update_bits(wdev->regmap, IMX2_WDT_WICR, in imx2_wdt_set_pretimeout()
213 regmap_write_bits(wdev->regmap, IMX2_WDT_WICR, in imx2_wdt_isr()
226 imx2_wdt_set_timeout(wdog, wdog->timeout); in imx2_wdt_start()
230 set_bit(WDOG_HW_RUNNING, &wdog->status); in imx2_wdt_start()
258 struct device *dev = &pdev->dev; in imx2_wdt_probe()
267 return -ENOMEM; in imx2_wdt_probe()
273 wdev->regmap = devm_regmap_init_mmio_clk(dev, NULL, base, in imx2_wdt_probe()
275 if (IS_ERR(wdev->regmap)) { in imx2_wdt_probe()
277 return PTR_ERR(wdev->regmap); in imx2_wdt_probe()
280 wdev->clk = devm_clk_get(dev, NULL); in imx2_wdt_probe()
281 if (IS_ERR(wdev->clk)) { in imx2_wdt_probe()
283 return PTR_ERR(wdev->clk); in imx2_wdt_probe()
286 wdog = &wdev->wdog; in imx2_wdt_probe()
287 wdog->info = &imx2_wdt_info; in imx2_wdt_probe()
288 wdog->ops = &imx2_wdt_ops; in imx2_wdt_probe()
289 wdog->min_timeout = 1; in imx2_wdt_probe()
290 wdog->timeout = IMX2_WDT_DEFAULT_TIME; in imx2_wdt_probe()
291 wdog->max_hw_heartbeat_ms = IMX2_WDT_MAX_TIME * 1000; in imx2_wdt_probe()
292 wdog->parent = dev; in imx2_wdt_probe()
298 wdog->info = &imx2_wdt_pretimeout_info; in imx2_wdt_probe()
300 ret = clk_prepare_enable(wdev->clk); in imx2_wdt_probe()
304 ret = devm_add_action_or_reset(dev, imx2_wdt_action, wdev->clk); in imx2_wdt_probe()
308 wdev->clk_is_on = true; in imx2_wdt_probe()
310 regmap_read(wdev->regmap, IMX2_WDT_WRSR, &val); in imx2_wdt_probe()
311 wdog->bootstatus = val & IMX2_WDT_WRSR_TOUT ? WDIOF_CARDRESET : 0; in imx2_wdt_probe()
313 wdev->ext_reset = of_property_read_bool(dev->of_node, in imx2_wdt_probe()
314 "fsl,ext-reset-output"); in imx2_wdt_probe()
323 imx2_wdt_set_timeout(wdog, wdog->timeout); in imx2_wdt_probe()
324 set_bit(WDOG_HW_RUNNING, &wdog->status); in imx2_wdt_probe()
332 regmap_write(wdev->regmap, IMX2_WDT_WMCR, 0); in imx2_wdt_probe()
349 dev_crit(&pdev->dev, "Device shutdown: Expect reboot!\n"); in imx2_wdt_shutdown()
353 /* Disable watchdog if it is active or non-active but still running */
362 * Don't update wdog->timeout, we'll restore the current value in imx2_wdt_suspend()
369 clk_disable_unprepare(wdev->clk); in imx2_wdt_suspend()
371 wdev->clk_is_on = false; in imx2_wdt_suspend()
383 ret = clk_prepare_enable(wdev->clk); in imx2_wdt_resume()
387 wdev->clk_is_on = true; in imx2_wdt_resume()
398 imx2_wdt_set_timeout(wdog, wdog->timeout); in imx2_wdt_resume()
409 { .compatible = "fsl,imx21-wdt", },