From 49e771b618e66b45adf327983931554ea817e96b Mon Sep 17 00:00:00 2001 From: Prateek Sood Date: Mon, 5 Oct 2020 23:24:46 +0530 Subject: [PATCH] qcom: wdog: improve error handling in watchdog core Improve error handling in watchdog core driver, to avoid aborts when watchdog enable fails. Change-Id: I09a8e0815755a90c7288b0b5fd43679208158977 Signed-off-by: Prateek Sood --- drivers/soc/qcom/qcom_wdt_core.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/drivers/soc/qcom/qcom_wdt_core.c b/drivers/soc/qcom/qcom_wdt_core.c index 4eef309f309c..49c1981da104 100644 --- a/drivers/soc/qcom/qcom_wdt_core.c +++ b/drivers/soc/qcom/qcom_wdt_core.c @@ -444,8 +444,14 @@ static void qcom_wdt_register_die_notifier(struct msm_watchdog_data *wdog_dd) wdog_dd->die_blk.priority = INT_MAX - 1; register_die_notifier(&wdog_dd->die_blk); } + +static void qcom_wdt_unregister_die_notifier(struct msm_watchdog_data *wdog_dd) +{ + unregister_die_notifier(&wdog_dd->die_blk); +} #else static void qcom_wdt_register_die_notifier(struct msm_watchdog_data *wdog_dd) { } +static void qcom_wdt_unregister_die_notifier(struct msm_watchdog_data *wdog_dd) { } #endif static void qcom_wdt_disable(struct msm_watchdog_data *wdog_dd) @@ -457,6 +463,8 @@ static void qcom_wdt_disable(struct msm_watchdog_data *wdog_dd) smp_mb(); atomic_notifier_chain_unregister(&panic_notifier_list, &wdog_dd->panic_blk); + qcom_wdt_unregister_die_notifier(wdog_dd); + unregister_restart_handler(&wdog_dd->restart_blk); del_timer_sync(&wdog_dd->pet_timer); wdog_dd->ops->disable_wdt(wdog_dd); dev_err(wdog_dd->dev, "QCOM Apps Watchdog deactivated\n"); @@ -847,11 +855,19 @@ static int qcom_wdt_init(struct msm_watchdog_data *wdog_dd, val = BIT(EN); if (wdog_dd->wakeup_irq_enable) val |= BIT(UNMASKED_INT_EN); + ret = wdog_dd->ops->enable_wdt(val, wdog_dd); if (ret) { + atomic_notifier_chain_unregister(&panic_notifier_list, + &wdog_dd->panic_blk); + qcom_wdt_unregister_die_notifier(wdog_dd); + unregister_restart_handler(&wdog_dd->restart_blk); + del_timer_sync(&wdog_dd->pet_timer); + flush_work(&wdog_dd->irq_counts_work); dev_err(wdog_dd->dev, "Failed Initializing QCOM Apps Watchdog\n"); return ret; } + wdog_dd->ops->reset_wdt(wdog_dd); wdog_dd->last_pet = sched_clock(); wdog_dd->enabled = true; @@ -917,8 +933,10 @@ int qcom_wdt_register(struct platform_device *pdev, goto err; } ret = qcom_wdt_init(wdog_dd, pdev); - if (ret) + if (ret) { + kthread_stop(wdog_dd->watchdog_task); goto err; + } boot_log_init();