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 */
4847struct 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
7574static 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+
224234static 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