Merge tag 'v3.14.25' into backport/v3.14.24-ltsi-rc1+v3.14.25/snapshot-merge.wip
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / gpio / gpio-rcar.c
index ca76ce7..0d251dc 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/pinctrl/consumer.h>
 #include <linux/platform_data/gpio-rcar.h>
 #include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
 #include <linux/spinlock.h>
 #include <linux/slab.h>
 
@@ -239,9 +240,9 @@ static int gpio_rcar_get(struct gpio_chip *chip, unsigned offset)
        /* testing on r8a7790 shows that INDT does not show correct pin state
         * when configured as output, so use OUTDT in case of output pins */
        if (gpio_rcar_read(gpio_to_priv(chip), INOUTSEL) & bit)
-               return (int)(gpio_rcar_read(gpio_to_priv(chip), OUTDT) & bit);
+               return !!(gpio_rcar_read(gpio_to_priv(chip), OUTDT) & bit);
        else
-               return (int)(gpio_rcar_read(gpio_to_priv(chip), INDT) & bit);
+               return !!(gpio_rcar_read(gpio_to_priv(chip), INDT) & bit);
 }
 
 static void gpio_rcar_set(struct gpio_chip *chip, unsigned offset, int value)
@@ -283,6 +284,7 @@ static int gpio_rcar_irq_domain_map(struct irq_domain *h, unsigned int irq,
 
 static struct irq_domain_ops gpio_rcar_irq_domain_ops = {
        .map    = gpio_rcar_irq_domain_map,
+       .xlate  = irq_domain_xlate_twocell,
 };
 
 struct gpio_rcar_info {
@@ -356,12 +358,12 @@ static int gpio_rcar_probe(struct platform_device *pdev)
        struct resource *io, *irq;
        struct gpio_chip *gpio_chip;
        struct irq_chip *irq_chip;
-       const char *name = dev_name(&pdev->dev);
+       struct device *dev = &pdev->dev;
+       const char *name = dev_name(dev);
        int ret;
 
-       p = devm_kzalloc(&pdev->dev, sizeof(*p), GFP_KERNEL);
+       p = devm_kzalloc(dev, sizeof(*p), GFP_KERNEL);
        if (!p) {
-               dev_err(&pdev->dev, "failed to allocate driver data\n");
                ret = -ENOMEM;
                goto err0;
        }
@@ -376,19 +378,21 @@ static int gpio_rcar_probe(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, p);
 
+       pm_runtime_enable(dev);
+       pm_runtime_get_sync(dev);
+
        io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 
        if (!io || !irq) {
-               dev_err(&pdev->dev, "missing IRQ or IOMEM\n");
+               dev_err(dev, "missing IRQ or IOMEM\n");
                ret = -EINVAL;
                goto err0;
        }
 
-       p->base = devm_ioremap_nocache(&pdev->dev, io->start,
-                                      resource_size(io));
+       p->base = devm_ioremap_nocache(dev, io->start, resource_size(io));
        if (!p->base) {
-               dev_err(&pdev->dev, "failed to remap I/O memory\n");
+               dev_err(dev, "failed to remap I/O memory\n");
                ret = -ENXIO;
                goto err0;
        }
@@ -402,7 +406,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
        gpio_chip->set = gpio_rcar_set;
        gpio_chip->to_irq = gpio_rcar_to_irq;
        gpio_chip->label = name;
-       gpio_chip->dev = &pdev->dev;
+       gpio_chip->dev = dev;
        gpio_chip->owner = THIS_MODULE;
        gpio_chip->base = p->config.gpio_base;
        gpio_chip->ngpio = p->config.number_of_pins;
@@ -421,30 +425,30 @@ static int gpio_rcar_probe(struct platform_device *pdev)
                                              &gpio_rcar_irq_domain_ops, p);
        if (!p->irq_domain) {
                ret = -ENXIO;
-               dev_err(&pdev->dev, "cannot initialize irq domain\n");
+               dev_err(dev, "cannot initialize irq domain\n");
                goto err0;
        }
 
-       if (devm_request_irq(&pdev->dev, irq->start,
-                            gpio_rcar_irq_handler, IRQF_SHARED, name, p)) {
-               dev_err(&pdev->dev, "failed to request IRQ\n");
+       if (devm_request_irq(dev, irq->start, gpio_rcar_irq_handler,
+                            IRQF_SHARED, name, p)) {
+               dev_err(dev, "failed to request IRQ\n");
                ret = -ENOENT;
                goto err1;
        }
 
        ret = gpiochip_add(gpio_chip);
        if (ret) {
-               dev_err(&pdev->dev, "failed to add GPIO controller\n");
+               dev_err(dev, "failed to add GPIO controller\n");
                goto err1;
        }
 
-       dev_info(&pdev->dev, "driving %d GPIOs\n", p->config.number_of_pins);
+       dev_info(dev, "driving %d GPIOs\n", p->config.number_of_pins);
 
        /* warn in case of mismatch if irq base is specified */
        if (p->config.irq_base) {
                ret = irq_find_mapping(p->irq_domain, 0);
                if (p->config.irq_base != ret)
-                       dev_warn(&pdev->dev, "irq base mismatch (%u/%u)\n",
+                       dev_warn(dev, "irq base mismatch (%u/%u)\n",
                                 p->config.irq_base, ret);
        }
 
@@ -452,7 +456,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
                ret = gpiochip_add_pin_range(gpio_chip, p->config.pctl_name, 0,
                                             gpio_chip->base, gpio_chip->ngpio);
                if (ret < 0)
-                       dev_warn(&pdev->dev, "failed to add pin range\n");
+                       dev_warn(dev, "failed to add pin range\n");
        }
 
        return 0;
@@ -460,6 +464,8 @@ static int gpio_rcar_probe(struct platform_device *pdev)
 err1:
        irq_domain_remove(p->irq_domain);
 err0:
+       pm_runtime_put(dev);
+       pm_runtime_disable(dev);
        return ret;
 }
 
@@ -473,6 +479,8 @@ static int gpio_rcar_remove(struct platform_device *pdev)
                return ret;
 
        irq_domain_remove(p->irq_domain);
+       pm_runtime_put(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
        return 0;
 }