[PATCH 1/2] irqchip: sirf: move from legacy mode to linear irqdomain

Barry Song 21cnbao at gmail.com
Mon Aug 19 05:30:31 EDT 2013


2013/8/6 Barry Song <21cnbao at gmail.com>:
> the series of patches for irqdomain core in 3.11 has broken sirf
> irq which uses legacy mapping. all users fail in the new kernel
> while setupping irq.
>
> this patch moves to linear irqdomain and drop old legacy irqdomain
> codes since we don't need it any more, and at the same time, it
> also fixes the broken interrupts of sirfsoc in 3.11.
>
> on the other hand, we actually only have 64 interrupt sources for
> prima2 and atlas6, but there are 128 interrupt souces for marco
> which uses GIC. in the legacy codes, sirf gpio also uses legacy
> irqdomain, so to make gpio interrupt mapping not depend on the
> prima2/atlas6/marco an use unified marco,we enlarge prima2/atlas6
> interrupt number to 128. here we don't need this workaround any
> more as sirf gpio also moved to linear mode before. so we move
> SIRFSOC_NUM_IRQS back to 64 too.
>
> Signed-off-by: Barry Song <Baohua.Song at csr.com>

ping, this should touch 3.11 as sirfsoc interrupts break in 3.11.

> ---
>  drivers/irqchip/irq-sirfsoc.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/irqchip/irq-sirfsoc.c b/drivers/irqchip/irq-sirfsoc.c
> index 69ea44e..4851afa 100644
> --- a/drivers/irqchip/irq-sirfsoc.c
> +++ b/drivers/irqchip/irq-sirfsoc.c
> @@ -23,7 +23,7 @@
>  #define SIRFSOC_INT_RISC_LEVEL1         0x0024
>  #define SIRFSOC_INIT_IRQ_ID            0x0038
>
> -#define SIRFSOC_NUM_IRQS               128
> +#define SIRFSOC_NUM_IRQS               64
>
>  static struct irq_domain *sirfsoc_irqdomain;
>
> @@ -32,15 +32,18 @@ sirfsoc_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
>  {
>         struct irq_chip_generic *gc;
>         struct irq_chip_type *ct;
> +       int ret;
> +       unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN;
>
> -       gc = irq_alloc_generic_chip("SIRFINTC", 1, irq_start, base, handle_level_irq);
> -       ct = gc->chip_types;
> +       ret = irq_alloc_domain_generic_chips(sirfsoc_irqdomain, num, 1, "irq_sirfsoc",
> +               handle_level_irq, clr, 0, IRQ_GC_INIT_MASK_CACHE);
>
> +       gc = irq_get_domain_generic_chip(sirfsoc_irqdomain, irq_start);
> +       gc->reg_base = base;
> +       ct = gc->chip_types;
>         ct->chip.irq_mask = irq_gc_mask_clr_bit;
>         ct->chip.irq_unmask = irq_gc_mask_set_bit;
>         ct->regs.mask = SIRFSOC_INT_RISC_MASK0;
> -
> -       irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE, IRQ_NOREQUEST, 0);
>  }
>
>  static asmlinkage void __exception_irq_entry sirfsoc_handle_irq(struct pt_regs *regs)
> @@ -60,9 +63,8 @@ static int __init sirfsoc_irq_init(struct device_node *np, struct device_node *p
>         if (!base)
>                 panic("unable to map intc cpu registers\n");
>
> -       /* using legacy because irqchip_generic does not work with linear */
> -       sirfsoc_irqdomain = irq_domain_add_legacy(np, SIRFSOC_NUM_IRQS, 0, 0,
> -                                &irq_domain_simple_ops, base);
> +       sirfsoc_irqdomain = irq_domain_add_linear(np, SIRFSOC_NUM_IRQS,
> +               &irq_generic_chip_ops, base);
>
>         sirfsoc_alloc_gc(base, 0, 32);
>         sirfsoc_alloc_gc(base + 4, 32, SIRFSOC_NUM_IRQS - 32);
> --
> 1.8.2.3
>

-barry



More information about the linux-arm-kernel mailing list