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"
60 * wdt_timeout_map maps the watchdog timer interval value in seconds to
86 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_restart()
87 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_restart()
91 val = readl(wdt_base + regs->wdt_cfg); in sunxi_wdt_restart()
92 val &= ~(regs->wdt_reset_mask); in sunxi_wdt_restart()
93 val |= regs->wdt_reset_val; in sunxi_wdt_restart()
94 writel(val, wdt_base + regs->wdt_cfg); in sunxi_wdt_restart()
97 val = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
98 val &= ~(WDT_TIMEOUT_MASK << regs->wdt_timeout_shift); in sunxi_wdt_restart()
100 writel(val, wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
106 writel(WDT_CTRL_RELOAD, wdt_base + regs->wdt_ctrl); in sunxi_wdt_restart()
110 val = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
112 writel(val, wdt_base + regs->wdt_mode); in sunxi_wdt_restart()
120 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_ping()
121 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_ping()
123 writel(WDT_CTRL_RELOAD, wdt_base + regs->wdt_ctrl); in sunxi_wdt_ping()
132 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_set_timeout()
133 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_set_timeout()
139 sunxi_wdt->wdt_dev.timeout = timeout; in sunxi_wdt_set_timeout()
141 reg = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_set_timeout()
142 reg &= ~(WDT_TIMEOUT_MASK << regs->wdt_timeout_shift); in sunxi_wdt_set_timeout()
143 reg |= wdt_timeout_map[timeout] << regs->wdt_timeout_shift; in sunxi_wdt_set_timeout()
144 writel(reg, wdt_base + regs->wdt_mode); in sunxi_wdt_set_timeout()
154 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_stop()
155 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_stop()
157 writel(0, wdt_base + regs->wdt_mode); in sunxi_wdt_stop()
166 void __iomem *wdt_base = sunxi_wdt->wdt_base; in sunxi_wdt_start()
167 const struct sunxi_wdt_reg *regs = sunxi_wdt->wdt_regs; in sunxi_wdt_start()
170 ret = sunxi_wdt_set_timeout(&sunxi_wdt->wdt_dev, in sunxi_wdt_start()
171 sunxi_wdt->wdt_dev.timeout); in sunxi_wdt_start()
176 reg = readl(wdt_base + regs->wdt_cfg); in sunxi_wdt_start()
177 reg &= ~(regs->wdt_reset_mask); in sunxi_wdt_start()
178 reg |= regs->wdt_reset_val; in sunxi_wdt_start()
179 writel(reg, wdt_base + regs->wdt_cfg); in sunxi_wdt_start()
182 reg = readl(wdt_base + regs->wdt_mode); in sunxi_wdt_start()
184 writel(reg, wdt_base + regs->wdt_mode); in sunxi_wdt_start()
224 { .compatible = "allwinner,sun4i-a10-wdt", .data = &sun4i_wdt_reg },
225 { .compatible = "allwinner,sun6i-a31-wdt", .data = &sun6i_wdt_reg },
232 struct device *dev = &pdev->dev; in sunxi_wdt_probe()
238 return -ENOMEM; in sunxi_wdt_probe()
240 sunxi_wdt->wdt_regs = of_device_get_match_data(dev); in sunxi_wdt_probe()
241 if (!sunxi_wdt->wdt_regs) in sunxi_wdt_probe()
242 return -ENODEV; in sunxi_wdt_probe()
244 sunxi_wdt->wdt_base = devm_platform_ioremap_resource(pdev, 0); in sunxi_wdt_probe()
245 if (IS_ERR(sunxi_wdt->wdt_base)) in sunxi_wdt_probe()
246 return PTR_ERR(sunxi_wdt->wdt_base); in sunxi_wdt_probe()
248 sunxi_wdt->wdt_dev.info = &sunxi_wdt_info; in sunxi_wdt_probe()
249 sunxi_wdt->wdt_dev.ops = &sunxi_wdt_ops; in sunxi_wdt_probe()
250 sunxi_wdt->wdt_dev.timeout = WDT_MAX_TIMEOUT; in sunxi_wdt_probe()
251 sunxi_wdt->wdt_dev.max_timeout = WDT_MAX_TIMEOUT; in sunxi_wdt_probe()
252 sunxi_wdt->wdt_dev.min_timeout = WDT_MIN_TIMEOUT; in sunxi_wdt_probe()
253 sunxi_wdt->wdt_dev.parent = dev; in sunxi_wdt_probe()
255 watchdog_init_timeout(&sunxi_wdt->wdt_dev, timeout, dev); in sunxi_wdt_probe()
256 watchdog_set_nowayout(&sunxi_wdt->wdt_dev, nowayout); in sunxi_wdt_probe()
257 watchdog_set_restart_priority(&sunxi_wdt->wdt_dev, 128); in sunxi_wdt_probe()
259 watchdog_set_drvdata(&sunxi_wdt->wdt_dev, sunxi_wdt); in sunxi_wdt_probe()
261 sunxi_wdt_stop(&sunxi_wdt->wdt_dev); in sunxi_wdt_probe()
263 watchdog_stop_on_reboot(&sunxi_wdt->wdt_dev); in sunxi_wdt_probe()
264 err = devm_watchdog_register_device(dev, &sunxi_wdt->wdt_dev); in sunxi_wdt_probe()
269 sunxi_wdt->wdt_dev.timeout, nowayout); in sunxi_wdt_probe()
294 MODULE_DESCRIPTION("sunxi WatchDog Timer Driver");