Commit 4892d3a6 authored by Linus Walleij's avatar Linus Walleij

gpio: Drop the parent_irq from gpio_irq_chip

We already have an array named "parents" so instead
of letting one point to the other, simply allocate a
dynamic array to hold the parents, just one if desired
and drop the number of members in gpio_irq_chip by
1. Rename gpiochip to gc in the process.
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 9a82ee69
...@@ -1644,39 +1644,47 @@ EXPORT_SYMBOL_GPL(gpiochip_irqchip_irq_valid); ...@@ -1644,39 +1644,47 @@ EXPORT_SYMBOL_GPL(gpiochip_irqchip_irq_valid);
/** /**
* gpiochip_set_cascaded_irqchip() - connects a cascaded irqchip to a gpiochip * gpiochip_set_cascaded_irqchip() - connects a cascaded irqchip to a gpiochip
* @gpiochip: the gpiochip to set the irqchip chain to * @gc: the gpiochip to set the irqchip chain to
* @parent_irq: the irq number corresponding to the parent IRQ for this * @parent_irq: the irq number corresponding to the parent IRQ for this
* chained irqchip * chained irqchip
* @parent_handler: the parent interrupt handler for the accumulated IRQ * @parent_handler: the parent interrupt handler for the accumulated IRQ
* coming out of the gpiochip. If the interrupt is nested rather than * coming out of the gpiochip. If the interrupt is nested rather than
* cascaded, pass NULL in this handler argument * cascaded, pass NULL in this handler argument
*/ */
static void gpiochip_set_cascaded_irqchip(struct gpio_chip *gpiochip, static void gpiochip_set_cascaded_irqchip(struct gpio_chip *gc,
unsigned int parent_irq, unsigned int parent_irq,
irq_flow_handler_t parent_handler) irq_flow_handler_t parent_handler)
{ {
if (!gpiochip->irq.domain) { struct gpio_irq_chip *girq = &gc->irq;
chip_err(gpiochip, "called %s before setting up irqchip\n", struct device *dev = &gc->gpiodev->dev;
if (!girq->domain) {
chip_err(gc, "called %s before setting up irqchip\n",
__func__); __func__);
return; return;
} }
if (parent_handler) { if (parent_handler) {
if (gpiochip->can_sleep) { if (gc->can_sleep) {
chip_err(gpiochip, chip_err(gc,
"you cannot have chained interrupts on a chip that may sleep\n"); "you cannot have chained interrupts on a chip that may sleep\n");
return; return;
} }
girq->parents = devm_kcalloc(dev, 1,
sizeof(*girq->parents),
GFP_KERNEL);
if (!girq->parents) {
chip_err(gc, "out of memory allocating parent IRQ\n");
return;
}
girq->parents[0] = parent_irq;
girq->num_parents = 1;
/* /*
* The parent irqchip is already using the chip_data for this * The parent irqchip is already using the chip_data for this
* irqchip, so our callbacks simply use the handler_data. * irqchip, so our callbacks simply use the handler_data.
*/ */
irq_set_chained_handler_and_data(parent_irq, parent_handler, irq_set_chained_handler_and_data(parent_irq, parent_handler,
gpiochip); gc);
gpiochip->irq.parent_irq = parent_irq;
gpiochip->irq.parents = &gpiochip->irq.parent_irq;
gpiochip->irq.num_parents = 1;
} }
} }
......
...@@ -102,13 +102,6 @@ struct gpio_irq_chip { ...@@ -102,13 +102,6 @@ struct gpio_irq_chip {
*/ */
unsigned int num_parents; unsigned int num_parents;
/**
* @parent_irq:
*
* For use by gpiochip_set_cascaded_irqchip()
*/
unsigned int parent_irq;
/** /**
* @parents: * @parents:
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment