aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-pxa.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpio-pxa.c')
-rw-r--r--drivers/gpio/gpio-pxa.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c
index 1e66f808051c..c18712dabf93 100644
--- a/drivers/gpio/gpio-pxa.c
+++ b/drivers/gpio/gpio-pxa.c
@@ -241,6 +241,17 @@ int pxa_irq_to_gpio(int irq)
241 return irq_gpio0; 241 return irq_gpio0;
242} 242}
243 243
244static bool pxa_gpio_has_pinctrl(void)
245{
246 switch (gpio_type) {
247 case PXA3XX_GPIO:
248 return false;
249
250 default:
251 return true;
252 }
253}
254
244static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 255static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
245{ 256{
246 struct pxa_gpio_chip *pchip = chip_to_pxachip(chip); 257 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)
255 unsigned long flags; 266 unsigned long flags;
256 int ret; 267 int ret;
257 268
258 ret = pinctrl_gpio_direction_input(chip->base + offset); 269 if (pxa_gpio_has_pinctrl()) {
259 if (!ret) 270 ret = pinctrl_gpio_direction_input(chip->base + offset);
260 return 0; 271 if (!ret)
272 return 0;
273 }
261 274
262 spin_lock_irqsave(&gpio_lock, flags); 275 spin_lock_irqsave(&gpio_lock, flags);
263 276
@@ -282,9 +295,11 @@ static int pxa_gpio_direction_output(struct gpio_chip *chip,
282 295
283 writel_relaxed(mask, base + (value ? GPSR_OFFSET : GPCR_OFFSET)); 296 writel_relaxed(mask, base + (value ? GPSR_OFFSET : GPCR_OFFSET));
284 297
285 ret = pinctrl_gpio_direction_output(chip->base + offset); 298 if (pxa_gpio_has_pinctrl()) {
286 if (ret) 299 ret = pinctrl_gpio_direction_output(chip->base + offset);
287 return ret; 300 if (ret)
301 return ret;
302 }
288 303
289 spin_lock_irqsave(&gpio_lock, flags); 304 spin_lock_irqsave(&gpio_lock, flags);
290 305
@@ -348,8 +363,12 @@ static int pxa_init_gpio_chip(struct pxa_gpio_chip *pchip, int ngpio,
348 pchip->chip.set = pxa_gpio_set; 363 pchip->chip.set = pxa_gpio_set;
349 pchip->chip.to_irq = pxa_gpio_to_irq; 364 pchip->chip.to_irq = pxa_gpio_to_irq;
350 pchip->chip.ngpio = ngpio; 365 pchip->chip.ngpio = ngpio;
351 pchip->chip.request = gpiochip_generic_request; 366
352 pchip->chip.free = gpiochip_generic_free; 367 if (pxa_gpio_has_pinctrl()) {
368 pchip->chip.request = gpiochip_generic_request;
369 pchip->chip.free = gpiochip_generic_free;
370 }
371
353#ifdef CONFIG_OF_GPIO 372#ifdef CONFIG_OF_GPIO
354 pchip->chip.of_node = np; 373 pchip->chip.of_node = np;
355 pchip->chip.of_xlate = pxa_gpio_of_xlate; 374 pchip->chip.of_xlate = pxa_gpio_of_xlate;
@@ -607,7 +626,7 @@ static int pxa_gpio_probe(struct platform_device *pdev)
607 struct pxa_gpio_platform_data *info; 626 struct pxa_gpio_platform_data *info;
608 void __iomem *gpio_reg_base; 627 void __iomem *gpio_reg_base;
609 int gpio, ret; 628 int gpio, ret;
610 int irq0 = 0, irq1 = 0, irq_mux, gpio_offset = 0; 629 int irq0 = 0, irq1 = 0, irq_mux;
611 630
612 pchip = devm_kzalloc(&pdev->dev, sizeof(*pchip), GFP_KERNEL); 631 pchip = devm_kzalloc(&pdev->dev, sizeof(*pchip), GFP_KERNEL);
613 if (!pchip) 632 if (!pchip)
@@ -646,14 +665,13 @@ static int pxa_gpio_probe(struct platform_device *pdev)
646 pchip->irq0 = irq0; 665 pchip->irq0 = irq0;
647 pchip->irq1 = irq1; 666 pchip->irq1 = irq1;
648 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 667 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
668 if (!res)
669 return -EINVAL;
649 gpio_reg_base = devm_ioremap(&pdev->dev, res->start, 670 gpio_reg_base = devm_ioremap(&pdev->dev, res->start,
650 resource_size(res)); 671 resource_size(res));
651 if (!gpio_reg_base) 672 if (!gpio_reg_base)
652 return -EINVAL; 673 return -EINVAL;
653 674
654 if (irq0 > 0)
655 gpio_offset = 2;
656
657 clk = clk_get(&pdev->dev, NULL); 675 clk = clk_get(&pdev->dev, NULL);
658 if (IS_ERR(clk)) { 676 if (IS_ERR(clk)) {
659 dev_err(&pdev->dev, "Error %ld to get gpio clock\n", 677 dev_err(&pdev->dev, "Error %ld to get gpio clock\n",