]> Pileus Git - ~andy/linux/blobdiff - drivers/gpio/gpio-em.c
Merge branch 'topic/hda-ca0132-dsp' into for-next
[~andy/linux] / drivers / gpio / gpio-em.c
index efb4c2d0d132912a05b63372ee479a71db4e7377..bdc8302e711ab0cf59e9cbdfc6c0246be94c1c6a 100644 (file)
@@ -35,7 +35,6 @@
 struct em_gio_priv {
        void __iomem *base0;
        void __iomem *base1;
-       unsigned int irq_base;
        spinlock_t sense_lock;
        struct platform_device *pdev;
        struct gpio_chip gpio_chip;
@@ -214,7 +213,7 @@ static int em_gio_direction_output(struct gpio_chip *chip, unsigned offset,
 
 static int em_gio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
-       return irq_find_mapping(gpio_to_priv(chip)->irq_domain, offset);
+       return irq_create_mapping(gpio_to_priv(chip)->irq_domain, offset);
 }
 
 static int em_gio_irq_domain_map(struct irq_domain *h, unsigned int virq,
@@ -234,41 +233,7 @@ static struct irq_domain_ops em_gio_irq_domain_ops = {
        .map    = em_gio_irq_domain_map,
 };
 
-static int __devinit em_gio_irq_domain_init(struct em_gio_priv *p)
-{
-       struct platform_device *pdev = p->pdev;
-       struct gpio_em_config *pdata = pdev->dev.platform_data;
-
-       p->irq_base = irq_alloc_descs(pdata->irq_base, 0,
-                                     pdata->number_of_pins, numa_node_id());
-       if (p->irq_base < 0) {
-               dev_err(&pdev->dev, "cannot get irq_desc\n");
-               return p->irq_base;
-       }
-       pr_debug("gio: hw base = %d, nr = %d, sw base = %d\n",
-                pdata->gpio_base, pdata->number_of_pins, p->irq_base);
-
-       p->irq_domain = irq_domain_add_legacy(pdev->dev.of_node,
-                                             pdata->number_of_pins,
-                                             p->irq_base, 0,
-                                             &em_gio_irq_domain_ops, p);
-       if (!p->irq_domain) {
-               irq_free_descs(p->irq_base, pdata->number_of_pins);
-               return -ENXIO;
-       }
-
-       return 0;
-}
-
-static void em_gio_irq_domain_cleanup(struct em_gio_priv *p)
-{
-       struct gpio_em_config *pdata = p->pdev->dev.platform_data;
-
-       irq_free_descs(p->irq_base, pdata->number_of_pins);
-       /* FIXME: irq domain wants to be freed! */
-}
-
-static int __devinit em_gio_probe(struct platform_device *pdev)
+static int em_gio_probe(struct platform_device *pdev)
 {
        struct gpio_em_config *pdata = pdev->dev.platform_data;
        struct em_gio_priv *p;
@@ -334,8 +299,11 @@ static int __devinit em_gio_probe(struct platform_device *pdev)
        irq_chip->irq_set_type = em_gio_irq_set_type;
        irq_chip->flags = IRQCHIP_SKIP_SET_WAKE;
 
-       ret = em_gio_irq_domain_init(p);
-       if (ret) {
+       p->irq_domain = irq_domain_add_linear(pdev->dev.of_node,
+                                             pdata->number_of_pins,
+                                             &em_gio_irq_domain_ops, p);
+       if (!p->irq_domain) {
+               ret = -ENXIO;
                dev_err(&pdev->dev, "cannot initialize irq domain\n");
                goto err3;
        }
@@ -364,7 +332,7 @@ err6:
 err5:
        free_irq(irq[0]->start, pdev);
 err4:
-       em_gio_irq_domain_cleanup(p);
+       irq_domain_remove(p->irq_domain);
 err3:
        iounmap(p->base1);
 err2:
@@ -375,7 +343,7 @@ err0:
        return ret;
 }
 
-static int __devexit em_gio_remove(struct platform_device *pdev)
+static int em_gio_remove(struct platform_device *pdev)
 {
        struct em_gio_priv *p = platform_get_drvdata(pdev);
        struct resource *irq[2];
@@ -390,7 +358,7 @@ static int __devexit em_gio_remove(struct platform_device *pdev)
 
        free_irq(irq[1]->start, pdev);
        free_irq(irq[0]->start, pdev);
-       em_gio_irq_domain_cleanup(p);
+       irq_domain_remove(p->irq_domain);
        iounmap(p->base1);
        iounmap(p->base0);
        kfree(p);
@@ -399,7 +367,7 @@ static int __devexit em_gio_remove(struct platform_device *pdev)
 
 static struct platform_driver em_gio_device_driver = {
        .probe          = em_gio_probe,
-       .remove         = __devexit_p(em_gio_remove),
+       .remove         = em_gio_remove,
        .driver         = {
                .name   = "em_gio",
        }