]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/gpio/gpio-grgpio.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux.git] / drivers / gpio / gpio-grgpio.c
index 08234e64993a951879d21bfc22b8f3debe1a1e74..f954359c9544ec3b31ad603306df9e7623ff2562 100644 (file)
@@ -253,17 +253,16 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq,
        lirq->irq = irq;
        uirq = &priv->uirqs[lirq->index];
        if (uirq->refcnt == 0) {
+               spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
                ret = request_irq(uirq->uirq, grgpio_irq_handler, 0,
                                  dev_name(priv->dev), priv);
                if (ret) {
                        dev_err(priv->dev,
                                "Could not request underlying irq %d\n",
                                uirq->uirq);
-
-                       spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
-
                        return ret;
                }
+               spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
        }
        uirq->refcnt++;
 
@@ -309,8 +308,11 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq)
        if (index >= 0) {
                uirq = &priv->uirqs[lirq->index];
                uirq->refcnt--;
-               if (uirq->refcnt == 0)
+               if (uirq->refcnt == 0) {
+                       spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
                        free_irq(uirq->uirq, priv);
+                       return;
+               }
        }
 
        spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
@@ -433,12 +435,9 @@ static int grgpio_probe(struct platform_device *ofdev)
 static int grgpio_remove(struct platform_device *ofdev)
 {
        struct grgpio_priv *priv = platform_get_drvdata(ofdev);
-       unsigned long flags;
        int i;
        int ret = 0;
 
-       spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
-
        if (priv->domain) {
                for (i = 0; i < GRGPIO_MAX_NGPIO; i++) {
                        if (priv->uirqs[i].refcnt != 0) {
@@ -454,8 +453,6 @@ static int grgpio_remove(struct platform_device *ofdev)
                irq_domain_remove(priv->domain);
 
 out:
-       spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
-
        return ret;
 }