diff mbox series

watchdog: sbsa_gwdt: add shutdown hook to driver

Message ID 20200824081804.23206-1-qiang.zhao@nxp.com (mailing list archive)
State Superseded
Headers show
Series watchdog: sbsa_gwdt: add shutdown hook to driver | expand

Commit Message

Qiang Zhao Aug. 24, 2020, 8:18 a.m. UTC
From: Zhao Qiang <qiang.zhao@nxp.com>

Kexec maybe need more time than timeout of wdt(sbsa)
which will reset the system.
So it is necessary to add shutdown hook to disable the
wdt when run kexec.

Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
---
 drivers/watchdog/sbsa_gwdt.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

Guenter Roeck Aug. 24, 2020, 1:28 p.m. UTC | #1
On 8/24/20 1:18 AM, Qiang Zhao wrote:
> From: Zhao Qiang <qiang.zhao@nxp.com>
> 
> Kexec maybe need more time than timeout of wdt(sbsa)
> which will reset the system.
> So it is necessary to add shutdown hook to disable the
> wdt when run kexec.
> 

Please explain why watchdog_stop_on_reboot() does not work.

Thanks,
Guenter

> Signed-off-by: Zhao Qiang <qiang.zhao@nxp.com>
> ---
>  drivers/watchdog/sbsa_gwdt.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
> index f0f1e3b..bbcd04d 100644
> --- a/drivers/watchdog/sbsa_gwdt.c
> +++ b/drivers/watchdog/sbsa_gwdt.c
> @@ -313,6 +313,14 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)
>  	return 0;
>  }
>  
> +static void sbsa_gwdt_shutdown(struct platform_device *pdev)
> +{
> +	struct sbsa_gwdt *gwdt;
> +
> +	gwdt = platform_get_drvdata(pdev);
> +	sbsa_gwdt_stop(&gwdt->wdd);
> +}
> +
>  /* Disable watchdog if it is active during suspend */
>  static int __maybe_unused sbsa_gwdt_suspend(struct device *dev)
>  {
> @@ -357,6 +365,7 @@ static struct platform_driver sbsa_gwdt_driver = {
>  		.pm = &sbsa_gwdt_pm_ops,
>  		.of_match_table = sbsa_gwdt_of_match,
>  	},
> +	.shutdown = sbsa_gwdt_shutdown,
>  	.probe = sbsa_gwdt_probe,
>  	.id_table = sbsa_gwdt_pdev_match,
>  };
>
Qiang Zhao Aug. 27, 2020, 7:55 a.m. UTC | #2
On 8/24/20 21:29 AM, Guenter Roeck <linux@roeck-us.net> wrote:

> -----Original Message-----
> From: Guenter Roeck <groeck7@gmail.com> On Behalf Of Guenter Roeck
> Sent: 2020年8月24日 21:29
> To: Qiang Zhao <qiang.zhao@nxp.com>; wim@linux-watchdog.org
> Cc: linux-watchdog@vger.kernel.org; linux-kernel@vger.kernel.org
> Subject: Re: [PATCH] watchdog: sbsa_gwdt: add shutdown hook to driver
> 
> On 8/24/20 1:18 AM, Qiang Zhao wrote:
> > From: Zhao Qiang <qiang.zhao@nxp.com>
> >
> > Kexec maybe need more time than timeout of wdt(sbsa) which will reset
> > the system.
> > So it is necessary to add shutdown hook to disable the wdt when run
> > kexec.
> >
> 
> Please explain why watchdog_stop_on_reboot() does not work.
> 

Thank you for your comments, it is helpful.
I investigate this issue again, found that this watchdog are enabled by uboot,
Meanwhile in kernel, it is not the default watchdog, in another words, it is not active in kernel.
So watchdog_stop_on_reboot() does not work.
This patch is not the right solution for the situation, I will abandon it. 

Best Regards
Qiang Zhao
Guenter Roeck Aug. 27, 2020, 4:52 p.m. UTC | #3
On Thu, Aug 27, 2020 at 07:55:31AM +0000, Qiang Zhao wrote:
> On 8/24/20 21:29 AM, Guenter Roeck <linux@roeck-us.net> wrote:
> 
> > -----Original Message-----
> > From: Guenter Roeck <groeck7@gmail.com> On Behalf Of Guenter Roeck
> > Sent: 2020年8月24日 21:29
> > To: Qiang Zhao <qiang.zhao@nxp.com>; wim@linux-watchdog.org
> > Cc: linux-watchdog@vger.kernel.org; linux-kernel@vger.kernel.org
> > Subject: Re: [PATCH] watchdog: sbsa_gwdt: add shutdown hook to driver
> > 
> > On 8/24/20 1:18 AM, Qiang Zhao wrote:
> > > From: Zhao Qiang <qiang.zhao@nxp.com>
> > >
> > > Kexec maybe need more time than timeout of wdt(sbsa) which will reset
> > > the system.
> > > So it is necessary to add shutdown hook to disable the wdt when run
> > > kexec.
> > >
> > 
> > Please explain why watchdog_stop_on_reboot() does not work.
> > 
> 
> Thank you for your comments, it is helpful.
> I investigate this issue again, found that this watchdog are enabled by uboot,
> Meanwhile in kernel, it is not the default watchdog, in another words, it is not active in kernel.
> So watchdog_stop_on_reboot() does not work.
> This patch is not the right solution for the situation, I will abandon it. 

Yes, it is the wrong solution. watchdog_reboot_notifier() needs to be
fixed instead: It needs to check check if the hardware watchdog is running
(not if it is active). Also, the reboot notifier should only be registered
if the stop callback exists (and otherwise bail out with an error).

Thanks,
Guenter
diff mbox series

Patch

diff --git a/drivers/watchdog/sbsa_gwdt.c b/drivers/watchdog/sbsa_gwdt.c
index f0f1e3b..bbcd04d 100644
--- a/drivers/watchdog/sbsa_gwdt.c
+++ b/drivers/watchdog/sbsa_gwdt.c
@@ -313,6 +313,14 @@  static int sbsa_gwdt_probe(struct platform_device *pdev)
 	return 0;
 }
 
+static void sbsa_gwdt_shutdown(struct platform_device *pdev)
+{
+	struct sbsa_gwdt *gwdt;
+
+	gwdt = platform_get_drvdata(pdev);
+	sbsa_gwdt_stop(&gwdt->wdd);
+}
+
 /* Disable watchdog if it is active during suspend */
 static int __maybe_unused sbsa_gwdt_suspend(struct device *dev)
 {
@@ -357,6 +365,7 @@  static struct platform_driver sbsa_gwdt_driver = {
 		.pm = &sbsa_gwdt_pm_ops,
 		.of_match_table = sbsa_gwdt_of_match,
 	},
+	.shutdown = sbsa_gwdt_shutdown,
 	.probe = sbsa_gwdt_probe,
 	.id_table = sbsa_gwdt_pdev_match,
 };