Commit 7726d4c3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'gpio-fixes-for-v6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux

Pull gpio fixes from Bartosz Golaszewski:
 "A a set of fixes from the GPIO subsystem.

  Most are small driver fixes except the realtek-otto driver patch which
  is pretty big but addresses a significant flaw that can cause the CPU
  to stay infinitely busy on uncleared ISR on some platforms.

  Summary:
   - MAINTAINERS update
   - fix resource leaks in gpio-mockup and gpio-pxa
   - add missing locking in gpio-pca953x
   - use 32-bit I/O in gpio-realtek-otto
   - make irq_chip structures immutable in four more drivers"

* tag 'gpio-fixes-for-v6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:
  gpio: ws16c48: Make irq_chip immutable
  gpio: 104-idio-16: Make irq_chip immutable
  gpio: 104-idi-48: Make irq_chip immutable
  gpio: 104-dio-48e: Make irq_chip immutable
  gpio: realtek-otto: switch to 32-bit I/O
  gpio: pca953x: Add mutex_lock for regcache sync in PM
  gpio: mockup: remove gpio debugfs when remove device
  gpio: pxa: use devres for the clock struct
  MAINTAINERS: rectify entry for XILINX GPIO DRIVER
parents 65eea2c0 68903817
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -22307,7 +22307,7 @@ M: Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
R:	Srinivas Neeli <srinivas.neeli@xilinx.com>
R:	Michal Simek <michal.simek@xilinx.com>
S:	Maintained
F:	Documentation/devicetree/bindings/gpio/gpio-xilinx.txt
F:	Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml
F:	Documentation/devicetree/bindings/gpio/gpio-zynq.yaml
F:	drivers/gpio/gpio-xilinx.c
F:	drivers/gpio/gpio-zynq.c
+7 −3
Original line number Diff line number Diff line
@@ -164,6 +164,7 @@ static void dio48e_irq_mask(struct irq_data *data)
		dio48egpio->irq_mask &= ~BIT(0);
	else
		dio48egpio->irq_mask &= ~BIT(1);
	gpiochip_disable_irq(chip, offset);

	if (!dio48egpio->irq_mask)
		/* disable interrupts */
@@ -191,6 +192,7 @@ static void dio48e_irq_unmask(struct irq_data *data)
		iowrite8(0x00, &dio48egpio->reg->enable_interrupt);
	}

	gpiochip_enable_irq(chip, offset);
	if (offset == 19)
		dio48egpio->irq_mask |= BIT(0);
	else
@@ -213,12 +215,14 @@ static int dio48e_irq_set_type(struct irq_data *data, unsigned int flow_type)
	return 0;
}

static struct irq_chip dio48e_irqchip = {
static const struct irq_chip dio48e_irqchip = {
	.name = "104-dio-48e",
	.irq_ack = dio48e_irq_ack,
	.irq_mask = dio48e_irq_mask,
	.irq_unmask = dio48e_irq_unmask,
	.irq_set_type = dio48e_irq_set_type
	.irq_set_type = dio48e_irq_set_type,
	.flags = IRQCHIP_IMMUTABLE,
	GPIOCHIP_IRQ_RESOURCE_HELPERS,
};

static irqreturn_t dio48e_irq_handler(int irq, void *dev_id)
@@ -322,7 +326,7 @@ static int dio48e_probe(struct device *dev, unsigned int id)
	dio48egpio->chip.set_multiple = dio48e_gpio_set_multiple;

	girq = &dio48egpio->chip.irq;
	girq->chip = &dio48e_irqchip;
	gpio_irq_chip_set_chip(girq, &dio48e_irqchip);
	/* This will let us handle the parent IRQ in the driver */
	girq->parent_handler = NULL;
	girq->num_parents = 0;
+7 −3
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ static void idi_48_irq_mask(struct irq_data *data)
	spin_lock_irqsave(&idi48gpio->lock, flags);

	idi48gpio->irq_mask[boundary] &= ~mask;
	gpiochip_disable_irq(chip, offset);

	/* Exit early if there are still input lines with IRQ unmasked */
	if (idi48gpio->irq_mask[boundary])
@@ -140,6 +141,7 @@ static void idi_48_irq_unmask(struct irq_data *data)

	prev_irq_mask = idi48gpio->irq_mask[boundary];

	gpiochip_enable_irq(chip, offset);
	idi48gpio->irq_mask[boundary] |= mask;

