diff mbox series

[1/2] watchdog: pm8916_wdt: fix pretimeout registration flow

Message ID 20190906203054.26725-1-jorge.ramirez-ortiz@linaro.org (mailing list archive)
State Accepted
Headers show
Series [1/2] watchdog: pm8916_wdt: fix pretimeout registration flow | expand

Commit Message

Jorge Ramirez-Ortiz Sept. 6, 2019, 8:30 p.m. UTC
When an IRQ is present in the dts, the probe function shall fail if
the interrupt can not be registered.

The probe function shall also be retried if getting the irq is being
deferred.

Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
---
 drivers/watchdog/pm8916_wdt.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

Comments

Guenter Roeck Sept. 8, 2019, 10:50 p.m. UTC | #1
On 9/6/19 1:30 PM, Jorge Ramirez-Ortiz wrote:
> When an IRQ is present in the dts, the probe function shall fail if
> the interrupt can not be registered.
> 

The author intended differently, and did not want registration to fail
in this situation, following the logic that it is better to have a
standard watchdog without pretimeout than no watchdog at all.

Copying the author; I am not inclined to accept such a change without
input from the driver author.

Similar, for the deferred probe, we'll need to know from the driver author
if this is a concern. In general it is, but there are cases where
-EPROBE_DEFFER is never returned in practice (eg for some SoC watchdog
drivers).

Guenter

> The probe function shall also be retried if getting the irq is being
> deferred.
> 
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
> ---
>   drivers/watchdog/pm8916_wdt.c | 16 ++++++++++++----
>   1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c
> index 2d3652004e39..cb5304c26ac3 100644
> --- a/drivers/watchdog/pm8916_wdt.c
> +++ b/drivers/watchdog/pm8916_wdt.c
> @@ -163,9 +163,18 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
>   
>   	irq = platform_get_irq(pdev, 0);
>   	if (irq > 0) {
> -		if (devm_request_irq(dev, irq, pm8916_wdt_isr, 0, "pm8916_wdt",
> -				     wdt))
> -			irq = 0;
> +		err = devm_request_irq(dev, irq, pm8916_wdt_isr, 0,
> +				       "pm8916_wdt", wdt);
> +		if (err)
> +			return err;
> +
> +		wdt->wdev.info = &pm8916_wdt_pt_ident;
> +
> +	} else {
> +		if (irq == -EPROBE_DEFER)
> +			return -EPROBE_DEFER;
> +
> +		wdt->wdev.info = &pm8916_wdt_ident;
>   	}
>   
>   	/* Configure watchdog to hard-reset mode */
> @@ -177,7 +186,6 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
>   		return err;
>   	}
>   
> -	wdt->wdev.info = (irq > 0) ? &pm8916_wdt_pt_ident : &pm8916_wdt_ident,
>   	wdt->wdev.ops = &pm8916_wdt_ops,
>   	wdt->wdev.parent = dev;
>   	wdt->wdev.min_timeout = PM8916_WDT_MIN_TIMEOUT;
>
Guenter Roeck Sept. 11, 2019, 5:54 p.m. UTC | #2
On Wed, Sep 11, 2019 at 10:04:12AM +0200, Loic Poulain wrote:
> Hi Guenter, Jorge,
> 
> On Mon, 9 Sep 2019 at 00:50, Guenter Roeck <linux@roeck-us.net> wrote:
> 
> > On 9/6/19 1:30 PM, Jorge Ramirez-Ortiz wrote:
> > > When an IRQ is present in the dts, the probe function shall fail if
> > > the interrupt can not be registered.
> > >
> >
> > The author intended differently, and did not want registration to fail
> > in this situation, following the logic that it is better to have a
> > standard watchdog without pretimeout than no watchdog at all.
> >
> 
> Indeed, but I tend to agree with this change since it aligns behavior with
> other
> watchdog drivers and I assume there is a serious issue if request_irq fails.
> I suggest adding a dev_err message in such case.
> 
> Copying the author; I am not inclined to accept such a change without
> > input from the driver author.
> >
> > Similar, for the deferred probe, we'll need to know from the driver author
> > if this is a concern. In general it is, but there are cases where
> > -EPROBE_DEFFER is never returned in practice (eg for some SoC watchdog
> > drivers).
> >
> 
> The IRQ controller is the SPMI bus parent node whose driver (MFD_SPMI_PMIC)
> is a direct dependency of pm8916_wdt. I'm not sure in which scenario this
> could
> happen.
> 
Not sure what the action item is. Accept the patch as-is (Reviewed-by
appreciated), or resubmit without the -EPROBE_DEFER check ?

