Lines Matching +full:sun4i +full:- +full:a10 +full:- +full:timer
1 // SPDX-License-Identifier: GPL-2.0-or-later
34 #define DRV_NAME "sunxi-wdt"
61 * wdt_timeout_map maps the watchdog timer interval value in seconds to
87 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_restart()
88 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_restart()
92 val = readl(wdt_base + regs->wdt_cfg); in sunxi_wdt_restart()
93 val &= ~(regs->wdt_reset_mask); in sunxi_wdt_restart()
94 val |= regs->wdt_reset_val; in sunxi_wdt_restart()
95 val |= regs->wdt_key_val; in sunxi_wdt_restart()
96 writel(val, wdt_base + regs->wdt_cfg); in sunxi_wdt_restart()
99 val = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
100 val &= ~(WDT_TIMEOUT_MASK << regs->wdt_timeout_shift); in sunxi_wdt_restart()
102 val |= regs->wdt_key_val; in sunxi_wdt_restart()
103 writel(val, wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
109 writel(WDT_CTRL_RELOAD, wdt_base + regs->wdt_ctrl); in sunxi_wdt_restart()
113 val = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
115 val |= regs->wdt_key_val; in sunxi_wdt_restart()
116 writel(val, wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
124 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_ping()
125 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_ping()
127 writel(WDT_CTRL_RELOAD, wdt_base + regs->wdt_ctrl); in sunxi_wdt_ping()
136 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_set_timeout()
137 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_set_timeout()
143 sunxi_wdt->wdt_dev.timeout = timeout; in sunxi_wdt_set_timeout()
145 reg = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_set_timeout()
146 reg &= ~(WDT_TIMEOUT_MASK << regs->wdt_timeout_shift); in sunxi_wdt_set_timeout()
147 reg |= wdt_timeout_map[timeout] << regs->wdt_timeout_shift; in sunxi_wdt_set_timeout()
148 reg |= regs->wdt_key_val; in sunxi_wdt_set_timeout()
149 writel(reg, wdt_base + regs->wdt_mode); in sunxi_wdt_set_timeout()
159 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_stop()
160 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_stop()
162 writel(regs->wdt_key_val, wdt_base + regs->wdt_mode); in sunxi_wdt_stop()
171 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_start()
172 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_start()
175 ret = sunxi_wdt_set_timeout(&sunxi_wdt->wdt_dev, in sunxi_wdt_start()
176 sunxi_wdt->wdt_dev.timeout); in sunxi_wdt_start()
181 reg = readl(wdt_base + regs->wdt_cfg); in sunxi_wdt_start()
182 reg &= ~(regs->wdt_reset_mask); in sunxi_wdt_start()
183 reg |= regs->wdt_reset_val; in sunxi_wdt_start()
184 reg |= regs->wdt_key_val; in sunxi_wdt_start()
185 writel(reg, wdt_base + regs->wdt_cfg); in sunxi_wdt_start()
188 reg = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_start()
190 reg |= regs->wdt_key_val; in sunxi_wdt_start()
191 writel(reg, wdt_base + regs->wdt_mode); in sunxi_wdt_start()
241 { .compatible = "allwinner,sun4i-a10-wdt", .data = &sun4i_wdt_reg },
242 { .compatible = "allwinner,sun6i-a31-wdt", .data = &sun6i_wdt_reg },
243 { .compatible = "allwinner,sun20i-d1-wdt", .data = &sun20i_wdt_reg },
250 struct device *dev = &pdev->dev; in sunxi_wdt_probe()
256 return -ENOMEM; in sunxi_wdt_probe()
258 sunxi_wdt->wdt_regs = of_device_get_match_data(dev); in sunxi_wdt_probe()
259 if (!sunxi_wdt->wdt_regs) in sunxi_wdt_probe()
260 return -ENODEV; in sunxi_wdt_probe()
262 sunxi_wdt->wdt_base = devm_platform_ioremap_resource(pdev, 0); in sunxi_wdt_probe()
263 if (IS_ERR(sunxi_wdt->wdt_base)) in sunxi_wdt_probe()
264 return PTR_ERR(sunxi_wdt->wdt_base); in sunxi_wdt_probe()
266 sunxi_wdt->wdt_dev.info = &sunxi_wdt_info; in sunxi_wdt_probe()
267 sunxi_wdt->wdt_dev.ops = &sunxi_wdt_ops; in sunxi_wdt_probe()
268 sunxi_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT; in sunxi_wdt_probe()
269 sunxi_wdt->wdt_dev.max_timeout = WDT_MAX_TIMEOUT; in sunxi_wdt_probe()
270 sunxi_wdt->wdt_dev.min_timeout = WDT_MIN_TIMEOUT; in sunxi_wdt_probe()
271 sunxi_wdt->wdt_dev.parent = dev; in sunxi_wdt_probe()
273 watchdog_init_timeout(&sunxi_wdt->wdt_dev, timeout, dev); in sunxi_wdt_probe()
274 watchdog_set_nowayout(&sunxi_wdt->wdt_dev, nowayout); in sunxi_wdt_probe()
275 watchdog_set_restart_priority(&sunxi_wdt->wdt_dev, 128); in sunxi_wdt_probe()
277 watchdog_set_drvdata(&sunxi_wdt->wdt_dev, sunxi_wdt); in sunxi_wdt_probe()
279 sunxi_wdt_stop(&sunxi_wdt->wdt_dev); in sunxi_wdt_probe()
281 watchdog_stop_on_reboot(&sunxi_wdt->wdt_dev); in sunxi_wdt_probe()
282 err = devm_watchdog_register_device(dev, &sunxi_wdt->wdt_dev); in sunxi_wdt_probe()
287 sunxi_wdt->wdt_dev.timeout, nowayout); in sunxi_wdt_probe()
312 MODULE_DESCRIPTION("sunxi WatchDog Timer Driver");