Lines Matching refs:gwdt
134 static u64 sbsa_gwdt_reg_read(struct sbsa_gwdt *gwdt) in sbsa_gwdt_reg_read() argument
136 if (gwdt->version == 0) in sbsa_gwdt_reg_read()
137 return readl(gwdt->control_base + SBSA_GWDT_WOR); in sbsa_gwdt_reg_read()
139 return lo_hi_readq(gwdt->control_base + SBSA_GWDT_WOR); in sbsa_gwdt_reg_read()
142 static void sbsa_gwdt_reg_write(u64 val, struct sbsa_gwdt *gwdt) in sbsa_gwdt_reg_write() argument
144 if (gwdt->version == 0) in sbsa_gwdt_reg_write()
145 writel((u32)val, gwdt->control_base + SBSA_GWDT_WOR); in sbsa_gwdt_reg_write()
147 lo_hi_writeq(val, gwdt->control_base + SBSA_GWDT_WOR); in sbsa_gwdt_reg_write()
156 struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd); in sbsa_gwdt_set_timeout() local
162 sbsa_gwdt_reg_write((u64)gwdt->clk * timeout, gwdt); in sbsa_gwdt_set_timeout()
169 sbsa_gwdt_reg_write(((u64)gwdt->clk / 2) * timeout, gwdt); in sbsa_gwdt_set_timeout()
193 if (gwdt->need_ws0_race_workaround) in sbsa_gwdt_set_timeout()
201 struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd); in sbsa_gwdt_get_timeleft() local
210 !(readl(gwdt->control_base + SBSA_GWDT_WCS) & SBSA_GWDT_WCS_WS0)) in sbsa_gwdt_get_timeleft()
211 timeleft += sbsa_gwdt_reg_read(gwdt); in sbsa_gwdt_get_timeleft()
213 timeleft += lo_hi_readq(gwdt->control_base + SBSA_GWDT_WCV) - in sbsa_gwdt_get_timeleft()
216 do_div(timeleft, gwdt->clk); in sbsa_gwdt_get_timeleft()
223 struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd); in sbsa_gwdt_keepalive() local
229 writel(0, gwdt->refresh_base + SBSA_GWDT_WRR); in sbsa_gwdt_keepalive()
236 struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd); in sbsa_gwdt_get_version() local
239 iidr = readl(gwdt->control_base + SBSA_GWDT_W_IIDR); in sbsa_gwdt_get_version()
243 gwdt->version = ver; in sbsa_gwdt_get_version()
244 gwdt->need_ws0_race_workaround = in sbsa_gwdt_get_version()
250 struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd); in sbsa_gwdt_start() local
253 writel(SBSA_GWDT_WCS_EN, gwdt->control_base + SBSA_GWDT_WCS); in sbsa_gwdt_start()
260 struct sbsa_gwdt *gwdt = watchdog_get_drvdata(wdd); in sbsa_gwdt_stop() local
263 writel(0, gwdt->control_base + SBSA_GWDT_WCS); in sbsa_gwdt_stop()
297 struct sbsa_gwdt *gwdt; in sbsa_gwdt_probe() local
301 gwdt = devm_kzalloc(dev, sizeof(*gwdt), GFP_KERNEL); in sbsa_gwdt_probe()
302 if (!gwdt) in sbsa_gwdt_probe()
304 platform_set_drvdata(pdev, gwdt); in sbsa_gwdt_probe()
319 gwdt->clk = arch_timer_get_cntfrq(); in sbsa_gwdt_probe()
320 gwdt->refresh_base = rf_base; in sbsa_gwdt_probe()
321 gwdt->control_base = cf_base; in sbsa_gwdt_probe()
323 wdd = &gwdt->wdd; in sbsa_gwdt_probe()
329 watchdog_set_drvdata(wdd, gwdt); in sbsa_gwdt_probe()
332 if (gwdt->version == 0) in sbsa_gwdt_probe()
333 wdd->max_hw_heartbeat_ms = U32_MAX / gwdt->clk * 1000; in sbsa_gwdt_probe()
335 wdd->max_hw_heartbeat_ms = GENMASK_ULL(47, 0) / gwdt->clk * 1000; in sbsa_gwdt_probe()
337 if (gwdt->need_ws0_race_workaround) { in sbsa_gwdt_probe()
366 pdev->name, gwdt)) { in sbsa_gwdt_probe()
396 wdd->timeout, gwdt->clk, action, in sbsa_gwdt_probe()
405 struct sbsa_gwdt *gwdt = dev_get_drvdata(dev); in sbsa_gwdt_suspend() local
407 if (watchdog_hw_running(&gwdt->wdd)) in sbsa_gwdt_suspend()
408 sbsa_gwdt_stop(&gwdt->wdd); in sbsa_gwdt_suspend()
416 struct sbsa_gwdt *gwdt = dev_get_drvdata(dev); in sbsa_gwdt_resume() local
418 if (watchdog_hw_running(&gwdt->wdd)) in sbsa_gwdt_resume()
419 sbsa_gwdt_start(&gwdt->wdd); in sbsa_gwdt_resume()