2323#include <linux/platform_device.h>
2424#include <linux/property.h>
2525#include <linux/regmap.h>
26+ #include <linux/seq_file.h>
2627#include <linux/slab.h>
2728#include <linux/string_helpers.h>
2829
@@ -101,7 +102,6 @@ struct armada_37xx_pinctrl {
101102 const struct armada_37xx_pin_data * data ;
102103 struct device * dev ;
103104 struct gpio_chip gpio_chip ;
104- struct irq_chip irq_chip ;
105105 raw_spinlock_t irq_lock ;
106106 struct pinctrl_desc pctl ;
107107 struct pinctrl_dev * pctl_dev ;
@@ -548,6 +548,7 @@ static void armada_37xx_irq_mask(struct irq_data *d)
548548 val = readl (info -> base + reg );
549549 writel (val & ~d -> mask , info -> base + reg );
550550 raw_spin_unlock_irqrestore (& info -> irq_lock , flags );
551+ gpiochip_disable_irq (chip , irqd_to_hwirq (d ));
551552}
552553
553554static void armada_37xx_irq_unmask (struct irq_data * d )
@@ -557,6 +558,7 @@ static void armada_37xx_irq_unmask(struct irq_data *d)
557558 u32 val , reg = IRQ_EN ;
558559 unsigned long flags ;
559560
561+ gpiochip_enable_irq (chip , irqd_to_hwirq (d ));
560562 armada_37xx_irq_update_reg (& reg , d );
561563 raw_spin_lock_irqsave (& info -> irq_lock , flags );
562564 val = readl (info -> base + reg );
@@ -729,11 +731,30 @@ static unsigned int armada_37xx_irq_startup(struct irq_data *d)
729731 return 0 ;
730732}
731733
734+ static void armada_37xx_irq_print_chip (struct irq_data * d , struct seq_file * p )
735+ {
736+ struct gpio_chip * chip = irq_data_get_irq_chip_data (d );
737+ struct armada_37xx_pinctrl * info = gpiochip_get_data (chip );
738+
739+ seq_printf (p , info -> data -> name );
740+ }
741+
742+ static const struct irq_chip armada_37xx_irqchip = {
743+ .irq_ack = armada_37xx_irq_ack ,
744+ .irq_mask = armada_37xx_irq_mask ,
745+ .irq_unmask = armada_37xx_irq_unmask ,
746+ .irq_set_wake = armada_37xx_irq_set_wake ,
747+ .irq_set_type = armada_37xx_irq_set_type ,
748+ .irq_startup = armada_37xx_irq_startup ,
749+ .irq_print_chip = armada_37xx_irq_print_chip ,
750+ .flags = IRQCHIP_IMMUTABLE ,
751+ GPIOCHIP_IRQ_RESOURCE_HELPERS ,
752+ };
753+
732754static int armada_37xx_irqchip_register (struct platform_device * pdev ,
733755 struct armada_37xx_pinctrl * info )
734756{
735757 struct gpio_chip * gc = & info -> gpio_chip ;
736- struct irq_chip * irqchip = & info -> irq_chip ;
737758 struct gpio_irq_chip * girq = & gc -> irq ;
738759 struct device_node * np = to_of_node (gc -> fwnode );
739760 struct device * dev = & pdev -> dev ;
@@ -751,14 +772,7 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,
751772 if (IS_ERR (info -> base ))
752773 return PTR_ERR (info -> base );
753774
754- irqchip -> irq_ack = armada_37xx_irq_ack ;
755- irqchip -> irq_mask = armada_37xx_irq_mask ;
756- irqchip -> irq_unmask = armada_37xx_irq_unmask ;
757- irqchip -> irq_set_wake = armada_37xx_irq_set_wake ;
758- irqchip -> irq_set_type = armada_37xx_irq_set_type ;
759- irqchip -> irq_startup = armada_37xx_irq_startup ;
760- irqchip -> name = info -> data -> name ;
761- girq -> chip = irqchip ;
775+ gpio_irq_chip_set_chip (girq , & armada_37xx_irqchip );
762776 girq -> parent_handler = armada_37xx_irq_handler ;
763777 /*
764778 * Many interrupts are connected to the parent interrupt
0 commit comments