Skip to content

Commit ab637d4

Browse files
linuswbrgl
authored andcommitted
gpio: ftgpio010: Make irqchip immutable
This turns the FTGPIO010 irqchip immutable. Tested on the D-Link DIR-685. Cc: Marc Zyngier <[email protected]> Signed-off-by: Linus Walleij <[email protected]> Acked-by: Marc Zyngier <[email protected]> Signed-off-by: Bartosz Golaszewski <[email protected]>
1 parent 02743c4 commit ab637d4

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

drivers/gpio/gpio-ftgpio010.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,12 @@
4141
* struct ftgpio_gpio - Gemini GPIO state container
4242
* @dev: containing device for this instance
4343
* @gc: gpiochip for this instance
44-
* @irq: irqchip for this instance
4544
* @base: remapped I/O-memory base
4645
* @clk: silicon clock
4746
*/
4847
struct ftgpio_gpio {
4948
struct device *dev;
5049
struct gpio_chip gc;
51-
struct irq_chip irq;
5250
void __iomem *base;
5351
struct clk *clk;
5452
};
@@ -70,6 +68,7 @@ static void ftgpio_gpio_mask_irq(struct irq_data *d)
7068
val = readl(g->base + GPIO_INT_EN);
7169
val &= ~BIT(irqd_to_hwirq(d));
7270
writel(val, g->base + GPIO_INT_EN);
71+
gpiochip_disable_irq(gc, irqd_to_hwirq(d));
7372
}
7473

7574
static void ftgpio_gpio_unmask_irq(struct irq_data *d)
@@ -78,6 +77,7 @@ static void ftgpio_gpio_unmask_irq(struct irq_data *d)
7877
struct ftgpio_gpio *g = gpiochip_get_data(gc);
7978
u32 val;
8079

80+
gpiochip_enable_irq(gc, irqd_to_hwirq(d));
8181
val = readl(g->base + GPIO_INT_EN);
8282
val |= BIT(irqd_to_hwirq(d));
8383
writel(val, g->base + GPIO_INT_EN);
@@ -221,6 +221,16 @@ static int ftgpio_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
221221
return 0;
222222
}
223223

224+
static const struct irq_chip ftgpio_irq_chip = {
225+
.name = "FTGPIO010",
226+
.irq_ack = ftgpio_gpio_ack_irq,
227+
.irq_mask = ftgpio_gpio_mask_irq,
228+
.irq_unmask = ftgpio_gpio_unmask_irq,
229+
.irq_set_type = ftgpio_gpio_set_irq_type,
230+
.flags = IRQCHIP_IMMUTABLE,
231+
GPIOCHIP_IRQ_RESOURCE_HELPERS,
232+
};
233+
224234
static int ftgpio_gpio_probe(struct platform_device *pdev)
225235
{
226236
struct device *dev = &pdev->dev;
@@ -277,14 +287,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev)
277287
if (!IS_ERR(g->clk))
278288
g->gc.set_config = ftgpio_gpio_set_config;
279289

280-
g->irq.name = "FTGPIO010";
281-
g->irq.irq_ack = ftgpio_gpio_ack_irq;
282-
g->irq.irq_mask = ftgpio_gpio_mask_irq;
283-
g->irq.irq_unmask = ftgpio_gpio_unmask_irq;
284-
g->irq.irq_set_type = ftgpio_gpio_set_irq_type;
285-
286290
girq = &g->gc.irq;
287-
girq->chip = &g->irq;
291+
gpio_irq_chip_set_chip(girq, &ftgpio_irq_chip);
288292
girq->parent_handler = ftgpio_gpio_irq_handler;
289293
girq->num_parents = 1;
290294
girq->parents = devm_kcalloc(dev, 1, sizeof(*girq->parents),

0 commit comments

Comments
 (0)