From 3af28a4e6d92080bdeda9b0d88f2b18d9ffdc23b Mon Sep 17 00:00:00 2001 From: Oleksandr Suvorov Date: Fri, 6 Dec 2019 17:41:24 +0200 Subject: watchdog: imx8_wdt: fix load/unload driver - Fix a probing to handle errors in scu notifier registration. - Unregister scu notifier properly on unload, so it is possible to load driver again. Signed-off-by: Oleksandr Suvorov --- drivers/watchdog/imx8_wdt.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/drivers/watchdog/imx8_wdt.c b/drivers/watchdog/imx8_wdt.c index 0fc5c8861b6f..50e4aba59d60 100644 --- a/drivers/watchdog/imx8_wdt.c +++ b/drivers/watchdog/imx8_wdt.c @@ -179,20 +179,33 @@ static int imx8_wdt_probe(struct platform_device *pdev) wdt->parent = &pdev->dev; watchdog_set_drvdata(wdt, NULL); - err = watchdog_init_timeout(wdt, DEFAULT_TIMEOUT, &pdev->dev); + err = watchdog_init_timeout(wdt, timeout, &pdev->dev); if (err) { - dev_err(&pdev->dev, "Failed to init the wdog timeout:%d\n", - err); + dev_err(&pdev->dev, "Failed to init watchdog timeout:%d\n", err); return err; } err = watchdog_register_device(wdt); if (err) { - dev_err(&pdev->dev, "Failed to register watchdog device\n"); + dev_err(&pdev->dev, "Failed to register watchdog device: %d\n", err); return err; } - return register_scu_notifier(&imx8_wdt_notifier); + err = register_scu_notifier(&imx8_wdt_notifier); + if (err) { + dev_err(&pdev->dev, "Failed to register scu notifier: %d\n", err); + goto scu_err; + } + + dev_info(&pdev->dev, "initialized (timeout=%d sec, nowayout=%d)\n", + timeout, nowayout); + + return 0; + +scu_err: + watchdog_unregister_device(wdt); + + return err; } static int imx8_wdt_remove(struct platform_device *pdev) @@ -201,6 +214,8 @@ static int imx8_wdt_remove(struct platform_device *pdev) imx8_wdt_stop(wdt); + unregister_scu_notifier(&imx8_wdt_notifier); + watchdog_unregister_device(wdt); return 0; -- cgit v1.2.3