linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Correct PowerPC Parport interrupt parsing.
@ 2010-04-26 11:15 Martyn Welch
  2010-04-26 21:27 ` Benjamin Herrenschmidt
  0 siblings, 1 reply; 3+ messages in thread
From: Martyn Welch @ 2010-04-26 11:15 UTC (permalink / raw)
  To: linuxppc-dev, Benjamin Herrenschmidt
  Cc: tim, Stephen Rothwell, Michael Neuling

Currently the parsing of the device tree in
arch/powerpc/include/asm/parport.h assumes that the interrupt provided in
the parallel port node is a valid virtual irq. The values for the
interrupts provided in the device tree should have meaning in the context
of the driver for the specific interrupt controller to which the interrupt
is connected and irq_of_parse_and_map() should be used to determine the
correct virtual irq.

Signed-off-by: Martyn Welch <martyn.welch@ge.com>
---

I believe this is the correct way to discover interrupt numbering. I assume
this has worked in the past as the interrupt routing hasn't been as
"interesting" as the board I'm currently working on.

I also don't have any other targets I could test this on, can anyone tell
me if this will break support on existing devices?

 arch/powerpc/include/asm/parport.h |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/include/asm/parport.h b/arch/powerpc/include/asm/parport.h
index 94942d6..aa3f7bc 100644
--- a/arch/powerpc/include/asm/parport.h
+++ b/arch/powerpc/include/asm/parport.h
@@ -19,6 +19,8 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
 	u32 io1, io2;
 	int propsize;
 	int count = 0;
+	int virq;
+
 	for (np = NULL; (np = of_find_compatible_node(np,
 						      "parallel",
 						      "pnpPNP,400")) != NULL;) {
@@ -26,10 +28,13 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
 		if (!prop || propsize > 6*sizeof(u32))
 			continue;
 		io1 = prop[1]; io2 = prop[2];
-		prop = of_get_property(np, "interrupts", NULL);
-		if (!prop)
+
+		virq = irq_of_parse_and_map(np, 1);
+		if (virq == NO_IRQ)
 			continue;
-		if (parport_pc_probe_port(io1, io2, prop[0], autodma, NULL, 0) != NULL)
+
+		if (parport_pc_probe_port(io1, io2, virq, autodma, NULL, 0)
+				!= NULL)
 			count++;
 	}
 	return count;


--
Martyn Welch (Principal Software Engineer)   |   Registered in England and
GE Intelligent Platforms                     |   Wales (3828642) at 100
T +44(0)127322748                            |   Barbirolli Square, Manchester,
E martyn.welch@ge.com                        |   M2 3AB  VAT:GB 927559189

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH] Correct PowerPC Parport interrupt parsing.
  2010-04-26 11:15 [PATCH] Correct PowerPC Parport interrupt parsing Martyn Welch
@ 2010-04-26 21:27 ` Benjamin Herrenschmidt
  2010-04-27  8:50   ` [PATCH v2] " Martyn Welch
  0 siblings, 1 reply; 3+ messages in thread
From: Benjamin Herrenschmidt @ 2010-04-26 21:27 UTC (permalink / raw)
  To: Martyn Welch; +Cc: tim, linuxppc-dev, Michael Neuling, Stephen Rothwell

On Mon, 2010-04-26 at 12:15 +0100, Martyn Welch wrote:
> Currently the parsing of the device tree in
> arch/powerpc/include/asm/parport.h assumes that the interrupt provided in
> the parallel port node is a valid virtual irq. The values for the
> interrupts provided in the device tree should have meaning in the context
> of the driver for the specific interrupt controller to which the interrupt
> is connected and irq_of_parse_and_map() should be used to determine the
> correct virtual irq.
> 
> Signed-off-by: Martyn Welch <martyn.welch@ge.com>
> ---
> 
> I believe this is the correct way to discover interrupt numbering. I assume
> this has worked in the past as the interrupt routing hasn't been as
> "interesting" as the board I'm currently working on.
> 
> I also don't have any other targets I could test this on, can anyone tell
> me if this will break support on existing devices?
> 
>  arch/powerpc/include/asm/parport.h |   11 ++++++++---
>  1 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/parport.h b/arch/powerpc/include/asm/parport.h
> index 94942d6..aa3f7bc 100644
> --- a/arch/powerpc/include/asm/parport.h
> +++ b/arch/powerpc/include/asm/parport.h
> @@ -19,6 +19,8 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
>  	u32 io1, io2;
>  	int propsize;
>  	int count = 0;
> +	int virq;
> +
>  	for (np = NULL; (np = of_find_compatible_node(np,
>  						      "parallel",
>  						      "pnpPNP,400")) != NULL;) {
> @@ -26,10 +28,13 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
>  		if (!prop || propsize > 6*sizeof(u32))
>  			continue;
>  		io1 = prop[1]; io2 = prop[2];
> -		prop = of_get_property(np, "interrupts", NULL);
> -		if (!prop)
> +
> +		virq = irq_of_parse_and_map(np, 1);

It looks good overall except the above, "1" should be "0".

I suspect it worked by luck so far because the few machines with a
parallel port also have a 8259 irq controller using legacy interrupts
and the virq layer keeps those mapped 1:1.

Cheers,
Ben.

> +		if (virq == NO_IRQ)
>  			continue;
> -		if (parport_pc_probe_port(io1, io2, prop[0], autodma, NULL, 0) != NULL)
> +
> +		if (parport_pc_probe_port(io1, io2, virq, autodma, NULL, 0)
> +				!= NULL)
>  			count++;
>  	}
>  	return count;
> 
> 
> --
> Martyn Welch (Principal Software Engineer)   |   Registered in England and
> GE Intelligent Platforms                     |   Wales (3828642) at 100
> T +44(0)127322748                            |   Barbirolli Square, Manchester,
> E martyn.welch@ge.com                        |   M2 3AB  VAT:GB 927559189

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2] Correct PowerPC Parport interrupt parsing.
  2010-04-26 21:27 ` Benjamin Herrenschmidt
