提交 dc7b0387 编写于 作者: T Thierry Reding 提交者: Linus Walleij

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: NThierry Reding <treding@nvidia.com>
Acked-by: NGrygorii Strashko <grygorii.strashko@ti.com>
Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
上级 dc6bafee
...@@ -313,8 +313,8 @@ symbol: ...@@ -313,8 +313,8 @@ symbol:
mark all the child IRQs as having the other IRQ as parent. mark all the child IRQs as having the other IRQ as parent.
If there is a need to exclude certain GPIOs from the IRQ domain, you can If there is a need to exclude certain GPIOs from the IRQ domain, you can
set .irq_need_valid_mask of the gpiochip before gpiochip_add_data() is set .irq.need_valid_mask of the gpiochip before gpiochip_add_data() is
called. This allocates an .irq_valid_mask with as many bits set as there called. This allocates an .irq.valid_mask with as many bits set as there
are GPIOs in the chip. Drivers can exclude GPIOs by clearing bits from this are GPIOs in the chip. Drivers can exclude GPIOs by clearing bits from this
mask. The mask must be filled in before gpiochip_irqchip_add() or mask. The mask must be filled in before gpiochip_irqchip_add() or
gpiochip_irqchip_add_nested() is called. gpiochip_irqchip_add_nested() is called.
......
...@@ -501,7 +501,7 @@ static void set_irq_valid_mask(struct aspeed_gpio *gpio) ...@@ -501,7 +501,7 @@ static void set_irq_valid_mask(struct aspeed_gpio *gpio)
if (i >= gpio->config->nr_gpios) if (i >= gpio->config->nr_gpios)
break; break;
clear_bit(i, gpio->chip.irq_valid_mask); clear_bit(i, gpio->chip.irq.valid_mask);
} }
props++; props++;
...@@ -856,7 +856,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev) ...@@ -856,7 +856,7 @@ static int __init aspeed_gpio_probe(struct platform_device *pdev)
gpio->chip.set_config = aspeed_gpio_set_config; gpio->chip.set_config = aspeed_gpio_set_config;
gpio->chip.label = dev_name(&pdev->dev); gpio->chip.label = dev_name(&pdev->dev);
gpio->chip.base = -1; gpio->chip.base = -1;
gpio->chip.irq_need_valid_mask = true; gpio->chip.irq.need_valid_mask = true;
rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio); rc = devm_gpiochip_add_data(&pdev->dev, &gpio->chip, gpio);
if (rc < 0) if (rc < 0)
......
...@@ -451,7 +451,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev) ...@@ -451,7 +451,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev)
of_property_read_u32(np, "st,norequest-mask", of_property_read_u32(np, "st,norequest-mask",
&stmpe_gpio->norequest_mask); &stmpe_gpio->norequest_mask);
if (stmpe_gpio->norequest_mask) if (stmpe_gpio->norequest_mask)
stmpe_gpio->chip.irq_need_valid_mask = true; stmpe_gpio->chip.irq.need_valid_mask = true;
if (irq < 0) if (irq < 0)
dev_info(&pdev->dev, dev_info(&pdev->dev,
...@@ -482,7 +482,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev) ...@@ -482,7 +482,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev)
/* Forbid unused lines to be mapped as IRQs */ /* Forbid unused lines to be mapped as IRQs */
for (i = 0; i < sizeof(u32); i++) for (i = 0; i < sizeof(u32); i++)
if (stmpe_gpio->norequest_mask & BIT(i)) if (stmpe_gpio->norequest_mask & BIT(i))
clear_bit(i, stmpe_gpio->chip.irq_valid_mask); clear_bit(i, stmpe_gpio->chip.irq.valid_mask);
} }
ret = gpiochip_irqchip_add_nested(&stmpe_gpio->chip, ret = gpiochip_irqchip_add_nested(&stmpe_gpio->chip,
&stmpe_gpio_irq_chip, &stmpe_gpio_irq_chip,
......
...@@ -1504,33 +1504,33 @@ static struct gpio_chip *find_chip_by_name(const char *name) ...@@ -1504,33 +1504,33 @@ static struct gpio_chip *find_chip_by_name(const char *name)
static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip) static int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gpiochip)
{ {
if (!gpiochip->irq_need_valid_mask) if (!gpiochip->irq.need_valid_mask)
return 0; return 0;
gpiochip->irq_valid_mask = kcalloc(BITS_TO_LONGS(gpiochip->ngpio), gpiochip->irq.valid_mask = kcalloc(BITS_TO_LONGS(gpiochip->ngpio),
sizeof(long), GFP_KERNEL); sizeof(long), GFP_KERNEL);
if (!gpiochip->irq_valid_mask) if (!gpiochip->irq.valid_mask)
return -ENOMEM; return -ENOMEM;
/* Assume by default all GPIOs are valid */ /* Assume by default all GPIOs are valid */
bitmap_fill(gpiochip->irq_valid_mask, gpiochip->ngpio); bitmap_fill(gpiochip->irq.valid_mask, gpiochip->ngpio);
return 0; return 0;
} }
static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip) static void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gpiochip)
{ {
kfree(gpiochip->irq_valid_mask); kfree(gpiochip->irq.valid_mask);
gpiochip->irq_valid_mask = NULL; gpiochip->irq.valid_mask = NULL;
} }
static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip, static bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip,
unsigned int offset) unsigned int offset)
{ {
/* No mask means all valid */ /* No mask means all valid */
if (likely(!gpiochip->irq_valid_mask)) if (likely(!gpiochip->irq.valid_mask))
return true; return true;
return test_bit(offset, gpiochip->irq_valid_mask); return test_bit(offset, gpiochip->irq.valid_mask);
} }
/** /**
......
...@@ -1660,7 +1660,7 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg) ...@@ -1660,7 +1660,7 @@ static void byt_gpio_irq_init_hw(struct byt_gpio *vg)
value = readl(reg); value = readl(reg);
if (value & BYT_DIRECT_IRQ_EN) { if (value & BYT_DIRECT_IRQ_EN) {
clear_bit(i, gc->irq_valid_mask); clear_bit(i, gc->irq.valid_mask);
dev_dbg(dev, "excluding GPIO %d from IRQ domain\n", i); dev_dbg(dev, "excluding GPIO %d from IRQ domain\n", i);
} else if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i)) { } else if ((value & BYT_PIN_MUX) == byt_get_gpio_mux(vg, i)) {
byt_gpio_clear_triggering(vg, i); byt_gpio_clear_triggering(vg, i);
...@@ -1703,7 +1703,7 @@ static int byt_gpio_probe(struct byt_gpio *vg) ...@@ -1703,7 +1703,7 @@ static int byt_gpio_probe(struct byt_gpio *vg)
gc->can_sleep = false; gc->can_sleep = false;
gc->parent = &vg->pdev->dev; gc->parent = &vg->pdev->dev;
gc->ngpio = vg->soc_data->npins; gc->ngpio = vg->soc_data->npins;
gc->irq_need_valid_mask = true; gc->irq.need_valid_mask = true;
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio, vg->saved_context = devm_kcalloc(&vg->pdev->dev, gc->ngpio,
......
...@@ -1584,7 +1584,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) ...@@ -1584,7 +1584,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
chip->label = dev_name(pctrl->dev); chip->label = dev_name(pctrl->dev);
chip->parent = pctrl->dev; chip->parent = pctrl->dev;
chip->base = -1; chip->base = -1;
chip->irq_need_valid_mask = need_valid_mask; chip->irq.need_valid_mask = need_valid_mask;
ret = devm_gpiochip_add_data(pctrl->dev, chip, pctrl); ret = devm_gpiochip_add_data(pctrl->dev, chip, pctrl);
if (ret) { if (ret) {
...@@ -1616,7 +1616,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) ...@@ -1616,7 +1616,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
intsel >>= CHV_PADCTRL0_INTSEL_SHIFT; intsel >>= CHV_PADCTRL0_INTSEL_SHIFT;
if (need_valid_mask && intsel >= pctrl->community->nirqs) if (need_valid_mask && intsel >= pctrl->community->nirqs)
clear_bit(i, chip->irq_valid_mask); clear_bit(i, chip->irq.valid_mask);
} }
/* Clear all interrupts */ /* Clear all interrupts */
......
...@@ -165,7 +165,7 @@ static int int0002_probe(struct platform_device *pdev) ...@@ -165,7 +165,7 @@ static int int0002_probe(struct platform_device *pdev)
chip->direction_output = int0002_gpio_direction_output; chip->direction_output = int0002_gpio_direction_output;
chip->base = -1; chip->base = -1;
chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1; chip->ngpio = GPE0A_PME_B0_VIRT_GPIO_PIN + 1;
chip->irq_need_valid_mask = true; chip->irq.need_valid_mask = true;
ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL); ret = devm_gpiochip_add_data(&pdev->dev, chip, NULL);
if (ret) { if (ret) {
...@@ -173,7 +173,7 @@ static int int0002_probe(struct platform_device *pdev) ...@@ -173,7 +173,7 @@ static int int0002_probe(struct platform_device *pdev)
return ret; return ret;
} }
bitmap_clear(chip->irq_valid_mask, 0, GPE0A_PME_B0_VIRT_GPIO_PIN); bitmap_clear(chip->irq.valid_mask, 0, GPE0A_PME_B0_VIRT_GPIO_PIN);
/* /*
* We manually request the irq here instead of passing a flow-handler * We manually request the irq here instead of passing a flow-handler
......
...@@ -99,6 +99,21 @@ struct gpio_irq_chip { ...@@ -99,6 +99,21 @@ struct gpio_irq_chip {
* True if set the interrupt handling is nested. * True if set the interrupt handling is nested.
*/ */
bool nested; bool nested;
/**
* @need_valid_mask:
*
* If set core allocates @valid_mask with all bits set to one.
*/
bool need_valid_mask;
/**
* @valid_mask:
*
* If not %NULL holds bitmask of GPIOs which are valid to be included
* in IRQ domain of the chip.
*/
unsigned long *valid_mask;
}; };
static inline struct gpio_irq_chip *to_gpio_irq_chip(struct irq_chip *chip) 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,10 +185,6 @@ static inline struct gpio_irq_chip *to_gpio_irq_chip(struct irq_chip *chip)
* safely. * safely.
* @bgpio_dir: shadowed direction register for generic GPIO to clear/set * @bgpio_dir: shadowed direction register for generic GPIO to clear/set
* direction safely. * direction safely.
* @irq_need_valid_mask: If set core allocates @irq_valid_mask with all
* bits set to one
* @irq_valid_mask: If not %NULL holds bitmask of GPIOs which are valid to
* be included in IRQ domain of the chip
* @lock_key: per GPIO IRQ chip lockdep class * @lock_key: per GPIO IRQ chip lockdep class
* *
* A gpio_chip can help platforms abstract various sources of GPIOs so * A gpio_chip can help platforms abstract various sources of GPIOs so
...@@ -244,8 +255,6 @@ struct gpio_chip { ...@@ -244,8 +255,6 @@ struct gpio_chip {
* With CONFIG_GPIOLIB_IRQCHIP we get an irqchip inside the gpiolib * With CONFIG_GPIOLIB_IRQCHIP we get an irqchip inside the gpiolib
* to handle IRQs for most practical cases. * to handle IRQs for most practical cases.
*/ */
bool irq_need_valid_mask;
unsigned long *irq_valid_mask;
struct lock_class_key *lock_key; struct lock_class_key *lock_key;
/** /**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册