Lines Matching +full:meson +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
26 #define GXBB_WDT_CTRL_DIV_MASK (BIT(18) - 1)
28 #define GXBB_WDT_TCNT_SETUP_MASK (BIT(16) - 1)
55 writel(readl(data->reg_base + GXBB_WDT_CTRL_REG) | GXBB_WDT_CTRL_EN, in meson_gxbb_wdt_start()
56 data->reg_base + GXBB_WDT_CTRL_REG); in meson_gxbb_wdt_start()
65 writel(readl(data->reg_base + GXBB_WDT_CTRL_REG) & ~GXBB_WDT_CTRL_EN, in meson_gxbb_wdt_stop()
66 data->reg_base + GXBB_WDT_CTRL_REG); in meson_gxbb_wdt_stop()
75 writel(0, data->reg_base + GXBB_WDT_RSET_REG); in meson_gxbb_wdt_ping()
89 wdt_dev->timeout = timeout; in meson_gxbb_wdt_set_timeout()
93 writel(tcnt, data->reg_base + GXBB_WDT_TCNT_REG); in meson_gxbb_wdt_set_timeout()
103 reg = readl(data->reg_base + GXBB_WDT_TCNT_REG); in meson_gxbb_wdt_get_timeleft()
105 return ((reg & GXBB_WDT_TCNT_SETUP_MASK) - in meson_gxbb_wdt_get_timeleft()
118 .identity = "Meson GXBB Watchdog",
122 static int __maybe_unused meson_gxbb_wdt_resume(struct device *dev) in meson_gxbb_wdt_resume()
126 if (watchdog_active(&data->wdt_dev)) in meson_gxbb_wdt_resume()
127 meson_gxbb_wdt_start(&data->wdt_dev); in meson_gxbb_wdt_resume()
132 static int __maybe_unused meson_gxbb_wdt_suspend(struct device *dev) in meson_gxbb_wdt_suspend()
136 if (watchdog_active(&data->wdt_dev)) in meson_gxbb_wdt_suspend()
137 meson_gxbb_wdt_stop(&data->wdt_dev); in meson_gxbb_wdt_suspend()
155 { .compatible = "amlogic,meson-gxbb-wdt", .data = &gxbb_params, },
156 { .compatible = "amlogic,t7-wdt", .data = &t7_params, },
163 struct device *dev = &pdev->dev; in meson_gxbb_wdt_probe()
170 return -ENOMEM; in meson_gxbb_wdt_probe()
172 data->reg_base = devm_platform_ioremap_resource(pdev, 0); in meson_gxbb_wdt_probe()
173 if (IS_ERR(data->reg_base)) in meson_gxbb_wdt_probe()
174 return PTR_ERR(data->reg_base); in meson_gxbb_wdt_probe()
176 data->clk = devm_clk_get_enabled(dev, NULL); in meson_gxbb_wdt_probe()
177 if (IS_ERR(data->clk)) in meson_gxbb_wdt_probe()
178 return PTR_ERR(data->clk); in meson_gxbb_wdt_probe()
184 data->wdt_dev.parent = dev; in meson_gxbb_wdt_probe()
185 data->wdt_dev.info = &meson_gxbb_wdt_info; in meson_gxbb_wdt_probe()
186 data->wdt_dev.ops = &meson_gxbb_wdt_ops; in meson_gxbb_wdt_probe()
187 data->wdt_dev.max_hw_heartbeat_ms = GXBB_WDT_TCNT_SETUP_MASK; in meson_gxbb_wdt_probe()
188 data->wdt_dev.min_timeout = 1; in meson_gxbb_wdt_probe()
189 data->wdt_dev.timeout = DEFAULT_TIMEOUT; in meson_gxbb_wdt_probe()
190 watchdog_init_timeout(&data->wdt_dev, timeout, dev); in meson_gxbb_wdt_probe()
191 watchdog_set_nowayout(&data->wdt_dev, nowayout); in meson_gxbb_wdt_probe()
192 watchdog_set_drvdata(&data->wdt_dev, data); in meson_gxbb_wdt_probe()
194 ctrl_reg = readl(data->reg_base + GXBB_WDT_CTRL_REG) & in meson_gxbb_wdt_probe()
198 /* Watchdog is running - keep it running but extend timeout in meson_gxbb_wdt_probe()
201 set_bit(WDOG_HW_RUNNING, &data->wdt_dev.status); in meson_gxbb_wdt_probe()
202 meson_gxbb_wdt_set_timeout(&data->wdt_dev, in meson_gxbb_wdt_probe()
207 ctrl_reg |= ((clk_get_rate(data->clk) / 1000) & in meson_gxbb_wdt_probe()
209 params->rst | in meson_gxbb_wdt_probe()
213 writel(ctrl_reg, data->reg_base + GXBB_WDT_CTRL_REG); in meson_gxbb_wdt_probe()
214 meson_gxbb_wdt_set_timeout(&data->wdt_dev, data->wdt_dev.timeout); in meson_gxbb_wdt_probe()
216 return devm_watchdog_register_device(dev, &data->wdt_dev); in meson_gxbb_wdt_probe()
222 .name = "meson-gxbb-wdt",
231 MODULE_DESCRIPTION("Amlogic Meson GXBB Watchdog timer driver");