aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2017-11-07 13:15:52 -0500
committerLinus Walleij <linus.walleij@linaro.org>2017-11-08 08:10:18 -0500
commitdc7b0387ee894c115ef5ddcaaf794125d6d9058c (patch)
tree074cc9142cac12525fef1eda6ab86aa832a2cf26
parentdc6bafee86897419b0908e8d1e52ef46ca0ea487 (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.txt4
-rw-r--r--drivers/gpio/gpio-aspeed.c4
-rw-r--r--drivers/gpio/gpio-stmpe.c4
-rw-r--r--drivers/gpio/gpiolib.c16
-rw-r--r--drivers/pinctrl/intel/pinctrl-baytrail.c4
-rw-r--r--drivers/pinctrl/intel/pinctrl-cherryview.c4
-rw-r--r--drivers/platform/x86/intel_int0002_vgpio.c4
-rw-r--r--include/linux/gpio/driver.h21
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
315If there is a need to exclude certain GPIOs from the IRQ domain, you can 315If there is a need to exclude certain GPIOs from the IRQ domain, you can
316set .irq_need_valid_mask of the gpiochip before gpiochip_add_data() is 316set .irq.need_valid_mask of the gpiochip before gpiochip_add_data() is
317called. This allocates an .irq_valid_mask with as many bits set as there 317called. This allocates an .irq.valid_mask with as many bits set as there
318are GPIOs in the chip. Drivers can exclude GPIOs by clearing bits from this 318are GPIOs in the chip. Drivers can exclude GPIOs by clearing bits from this
319mask. The mask must be filled in before gpiochip_irqchip_add() or 319mask. The mask must be filled in before gpiochip_irqchip_add() or
320gpiochip_irqchip_add_nested() is called. 320gpiochip_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
1505static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip) 1505static 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
1521static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip) 1521static 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
1527static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip, 1527static 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
104static inline struct gpio_irq_chip *to_gpio_irq_chip(struct irq_chip *chip) 119static 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 /**