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

Configure Feed

Select the types of activity you want to include in your feed.

gpio: spacemit-k1: use new generic GPIO chip API

Convert the driver to using the new generic GPIO chip interfaces from
linux/gpio/generic.h.

Reviewed-by: Yixun Lan <dlan@gentoo.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20250910-gpio-mmio-gpio-conv-part4-v2-12-f3d1a4c57124@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>

+20 -8
+20 -8
drivers/gpio/gpio-spacemit-k1.c
··· 6 6 7 7 #include <linux/clk.h> 8 8 #include <linux/gpio/driver.h> 9 + #include <linux/gpio/generic.h> 9 10 #include <linux/init.h> 10 11 #include <linux/interrupt.h> 11 12 #include <linux/io.h> ··· 39 38 struct spacemit_gpio; 40 39 41 40 struct spacemit_gpio_bank { 42 - struct gpio_chip gc; 41 + struct gpio_generic_chip chip; 43 42 struct spacemit_gpio *sg; 44 43 void __iomem *base; 45 44 u32 irq_mask; ··· 73 72 return IRQ_NONE; 74 73 75 74 for_each_set_bit(n, &pending, BITS_PER_LONG) 76 - handle_nested_irq(irq_find_mapping(gb->gc.irq.domain, n)); 75 + handle_nested_irq(irq_find_mapping(gb->chip.gc.irq.domain, n)); 77 76 78 77 return IRQ_HANDLED; 79 78 } ··· 144 143 { 145 144 struct spacemit_gpio_bank *gb = irq_data_get_irq_chip_data(data); 146 145 147 - seq_printf(p, "%s-%d", dev_name(gb->gc.parent), spacemit_gpio_bank_index(gb)); 146 + seq_printf(p, "%s-%d", dev_name(gb->chip.gc.parent), spacemit_gpio_bank_index(gb)); 148 147 } 149 148 150 149 static struct irq_chip spacemit_gpio_chip = { ··· 166 165 if (i >= SPACEMIT_NR_BANKS) 167 166 return false; 168 167 169 - return (gc == &sg->sgb[i].gc); 168 + return (gc == &sg->sgb[i].chip.gc); 170 169 } 171 170 172 171 static int spacemit_gpio_add_bank(struct spacemit_gpio *sg, ··· 174 173 int index, int irq) 175 174 { 176 175 struct spacemit_gpio_bank *gb = &sg->sgb[index]; 177 - struct gpio_chip *gc = &gb->gc; 176 + struct gpio_generic_chip_config config; 177 + struct gpio_chip *gc = &gb->chip.gc; 178 178 struct device *dev = sg->dev; 179 179 struct gpio_irq_chip *girq; 180 180 void __iomem *dat, *set, *clr, *dirin, *dirout; ··· 189 187 dirin = gb->base + SPACEMIT_GCDR; 190 188 dirout = gb->base + SPACEMIT_GSDR; 191 189 190 + config = (struct gpio_generic_chip_config) { 191 + .dev = dev, 192 + .sz = 4, 193 + .dat = dat, 194 + .set = set, 195 + .clr = clr, 196 + .dirout = dirout, 197 + .dirin = dirin, 198 + .flags = BGPIOF_UNREADABLE_REG_SET | BGPIOF_UNREADABLE_REG_DIR, 199 + }; 200 + 192 201 /* This registers 32 GPIO lines per bank */ 193 - ret = bgpio_init(gc, dev, 4, dat, set, clr, dirout, dirin, 194 - BGPIOF_UNREADABLE_REG_SET | BGPIOF_UNREADABLE_REG_DIR); 202 + ret = gpio_generic_chip_init(&gb->chip, &config); 195 203 if (ret) 196 204 return dev_err_probe(dev, ret, "failed to init gpio chip\n"); 197 205 ··· 233 221 ret = devm_request_threaded_irq(dev, irq, NULL, 234 222 spacemit_gpio_irq_handler, 235 223 IRQF_ONESHOT | IRQF_SHARED, 236 - gb->gc.label, gb); 224 + gb->chip.gc.label, gb); 237 225 if (ret < 0) 238 226 return dev_err_probe(dev, ret, "failed to register IRQ\n"); 239 227