Thanks,
Guenter
Loic Poulain Sept. 13, 2019, 10:36 a.m. UTC | #3
On Wed, 11 Sep 2019 at 19:54, Guenter Roeck <linux@roeck-us.net> wrote:
>
> On Wed, Sep 11, 2019 at 10:04:12AM +0200, Loic Poulain wrote:
> > Hi Guenter, Jorge,
> >
> > On Mon, 9 Sep 2019 at 00:50, Guenter Roeck <linux@roeck-us.net> wrote:
> >
> > > On 9/6/19 1:30 PM, Jorge Ramirez-Ortiz wrote:
> > > > When an IRQ is present in the dts, the probe function shall fail if
> > > > the interrupt can not be registered.
> > > >
> > >
> > > The author intended differently, and did not want registration to fail
> > > in this situation, following the logic that it is better to have a
> > > standard watchdog without pretimeout than no watchdog at all.
> > >
> >
> > Indeed, but I tend to agree with this change since it aligns behavior with
> > other
> > watchdog drivers and I assume there is a serious issue if request_irq fails.
> > I suggest adding a dev_err message in such case.
> >
> > Copying the author; I am not inclined to accept such a change without
> > > input from the driver author.
> > >
> > > Similar, for the deferred probe, we'll need to know from the driver author
> > > if this is a concern. In general it is, but there are cases where
> > > -EPROBE_DEFFER is never returned in practice (eg for some SoC watchdog
> > > drivers).
> > >
> >
> > The IRQ controller is the SPMI bus parent node whose driver (MFD_SPMI_PMIC)
> > is a direct dependency of pm8916_wdt. I'm not sure in which scenario this
> > could
> > happen.
> >
> Not sure what the action item is. Accept the patch as-is (Reviewed-by
> appreciated), or resubmit without the -EPROBE_DEFER check ?

Reviewed-by: Loic Poulain <loic.poulain@linaro.org>
Guenter Roeck Sept. 13, 2019, 12:52 p.m. UTC | #4
On Fri, Sep 06, 2019 at 10:30:53PM +0200, Jorge Ramirez-Ortiz wrote:
> When an IRQ is present in the dts, the probe function shall fail if
> the interrupt can not be registered.
> 
> The probe function shall also be retried if getting the irq is being
> deferred.
> 
> Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
> Reviewed-by: Loic Poulain <loic.poulain@linaro.org>

Reviewed-by: Guenter Roeck <linux@roeck-us.net>

with nitpick below.

> ---
>  drivers/watchdog/pm8916_wdt.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c
> index 2d3652004e39..cb5304c26ac3 100644
> --- a/drivers/watchdog/pm8916_wdt.c
> +++ b/drivers/watchdog/pm8916_wdt.c
> @@ -163,9 +163,18 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
>  
>  	irq = platform_get_irq(pdev, 0);
>  	if (irq > 0) {
> -		if (devm_request_irq(dev, irq, pm8916_wdt_isr, 0, "pm8916_wdt",
> -				     wdt))
> -			irq = 0;
> +		err = devm_request_irq(dev, irq, pm8916_wdt_isr, 0,
> +				       "pm8916_wdt", wdt);
> +		if (err)
> +			return err;
> +
> +		wdt->wdev.info = &pm8916_wdt_pt_ident;
> +

Unnecessary empty line.

> +	} else {
> +		if (irq == -EPROBE_DEFER)
> +			return -EPROBE_DEFER;
> +
> +		wdt->wdev.info = &pm8916_wdt_ident;
>  	}
>  
>  	/* Configure watchdog to hard-reset mode */
> @@ -177,7 +186,6 @@ static int pm8916_wdt_probe(struct platform_device *pdev)
>  		return err;
>  	}
>  
> -	wdt->wdev.info = (irq > 0) ? &pm8916_wdt_pt_ident : &pm8916_wdt_ident,
>  	wdt->wdev.ops = &pm8916_wdt_ops,
>  	wdt->wdev.parent = dev;
>  	wdt->wdev.min_timeout = PM8916_WDT_MIN_TIMEOUT;
diff mbox series

Patch

diff --git a/drivers/watchdog/pm8916_wdt.c b/drivers/watchdog/pm8916_wdt.c
index 2d3652004e39..cb5304c26ac3 100644
--- a/drivers/watchdog/pm8916_wdt.c
+++ b/drivers/watchdog/pm8916_wdt.c
@@ -163,9 +163,18 @@  static int pm8916_wdt_probe(struct platform_device *pdev)
 
 	irq = platform_get_irq(pdev, 0);
 	if (irq > 0) {
-		if (devm_request_irq(dev, irq, pm8916_wdt_isr, 0, "pm8916_wdt",
-				     wdt))
-			irq = 0;
+		err = devm_request_irq(dev, irq, pm8916_wdt_isr, 0,
+				       "pm8916_wdt", wdt);
+		if (err)
+			return err;
+
+		wdt->wdev.info = &pm8916_wdt_pt_ident;
+
+	} else {
+		if (irq == -EPROBE_DEFER)
+			return -EPROBE_DEFER;
+
+		wdt->wdev.info = &pm8916_wdt_ident;
 	}
 
 	/* Configure watchdog to hard-reset mode */
@@ -177,7 +186,6 @@  static int pm8916_wdt_probe(struct platform_device *pdev)
 		return err;
 	}
 
-	wdt->wdev.info = (irq > 0) ? &pm8916_wdt_pt_ident : &pm8916_wdt_ident,
 	wdt->wdev.ops = &pm8916_wdt_ops,
 	wdt->wdev.parent = dev;
 	wdt->wdev.min_timeout = PM8916_WDT_MIN_TIMEOUT;