Commit 6edecb99 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull gpio fixes from Bartosz Golaszewski:

 - fix IRQ initialization in gpiochip_irqchip_add_domain()

 - add a missing return value check for platform_get_irq() in
   gpio-sifive

 - don't free irq_domains which GPIOLIB does not manage

* tag 'gpio-fixes-for-v6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:
  gpiolib: Fix irq_domain resource tracking for gpiochip_irqchip_add_domain()
  gpio: sifive: add missing check for platform_get_irq
  gpiolib: Fix GPIO chip IRQ initialization restriction
parents afa4bb77 ff7a1790
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -221,8 +221,12 @@ static int sifive_gpio_probe(struct platform_device *pdev)
		return -ENODEV;
	}

	for (i = 0; i < ngpio; i++)
		chip->irq_number[i] = platform_get_irq(pdev, i);
	for (i = 0; i < ngpio; i++) {
		ret = platform_get_irq(pdev, i);
		if (ret < 0)
			return ret;
		chip->irq_number[i] = ret;
	}

	ret = bgpio_init(&chip->gc, dev, 4,
			 chip->base + SIFIVE_GPIO_INPUT_VAL,
+10 −1
Original line number Diff line number Diff line
@@ -1745,7 +1745,7 @@ static void gpiochip_irqchip_remove(struct gpio_chip *gc)
	}

	/* Remove all IRQ mappings and delete the domain */
	if (gc->irq.domain) {
	if (!gc->irq.domain_is_allocated_externally && gc->irq.domain) {
		unsigned int irq;

		for (offset = 0; offset < gc->ngpio; offset++) {
@@ -1791,6 +1791,15 @@ int gpiochip_irqchip_add_domain(struct gpio_chip *gc,

	gc->to_irq = gpiochip_to_irq;
	gc->irq.domain = domain;
	gc->irq.domain_is_allocated_externally = true;

	/*
	 * Using barrier() here to prevent compiler from reordering
	 * gc->irq.initialized before adding irqdomain.
	 */
	barrier();

	gc->irq.initialized = true;

	return 0;
}
+8 −0
Original line number Diff line number Diff line
@@ -251,6 +251,14 @@ struct gpio_irq_chip {
	 */
	bool initialized;

	/**
	 * @domain_is_allocated_externally:
	 *
	 * True it the irq_domain was allocated outside of gpiolib, in which
	 * case gpiolib won't free the irq_domain itself.
	 */
	bool domain_is_allocated_externally;

	/**
	 * @init_hw: optional routine to initialize hardware before
	 * an IRQ chip will be added. This is quite useful when