Merge tag 'gpio-v4.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[sfrench/cifs-2.6.git] / drivers / gpio / gpio-pxa.c
index 1e66f808051cfc4e255be01f326d86d017b170f2..bfe4c5c9f41cef3a9c3a483e5283e015d840bc91 100644 (file)
@@ -241,6 +241,17 @@ int pxa_irq_to_gpio(int irq)
        return irq_gpio0;
 }
 
+static bool pxa_gpio_has_pinctrl(void)
+{
+       switch (gpio_type) {
+       case PXA3XX_GPIO:
+               return false;
+
+       default:
+               return true;
+       }
+}
+
 static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
        struct pxa_gpio_chip *pchip = chip_to_pxachip(chip);
@@ -255,9 +266,11 @@ static int pxa_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
        unsigned long flags;
        int ret;
 
-       ret = pinctrl_gpio_direction_input(chip->base + offset);
-       if (!ret)
-               return 0;
+       if (pxa_gpio_has_pinctrl()) {
+               ret = pinctrl_gpio_direction_input(chip->base + offset);
+               if (!ret)
+                       return 0;
+       }
 
        spin_lock_irqsave(&gpio_lock, flags);
 
@@ -282,9 +295,11 @@ static int pxa_gpio_direction_output(struct gpio_chip *chip,
 
        writel_relaxed(mask, base + (value ? GPSR_OFFSET : GPCR_OFFSET));
 
-       ret = pinctrl_gpio_direction_output(chip->base + offset);
-       if (ret)
-               return ret;
+       if (pxa_gpio_has_pinctrl()) {
+               ret = pinctrl_gpio_direction_output(chip->base + offset);
+               if (ret)
+                       return ret;
+       }
 
        spin_lock_irqsave(&gpio_lock, flags);
 
@@ -348,8 +363,12 @@ static int pxa_init_gpio_chip(struct pxa_gpio_chip *pchip, int ngpio,
        pchip->chip.set = pxa_gpio_set;
        pchip->chip.to_irq = pxa_gpio_to_irq;
        pchip->chip.ngpio = ngpio;
-       pchip->chip.request = gpiochip_generic_request;
-       pchip->chip.free = gpiochip_generic_free;
+
+       if (pxa_gpio_has_pinctrl()) {
+               pchip->chip.request = gpiochip_generic_request;
+               pchip->chip.free = gpiochip_generic_free;
+       }
+
 #ifdef CONFIG_OF_GPIO
        pchip->chip.of_node = np;
        pchip->chip.of_xlate = pxa_gpio_of_xlate;
@@ -607,7 +626,7 @@ static int pxa_gpio_probe(struct platform_device *pdev)
        struct pxa_gpio_platform_data *info;
        void __iomem *gpio_reg_base;
        int gpio, ret;
-       int irq0 = 0, irq1 = 0, irq_mux, gpio_offset = 0;
+       int irq0 = 0, irq1 = 0, irq_mux;
 
        pchip = devm_kzalloc(&pdev->dev, sizeof(*pchip), GFP_KERNEL);
        if (!pchip)
@@ -646,14 +665,13 @@ static int pxa_gpio_probe(struct platform_device *pdev)
        pchip->irq0 = irq0;
        pchip->irq1 = irq1;
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -EINVAL;
        gpio_reg_base = devm_ioremap(&pdev->dev, res->start,
                                     resource_size(res));
        if (!gpio_reg_base)
                return -EINVAL;
 
-       if (irq0 > 0)
-               gpio_offset = 2;
-
        clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(clk)) {
                dev_err(&pdev->dev, "Error %ld to get gpio clock\n",
@@ -758,6 +776,9 @@ static int pxa_gpio_suspend(void)
        struct pxa_gpio_bank *c;
        int gpio;
 
+       if (!pchip)
+               return 0;
+
        for_each_gpio_bank(gpio, c, pchip) {
                c->saved_gplr = readl_relaxed(c->regbase + GPLR_OFFSET);
                c->saved_gpdr = readl_relaxed(c->regbase + GPDR_OFFSET);
@@ -776,6 +797,9 @@ static void pxa_gpio_resume(void)
        struct pxa_gpio_bank *c;
        int gpio;
 
+       if (!pchip)
+               return;
+
        for_each_gpio_bank(gpio, c, pchip) {
                /* restore level with set/clear */
                writel_relaxed(c->saved_gplr, c->regbase + GPSR_OFFSET);