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.kelle...@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.kelle...@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@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to