Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: visconti: Convert to immutable irq_chip

Convert the driver to immutable irq-chip with a bit of
intuition.

The driver is for a hierarchical chip so some extra care
needs to be taken to introduce two new callbacks.

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

authored by

Linus Walleij and committed by
Bartosz Golaszewski
5cf3e019 8e43827b

+39 -11
+39 -11
drivers/gpio/gpio-visconti.c
··· 15 15 #include <linux/io.h> 16 16 #include <linux/of_irq.h> 17 17 #include <linux/platform_device.h> 18 + #include <linux/seq_file.h> 18 19 #include <linux/bitops.h> 19 20 20 21 /* register offset */ ··· 32 31 void __iomem *base; 33 32 spinlock_t lock; /* protect gpio register */ 34 33 struct gpio_chip gpio_chip; 35 - struct irq_chip irq_chip; 34 + struct device *dev; 36 35 }; 37 36 38 37 static int visconti_gpio_irq_set_type(struct irq_data *d, unsigned int type) ··· 120 119 return 0; 121 120 } 122 121 122 + static void visconti_gpio_mask_irq(struct irq_data *d) 123 + { 124 + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 125 + 126 + irq_chip_mask_parent(d); 127 + gpiochip_disable_irq(gc, irqd_to_hwirq(d)); 128 + } 129 + 130 + static void visconti_gpio_unmask_irq(struct irq_data *d) 131 + { 132 + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 133 + 134 + gpiochip_enable_irq(gc, irqd_to_hwirq(d)); 135 + irq_chip_unmask_parent(d); 136 + } 137 + 138 + static void visconti_gpio_irq_print_chip(struct irq_data *d, struct seq_file *p) 139 + { 140 + struct gpio_chip *gc = irq_data_get_irq_chip_data(d); 141 + struct visconti_gpio *priv = gpiochip_get_data(gc); 142 + 143 + seq_printf(p, dev_name(priv->dev)); 144 + } 145 + 146 + static const struct irq_chip visconti_gpio_irq_chip = { 147 + .irq_mask = visconti_gpio_mask_irq, 148 + .irq_unmask = visconti_gpio_unmask_irq, 149 + .irq_eoi = irq_chip_eoi_parent, 150 + .irq_set_type = visconti_gpio_irq_set_type, 151 + .irq_print_chip = visconti_gpio_irq_print_chip, 152 + .flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND | 153 + IRQCHIP_IMMUTABLE, 154 + GPIOCHIP_IRQ_RESOURCE_HELPERS, 155 + }; 156 + 123 157 static int visconti_gpio_probe(struct platform_device *pdev) 124 158 { 125 159 struct device *dev = &pdev->dev; 126 160 struct visconti_gpio *priv; 127 - struct irq_chip *irq_chip; 128 161 struct gpio_irq_chip *girq; 129 162 struct irq_domain *parent; 130 163 struct device_node *irq_parent; ··· 169 134 return -ENOMEM; 170 135 171 136 spin_lock_init(&priv->lock); 137 + priv->dev = dev; 172 138 173 139 priv->base = devm_platform_ioremap_resource(pdev, 0); 174 140 if (IS_ERR(priv->base)) ··· 200 164 return ret; 201 165 } 202 166 203 - irq_chip = &priv->irq_chip; 204 - irq_chip->name = dev_name(dev); 205 - irq_chip->irq_mask = irq_chip_mask_parent; 206 - irq_chip->irq_unmask = irq_chip_unmask_parent; 207 - irq_chip->irq_eoi = irq_chip_eoi_parent; 208 - irq_chip->irq_set_type = visconti_gpio_irq_set_type; 209 - irq_chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND; 210 - 211 167 girq = &priv->gpio_chip.irq; 212 - girq->chip = irq_chip; 168 + gpio_irq_chip_set_chip(girq, &visconti_gpio_irq_chip); 213 169 girq->fwnode = of_node_to_fwnode(dev->of_node); 214 170 girq->parent_domain = parent; 215 171 girq->child_to_parent_hwirq = visconti_gpio_child_to_parent_hwirq;