lkml.org 
[lkml]   [2011]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH] irq: convert generic-chip to use irq_domain
    On Sun, Dec 11, 2011 at 08:52:22PM -0600, Rob Herring wrote:
    > Actually, there's a much simpler fix:
    >
    > diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
    > index 200ce83..3832ac6 100644
    > --- a/kernel/irq/irqdomain.c
    > +++ b/kernel/irq/irqdomain.c
    > @@ -135,6 +135,9 @@ int irq_domain_simple_dt_translate(struct irq_domain *d,
    > return -EINVAL;
    > if (intsize < 1)
    > return -EINVAL;
    > + if ((intspec[0] < d->hwirq_base) ||
    > + (intspec[0] >= d->hwirq_base + d->nr_irq))
    > + return -EINVAL;
    >
    > *out_hwirq = intspec[0];
    > *out_type = IRQ_TYPE_NONE;
    >
    Thanks, Rob. It works for me with some additional changes to your
    patch.

    8<-------------------------

    diff --git a/kernel/irq/generic-chip.c b/kernel/irq/generic-chip.c
    index 48eeb29..3ac7de4 100644
    --- a/kernel/irq/generic-chip.c
    +++ b/kernel/irq/generic-chip.c
    @@ -252,14 +252,16 @@ void irq_setup_generic_chip(struct irq_chip_generic *gc, u32 msk,
    gc->mask_cache = irq_reg_readl(gc->reg_base + ct->regs.mask);

    gc->domain->nr_irq = fls(msk);
    - irq = irq_alloc_descs(gc->domain->irq_base, 1, gc->domain->nr_irq,
    - numa_node_id());
    - if (irq > 0)
    - gc->domain->irq_base = irq;
    + if ((int) gc->domain->irq_base < 0) {
    + irq = irq_alloc_descs(gc->domain->irq_base, 1,
    + gc->domain->nr_irq, numa_node_id());
    + if (irq > 0)
    + gc->domain->irq_base = irq;
    + }

    irq_domain_add(gc->domain);

    - for (i = 0; msk; msk >>= 1, i++) {
    + for (i = gc->domain->hwirq_base; msk; msk >>= 1, i++) {
    if (!(msk & 0x01))
    continue;

    diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
    index 200ce83..7947252 100644
    --- a/kernel/irq/irqdomain.c
    +++ b/kernel/irq/irqdomain.c
    @@ -39,7 +39,7 @@ void irq_domain_add(struct irq_domain *domain)
    return;
    }
    d->domain = domain;
    - d->hwirq = hwirq;
    + d->hwirq = hwirq - d->domain->hwirq_base;
    }

    mutex_lock(&irq_domain_mutex);
    @@ -136,6 +136,10 @@ int irq_domain_simple_dt_translate(struct irq_domain *d,
    if (intsize < 1)
    return -EINVAL;

    + if ((intspec[0] < d->hwirq_base) ||
    + (intspec[0] >= d->hwirq_base + d->nr_irq))
    + return -EINVAL;
    +
    *out_hwirq = intspec[0];
    *out_type = IRQ_TYPE_NONE;
    if (intsize > 1)
    ------------------------->8
    Regards,
    Shawn



    \
     
     \ /
      Last update: 2011-12-12 10:45    [W:0.026 / U:29.780 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site