Lines Matching refs:wdt
208 static int s3c2410wdt_mask_and_disable_reset(struct s3c2410_wdt *wdt, bool mask) in s3c2410wdt_mask_and_disable_reset() argument
211 u32 mask_val = 1 << wdt->drv_data->mask_bit; in s3c2410wdt_mask_and_disable_reset()
215 if (!(wdt->drv_data->quirks & QUIRK_HAS_PMU_CONFIG)) in s3c2410wdt_mask_and_disable_reset()
221 ret = regmap_update_bits(wdt->pmureg, in s3c2410wdt_mask_and_disable_reset()
222 wdt->drv_data->disable_reg, in s3c2410wdt_mask_and_disable_reset()
227 ret = regmap_update_bits(wdt->pmureg, in s3c2410wdt_mask_and_disable_reset()
228 wdt->drv_data->mask_reset_reg, in s3c2410wdt_mask_and_disable_reset()
232 dev_err(wdt->dev, "failed to update reg(%d)\n", ret); in s3c2410wdt_mask_and_disable_reset()
239 struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd); in s3c2410wdt_keepalive() local
241 spin_lock(&wdt->lock); in s3c2410wdt_keepalive()
242 writel(wdt->count, wdt->reg_base + S3C2410_WTCNT); in s3c2410wdt_keepalive()
243 spin_unlock(&wdt->lock); in s3c2410wdt_keepalive()
248 static void __s3c2410wdt_stop(struct s3c2410_wdt *wdt) in __s3c2410wdt_stop() argument
252 wtcon = readl(wdt->reg_base + S3C2410_WTCON); in __s3c2410wdt_stop()
254 writel(wtcon, wdt->reg_base + S3C2410_WTCON); in __s3c2410wdt_stop()
259 struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd); in s3c2410wdt_stop() local
261 spin_lock(&wdt->lock); in s3c2410wdt_stop()
262 __s3c2410wdt_stop(wdt); in s3c2410wdt_stop()
263 spin_unlock(&wdt->lock); in s3c2410wdt_stop()
271 struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd); in s3c2410wdt_start() local
273 spin_lock(&wdt->lock); in s3c2410wdt_start()
275 __s3c2410wdt_stop(wdt); in s3c2410wdt_start()
277 wtcon = readl(wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_start()
289 __func__, wdt->count, wtcon); in s3c2410wdt_start()
291 writel(wdt->count, wdt->reg_base + S3C2410_WTDAT); in s3c2410wdt_start()
292 writel(wdt->count, wdt->reg_base + S3C2410_WTCNT); in s3c2410wdt_start()
293 writel(wtcon, wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_start()
294 spin_unlock(&wdt->lock); in s3c2410wdt_start()
299 static inline int s3c2410wdt_is_running(struct s3c2410_wdt *wdt) in s3c2410wdt_is_running() argument
301 return readl(wdt->reg_base + S3C2410_WTCON) & S3C2410_WTCON_ENABLE; in s3c2410wdt_is_running()
306 struct s3c2410_wdt *wdt = watchdog_get_drvdata(wdd); in s3c2410wdt_set_heartbeat() local
307 unsigned long freq = clk_get_rate(wdt->clock); in s3c2410wdt_set_heartbeat()
330 dev_err(wdt->dev, "timeout %d too big\n", timeout); in s3c2410wdt_set_heartbeat()
339 wdt->count = count; in s3c2410wdt_set_heartbeat()
342 wtcon = readl(wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_set_heartbeat()
346 writel(count, wdt->reg_base + S3C2410_WTDAT); in s3c2410wdt_set_heartbeat()
347 writel(wtcon, wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_set_heartbeat()
380 struct s3c2410_wdt *wdt = platform_get_drvdata(param); in s3c2410wdt_irq() local
382 dev_info(wdt->dev, "watchdog timer expired (irq)\n"); in s3c2410wdt_irq()
384 s3c2410wdt_keepalive(&wdt->wdt_device); in s3c2410wdt_irq()
394 struct s3c2410_wdt *wdt = freq_to_wdt(nb); in s3c2410wdt_cpufreq_transition() local
396 if (!s3c2410wdt_is_running(wdt)) in s3c2410wdt_cpufreq_transition()
405 s3c2410wdt_keepalive(&wdt->wdt_device); in s3c2410wdt_cpufreq_transition()
407 s3c2410wdt_stop(&wdt->wdt_device); in s3c2410wdt_cpufreq_transition()
409 ret = s3c2410wdt_set_heartbeat(&wdt->wdt_device, in s3c2410wdt_cpufreq_transition()
410 wdt->wdt_device.timeout); in s3c2410wdt_cpufreq_transition()
413 s3c2410wdt_start(&wdt->wdt_device); in s3c2410wdt_cpufreq_transition()
422 dev_err(wdt->dev, "cannot set new value for timeout %d\n", in s3c2410wdt_cpufreq_transition()
423 wdt->wdt_device.timeout); in s3c2410wdt_cpufreq_transition()
427 static inline int s3c2410wdt_cpufreq_register(struct s3c2410_wdt *wdt) in s3c2410wdt_cpufreq_register() argument
429 wdt->freq_transition.notifier_call = s3c2410wdt_cpufreq_transition; in s3c2410wdt_cpufreq_register()
431 return cpufreq_register_notifier(&wdt->freq_transition, in s3c2410wdt_cpufreq_register()
435 static inline void s3c2410wdt_cpufreq_deregister(struct s3c2410_wdt *wdt) in s3c2410wdt_cpufreq_deregister() argument
437 wdt->freq_transition.notifier_call = s3c2410wdt_cpufreq_transition; in s3c2410wdt_cpufreq_deregister()
439 cpufreq_unregister_notifier(&wdt->freq_transition, in s3c2410wdt_cpufreq_deregister()
445 static inline int s3c2410wdt_cpufreq_register(struct s3c2410_wdt *wdt) in s3c2410wdt_cpufreq_register() argument
450 static inline void s3c2410wdt_cpufreq_deregister(struct s3c2410_wdt *wdt) in s3c2410wdt_cpufreq_deregister() argument
458 struct s3c2410_wdt *wdt = container_of(this, struct s3c2410_wdt, in s3c2410wdt_restart() local
460 void __iomem *wdt_base = wdt->reg_base; in s3c2410wdt_restart()
480 static inline unsigned int s3c2410wdt_get_bootstatus(struct s3c2410_wdt *wdt) in s3c2410wdt_get_bootstatus() argument
485 if (!(wdt->drv_data->quirks & QUIRK_HAS_RST_STAT)) in s3c2410wdt_get_bootstatus()
488 ret = regmap_read(wdt->pmureg, wdt->drv_data->rst_stat_reg, &rst_stat); in s3c2410wdt_get_bootstatus()
490 dev_warn(wdt->dev, "Couldn't get RST_STAT register\n"); in s3c2410wdt_get_bootstatus()
491 else if (rst_stat & BIT(wdt->drv_data->rst_stat_bit)) in s3c2410wdt_get_bootstatus()
514 struct s3c2410_wdt *wdt; in s3c2410wdt_probe() local
525 wdt = devm_kzalloc(dev, sizeof(*wdt), GFP_KERNEL); in s3c2410wdt_probe()
526 if (!wdt) in s3c2410wdt_probe()
529 wdt->dev = &pdev->dev; in s3c2410wdt_probe()
530 spin_lock_init(&wdt->lock); in s3c2410wdt_probe()
531 wdt->wdt_device = s3c2410_wdd; in s3c2410wdt_probe()
533 wdt->drv_data = get_wdt_drv_data(pdev); in s3c2410wdt_probe()
534 if (wdt->drv_data->quirks & QUIRKS_HAVE_PMUREG) { in s3c2410wdt_probe()
535 wdt->pmureg = syscon_regmap_lookup_by_phandle(dev->of_node, in s3c2410wdt_probe()
537 if (IS_ERR(wdt->pmureg)) { in s3c2410wdt_probe()
539 return PTR_ERR(wdt->pmureg); in s3c2410wdt_probe()
552 wdt->reg_base = devm_ioremap_resource(dev, wdt_mem); in s3c2410wdt_probe()
553 if (IS_ERR(wdt->reg_base)) { in s3c2410wdt_probe()
554 ret = PTR_ERR(wdt->reg_base); in s3c2410wdt_probe()
558 DBG("probe: mapped reg_base=%p\n", wdt->reg_base); in s3c2410wdt_probe()
560 wdt->clock = devm_clk_get(dev, "watchdog"); in s3c2410wdt_probe()
561 if (IS_ERR(wdt->clock)) { in s3c2410wdt_probe()
563 ret = PTR_ERR(wdt->clock); in s3c2410wdt_probe()
567 ret = clk_prepare_enable(wdt->clock); in s3c2410wdt_probe()
573 ret = s3c2410wdt_cpufreq_register(wdt); in s3c2410wdt_probe()
579 watchdog_set_drvdata(&wdt->wdt_device, wdt); in s3c2410wdt_probe()
584 watchdog_init_timeout(&wdt->wdt_device, tmr_margin, &pdev->dev); in s3c2410wdt_probe()
585 ret = s3c2410wdt_set_heartbeat(&wdt->wdt_device, in s3c2410wdt_probe()
586 wdt->wdt_device.timeout); in s3c2410wdt_probe()
588 started = s3c2410wdt_set_heartbeat(&wdt->wdt_device, in s3c2410wdt_probe()
607 watchdog_set_nowayout(&wdt->wdt_device, nowayout); in s3c2410wdt_probe()
609 wdt->wdt_device.bootstatus = s3c2410wdt_get_bootstatus(wdt); in s3c2410wdt_probe()
611 ret = watchdog_register_device(&wdt->wdt_device); in s3c2410wdt_probe()
617 ret = s3c2410wdt_mask_and_disable_reset(wdt, false); in s3c2410wdt_probe()
623 s3c2410wdt_start(&wdt->wdt_device); in s3c2410wdt_probe()
629 s3c2410wdt_stop(&wdt->wdt_device); in s3c2410wdt_probe()
632 platform_set_drvdata(pdev, wdt); in s3c2410wdt_probe()
634 wdt->restart_handler.notifier_call = s3c2410wdt_restart; in s3c2410wdt_probe()
635 wdt->restart_handler.priority = 128; in s3c2410wdt_probe()
636 ret = register_restart_handler(&wdt->restart_handler); in s3c2410wdt_probe()
642 wtcon = readl(wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_probe()
652 watchdog_unregister_device(&wdt->wdt_device); in s3c2410wdt_probe()
655 s3c2410wdt_cpufreq_deregister(wdt); in s3c2410wdt_probe()
658 clk_disable_unprepare(wdt->clock); in s3c2410wdt_probe()
667 struct s3c2410_wdt *wdt = platform_get_drvdata(dev); in s3c2410wdt_remove() local
669 unregister_restart_handler(&wdt->restart_handler); in s3c2410wdt_remove()
671 ret = s3c2410wdt_mask_and_disable_reset(wdt, true); in s3c2410wdt_remove()
675 watchdog_unregister_device(&wdt->wdt_device); in s3c2410wdt_remove()
677 s3c2410wdt_cpufreq_deregister(wdt); in s3c2410wdt_remove()
679 clk_disable_unprepare(wdt->clock); in s3c2410wdt_remove()
686 struct s3c2410_wdt *wdt = platform_get_drvdata(dev); in s3c2410wdt_shutdown() local
688 s3c2410wdt_mask_and_disable_reset(wdt, true); in s3c2410wdt_shutdown()
690 s3c2410wdt_stop(&wdt->wdt_device); in s3c2410wdt_shutdown()
698 struct s3c2410_wdt *wdt = dev_get_drvdata(dev); in s3c2410wdt_suspend() local
701 wdt->wtcon_save = readl(wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_suspend()
702 wdt->wtdat_save = readl(wdt->reg_base + S3C2410_WTDAT); in s3c2410wdt_suspend()
704 ret = s3c2410wdt_mask_and_disable_reset(wdt, true); in s3c2410wdt_suspend()
709 s3c2410wdt_stop(&wdt->wdt_device); in s3c2410wdt_suspend()
717 struct s3c2410_wdt *wdt = dev_get_drvdata(dev); in s3c2410wdt_resume() local
720 writel(wdt->wtdat_save, wdt->reg_base + S3C2410_WTDAT); in s3c2410wdt_resume()
721 writel(wdt->wtdat_save, wdt->reg_base + S3C2410_WTCNT);/* Reset count */ in s3c2410wdt_resume()
722 writel(wdt->wtcon_save, wdt->reg_base + S3C2410_WTCON); in s3c2410wdt_resume()
724 ret = s3c2410wdt_mask_and_disable_reset(wdt, false); in s3c2410wdt_resume()
729 (wdt->wtcon_save & S3C2410_WTCON_ENABLE) ? "en" : "dis"); in s3c2410wdt_resume()