1515#include <linux/io.h>
1616#include <linux/of_irq.h>
1717#include <linux/platform_device.h>
18+ #include <linux/seq_file.h>
1819#include <linux/bitops.h>
1920
2021/* register offset */
@@ -31,7 +32,7 @@ struct visconti_gpio {
3132 void __iomem * base ;
3233 spinlock_t lock ; /* protect gpio register */
3334 struct gpio_chip gpio_chip ;
34- struct irq_chip irq_chip ;
35+ struct device * dev ;
3536};
3637
3738static int visconti_gpio_irq_set_type (struct irq_data * d , unsigned int type )
@@ -119,11 +120,45 @@ static int visconti_gpio_populate_parent_fwspec(struct gpio_chip *chip,
119120 return 0 ;
120121}
121122
123+ static void visconti_gpio_mask_irq (struct irq_data * d )
124+ {
125+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
126+
127+ irq_chip_mask_parent (d );
128+ gpiochip_disable_irq (gc , irqd_to_hwirq (d ));
129+ }
130+
131+ static void visconti_gpio_unmask_irq (struct irq_data * d )
132+ {
133+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
134+
135+ gpiochip_enable_irq (gc , irqd_to_hwirq (d ));
136+ irq_chip_unmask_parent (d );
137+ }
138+
139+ static void visconti_gpio_irq_print_chip (struct irq_data * d , struct seq_file * p )
140+ {
141+ struct gpio_chip * gc = irq_data_get_irq_chip_data (d );
142+ struct visconti_gpio * priv = gpiochip_get_data (gc );
143+
144+ seq_printf (p , dev_name (priv -> dev ));
145+ }
146+
147+ static const struct irq_chip visconti_gpio_irq_chip = {
148+ .irq_mask = visconti_gpio_mask_irq ,
149+ .irq_unmask = visconti_gpio_unmask_irq ,
150+ .irq_eoi = irq_chip_eoi_parent ,
151+ .irq_set_type = visconti_gpio_irq_set_type ,
152+ .irq_print_chip = visconti_gpio_irq_print_chip ,
153+ .flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND |
154+ IRQCHIP_IMMUTABLE ,
155+ GPIOCHIP_IRQ_RESOURCE_HELPERS ,
156+ };
157+
122158static int visconti_gpio_probe (struct platform_device * pdev )
123159{
124160 struct device * dev = & pdev -> dev ;
125161 struct visconti_gpio * priv ;
126- struct irq_chip * irq_chip ;
127162 struct gpio_irq_chip * girq ;
128163 struct irq_domain * parent ;
129164 struct device_node * irq_parent ;
@@ -134,6 +169,7 @@ static int visconti_gpio_probe(struct platform_device *pdev)
134169 return - ENOMEM ;
135170
136171 spin_lock_init (& priv -> lock );
172+ priv -> dev = dev ;
137173
138174 priv -> base = devm_platform_ioremap_resource (pdev , 0 );
139175 if (IS_ERR (priv -> base ))
@@ -164,16 +200,8 @@ static int visconti_gpio_probe(struct platform_device *pdev)
164200 return ret ;
165201 }
166202
167- irq_chip = & priv -> irq_chip ;
168- irq_chip -> name = dev_name (dev );
169- irq_chip -> irq_mask = irq_chip_mask_parent ;
170- irq_chip -> irq_unmask = irq_chip_unmask_parent ;
171- irq_chip -> irq_eoi = irq_chip_eoi_parent ;
172- irq_chip -> irq_set_type = visconti_gpio_irq_set_type ;
173- irq_chip -> flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND ;
174-
175203 girq = & priv -> gpio_chip .irq ;
176- girq -> chip = irq_chip ;
204+ gpio_irq_chip_set_chip ( girq , & visconti_gpio_irq_chip ) ;
177205 girq -> fwnode = of_node_to_fwnode (dev -> of_node );
178206 girq -> parent_domain = parent ;
179207 girq -> child_to_parent_hwirq = visconti_gpio_child_to_parent_hwirq ;
0 commit comments