diff mbox

[OpenWrt-Devel,v3,2/3] mcs814x: fix interrupts

Message ID 1438355005-8947-3-git-send-email-guenther.kelleter@devolo.de
State Superseded
Headers show

Commit Message

Günther Kelleter July 31, 2015, 3:03 p.m. UTC
create explicit 1:1 mapping before mcs814x_alloc_gc/irq_setup_generic_chip
marks all interrupts used and prevents mapping by dts init.
IRQ 0 is the timer interrupt and is not illegal!

Was broken since kernel 3.14.

Signed-off-by: Günther Kelleter <guenther.kelleter@devolo.de>
---
 target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c |  6 +++++-
 target/linux/mcs814x/patches-3.18/015-timer-irq.patch       | 11 +++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)
 create mode 100644 target/linux/mcs814x/patches-3.18/015-timer-irq.patch

Comments

Günther Kelleter Aug. 3, 2015, 7:03 a.m. UTC | #1
Please ignore this patch.
I have another (better? bigger!) patch which switches to generic chip interrupt domains. Finally.

Günther

> -----Original Message-----

> From: Günther Kelleter [mailto:guenther.kelleter@devolo.de]

> Sent: Friday, July 31, 2015 5:03 PM

> To: openwrt-devel@lists.openwrt.org

> Cc: Guenther Kelleter

> Subject: [PATCH v3 2/3] mcs814x: fix interrupts

> 

> create explicit 1:1 mapping before mcs814x_alloc_gc/irq_setup_generic_chip

> marks all interrupts used and prevents mapping by dts init.

> IRQ 0 is the timer interrupt and is not illegal!

> 

> Was broken since kernel 3.14.

> 

> Signed-off-by: Günther Kelleter <guenther.kelleter@devolo.de>

> ---

>  target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c |  6 +++++-

>  target/linux/mcs814x/patches-3.18/015-timer-irq.patch       | 11 +++++++++++

>  2 files changed, 16 insertions(+), 1 deletion(-)

>  create mode 100644 target/linux/mcs814x/patches-3.18/015-timer-irq.patch

> 

> diff --git a/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c

> b/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c

> index f84c412..fd4345f 100644

> --- a/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c

> +++ b/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c

> @@ -71,6 +71,7 @@ static const struct of_device_id mcs814x_intc_ids[] = {

>  void __init mcs814x_of_irq_init(void)

>  {

>  	struct device_node *np;

> +	struct irq_domain *domain;

> 

>  	np = of_find_matching_node(NULL, mcs814x_intc_ids);

>  	if (!np)

> @@ -80,7 +81,10 @@ void __init mcs814x_of_irq_init(void)

>  	if (!mcs814x_intc_base)

>  		panic("unable to map intc cpu registers\n");

> 

> -	irq_domain_add_simple(np, 32, 0, &irq_generic_chip_ops, NULL);

> +	domain = irq_domain_add_simple(np, 32, 0, &irq_domain_simple_ops, NULL);

> +	if (!domain)

> +		panic("unable to add irq domain\n");

> +	irq_create_strict_mappings(domain, 0, 0, 32);

> 

>  	of_node_put(np);

> 

> diff --git a/target/linux/mcs814x/patches-3.18/015-timer-irq.patch

> b/target/linux/mcs814x/patches-3.18/015-timer-irq.patch

> new file mode 100644

> index 0000000..9bbb094

> --- /dev/null

> +++ b/target/linux/mcs814x/patches-3.18/015-timer-irq.patch

> @@ -0,0 +1,11 @@

> +--- a/kernel/irq/irqdesc.c

> ++++ b/kernel/irq/irqdesc.c

> +@@ -381,7 +381,7 @@ int __handle_domain_irq(struct irq_domai

> + 	 * Some hardware gives randomly wrong interrupts.  Rather

> + 	 * than crashing, do something sensible.

> + 	 */

> +-	if (unlikely(!irq || irq >= nr_irqs)) {

> ++	if (unlikely(irq >= nr_irqs)) {

> + 		ack_bad_irq(irq);

> + 		ret = -EINVAL;

> + 	} else {

> --

> 2.4.6.89.g851dcf4
diff mbox

Patch

diff --git a/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c b/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c
index f84c412..fd4345f 100644
--- a/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c
+++ b/target/linux/mcs814x/files-3.18/arch/arm/mach-mcs814x/irq.c
@@ -71,6 +71,7 @@  static const struct of_device_id mcs814x_intc_ids[] = {
 void __init mcs814x_of_irq_init(void)
 {
 	struct device_node *np;
+	struct irq_domain *domain;
 
 	np = of_find_matching_node(NULL, mcs814x_intc_ids);
 	if (!np)
@@ -80,7 +81,10 @@  void __init mcs814x_of_irq_init(void)
 	if (!mcs814x_intc_base)
 		panic("unable to map intc cpu registers\n");
 
-	irq_domain_add_simple(np, 32, 0, &irq_generic_chip_ops, NULL);
+	domain = irq_domain_add_simple(np, 32, 0, &irq_domain_simple_ops, NULL);
+	if (!domain)
+		panic("unable to add irq domain\n");
+	irq_create_strict_mappings(domain, 0, 0, 32);
 
 	of_node_put(np);
 
diff --git a/target/linux/mcs814x/patches-3.18/015-timer-irq.patch b/target/linux/mcs814x/patches-3.18/015-timer-irq.patch
new file mode 100644
index 0000000..9bbb094
--- /dev/null
+++ b/target/linux/mcs814x/patches-3.18/015-timer-irq.patch
@@ -0,0 +1,11 @@ 
+--- a/kernel/irq/irqdesc.c
++++ b/kernel/irq/irqdesc.c
+@@ -381,7 +381,7 @@ int __handle_domain_irq(struct irq_domai
+ 	 * Some hardware gives randomly wrong interrupts.  Rather
+ 	 * than crashing, do something sensible.
+ 	 */
+-	if (unlikely(!irq || irq >= nr_irqs)) {
++	if (unlikely(irq >= nr_irqs)) {
+ 		ack_bad_irq(irq);
+ 		ret = -EINVAL;
+ 	} else {