diff options
author | Thierry Reding <treding@nvidia.com> | 2017-11-07 13:15:52 -0500 |
---|---|---|
committer | Linus Walleij <linus.walleij@linaro.org> | 2017-11-08 08:10:18 -0500 |
commit | dc7b0387ee894c115ef5ddcaaf794125d6d9058c (patch) | |
tree | 074cc9142cac12525fef1eda6ab86aa832a2cf26 | |
parent | dc6bafee86897419b0908e8d1e52ef46ca0ea487 (diff) |
gpio: Move irq_valid_mask into struct gpio_irq_chip
In order to consolidate the multiple ways to associate an IRQ chip with
a GPIO chip, move more fields into the new struct gpio_irq_chip.
Signed-off-by: Thierry Reding <treding@nvidia.com>
Acked-by: Grygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r-- | Documentation/gpio/driver.txt | 4 | ||||
-rw-r--r-- | drivers/gpio/gpio-aspeed.c | 4 | ||||
-rw-r--r-- | drivers/gpio/gpio-stmpe.c | 4 | ||||
-rw-r--r-- | drivers/gpio/gpiolib.c | 16 | ||||
-rw-r--r-- | drivers/pinctrl/intel/pinctrl-baytrail.c | 4 | ||||
-rw-r--r-- | drivers/pinctrl/intel/pinctrl-cherryview.c | 4 | ||||
-rw-r--r-- | drivers/platform/x86/intel_int0002_vgpio.c | 4 | ||||
-rw-r--r-- | include/linux/gpio/driver.h | 21 |
8 files changed, 35 insertions, 26 deletions
diff --git a/Documentation/gpio/driver.txt b/Documentation/gpio/driver.txt index dcf6af1d9e56..d8de1c7de85a 100644 --- a/Documentation/gpio/driver.txt +++ b/Documentation/gpio/driver.txt | |||
@@ -313,8 +313,8 @@ symbol: | |||
313 | mark all the child IRQs as having the other IRQ as parent. | 313 | mark all the child IRQs as having the other IRQ as parent. |
314 | 314 | ||
315 | If there is a need to exclude certain GPIOs from the IRQ domain, you can | 315 | If there is a need to exclude certain GPIOs from the IRQ domain, you can |
316 | set .irq_need_valid_mask of the gpiochip before gpiochip_add_data() is | 316 | set .irq.need_valid_mask of the gpiochip before gpiochip_add_data() is |
317 | called. This allocates an .irq_valid_mask with as many bits set as there | 317 | called. This allocates an .irq.valid_mask with as many bits set as there |
318 | are GPIOs in the chip. Drivers can exclude GPIOs by clearing bits from this | 318 | are GPIOs in the chip. Drivers can exclude GPIOs by clearing bits from this |
319 | mask. The mask must be filled in before gpiochip_irqchip_add() or | 319 | mask. The mask must be filled in before gpiochip_irqchip_add() or |
320 | gpiochip_irqchip_add_nested() is called. | 320 | gpiochip_irqchip_add_nested() is called. |
diff --git a/drivers/gpio/gpio-aspeed.c b/drivers/gpio/gpio-aspeed.c index 2bfce0ab7326..8781817d9003 100644 --- a/drivers/gpio/gpio-aspeed.c +++ b/drivers/gpio/gpio-aspeed.c | |||
@@ -501,7 +501,7 @@ static void set_irq_valid_mask(struct aspeed_gpio *gpio) | |||
501 | if (i >= gpio->config->nr_gpios) | 501 | if (i >= gpio->config->nr_gpios) |
502 | break; | 502 | break; |
503 | 503 | ||
504 | clear_bit(i, gpio->chip.irq_valid_mask); | 504 | clear_bit(i, gpio->chip.irq.valid_mask); |
505 | } | 505 | } |
506 | 506 | ||
507 | props++; | 507 | props++; |
@@ -856,7 +856,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) | |||
856 | gpio->chip.set_config = aspeed_gpio_set_config; | 856 | gpio->chip.set_config = aspeed_gpio_set_config; |
857 | gpio->chip.label = dev_name(&pdev->dev); | 857 | gpio->chip.label = dev_name(&pdev->dev); |
858 | gpio->chip.base = -1; | 858 | gpio->chip.base = -1; |
859 | gpio->chip.irq_need_valid_mask = true; | 859 | gpio->chip.irq.need_valid_mask = true; |
860 | 860 | ||
861 | rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio); | 861 | rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio); |
862 | if (rc < 0) | 862 | if (rc < 0) |
diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c index 18d8bef76d85..e6e5cca624a7 100644 --- a/drivers/gpio/gpio-stmpe.c +++ b/drivers/gpio/gpio-stmpe.c | |||
@@ -451,7 +451,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev) | |||
451 | of_property_read_u32(np, "st,norequest-mask", | 451 | of_property_read_u32(np, "st,norequest-mask", |
452 | &stmpe_gpio->norequest_mask); | 452 | &stmpe_gpio->norequest_mask); |
453 | if (stmpe_gpio->norequest_mask) | 453 | if (stmpe_gpio->norequest_mask) |
454 | stmpe_gpio->chip.irq_need_valid_mask = true; | 454 | stmpe_gpio->chip.irq.need_valid_mask = true; |
455 | 455 | ||
456 | if (irq < 0) | 456 | if (irq < 0) |
457 | dev_info(&pdev->dev, | 457 | dev_info(&pdev->dev, |
@@ -482,7 +482,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev) | |||
482 | /* Forbid unused lines to be mapped as IRQs */ | 482 | /* Forbid unused lines to be mapped as IRQs */ |
483 | for (i = 0; i < sizeof(u32); i++) | 483 | for (i = 0; i < sizeof(u32); i++) |
484 | if (stmpe_gpio->norequest_mask & BIT(i)) | 484 | if (stmpe_gpio->norequest_mask & BIT(i)) |
485 | clear_bit(i, stmpe_gpio->chip.irq_valid_mask); | 485 | clear_bit(i, stmpe_gpio->chip.irq.valid_mask); |
486 | } | 486 | } |
487 | ret = gpiochip_irqchip_add_nested(&stmpe_gpio->chip, | 487 | ret = gpiochip_irqchip_add_nested(&stmpe_gpio->chip, |
488 | &stmpe_gpio_irq_chip, | 488 | &stmpe_gpio_irq_chip, |
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 236a9f55a265..0bf844470693 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c | |||
@@ -1504,33 +1504,33 @@ static struct gpio_chip *find_chip_by_name(const char *name) | |||
1504 | 1504 | ||
1505 | static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip) | 1505 | static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip) |
1506 | { | 1506 | { |
1507 | if (!gpiochip->irq_need_valid_mask) | 1507 | if (!gpiochip->irq.need_valid_mask) |
1508 | return 0; | 1508 | return 0; |
1509 | 1509 | ||
1510 | gpiochip->irq_valid_mask = kcalloc(BITS_TO_LONGS(gpiochip->ngpio), | 1510 | gpiochip->irq.valid_mask = kcalloc(BITS_TO_LONGS(gpiochip->ngpio), |
1511 | sizeof(long), GFP_KERNEL); | 1511 | sizeof(long), GFP_KERNEL); |
1512 | if (!gpiochip->irq_valid_mask) | 1512 | if (!gpiochip->irq.valid_mask) |
1513 | return -ENOMEM; | 1513 | return -ENOMEM; |
1514 | 1514 | ||
1515 | /* Assume by default all GPIOs are valid */ | 1515 | /* Assume by default all GPIOs are valid */ |
1516 | bitmap_fill(gpiochip->irq_valid_mask, gpiochip->ngpio); | 1516 | bitmap_fill(gpiochip->irq.valid_mask, gpiochip->ngpio); |
1517 | 1517 | ||
1518 | return 0; | 1518 | return 0; |
1519 | } | 1519 | } |
1520 | 1520 | ||
1521 | static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip) | 1521 | static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip) |
1522 | { | 1522 | { |
1523 | kfree(gpiochip->irq_valid_mask); | 1523 | kfree(gpiochip->irq.valid_mask); |
1524 | gpiochip->irq_valid_mask = NULL; | 1524 | gpiochip->irq.valid_mask = NULL; |
1525 | } | 1525 | } |
1526 | 1526 | ||
1527 | static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip, | 1527 | static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip, |
1528 | unsigned int offset) | 1528 | unsigned int offset) |
1529 | { | 1529 | { |
1530 | /* No mask means all valid */ | 1530 | /* No mask means all valid */ |
1531 | if (likely(!gpiochip->irq_valid_mask)) | 1531 | if (likely(!gpiochip->irq.valid_mask)) |
1532 | return true; | 1532 | return true; |
1533 | return test_bit(offset, gpiochip->irq_valid_mask); | 1533 | return test_bit(offset, gpiochip->irq.valid_mask); |
1534 | } | 1534 | } |
1535 | 1535 | ||
1536 | /** | 1536 | /** |
diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c index 5897981e5ed3..9c1ca29c60b7 100644 --- a/drivers/pinctrl/intel/pinctrl-baytrail.c +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c | |||
@@ -1660,7 +1660,7 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg) | |||
1660 | 1660 | ||
1661 | value = readl(reg); | 1661 | value = readl(reg); |
1662 | if (value & BYT_DIRECT_IRQ_EN) { | 1662 | if (value & BYT_DIRECT_IRQ_EN) { |
1663 | clear_bit(i, gc->irq_valid_mask); | 1663 | clear_bit(i, gc->irq.valid_mask); |
1664 | dev_dbg(dev, "excluding GPIO %d from IRQ domain\n", i); | 1664 | dev_dbg(dev, "excluding GPIO %d from IRQ domain\n", i); |
1665 | } else if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i)) { | 1665 | } else if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i)) { |
1666 | byt_gpio_clear_triggering(vg, i); | 1666 | byt_gpio_clear_triggering(vg, i); |
@@ -1703,7 +1703,7 @@ static int byt_gpio_probe(struct byt_gpio *vg) | |||
1703 | gc->can_sleep = false; | 1703 | gc->can_sleep = false; |
1704 | gc->parent = &vg->pdev->dev; | 1704 | gc->parent = &vg->pdev->dev; |
1705 | gc->ngpio = vg->soc_data->npins; | 1705 | gc->ngpio = vg->soc_data->npins; |
1706 | gc->irq_need_valid_mask = true; | 1706 | gc->irq.need_valid_mask = true; |
1707 | 1707 | ||
1708 | #ifdef CONFIG_PM_SLEEP | 1708 | #ifdef CONFIG_PM_SLEEP |
1709 | vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio, | 1709 | vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio, |
diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c index 1cd7043edbc1..e23def322de2 100644 --- a/drivers/pinctrl/intel/pinctrl-cherryview.c +++ b/drivers/pinctrl/intel/pinctrl-cherryview.c | |||
@@ -1584,7 +1584,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) | |||
1584 | chip->label = dev_name(pctrl->dev); | 1584 | chip->label = dev_name(pctrl->dev); |
1585 | chip->parent = pctrl->dev; | 1585 | chip->parent = pctrl->dev; |
1586 | chip->base = -1; | 1586 | chip->base = -1; |
1587 | chip->irq_need_valid_mask = need_valid_mask; | 1587 | chip->irq.need_valid_mask = need_valid_mask; |
1588 | 1588 | ||
1589 | ret = devm_gpiochip_add_data(pctrl->dev, chip, pctrl); | 1589 | ret = devm_gpiochip_add_data(pctrl->dev, chip, pctrl); |
1590 | if (ret) { | 1590 | if (ret) { |
@@ -1616,7 +1616,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) | |||
1616 | intsel >>= CHV_PADCTRL0_INTSEL_SHIFT; | 1616 | intsel >>= CHV_PADCTRL0_INTSEL_SHIFT; |
1617 | 1617 | ||
1618 | if (need_valid_mask && intsel >= pctrl->community->nirqs) | 1618 | if (need_valid_mask && intsel >= pctrl->community->nirqs) |
1619 | clear_bit(i, chip->irq_valid_mask); | 1619 | clear_bit(i, chip->irq.valid_mask); |
1620 | } | 1620 | } |
1621 | 1621 | ||
1622 | /* Clear all interrupts */ | 1622 | /* Clear all interrupts */ |
diff --git a/drivers/platform/x86/intel_int0002_vgpio.c b/drivers/platform/x86/intel_int0002_vgpio.c index f6b3af73dea5..f7b67e898abc 100644 --- a/drivers/platform/x86/intel_int0002_vgpio.c +++ b/drivers/platform/x86/intel_int0002_vgpio.c | |||
@@ -165,7 +165,7 @@ static int int0002_probe(struct platform_device *pdev) | |||
165 | chip->direction_output = int0002_gpio_direction_output; | 165 | chip->direction_output = int0002_gpio_direction_output; |
166 | chip->base = -1; | 166 | chip->base = -1; |
167 | chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1; | 167 | chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1; |
168 | chip->irq_need_valid_mask = true; | 168 | chip->irq.need_valid_mask = true; |
169 | 169 | ||
170 | ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL); | 170 | ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL); |
171 | if (ret) { | 171 | if (ret) { |
@@ -173,7 +173,7 @@ static int int0002_probe(struct platform_device *pdev) | |||
173 | return ret; | 173 | return ret; |
174 | } | 174 | } |
175 | 175 | ||
176 | bitmap_clear(chip->irq_valid_mask, 0, GPE0A_PME_B0_VIRT_GPIO_PIN); | 176 | bitmap_clear(chip->irq.valid_mask, 0, GPE0A_PME_B0_VIRT_GPIO_PIN); |
177 | 177 | ||
178 | /* | 178 | /* |
179 | * We manually request the irq here instead of passing a flow-handler | 179 | * We manually request the irq here instead of passing a flow-handler |
diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h index 1c3d06fe54b1..067efcd4f46d 100644 --- a/include/linux/gpio/driver.h +++ b/include/linux/gpio/driver.h | |||
@@ -99,6 +99,21 @@ struct gpio_irq_chip { | |||
99 | * True if set the interrupt handling is nested. | 99 | * True if set the interrupt handling is nested. |
100 | */ | 100 | */ |
101 | bool nested; | 101 | bool nested; |
102 | |||
103 | /** | ||
104 | * @need_valid_mask: | ||
105 | * | ||
106 | * If set core allocates @valid_mask with all bits set to one. | ||
107 | */ | ||
108 | bool need_valid_mask; | ||
109 | |||
110 | /** | ||
111 | * @valid_mask: | ||
112 | * | ||
113 | * If not %NULL holds bitmask of GPIOs which are valid to be included | ||
114 | * in IRQ domain of the chip. | ||
115 | */ | ||
116 | unsigned long *valid_mask; | ||
102 | }; | 117 | }; |
103 | 118 | ||
104 | static inline struct gpio_irq_chip *to_gpio_irq_chip(struct irq_chip *chip) | 119 | static inline struct gpio_irq_chip *to_gpio_irq_chip(struct irq_chip *chip) |
@@ -170,10 +185,6 @@ static inline struct gpio_irq_chip *to_gpio_irq_chip(struct irq_chip *chip) | |||
170 | * safely. | 185 | * safely. |
171 | * @bgpio_dir: shadowed direction register for generic GPIO to clear/set | 186 | * @bgpio_dir: shadowed direction register for generic GPIO to clear/set |
172 | * direction safely. | 187 | * direction safely. |
173 | * @irq_need_valid_mask: If set core allocates @irq_valid_mask with all | ||
174 | * bits set to one | ||
175 | * @irq_valid_mask: If not %NULL holds bitmask of GPIOs which are valid to | ||
176 | * be included in IRQ domain of the chip | ||
177 | * @lock_key: per GPIO IRQ chip lockdep class | 188 | * @lock_key: per GPIO IRQ chip lockdep class |
178 | * | 189 | * |
179 | * A gpio_chip can help platforms abstract various sources of GPIOs so | 190 | * A gpio_chip can help platforms abstract various sources of GPIOs so |
@@ -244,8 +255,6 @@ struct gpio_chip { | |||
244 | * With CONFIG_GPIOLIB_IRQCHIP we get an irqchip inside the gpiolib | 255 | * With CONFIG_GPIOLIB_IRQCHIP we get an irqchip inside the gpiolib |
245 | * to handle IRQs for most practical cases. | 256 | * to handle IRQs for most practical cases. |
246 | */ | 257 | */ |
247 | bool irq_need_valid_mask; | ||
248 | unsigned long *irq_valid_mask; | ||
249 | struct lock_class_key *lock_key; | 258 | struct lock_class_key *lock_key; |
250 | 259 | ||
251 | /** | 260 | /** |