diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-24 18:54:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-08-24 18:54:23 -0400 |
| commit | fa7f78e02e69e814e03aebc048971d05cae33d88 (patch) | |
| tree | ceff0863daa0470b6cbccc0e4e91eea4833e9949 | |
| parent | 5e30ca1e44029dad8304976128e3af76e4575cd1 (diff) | |
| parent | 8117bd531501ec329e4c9ea96fb7f9d5504c82f5 (diff) | |
Merge tag 'gpio-v3.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull gpio fixes from Linus Walleij:
- a largeish fix for the IRQ handling in the new Zynq driver. The
quite verbose commit message gives the exact details.
- move some defines for gpiod flags outside an ifdef to make stub
functions work again.
- various minor fixes that we can accept for -rc1.
* tag 'gpio-v3.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio:
gpio-lynxpoint: enable input sensing in resume
gpio: move GPIOD flags outside #ifdef
gpio: delete unneeded test before of_node_put
gpio: zynq: Fix IRQ handlers
gpiolib: devres: use correct structure type name in sizeof
MAINTAINERS: Change maintainer for gpio-bcm-kona.c
| -rw-r--r-- | MAINTAINERS | 2 | ||||
| -rw-r--r-- | drivers/gpio/devres.c | 2 | ||||
| -rw-r--r-- | drivers/gpio/gpio-lynxpoint.c | 18 | ||||
| -rw-r--r-- | drivers/gpio/gpio-zynq.c | 36 | ||||
| -rw-r--r-- | drivers/gpio/gpiolib-of.c | 4 | ||||
| -rw-r--r-- | include/linux/gpio/consumer.h | 4 |
6 files changed, 51 insertions, 15 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index c1c08a2652f7..aacfc6a9052b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2065,7 +2065,7 @@ S: Supported | |||
| 2065 | F: drivers/scsi/bnx2i/ | 2065 | F: drivers/scsi/bnx2i/ |
| 2066 | 2066 | ||
| 2067 | BROADCOM KONA GPIO DRIVER | 2067 | BROADCOM KONA GPIO DRIVER |
| 2068 | M: Markus Mayer <markus.mayer@linaro.org> | 2068 | M: Ray Jui <rjui@broadcom.com> |
| 2069 | L: bcm-kernel-feedback-list@broadcom.com | 2069 | L: bcm-kernel-feedback-list@broadcom.com |
| 2070 | S: Supported | 2070 | S: Supported |
| 2071 | F: drivers/gpio/gpio-bcm-kona.c | 2071 | F: drivers/gpio/gpio-bcm-kona.c |
diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c index 41b2f40578d5..954b9f6b0ef8 100644 --- a/drivers/gpio/devres.c +++ b/drivers/gpio/devres.c | |||
| @@ -90,7 +90,7 @@ struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev, | |||
| 90 | struct gpio_desc **dr; | 90 | struct gpio_desc **dr; |
| 91 | struct gpio_desc *desc; | 91 | struct gpio_desc *desc; |
| 92 | 92 | ||
| 93 | dr = devres_alloc(devm_gpiod_release, sizeof(struct gpiod_desc *), | 93 | dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *), |
| 94 | GFP_KERNEL); | 94 | GFP_KERNEL); |
| 95 | if (!dr) | 95 | if (!dr) |
| 96 | return ERR_PTR(-ENOMEM); | 96 | return ERR_PTR(-ENOMEM); |
diff --git a/drivers/gpio/gpio-lynxpoint.c b/drivers/gpio/gpio-lynxpoint.c index ff9eb911b5e4..fa945ec9ccff 100644 --- a/drivers/gpio/gpio-lynxpoint.c +++ b/drivers/gpio/gpio-lynxpoint.c | |||
| @@ -407,9 +407,27 @@ static int lp_gpio_runtime_resume(struct device *dev) | |||
| 407 | return 0; | 407 | return 0; |
| 408 | } | 408 | } |
| 409 | 409 | ||
| 410 | static int lp_gpio_resume(struct device *dev) | ||
| 411 | { | ||
| 412 | struct platform_device *pdev = to_platform_device(dev); | ||
| 413 | struct lp_gpio *lg = platform_get_drvdata(pdev); | ||
| 414 | unsigned long reg; | ||
| 415 | int i; | ||
| 416 | |||
| 417 | /* on some hardware suspend clears input sensing, re-enable it here */ | ||
| 418 | for (i = 0; i < lg->chip.ngpio; i++) { | ||
| 419 | if (gpiochip_is_requested(&lg->chip, i) != NULL) { | ||
| 420 | reg = lp_gpio_reg(&lg->chip, i, LP_CONFIG2); | ||
| 421 | outl(inl(reg) & ~GPINDIS_BIT, reg); | ||
| 422 | } | ||
| 423 | } | ||
| 424 | return 0; | ||
| 425 | } | ||
| 426 | |||
| 410 | static const struct dev_pm_ops lp_gpio_pm_ops = { | 427 | static const struct dev_pm_ops lp_gpio_pm_ops = { |
| 411 | .runtime_suspend = lp_gpio_runtime_suspend, | 428 | .runtime_suspend = lp_gpio_runtime_suspend, |
| 412 | .runtime_resume = lp_gpio_runtime_resume, | 429 | .runtime_resume = lp_gpio_runtime_resume, |
| 430 | .resume = lp_gpio_resume, | ||
| 413 | }; | 431 | }; |
| 414 | 432 | ||
| 415 | static const struct acpi_device_id lynxpoint_gpio_acpi_match[] = { | 433 | static const struct acpi_device_id lynxpoint_gpio_acpi_match[] = { |
diff --git a/drivers/gpio/gpio-zynq.c b/drivers/gpio/gpio-zynq.c index c3145f91fda3..31ad5df5dbc9 100644 --- a/drivers/gpio/gpio-zynq.c +++ b/drivers/gpio/gpio-zynq.c | |||
| @@ -95,6 +95,9 @@ struct zynq_gpio { | |||
| 95 | struct clk *clk; | 95 | struct clk *clk; |
| 96 | }; | 96 | }; |
| 97 | 97 | ||
| 98 | static struct irq_chip zynq_gpio_level_irqchip; | ||
| 99 | static struct irq_chip zynq_gpio_edge_irqchip; | ||
| 100 | |||
| 98 | /** | 101 | /** |
| 99 | * zynq_gpio_get_bank_pin - Get the bank number and pin number within that bank | 102 | * zynq_gpio_get_bank_pin - Get the bank number and pin number within that bank |
| 100 | * for a given pin in the GPIO device | 103 | * for a given pin in the GPIO device |
| @@ -410,6 +413,15 @@ static int zynq_gpio_set_irq_type(struct irq_data *irq_data, unsigned int type) | |||
| 410 | gpio->base_addr + ZYNQ_GPIO_INTPOL_OFFSET(bank_num)); | 413 | gpio->base_addr + ZYNQ_GPIO_INTPOL_OFFSET(bank_num)); |
| 411 | writel_relaxed(int_any, | 414 | writel_relaxed(int_any, |
| 412 | gpio->base_addr + ZYNQ_GPIO_INTANY_OFFSET(bank_num)); | 415 | gpio->base_addr + ZYNQ_GPIO_INTANY_OFFSET(bank_num)); |
| 416 | |||
| 417 | if (type & IRQ_TYPE_LEVEL_MASK) { | ||
| 418 | __irq_set_chip_handler_name_locked(irq_data->irq, | ||
| 419 | &zynq_gpio_level_irqchip, handle_fasteoi_irq, NULL); | ||
| 420 | } else { | ||
| 421 | __irq_set_chip_handler_name_locked(irq_data->irq, | ||
| 422 | &zynq_gpio_edge_irqchip, handle_level_irq, NULL); | ||
| 423 | } | ||
| 424 | |||
| 413 | return 0; | 425 | return 0; |
| 414 | } | 426 | } |
| 415 | 427 | ||
| @@ -424,9 +436,21 @@ static int zynq_gpio_set_wake(struct irq_data *data, unsigned int on) | |||
| 424 | } | 436 | } |
| 425 | 437 | ||
| 426 | /* irq chip descriptor */ | 438 | /* irq chip descriptor */ |
| 427 | static struct irq_chip zynq_gpio_irqchip = { | 439 | static struct irq_chip zynq_gpio_level_irqchip = { |
| 428 | .name = DRIVER_NAME, | 440 | .name = DRIVER_NAME, |
| 429 | .irq_enable = zynq_gpio_irq_enable, | 441 | .irq_enable = zynq_gpio_irq_enable, |
| 442 | .irq_eoi = zynq_gpio_irq_ack, | ||
| 443 | .irq_mask = zynq_gpio_irq_mask, | ||
| 444 | .irq_unmask = zynq_gpio_irq_unmask, | ||
| 445 | .irq_set_type = zynq_gpio_set_irq_type, | ||
| 446 | .irq_set_wake = zynq_gpio_set_wake, | ||
| 447 | .flags = IRQCHIP_EOI_THREADED | IRQCHIP_EOI_IF_HANDLED, | ||
| 448 | }; | ||
| 449 | |||
| 450 | static struct irq_chip zynq_gpio_edge_irqchip = { | ||
| 451 | .name = DRIVER_NAME, | ||
| 452 | .irq_enable = zynq_gpio_irq_enable, | ||
| 453 | .irq_ack = zynq_gpio_irq_ack, | ||
| 430 | .irq_mask = zynq_gpio_irq_mask, | 454 | .irq_mask = zynq_gpio_irq_mask, |
| 431 | .irq_unmask = zynq_gpio_irq_unmask, | 455 | .irq_unmask = zynq_gpio_irq_unmask, |
| 432 | .irq_set_type = zynq_gpio_set_irq_type, | 456 | .irq_set_type = zynq_gpio_set_irq_type, |
| @@ -469,10 +493,6 @@ static void zynq_gpio_irqhandler(unsigned int irq, struct irq_desc *desc) | |||
| 469 | offset); | 493 | offset); |
| 470 | generic_handle_irq(gpio_irq); | 494 | generic_handle_irq(gpio_irq); |
| 471 | } | 495 | } |
| 472 | |||
| 473 | /* clear IRQ in HW */ | ||
| 474 | writel_relaxed(int_sts, gpio->base_addr + | ||
| 475 | ZYNQ_GPIO_INTSTS_OFFSET(bank_num)); | ||
| 476 | } | 496 | } |
| 477 | } | 497 | } |
| 478 | 498 | ||
| @@ -610,14 +630,14 @@ static int zynq_gpio_probe(struct platform_device *pdev) | |||
| 610 | writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr + | 630 | writel_relaxed(ZYNQ_GPIO_IXR_DISABLE_ALL, gpio->base_addr + |
| 611 | ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); | 631 | ZYNQ_GPIO_INTDIS_OFFSET(bank_num)); |
| 612 | 632 | ||
| 613 | ret = gpiochip_irqchip_add(chip, &zynq_gpio_irqchip, 0, | 633 | ret = gpiochip_irqchip_add(chip, &zynq_gpio_edge_irqchip, 0, |
| 614 | handle_simple_irq, IRQ_TYPE_NONE); | 634 | handle_level_irq, IRQ_TYPE_NONE); |
| 615 | if (ret) { | 635 | if (ret) { |
| 616 | dev_err(&pdev->dev, "Failed to add irq chip\n"); | 636 | dev_err(&pdev->dev, "Failed to add irq chip\n"); |
| 617 | goto err_rm_gpiochip; | 637 | goto err_rm_gpiochip; |
| 618 | } | 638 | } |
| 619 | 639 | ||
| 620 | gpiochip_set_chained_irqchip(chip, &zynq_gpio_irqchip, irq, | 640 | gpiochip_set_chained_irqchip(chip, &zynq_gpio_edge_irqchip, irq, |
| 621 | zynq_gpio_irqhandler); | 641 | zynq_gpio_irqhandler); |
| 622 | 642 | ||
| 623 | pm_runtime_set_active(&pdev->dev); | 643 | pm_runtime_set_active(&pdev->dev); |
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index 7cfdc2278905..604dbe60bdee 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c | |||
| @@ -307,7 +307,5 @@ void of_gpiochip_add(struct gpio_chip *chip) | |||
| 307 | void of_gpiochip_remove(struct gpio_chip *chip) | 307 | void of_gpiochip_remove(struct gpio_chip *chip) |
| 308 | { | 308 | { |
| 309 | gpiochip_remove_pin_ranges(chip); | 309 | gpiochip_remove_pin_ranges(chip); |
| 310 | 310 | of_node_put(chip->of_node); | |
| 311 | if (chip->of_node) | ||
| 312 | of_node_put(chip->of_node); | ||
| 313 | } | 311 | } |
diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h index b7ce0c64c6f3..c7e17de732f3 100644 --- a/include/linux/gpio/consumer.h +++ b/include/linux/gpio/consumer.h | |||
| @@ -16,8 +16,6 @@ struct device; | |||
| 16 | */ | 16 | */ |
| 17 | struct gpio_desc; | 17 | struct gpio_desc; |
| 18 | 18 | ||
| 19 | #ifdef CONFIG_GPIOLIB | ||
| 20 | |||
| 21 | #define GPIOD_FLAGS_BIT_DIR_SET BIT(0) | 19 | #define GPIOD_FLAGS_BIT_DIR_SET BIT(0) |
| 22 | #define GPIOD_FLAGS_BIT_DIR_OUT BIT(1) | 20 | #define GPIOD_FLAGS_BIT_DIR_OUT BIT(1) |
| 23 | #define GPIOD_FLAGS_BIT_DIR_VAL BIT(2) | 21 | #define GPIOD_FLAGS_BIT_DIR_VAL BIT(2) |
| @@ -34,6 +32,8 @@ enum gpiod_flags { | |||
| 34 | GPIOD_FLAGS_BIT_DIR_VAL, | 32 | GPIOD_FLAGS_BIT_DIR_VAL, |
| 35 | }; | 33 | }; |
| 36 | 34 | ||
| 35 | #ifdef CONFIG_GPIOLIB | ||
| 36 | |||
| 37 | /* Acquire and dispose GPIOs */ | 37 | /* Acquire and dispose GPIOs */ |
| 38 | struct gpio_desc *__must_check __gpiod_get(struct device *dev, | 38 | struct gpio_desc *__must_check __gpiod_get(struct device *dev, |
| 39 | const char *con_id, | 39 | const char *con_id, |
