2323#include <linux/kernel.h>
2424#include <linux/of_device.h>
2525#include <linux/of_irq.h>
26+ #include <linux/seq_file.h>
2627#include <linux/slab.h>
2728
2829#include <linux/pinctrl/consumer.h>
@@ -108,7 +109,6 @@ struct iproc_gpio {
108109
109110 raw_spinlock_t lock ;
110111
111- struct irq_chip irqchip ;
112112 struct gpio_chip gc ;
113113 unsigned num_banks ;
114114
@@ -217,7 +217,7 @@ static void iproc_gpio_irq_set_mask(struct irq_data *d, bool unmask)
217217{
218218 struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
219219 struct iproc_gpio * chip = gpiochip_get_data (gc );
220- unsigned gpio = d -> hwirq ;
220+ unsigned gpio = irqd_to_hwirq ( d ) ;
221221
222222 iproc_set_bit (chip , IPROC_GPIO_INT_MSK_OFFSET , gpio , unmask );
223223}
@@ -231,6 +231,7 @@ static void iproc_gpio_irq_mask(struct irq_data *d)
231231 raw_spin_lock_irqsave (& chip -> lock , flags );
232232 iproc_gpio_irq_set_mask (d , false);
233233 raw_spin_unlock_irqrestore (& chip -> lock , flags );
234+ gpiochip_disable_irq (gc , irqd_to_hwirq (d ));
234235}
235236
236237static void iproc_gpio_irq_unmask (struct irq_data * d )
@@ -239,6 +240,7 @@ static void iproc_gpio_irq_unmask(struct irq_data *d)
239240 struct iproc_gpio * chip = gpiochip_get_data (gc );
240241 unsigned long flags ;
241242
243+ gpiochip_enable_irq (gc , irqd_to_hwirq (d ));
242244 raw_spin_lock_irqsave (& chip -> lock , flags );
243245 iproc_gpio_irq_set_mask (d , true);
244246 raw_spin_unlock_irqrestore (& chip -> lock , flags );
@@ -302,6 +304,26 @@ static int iproc_gpio_irq_set_type(struct irq_data *d, unsigned int type)
302304 return 0 ;
303305}
304306
307+ static void iproc_gpio_irq_print_chip (struct irq_data * d , struct seq_file * p )
308+ {
309+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
310+ struct iproc_gpio * chip = gpiochip_get_data (gc );
311+
312+ seq_printf (p , dev_name (chip -> dev ));
313+ }
314+
315+ static const struct irq_chip iproc_gpio_irq_chip = {
316+ .irq_ack = iproc_gpio_irq_ack ,
317+ .irq_mask = iproc_gpio_irq_mask ,
318+ .irq_unmask = iproc_gpio_irq_unmask ,
319+ .irq_set_type = iproc_gpio_irq_set_type ,
320+ .irq_enable = iproc_gpio_irq_unmask ,
321+ .irq_disable = iproc_gpio_irq_mask ,
322+ .irq_print_chip = iproc_gpio_irq_print_chip ,
323+ .flags = IRQCHIP_IMMUTABLE ,
324+ GPIOCHIP_IRQ_RESOURCE_HELPERS ,
325+ };
326+
305327/*
306328 * Request the Iproc IOMUX pinmux controller to mux individual pins to GPIO
307329 */
@@ -852,20 +874,10 @@ static int iproc_gpio_probe(struct platform_device *pdev)
852874 /* optional GPIO interrupt support */
853875 irq = platform_get_irq_optional (pdev , 0 );
854876 if (irq > 0 ) {
855- struct irq_chip * irqc ;
856877 struct gpio_irq_chip * girq ;
857878
858- irqc = & chip -> irqchip ;
859- irqc -> name = dev_name (dev );
860- irqc -> irq_ack = iproc_gpio_irq_ack ;
861- irqc -> irq_mask = iproc_gpio_irq_mask ;
862- irqc -> irq_unmask = iproc_gpio_irq_unmask ;
863- irqc -> irq_set_type = iproc_gpio_irq_set_type ;
864- irqc -> irq_enable = iproc_gpio_irq_unmask ;
865- irqc -> irq_disable = iproc_gpio_irq_mask ;
866-
867879 girq = & gc -> irq ;
868- girq -> chip = irqc ;
880+ gpio_irq_chip_set_chip ( girq , & iproc_gpio_irq_chip ) ;
869881 girq -> parent_handler = iproc_gpio_irq_handler ;
870882 girq -> num_parents = 1 ;
871883 girq -> parents = devm_kcalloc (dev , 1 ,
0 commit comments