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.

Signed-off-by: Milton Miller <milt...@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

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to