diff options
Diffstat (limited to 'drivers/gpio/gpio-pxa.c')
-rw-r--r-- | drivers/gpio/gpio-pxa.c | 42 |
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 | ||
244 | static 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 | |||
244 | static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset) | 255 | static 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", |