41
41
* struct ftgpio_gpio - Gemini GPIO state container
42
42
* @dev: containing device for this instance
43
43
* @gc: gpiochip for this instance
44
- * @irq: irqchip for this instance
45
44
* @base: remapped I/O-memory base
46
45
* @clk: silicon clock
47
46
*/
48
47
struct ftgpio_gpio {
49
48
struct device * dev ;
50
49
struct gpio_chip gc ;
51
- struct irq_chip irq ;
52
50
void __iomem * base ;
53
51
struct clk * clk ;
54
52
};
@@ -70,6 +68,7 @@ static void ftgpio_gpio_mask_irq(struct irq_data *d)
70
68
val = readl (g -> base + GPIO_INT_EN );
71
69
val &= ~BIT (irqd_to_hwirq (d ));
72
70
writel (val , g -> base + GPIO_INT_EN );
71
+ gpiochip_disable_irq (gc , irqd_to_hwirq (d ));
73
72
}
74
73
75
74
static void ftgpio_gpio_unmask_irq (struct irq_data * d )
@@ -78,6 +77,7 @@ static void ftgpio_gpio_unmask_irq(struct irq_data *d)
78
77
struct ftgpio_gpio * g = gpiochip_get_data (gc );
79
78
u32 val ;
80
79
80
+ gpiochip_enable_irq (gc , irqd_to_hwirq (d ));
81
81
val = readl (g -> base + GPIO_INT_EN );
82
82
val |= BIT (irqd_to_hwirq (d ));
83
83
writel (val , g -> base + GPIO_INT_EN );
@@ -221,6 +221,16 @@ static int ftgpio_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
221
221
return 0 ;
222
222
}
223
223
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
+
224
234
static int ftgpio_gpio_probe (struct platform_device * pdev )
225
235
{
226
236
struct device * dev = & pdev -> dev ;
@@ -277,14 +287,8 @@ static int ftgpio_gpio_probe(struct platform_device *pdev)
277
287
if (!IS_ERR (g -> clk ))
278
288
g -> gc .set_config = ftgpio_gpio_set_config ;
279
289
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
-
286
290
girq = & g -> gc .irq ;
287
- girq -> chip = & g -> irq ;
291
+ gpio_irq_chip_set_chip ( girq , & ftgpio_irq_chip ) ;
288
292
girq -> parent_handler = ftgpio_gpio_irq_handler ;
289
293
girq -> num_parents = 1 ;
290
294
girq -> parents = devm_kcalloc (dev , 1 , sizeof (* girq -> parents ),
0 commit comments