diff mbox series

[1/3] watchdog: qcom-wdt: add option to skip pretimeout

Message ID 20200204152104.13278-1-ansuelsmth@gmail.com
State New, archived
Headers show
Series [1/3] watchdog: qcom-wdt: add option to skip pretimeout | expand

Commit Message

Ansuel Smith Feb. 4, 2020, 3:21 p.m. UTC
Some platform like ipq806x doesn't support pretimeout.
As the driver check if there are available interrupts and ipq806x
use msm-timer that require interrupts, the watchdog fail to probe
as request_irq tries to use a ppi interrupt. Add an option to skip
pretimeout setup and use the normal watchdog probe.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/watchdog/qcom-wdt.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Guenter Roeck Feb. 4, 2020, 4:08 p.m. UTC | #1
On Tue, Feb 04, 2020 at 04:21:01PM +0100, Ansuel Smith wrote:
> Some platform like ipq806x doesn't support pretimeout.
> As the driver check if there are available interrupts and ipq806x
> use msm-timer that require interrupts, the watchdog fail to probe
> as request_irq tries to use a ppi interrupt. Add an option to skip
> pretimeout setup and use the normal watchdog probe.
> 
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
>  drivers/watchdog/qcom-wdt.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> index a494543d3ae1..e689e97e883e 100644
> --- a/drivers/watchdog/qcom-wdt.c
> +++ b/drivers/watchdog/qcom-wdt.c
> @@ -189,6 +189,7 @@ static int qcom_wdt_probe(struct platform_device *pdev)
>  	u32 percpu_offset;
>  	int irq, ret;
>  	struct clk *clk;
> +	bool nopretimeout;
>  
>  	regs = of_device_get_match_data(dev);
>  	if (!regs) {
> @@ -204,6 +205,8 @@ static int qcom_wdt_probe(struct platform_device *pdev)
>  	if (!res)
>  		return -ENOMEM;
>  
> +	nopretimeout = of_property_read_bool(np, "no-pretimeout");
> +
>  	/* We use CPU0's DGT for the watchdog */
>  	if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
>  		percpu_offset = 0;
> @@ -247,7 +250,7 @@ static int qcom_wdt_probe(struct platform_device *pdev)
>  
>  	/* check if there is pretimeout support */
>  	irq = platform_get_irq(pdev, 0);
> -	if (irq > 0) {
> +	if (!nopretimeout && irq > 0) {

That is unnecessary; such platforms should simply not provide an interrupt.
Or, in other words, what is the point of assigning an interrupt to be used
for pretimeout if the platform doesn't support it ? And then to add yet
another attribute to tell the driver not to use it ?

Guenter

>  		ret = devm_request_irq(dev, irq, qcom_wdt_isr,
>  				       IRQF_TRIGGER_RISING,
>  				       "wdt_bark", &wdt->wdd);
> -- 
> 2.24.0
>
Ansuel Smith Feb. 4, 2020, 4:16 p.m. UTC | #2
If something like this is used, msm-timer require interrupts. Without this
configuration, the device is unbootable as the system froze on system
bootup.

timer@200a000 {
			compatible = "qcom,kpss-timer", "qcom,msm-timer";
			interrupts = <GIC_PPI 1 (GIC_CPU_MASK_SIMPLE(2) |
						 IRQ_TYPE_EDGE_RISING)>,
				     <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(2) |
						 IRQ_TYPE_EDGE_RISING)>,
				     <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(2) |
						 IRQ_TYPE_EDGE_RISING)>,
				     <GIC_PPI 4 (GIC_CPU_MASK_SIMPLE(2) |
						 IRQ_TYPE_EDGE_RISING)>,
				     <GIC_PPI 5 (GIC_CPU_MASK_SIMPLE(2) |
						 IRQ_TYPE_EDGE_RISING)>;
			no-pretimeout;
			reg = <0x0200a000 0x100>;
			clock-frequency = <25000000>,
					  <32768>;
			clocks = <&sleep_clk>;
			clock-names = "sleep";
			cpu-offset = <0x80000>;
		};

> On Tue, Feb 04, 2020 at 04:21:01PM +0100, Ansuel Smith wrote:
> > Some platform like ipq806x doesn't support pretimeout.
> > As the driver check if there are available interrupts and ipq806x
> > use msm-timer that require interrupts, the watchdog fail to probe
> > as request_irq tries to use a ppi interrupt. Add an option to skip
> > pretimeout setup and use the normal watchdog probe.
> >
> > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> > ---
> >  drivers/watchdog/qcom-wdt.c | 5 ++++-
> >  1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> > index a494543d3ae1..e689e97e883e 100644
> > --- a/drivers/watchdog/qcom-wdt.c
> > +++ b/drivers/watchdog/qcom-wdt.c
> > @@ -189,6 +189,7 @@ static int qcom_wdt_probe(struct platform_device
> *pdev)
> >  	u32 percpu_offset;
> >  	int irq, ret;
> >  	struct clk *clk;
> > +	bool nopretimeout;
> >
> >  	regs = of_device_get_match_data(dev);
> >  	if (!regs) {
> > @@ -204,6 +205,8 @@ static int qcom_wdt_probe(struct platform_device
> *pdev)
> >  	if (!res)
> >  		return -ENOMEM;
> >
> > +	nopretimeout = of_property_read_bool(np, "no-pretimeout");
> > +
> >  	/* We use CPU0's DGT for the watchdog */
> >  	if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
> >  		percpu_offset = 0;
> > @@ -247,7 +250,7 @@ static int qcom_wdt_probe(struct platform_device
> *pdev)
> >
> >  	/* check if there is pretimeout support */
> >  	irq = platform_get_irq(pdev, 0);
> > -	if (irq > 0) {
> > +	if (!nopretimeout && irq > 0) {
> 
> That is unnecessary; such platforms should simply not provide an
interrupt.
> Or, in other words, what is the point of assigning an interrupt to be used
> for pretimeout if the platform doesn't support it ? And then to add yet
> another attribute to tell the driver not to use it ?
> 
> Guenter
> 
> >  		ret = devm_request_irq(dev, irq, qcom_wdt_isr,
> >  				       IRQF_TRIGGER_RISING,
> >  				       "wdt_bark", &wdt->wdd);
> > --
> > 2.24.0
> >
Guenter Roeck Feb. 4, 2020, 4:25 p.m. UTC | #3
On Tue, Feb 04, 2020 at 05:16:34PM +0100, ansuelsmth@gmail.com wrote:
> If something like this is used, msm-timer require interrupts. Without this
> configuration, the device is unbootable as the system froze on system
> bootup.
> 
> timer@200a000 {
> 			compatible = "qcom,kpss-timer", "qcom,msm-timer";
> 			interrupts = <GIC_PPI 1 (GIC_CPU_MASK_SIMPLE(2) |
> 						 IRQ_TYPE_EDGE_RISING)>,
> 				     <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(2) |
> 						 IRQ_TYPE_EDGE_RISING)>,
> 				     <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(2) |
> 						 IRQ_TYPE_EDGE_RISING)>,
> 				     <GIC_PPI 4 (GIC_CPU_MASK_SIMPLE(2) |
> 						 IRQ_TYPE_EDGE_RISING)>,
> 				     <GIC_PPI 5 (GIC_CPU_MASK_SIMPLE(2) |
> 						 IRQ_TYPE_EDGE_RISING)>;
> 			no-pretimeout;
> 			reg = <0x0200a000 0x100>;
> 			clock-frequency = <25000000>,
> 					  <32768>;
> 			clocks = <&sleep_clk>;
> 			clock-names = "sleep";
> 			cpu-offset = <0x80000>;
> 		};
> 

I think this is all wrong; the new property shows up in a node which
is completely unrelated to a watchdog. Maybe it wasn't such a good idea
to tie the watchdog to the timer node. At the very least, the situation
should be handled in the driver via of_table flags. If the situation can't
be handled that way, something is even more wrong. In that case it might
be better to revert commit 36375491a439 until that is sorted out properly.

Guenter

> > On Tue, Feb 04, 2020 at 04:21:01PM +0100, Ansuel Smith wrote:
> > > Some platform like ipq806x doesn't support pretimeout.
> > > As the driver check if there are available interrupts and ipq806x
> > > use msm-timer that require interrupts, the watchdog fail to probe
> > > as request_irq tries to use a ppi interrupt. Add an option to skip
> > > pretimeout setup and use the normal watchdog probe.
> > >
> > > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> > > ---
> > >  drivers/watchdog/qcom-wdt.c | 5 ++++-
> > >  1 file changed, 4 insertions(+), 1 deletion(-)
> > >
> > > diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
> > > index a494543d3ae1..e689e97e883e 100644
> > > --- a/drivers/watchdog/qcom-wdt.c
> > > +++ b/drivers/watchdog/qcom-wdt.c
> > > @@ -189,6 +189,7 @@ static int qcom_wdt_probe(struct platform_device
> > *pdev)
> > >  	u32 percpu_offset;
> > >  	int irq, ret;
> > >  	struct clk *clk;
> > > +	bool nopretimeout;
> > >
> > >  	regs = of_device_get_match_data(dev);
> > >  	if (!regs) {
> > > @@ -204,6 +205,8 @@ static int qcom_wdt_probe(struct platform_device
> > *pdev)
> > >  	if (!res)
> > >  		return -ENOMEM;
> > >
> > > +	nopretimeout = of_property_read_bool(np, "no-pretimeout");
> > > +
> > >  	/* We use CPU0's DGT for the watchdog */
> > >  	if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
> > >  		percpu_offset = 0;
> > > @@ -247,7 +250,7 @@ static int qcom_wdt_probe(struct platform_device
> > *pdev)
> > >
> > >  	/* check if there is pretimeout support */
> > >  	irq = platform_get_irq(pdev, 0);
> > > -	if (irq > 0) {
> > > +	if (!nopretimeout && irq > 0) {
> > 
> > That is unnecessary; such platforms should simply not provide an
> interrupt.
> > Or, in other words, what is the point of assigning an interrupt to be used
> > for pretimeout if the platform doesn't support it ? And then to add yet
> > another attribute to tell the driver not to use it ?
> > 
> > Guenter
> > 
> > >  		ret = devm_request_irq(dev, irq, qcom_wdt_isr,
> > >  				       IRQF_TRIGGER_RISING,
> > >  				       "wdt_bark", &wdt->wdd);
> > > --
> > > 2.24.0
> > >
>
Ansuel Smith Feb. 4, 2020, 5:30 p.m. UTC | #4
> On Tue, Feb 04, 2020 at 05:16:34PM +0100, ansuelsmth@gmail.com wrote:
> > If something like this is used, msm-timer require interrupts. Without
this
> > configuration, the device is unbootable as the system froze on system
> > bootup.
> >
> > timer@200a000 {
> > 			compatible = "qcom,kpss-timer", "qcom,msm-timer";
> > 			interrupts = <GIC_PPI 1 (GIC_CPU_MASK_SIMPLE(2) |
> > 						 IRQ_TYPE_EDGE_RISING)>,
> > 				     <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(2) |
> > 						 IRQ_TYPE_EDGE_RISING)>,
> > 				     <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(2) |
> > 						 IRQ_TYPE_EDGE_RISING)>,
> > 				     <GIC_PPI 4 (GIC_CPU_MASK_SIMPLE(2) |
> > 						 IRQ_TYPE_EDGE_RISING)>,
> > 				     <GIC_PPI 5 (GIC_CPU_MASK_SIMPLE(2) |
> > 						 IRQ_TYPE_EDGE_RISING)>;
> > 			no-pretimeout;
> > 			reg = <0x0200a000 0x100>;
> > 			clock-frequency = <25000000>,
> > 					  <32768>;
> > 			clocks = <&sleep_clk>;
> > 			clock-names = "sleep";
> > 			cpu-offset = <0x80000>;
> > 		};
> >
> 
> I think this is all wrong; the new property shows up in a node which
> is completely unrelated to a watchdog. Maybe it wasn't such a good idea
> to tie the watchdog to the timer node. At the very least, the situation
> should be handled in the driver via of_table flags. If the situation can't
> be handled that way, something is even more wrong. In that case it might
> be better to revert commit 36375491a439 until that is sorted out properly.
> 
> Guenter
> 

So pretimeout should be enabled only for kpss-wdt and disabled with a flag 
in the of_table of the driver?

> > > On Tue, Feb 04, 2020 at 04:21:01PM +0100, Ansuel Smith wrote:
> > > > Some platform like ipq806x doesn't support pretimeout.
> > > > As the driver check if there are available interrupts and ipq806x
> > > > use msm-timer that require interrupts, the watchdog fail to probe
> > > > as request_irq tries to use a ppi interrupt. Add an option to skip
> > > > pretimeout setup and use the normal watchdog probe.
> > > >
> > > > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> > > > ---
> > > >  drivers/watchdog/qcom-wdt.c | 5 ++++-
> > > >  1 file changed, 4 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/drivers/watchdog/qcom-wdt.c
b/drivers/watchdog/qcom-wdt.c
> > > > index a494543d3ae1..e689e97e883e 100644
> > > > --- a/drivers/watchdog/qcom-wdt.c
> > > > +++ b/drivers/watchdog/qcom-wdt.c
> > > > @@ -189,6 +189,7 @@ static int qcom_wdt_probe(struct platform_device
> > > *pdev)
> > > >  	u32 percpu_offset;
> > > >  	int irq, ret;
> > > >  	struct clk *clk;
> > > > +	bool nopretimeout;
> > > >
> > > >  	regs = of_device_get_match_data(dev);
> > > >  	if (!regs) {
> > > > @@ -204,6 +205,8 @@ static int qcom_wdt_probe(struct platform_device
> > > *pdev)
> > > >  	if (!res)
> > > >  		return -ENOMEM;
> > > >
> > > > +	nopretimeout = of_property_read_bool(np, "no-pretimeout");
> > > > +
> > > >  	/* We use CPU0's DGT for the watchdog */
> > > >  	if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
> > > >  		percpu_offset = 0;
> > > > @@ -247,7 +250,7 @@ static int qcom_wdt_probe(struct platform_device
> > > *pdev)
> > > >
> > > >  	/* check if there is pretimeout support */
> > > >  	irq = platform_get_irq(pdev, 0);
> > > > -	if (irq > 0) {
> > > > +	if (!nopretimeout && irq > 0) {
> > >
> > > That is unnecessary; such platforms should simply not provide an
> > interrupt.
> > > Or, in other words, what is the point of assigning an interrupt to be
used
> > > for pretimeout if the platform doesn't support it ? And then to add
yet
> > > another attribute to tell the driver not to use it ?
> > >
> > > Guenter
> > >
> > > >  		ret = devm_request_irq(dev, irq, qcom_wdt_isr,
> > > >  				       IRQF_TRIGGER_RISING,
> > > >  				       "wdt_bark", &wdt->wdd);
> > > > --
> > > > 2.24.0
> > > >
> >
Guenter Roeck Feb. 4, 2020, 5:37 p.m. UTC | #5
On Tue, Feb 04, 2020 at 06:30:40PM +0100, ansuelsmth@gmail.com wrote:
> > On Tue, Feb 04, 2020 at 05:16:34PM +0100, ansuelsmth@gmail.com wrote:
> > > If something like this is used, msm-timer require interrupts. Without
> this
> > > configuration, the device is unbootable as the system froze on system
> > > bootup.
> > >
> > > timer@200a000 {
> > > 			compatible = "qcom,kpss-timer", "qcom,msm-timer";
> > > 			interrupts = <GIC_PPI 1 (GIC_CPU_MASK_SIMPLE(2) |
> > > 						 IRQ_TYPE_EDGE_RISING)>,
> > > 				     <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(2) |
> > > 						 IRQ_TYPE_EDGE_RISING)>,
> > > 				     <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(2) |
> > > 						 IRQ_TYPE_EDGE_RISING)>,
> > > 				     <GIC_PPI 4 (GIC_CPU_MASK_SIMPLE(2) |
> > > 						 IRQ_TYPE_EDGE_RISING)>,
> > > 				     <GIC_PPI 5 (GIC_CPU_MASK_SIMPLE(2) |
> > > 						 IRQ_TYPE_EDGE_RISING)>;
> > > 			no-pretimeout;
> > > 			reg = <0x0200a000 0x100>;
> > > 			clock-frequency = <25000000>,
> > > 					  <32768>;
> > > 			clocks = <&sleep_clk>;
> > > 			clock-names = "sleep";
> > > 			cpu-offset = <0x80000>;
> > > 		};
> > >
> > 
> > I think this is all wrong; the new property shows up in a node which
> > is completely unrelated to a watchdog. Maybe it wasn't such a good idea
> > to tie the watchdog to the timer node. At the very least, the situation
> > should be handled in the driver via of_table flags. If the situation can't
> > be handled that way, something is even more wrong. In that case it might
> > be better to revert commit 36375491a439 until that is sorted out properly.
> > 
> > Guenter
> > 
> 
> So pretimeout should be enabled only for kpss-wdt and disabled with a flag 
> in the of_table of the driver?
> 

Correct, if that is the determining factor.

Guenter
diff mbox series

Patch

diff --git a/drivers/watchdog/qcom-wdt.c b/drivers/watchdog/qcom-wdt.c
index a494543d3ae1..e689e97e883e 100644
--- a/drivers/watchdog/qcom-wdt.c
+++ b/drivers/watchdog/qcom-wdt.c
@@ -189,6 +189,7 @@  static int qcom_wdt_probe(struct platform_device *pdev)
 	u32 percpu_offset;
 	int irq, ret;
 	struct clk *clk;
+	bool nopretimeout;
 
 	regs = of_device_get_match_data(dev);
 	if (!regs) {
@@ -204,6 +205,8 @@  static int qcom_wdt_probe(struct platform_device *pdev)
 	if (!res)
 		return -ENOMEM;
 
+	nopretimeout = of_property_read_bool(np, "no-pretimeout");
+
 	/* We use CPU0's DGT for the watchdog */
 	if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
 		percpu_offset = 0;
@@ -247,7 +250,7 @@  static int qcom_wdt_probe(struct platform_device *pdev)
 
 	/* check if there is pretimeout support */
 	irq = platform_get_irq(pdev, 0);
-	if (irq > 0) {
+	if (!nopretimeout && irq > 0) {
 		ret = devm_request_irq(dev, irq, qcom_wdt_isr,
 				       IRQF_TRIGGER_RISING,
 				       "wdt_bark", &wdt->wdd);