@ 2010-04-27  8:50   ` Martyn Welch
  0 siblings, 0 replies; 3+ messages in thread
From: Martyn Welch @ 2010-04-27  8:50 UTC (permalink / raw)
  To: linuxppc-dev, benh; +Cc: sfr, mikey

Currently the parsing of the device tree in
arch/powerpc/include/asm/parport.h assumes that the interrupt provided in
the parallel port node is a valid virtual irq. The values for the
interrupts provided in the device tree should have meaning in the context
of the driver for the specific interrupt controller to which the interrupt
is connected and irq_of_parse_and_map() should be used to determine the
correct virtual irq.

Signed-off-by: Martyn Welch <martyn.welch@ge.com>
---

v2: Corrected irq_of_parse_and_map() index.

 arch/powerpc/include/asm/parport.h |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/include/asm/parport.h b/arch/powerpc/include/asm/parport.h
index 94942d6..1ca1102 100644
--- a/arch/powerpc/include/asm/parport.h
+++ b/arch/powerpc/include/asm/parport.h
@@ -19,6 +19,8 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
 	u32 io1, io2;
 	int propsize;
 	int count = 0;
+	int virq;
+
 	for (np = NULL; (np = of_find_compatible_node(np,
 						      "parallel",
 						      "pnpPNP,400")) != NULL;) {
@@ -26,10 +28,13 @@ static int __devinit parport_pc_find_nonpci_ports (int autoirq, int autodma)
 		if (!prop || propsize > 6*sizeof(u32))
 			continue;
 		io1 = prop[1]; io2 = prop[2];
-		prop = of_get_property(np, "interrupts", NULL);
-		if (!prop)
+
+		virq = irq_of_parse_and_map(np, 0);
+		if (virq == NO_IRQ)
 			continue;
-		if (parport_pc_probe_port(io1, io2, prop[0], autodma, NULL, 0) != NULL)
+
+		if (parport_pc_probe_port(io1, io2, virq, autodma, NULL, 0)
+				!= NULL)
 			count++;
 	}
 	return count;


--
Martyn Welch (Principal Software Engineer)   |   Registered in England and
GE Intelligent Platforms                     |   Wales (3828642) at 100
T +44(0)127322748                            |   Barbirolli Square, Manchester,
E martyn.welch@ge.com                        |   M2 3AB  VAT:GB 927559189

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-04-27  8:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-04-26 11:15 [PATCH] Correct PowerPC Parport interrupt parsing Martyn Welch
2010-04-26 21:27 ` Benjamin Herrenschmidt
2010-04-27  8:50   ` [PATCH v2] " Martyn Welch

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).