[PATCH 37/37] powerpc: make IRQ_NOREQUEST last to clear, first to set

Grant Likely grant.likely at secretlab.ca
Thu May 12 05:18:11 EST 2011


On Wed, May 11, 2011 at 7:30 AM, Milton Miller <miltonm at bga.com> wrote:
> When allocating irqs, wait to clear the IRQ_NOREQUEST flag until the
> host map hook has been called.
>
> When freeing irqs, set the IRQ_NOREQUEST flag before calling the host
> unmap hook.

A description describing why this change is being made would be
appreciated here.

g.

>
> Signed-off-by: Milton Miller <miltonm at bga.com>
> ---
>  arch/powerpc/kernel/irq.c |   14 +++++++-------
>  1 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index 4368b5e..a24d37d 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -586,14 +586,14 @@ struct irq_host *irq_alloc_host(struct device_node *of_node,
>                        irq_map[i].host = host;
>                        smp_wmb();
>
> -                       /* Clear norequest flags */
> -                       irq_clear_status_flags(i, IRQ_NOREQUEST);
> -
>                        /* Legacy flags are left to default at this point,
>                         * one can then use irq_create_mapping() to
>                         * explicitly change them
>                         */
>                        ops->map(host, i, i);
> +
> +                       /* Clear norequest flags */
> +                       irq_clear_status_flags(i, IRQ_NOREQUEST);
>                }
>                break;
>        case IRQ_HOST_MAP_LINEAR:
> @@ -664,8 +664,6 @@ static int irq_setup_virq(struct irq_host *host, unsigned int virq,
>                goto error;
>        }
>
> -       irq_clear_status_flags(virq, IRQ_NOREQUEST);
> -
>        /* map it */
>        smp_wmb();
>        irq_map[virq].hwirq = hwirq;
> @@ -676,6 +674,8 @@ static int irq_setup_virq(struct irq_host *host, unsigned int virq,
>                goto errdesc;
>        }
>
> +       irq_clear_status_flags(virq, IRQ_NOREQUEST);
> +
>        return 0;
>
>  errdesc:
> @@ -819,6 +819,8 @@ void irq_dispose_mapping(unsigned int virq)
>        if (host->revmap_type == IRQ_HOST_MAP_LEGACY)
>                return;
>
> +       irq_set_status_flags(virq, IRQ_NOREQUEST);
> +
>        /* remove chip and handler */
>        irq_set_chip_and_handler(virq, NULL, NULL);
>
> @@ -848,8 +850,6 @@ void irq_dispose_mapping(unsigned int virq)
>        smp_mb();
>        irq_map[virq].hwirq = host->inval_irq;
>
> -       irq_set_status_flags(virq, IRQ_NOREQUEST);
> -
>        irq_free_descs(virq, 1);
>        /* Free it */
>        irq_free_virt(virq, 1);
> --
> 1.7.0.4
>
>



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.


More information about the Linuxppc-dev mailing list