1111#include <linux/kernel.h>
1212#include <linux/module.h>
1313#include <linux/platform_device.h>
14+ #include <linux/seq_file.h>
1415#include <linux/spinlock.h>
1516
1617#define IPROC_CCA_INT_F_GPIOINT BIT(0)
2728#define IPROC_GPIO_CCA_INT_EDGE 0x24
2829
2930struct iproc_gpio_chip {
30- struct irq_chip irqchip ;
3131 struct gpio_chip gc ;
3232 spinlock_t lock ;
3333 struct device * dev ;
@@ -69,6 +69,7 @@ static void iproc_gpio_irq_unmask(struct irq_data *d)
6969 u32 irq = d -> irq ;
7070 u32 int_mask , irq_type , event_mask ;
7171
72+ gpiochip_enable_irq (gc , pin );
7273 spin_lock_irqsave (& chip -> lock , flags );
7374 irq_type = irq_get_trigger_type (irq );
7475 event_mask = readl_relaxed (chip -> base + IPROC_GPIO_CCA_INT_EVENT_MASK );
@@ -110,6 +111,7 @@ static void iproc_gpio_irq_mask(struct irq_data *d)
110111 chip -> base + IPROC_GPIO_CCA_INT_LEVEL_MASK );
111112 }
112113 spin_unlock_irqrestore (& chip -> lock , flags );
114+ gpiochip_disable_irq (gc , pin );
113115}
114116
115117static int iproc_gpio_irq_set_type (struct irq_data * d , u32 type )
@@ -191,6 +193,24 @@ static irqreturn_t iproc_gpio_irq_handler(int irq, void *data)
191193 return int_bits ? IRQ_HANDLED : IRQ_NONE ;
192194}
193195
196+ static void iproc_gpio_irq_print_chip (struct irq_data * d , struct seq_file * p )
197+ {
198+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
199+ struct iproc_gpio_chip * chip = to_iproc_gpio (gc );
200+
201+ seq_printf (p , dev_name (chip -> dev ));
202+ }
203+
204+ static const struct irq_chip iproc_gpio_irq_chip = {
205+ .irq_ack = iproc_gpio_irq_ack ,
206+ .irq_mask = iproc_gpio_irq_mask ,
207+ .irq_unmask = iproc_gpio_irq_unmask ,
208+ .irq_set_type = iproc_gpio_irq_set_type ,
209+ .irq_print_chip = iproc_gpio_irq_print_chip ,
210+ .flags = IRQCHIP_IMMUTABLE ,
211+ GPIOCHIP_IRQ_RESOURCE_HELPERS ,
212+ };
213+
194214static int iproc_gpio_probe (struct platform_device * pdev )
195215{
196216 struct device * dev = & pdev -> dev ;
@@ -230,16 +250,8 @@ static int iproc_gpio_probe(struct platform_device *pdev)
230250 irq = platform_get_irq (pdev , 0 );
231251 if (irq > 0 ) {
232252 struct gpio_irq_chip * girq ;
233- struct irq_chip * irqc ;
234253 u32 val ;
235254
236- irqc = & chip -> irqchip ;
237- irqc -> name = dev_name (dev );
238- irqc -> irq_ack = iproc_gpio_irq_ack ;
239- irqc -> irq_mask = iproc_gpio_irq_mask ;
240- irqc -> irq_unmask = iproc_gpio_irq_unmask ;
241- irqc -> irq_set_type = iproc_gpio_irq_set_type ;
242-
243255 chip -> intr = devm_platform_ioremap_resource (pdev , 1 );
244256 if (IS_ERR (chip -> intr ))
245257 return PTR_ERR (chip -> intr );
@@ -261,7 +273,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
261273 }
262274
263275 girq = & chip -> gc .irq ;
264- girq -> chip = irqc ;
276+ gpio_irq_chip_set_chip ( girq , & iproc_gpio_irq_chip ) ;
265277 /* This will let us handle the parent IRQ in the driver */
266278 girq -> parent_handler = NULL ;
267279 girq -> num_parents = 0 ;
0 commit comments