···11111212#include <linux/device.h>1313#include <linux/gpio/driver.h>1414+#include <linux/gpio/generic.h>1415#include <linux/interrupt.h>1516#include <linux/irq.h>1617#include <linux/mfd/syscon.h>···4847struct wpcm450_bank;49485049struct wpcm450_gpio {5151- struct gpio_chip gc;5050+ struct gpio_generic_chip chip;5251 struct wpcm450_pinctrl *pctrl;5352 const struct wpcm450_bank *bank;5453};···185184}186185187186/*188188- * This is an implementation of the gpio_chip->get() function, for use in189189- * wpcm450_gpio_fix_evpol. Unfortunately, we can't use the bgpio-provided190190- * implementation there, because it would require taking gpio_chip->bgpio_lock,191191- * which is a spin lock, but wpcm450_gpio_fix_evpol must work in contexts where192192- * a raw spin lock is held.187187+ * FIXME: This is an implementation of the gpio_chip->get() function, for use188188+ * in wpcm450_gpio_fix_evpol(). It was implemented back when gpio-mmio used a189189+ * regular spinlock internally, while wpcm450_gpio_fix_evpol() needed to work190190+ * in contexts with a raw spinlock held. Since then, the gpio generic chip has191191+ * been switched to using a raw spinlock so this should be converted to using192192+ * the locking interfaces provided in linux/gpio/gneneric.h.193193 */194194static int wpcm450_gpio_get(struct wpcm450_gpio *gpio, int offset)195195{···331329 for_each_set_bit(bit, &pending, 32) {332330 int offset = wpcm450_irq_bitnum_to_gpio(gpio, bit);333331334334- generic_handle_domain_irq(gpio->gc.irq.domain, offset);332332+ generic_handle_domain_irq(gpio->chip.gc.irq.domain, offset);335333 }336334 chained_irq_exit(chip, desc);337335}···10141012 struct wpcm450_gpio *gpio = gpiochip_get_data(chip);10151013 const struct wpcm450_bank *bank = gpio->bank;1016101410171017- return gpiochip_add_pin_range(&gpio->gc, dev_name(gpio->pctrl->dev),10151015+ return gpiochip_add_pin_range(&gpio->chip.gc, dev_name(gpio->pctrl->dev),10181016 0, bank->base, bank->length);10191017}10201018···10311029 "Resource fail for GPIO controller\n");1032103010331031 for_each_gpiochip_node(dev, child) {10321032+ struct gpio_generic_chip_config config;10341033 void __iomem *dat = NULL;10351034 void __iomem *set = NULL;10361035 void __iomem *dirout = NULL;···10631060 } else {10641061 flags = BGPIOF_NO_OUTPUT;10651062 }10661066- ret = bgpio_init(&gpio->gc, dev, 4,10671067- dat, set, NULL, dirout, NULL, flags);10631063+10641064+ config = (typeof(config)){10651065+ .dev = dev,10661066+ .sz = 4,10671067+ .dat = dat,10681068+ .set = set,10691069+ .dirout = dirout,10701070+ .flags = flags,10711071+ };10721072+10731073+ ret = gpio_generic_chip_init(&gpio->chip, &config);10681074 if (ret < 0)10691075 return dev_err_probe(dev, ret, "GPIO initialization failed\n");1070107610711071- gpio->gc.ngpio = bank->length;10721072- gpio->gc.set_config = wpcm450_gpio_set_config;10731073- gpio->gc.fwnode = child;10741074- gpio->gc.add_pin_ranges = wpcm450_gpio_add_pin_ranges;10771077+ gpio->chip.gc.ngpio = bank->length;10781078+ gpio->chip.gc.set_config = wpcm450_gpio_set_config;10791079+ gpio->chip.gc.fwnode = child;10801080+ gpio->chip.gc.add_pin_ranges = wpcm450_gpio_add_pin_ranges;1075108110761076- girq = &gpio->gc.irq;10821082+ girq = &gpio->chip.gc.irq;10771083 gpio_irq_chip_set_chip(girq, &wpcm450_gpio_irqchip);10781084 girq->parent_handler = wpcm450_gpio_irqhandler;10791085 girq->parents = devm_kcalloc(dev, WPCM450_NUM_GPIO_IRQS,···11061094 girq->num_parents++;11071095 }1108109611091109- ret = devm_gpiochip_add_data(dev, &gpio->gc, gpio);10971097+ ret = devm_gpiochip_add_data(dev, &gpio->chip.gc, gpio);11101098 if (ret)11111099 return dev_err_probe(dev, ret, "Failed to add GPIO chip\n");11121100 }