	/* Exit early if IRQ was already unmasked for this boundary */
@@ -164,12 +166,14 @@ static int idi_48_irq_set_type(struct irq_data *data, unsigned int flow_type)
	return 0;
}

static struct irq_chip idi_48_irqchip = {
static const struct irq_chip idi_48_irqchip = {
	.name = "104-idi-48",
	.irq_ack = idi_48_irq_ack,
	.irq_mask = idi_48_irq_mask,
	.irq_unmask = idi_48_irq_unmask,
	.irq_set_type = idi_48_irq_set_type
	.irq_set_type = idi_48_irq_set_type,
	.flags = IRQCHIP_IMMUTABLE,
	GPIOCHIP_IRQ_RESOURCE_HELPERS,
};

static irqreturn_t idi_48_irq_handler(int irq, void *dev_id)
@@ -267,7 +271,7 @@ static int idi_48_probe(struct device *dev, unsigned int id)
	idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple;

	girq = &idi48gpio->chip.irq;
	girq->chip = &idi_48_irqchip;
	gpio_irq_chip_set_chip(girq, &idi_48_irqchip);
	/* This will let us handle the parent IRQ in the driver */
	girq->parent_handler = NULL;
	girq->num_parents = 0;
+11 −7
Original line number Diff line number Diff line
@@ -174,10 +174,11 @@ static void idio_16_irq_mask(struct irq_data *data)
{
	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
	struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
	const unsigned long mask = BIT(irqd_to_hwirq(data));
	const unsigned long offset = irqd_to_hwirq(data);
	unsigned long flags;

	idio16gpio->irq_mask &= ~mask;
	idio16gpio->irq_mask &= ~BIT(offset);
	gpiochip_disable_irq(chip, offset);

	if (!idio16gpio->irq_mask) {
		raw_spin_lock_irqsave(&idio16gpio->lock, flags);
@@ -192,11 +193,12 @@ static void idio_16_irq_unmask(struct irq_data *data)
{
	struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
	struct idio_16_gpio *const idio16gpio = gpiochip_get_data(chip);
	const unsigned long mask = BIT(irqd_to_hwirq(data));
	const unsigned long offset = irqd_to_hwirq(data);
	const unsigned long prev_irq_mask = idio16gpio->irq_mask;
	unsigned long flags;

	idio16gpio->irq_mask |= mask;
	gpiochip_enable_irq(chip, offset);
	idio16gpio->irq_mask |= BIT(offset);

	if (!prev_irq_mask) {
		raw_spin_lock_irqsave(&idio16gpio->lock, flags);
@@ -217,12 +219,14 @@ static int idio_16_irq_set_type(struct irq_data *data, unsigned int flow_type)
	return 0;
}

static struct irq_chip idio_16_irqchip = {
static const struct irq_chip idio_16_irqchip = {
	.name = "104-idio-16",
	.irq_ack = idio_16_irq_ack,
	.irq_mask = idio_16_irq_mask,
	.irq_unmask = idio_16_irq_unmask,
	.irq_set_type = idio_16_irq_set_type
	.irq_set_type = idio_16_irq_set_type,
	.flags = IRQCHIP_IMMUTABLE,
	GPIOCHIP_IRQ_RESOURCE_HELPERS,
};

static irqreturn_t idio_16_irq_handler(int irq, void *dev_id)
@@ -299,7 +303,7 @@ static int idio_16_probe(struct device *dev, unsigned int id)
	idio16gpio->out_state = 0xFFFF;

	girq = &idio16gpio->chip.irq;
	girq->chip = &idio_16_irqchip;
	gpio_irq_chip_set_chip(girq, &idio_16_irqchip);
	/* This will let us handle the parent IRQ in the driver */
	girq->parent_handler = NULL;
	girq->num_parents = 0;
+8 −1
Original line number Diff line number Diff line
@@ -373,6 +373,13 @@ static void gpio_mockup_debugfs_setup(struct device *dev,
	}
}

static void gpio_mockup_debugfs_cleanup(void *data)
{
	struct gpio_mockup_chip *chip = data;

	debugfs_remove_recursive(chip->dbg_dir);
}

static void gpio_mockup_dispose_mappings(void *data)
{
	struct gpio_mockup_chip *chip = data;
@@ -455,7 +462,7 @@ static int gpio_mockup_probe(struct platform_device *pdev)

	gpio_mockup_debugfs_setup(dev, chip);

	return 0;
	return devm_add_action_or_reset(dev, gpio_mockup_debugfs_cleanup, chip);
}

static const struct of_device_id gpio_mockup_of_match[] = {
Loading