[OpenWrt-Devel] [PATCH v3 2/3] mcs814x: fix interrupts
Günther Kelleter
guenther.kelleter at devolo.de
Fri Jul 31 11:03:24 EDT 2015
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 at 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
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list