linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2
@ 2023-03-20  9:55 Linus Walleij
  2023-03-20  9:55 ` [PATCH 1/9] gpio: rda: Convert to immutable irq_chip Linus Walleij
                   ` (10 more replies)
  0 siblings, 11 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

Following up on my first series with this second series
concluding all the low-hanging immutable irqchip conversions
in the GPIO subsystem. These are all I could easily
convert.

The remaining irqchips are not using the GPIOLIB_IRQCHIP
for one or another reason, or too complex for me to
deal with. Mostly they are using generic irqchip, and
I guess those are fine as-is.

Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
Linus Walleij (9):
      gpio: rda: Convert to immutable irq_chip
      gpio: siox: Convert to immutable irq_chip
      gpio: stmpe: Convert to immutable irq_chip
      gpio: thunderx: Convert to immutable irq_chip
      gpio: tqmx86: Convert to immutable irq_chip
      gpio: visconti: Convert to immutable irq_chip
      gpio: xgs-iproc: Convert to immutable irq_chip
      gpio: xilinx: Convert to immutable irq_chip
      gpio: xlp: Convert to immutable irq_chip

 drivers/gpio/gpio-rda.c       | 22 +++++++------
 drivers/gpio/gpio-siox.c      | 75 ++++++++++++++++++++++---------------------
 drivers/gpio/gpio-stmpe.c     |  8 +++--
 drivers/gpio/gpio-thunderx.c  | 26 +++++++++------
 drivers/gpio/gpio-tqmx86.c    | 28 +++++++++++-----
 drivers/gpio/gpio-visconti.c  | 50 ++++++++++++++++++++++-------
 drivers/gpio/gpio-xgs-iproc.c | 32 ++++++++++++------
 drivers/gpio/gpio-xilinx.c    | 23 ++++++++-----
 drivers/gpio/gpio-xlp.c       | 14 ++++++--
 9 files changed, 181 insertions(+), 97 deletions(-)
---
base-commit: fe15c26ee26efa11741a7b632e9f23b01aca4cc6
change-id: 20230316-immutable-chips-2-ad2808db8054

Best regards,
-- 
Linus Walleij <linus.walleij@linaro.org>


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/9] gpio: rda: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20 10:34   ` Manivannan Sadhasivam
  2023-03-20  9:55 ` [PATCH 2/9] gpio: siox: " Linus Walleij
                   ` (9 subsequent siblings)
  10 siblings, 1 reply; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-rda.c | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/drivers/gpio/gpio-rda.c b/drivers/gpio/gpio-rda.c
index 62ba18b3a602..dd568907d389 100644
--- a/drivers/gpio/gpio-rda.c
+++ b/drivers/gpio/gpio-rda.c
@@ -38,7 +38,6 @@ struct rda_gpio {
 	struct gpio_chip chip;
 	void __iomem *base;
 	spinlock_t lock;
-	struct irq_chip irq_chip;
 	int irq;
 };
 
@@ -74,6 +73,7 @@ static void rda_gpio_irq_mask(struct irq_data *data)
 	value |= BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT;
 
 	writel_relaxed(value, base + RDA_GPIO_INT_CTRL_CLR);
+	gpiochip_disable_irq(chip, offset);
 }
 
 static void rda_gpio_irq_ack(struct irq_data *data)
@@ -154,6 +154,7 @@ static void rda_gpio_irq_unmask(struct irq_data *data)
 	u32 offset = irqd_to_hwirq(data);
 	u32 trigger = irqd_get_trigger_type(data);
 
+	gpiochip_enable_irq(chip, offset);
 	rda_gpio_set_irq(chip, offset, trigger);
 }
 
@@ -195,6 +196,16 @@ static void rda_gpio_irq_handler(struct irq_desc *desc)
 	chained_irq_exit(ic, desc);
 }
 
+static const struct irq_chip rda_gpio_irq_chip = {
+	.name = "rda-gpio",
+	.irq_ack = rda_gpio_irq_ack,
+	.irq_mask = rda_gpio_irq_mask,
+	.irq_unmask = rda_gpio_irq_unmask,
+	.irq_set_type = rda_gpio_irq_set_type,
+	.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
 static int rda_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -241,15 +252,8 @@ static int rda_gpio_probe(struct platform_device *pdev)
 	rda_gpio->chip.base = -1;
 
 	if (rda_gpio->irq >= 0) {
-		rda_gpio->irq_chip.name = "rda-gpio",
-		rda_gpio->irq_chip.irq_ack = rda_gpio_irq_ack,
-		rda_gpio->irq_chip.irq_mask = rda_gpio_irq_mask,
-		rda_gpio->irq_chip.irq_unmask = rda_gpio_irq_unmask,
-		rda_gpio->irq_chip.irq_set_type = rda_gpio_irq_set_type,
-		rda_gpio->irq_chip.flags = IRQCHIP_SKIP_SET_WAKE,
-
 		girq = &rda_gpio->chip.irq;
-		girq->chip = &rda_gpio->irq_chip;
+		gpio_irq_chip_set_chip(girq, &rda_gpio_irq_chip);
 		girq->handler = handle_bad_irq;
 		girq->default_type = IRQ_TYPE_NONE;
 		girq->parent_handler = rda_gpio_irq_handler;

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/9] gpio: siox: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
  2023-03-20  9:55 ` [PATCH 1/9] gpio: rda: Convert to immutable irq_chip Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 3/9] gpio: stmpe: " Linus Walleij
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

In this case I had to figure out a way to get to the
struct gpio_chip that would work even when the irq_chip
is not part of the driver state container. I did this by
just doing what most other GPIO drivers do and pass
the state struct as data to devm_gpiochip_add_data()
and rewrite accordingly.

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-siox.c | 75 ++++++++++++++++++++++++------------------------
 1 file changed, 38 insertions(+), 37 deletions(-)

diff --git a/drivers/gpio/gpio-siox.c b/drivers/gpio/gpio-siox.c
index f8c5e9fc4bac..051bc99bdfb2 100644
--- a/drivers/gpio/gpio-siox.c
+++ b/drivers/gpio/gpio-siox.c
@@ -10,7 +10,6 @@
 
 struct gpio_siox_ddata {
 	struct gpio_chip gchip;
-	struct irq_chip ichip;
 	struct mutex lock;
 	u8 setdata[1];
 	u8 getdata[3];
@@ -97,9 +96,8 @@ static int gpio_siox_get_data(struct siox_device *sdevice, const u8 buf[])
 
 static void gpio_siox_irq_ack(struct irq_data *d)
 {
-	struct irq_chip *ic = irq_data_get_irq_chip(d);
-	struct gpio_siox_ddata *ddata =
-		container_of(ic, struct gpio_siox_ddata, ichip);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct gpio_siox_ddata *ddata = gpiochip_get_data(gc);
 
 	raw_spin_lock(&ddata->irqlock);
 	ddata->irq_status &= ~(1 << d->hwirq);
@@ -108,21 +106,21 @@ static void gpio_siox_irq_ack(struct irq_data *d)
 
 static void gpio_siox_irq_mask(struct irq_data *d)
 {
-	struct irq_chip *ic = irq_data_get_irq_chip(d);
-	struct gpio_siox_ddata *ddata =
-		container_of(ic, struct gpio_siox_ddata, ichip);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct gpio_siox_ddata *ddata = gpiochip_get_data(gc);
 
 	raw_spin_lock(&ddata->irqlock);
 	ddata->irq_enable &= ~(1 << d->hwirq);
 	raw_spin_unlock(&ddata->irqlock);
+	gpiochip_disable_irq(gc, irqd_to_hwirq(d));
 }
 
 static void gpio_siox_irq_unmask(struct irq_data *d)
 {
-	struct irq_chip *ic = irq_data_get_irq_chip(d);
-	struct gpio_siox_ddata *ddata =
-		container_of(ic, struct gpio_siox_ddata, ichip);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct gpio_siox_ddata *ddata = gpiochip_get_data(gc);
 
+	gpiochip_enable_irq(gc, irqd_to_hwirq(d));
 	raw_spin_lock(&ddata->irqlock);
 	ddata->irq_enable |= 1 << d->hwirq;
 	raw_spin_unlock(&ddata->irqlock);
@@ -130,9 +128,8 @@ static void gpio_siox_irq_unmask(struct irq_data *d)
 
 static int gpio_siox_irq_set_type(struct irq_data *d, u32 type)
 {
-	struct irq_chip *ic = irq_data_get_irq_chip(d);
-	struct gpio_siox_ddata *ddata =
-		container_of(ic, struct gpio_siox_ddata, ichip);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct gpio_siox_ddata *ddata = gpiochip_get_data(gc);
 
 	raw_spin_lock(&ddata->irqlock);
 	ddata->irq_type[d->hwirq] = type;
@@ -143,8 +140,7 @@ static int gpio_siox_irq_set_type(struct irq_data *d, u32 type)
 
 static int gpio_siox_get(struct gpio_chip *chip, unsigned int offset)
 {
-	struct gpio_siox_ddata *ddata =
-		container_of(chip, struct gpio_siox_ddata, gchip);
+	struct gpio_siox_ddata *ddata = gpiochip_get_data(chip);
 	int ret;
 
 	mutex_lock(&ddata->lock);
@@ -167,8 +163,7 @@ static int gpio_siox_get(struct gpio_chip *chip, unsigned int offset)
 static void gpio_siox_set(struct gpio_chip *chip,
 			  unsigned int offset, int value)
 {
-	struct gpio_siox_ddata *ddata =
-		container_of(chip, struct gpio_siox_ddata, gchip);
+	struct gpio_siox_ddata *ddata = gpiochip_get_data(chip);
 	u8 mask = 1 << (19 - offset);
 
 	mutex_lock(&ddata->lock);
@@ -208,11 +203,22 @@ static int gpio_siox_get_direction(struct gpio_chip *chip, unsigned int offset)
 		return GPIO_LINE_DIRECTION_OUT;
 }
 
+static const struct irq_chip gpio_siox_irq_chip = {
+	.name = "siox-gpio",
+	.irq_ack = gpio_siox_irq_ack,
+	.irq_mask = gpio_siox_irq_mask,
+	.irq_unmask = gpio_siox_irq_unmask,
+	.irq_set_type = gpio_siox_irq_set_type,
+	.flags = IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
 static int gpio_siox_probe(struct siox_device *sdevice)
 {
 	struct gpio_siox_ddata *ddata;
 	struct gpio_irq_chip *girq;
 	struct device *dev = &sdevice->dev;
+	struct gpio_chip *gc;
 	int ret;
 
 	ddata = devm_kzalloc(dev, sizeof(*ddata), GFP_KERNEL);
@@ -224,30 +230,25 @@ static int gpio_siox_probe(struct siox_device *sdevice)
 	mutex_init(&ddata->lock);
 	raw_spin_lock_init(&ddata->irqlock);
 
-	ddata->gchip.base = -1;
-	ddata->gchip.can_sleep = 1;
-	ddata->gchip.parent = dev;
-	ddata->gchip.owner = THIS_MODULE;
-	ddata->gchip.get = gpio_siox_get;
-	ddata->gchip.set = gpio_siox_set;
-	ddata->gchip.direction_input = gpio_siox_direction_input;
-	ddata->gchip.direction_output = gpio_siox_direction_output;
-	ddata->gchip.get_direction = gpio_siox_get_direction;
-	ddata->gchip.ngpio = 20;
-
-	ddata->ichip.name = "siox-gpio";
-	ddata->ichip.irq_ack = gpio_siox_irq_ack;
-	ddata->ichip.irq_mask = gpio_siox_irq_mask;
-	ddata->ichip.irq_unmask = gpio_siox_irq_unmask;
-	ddata->ichip.irq_set_type = gpio_siox_irq_set_type;
-
-	girq = &ddata->gchip.irq;
-	girq->chip = &ddata->ichip;
+	gc = &ddata->gchip;
+	gc->base = -1;
+	gc->can_sleep = 1;
+	gc->parent = dev;
+	gc->owner = THIS_MODULE;
+	gc->get = gpio_siox_get;
+	gc->set = gpio_siox_set;
+	gc->direction_input = gpio_siox_direction_input;
+	gc->direction_output = gpio_siox_direction_output;
+	gc->get_direction = gpio_siox_get_direction;
+	gc->ngpio = 20;
+
+	girq = &gc->irq;
+	gpio_irq_chip_set_chip(girq, &gpio_siox_irq_chip);
 	girq->default_type = IRQ_TYPE_NONE;
 	girq->handler = handle_level_irq;
 	girq->threaded = true;
 
-	ret = devm_gpiochip_add_data(dev, &ddata->gchip, NULL);
+	ret = devm_gpiochip_add_data(dev, gc, ddata);
 	if (ret)
 		dev_err(dev, "Failed to register gpio chip (%d)\n", ret);
 

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/9] gpio: stmpe: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
  2023-03-20  9:55 ` [PATCH 1/9] gpio: rda: Convert to immutable irq_chip Linus Walleij
  2023-03-20  9:55 ` [PATCH 2/9] gpio: siox: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 4/9] gpio: thunderx: " Linus Walleij
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-stmpe.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpio-stmpe.c b/drivers/gpio/gpio-stmpe.c
index 0fa4f0a93378..27cc4da53565 100644
--- a/drivers/gpio/gpio-stmpe.c
+++ b/drivers/gpio/gpio-stmpe.c
@@ -234,6 +234,7 @@ static void stmpe_gpio_irq_mask(struct irq_data *d)
 	int mask = BIT(offset % 8);
 
 	stmpe_gpio->regs[REG_IE][regoffset] &= ~mask;
+	gpiochip_disable_irq(gc, offset);
 }
 
 static void stmpe_gpio_irq_unmask(struct irq_data *d)
@@ -244,6 +245,7 @@ static void stmpe_gpio_irq_unmask(struct irq_data *d)
 	int regoffset = offset / 8;
 	int mask = BIT(offset % 8);
 
+	gpiochip_enable_irq(gc, offset);
 	stmpe_gpio->regs[REG_IE][regoffset] |= mask;
 }
 
@@ -357,13 +359,15 @@ static void stmpe_dbg_show(struct seq_file *s, struct gpio_chip *gc)
 	}
 }
 
-static struct irq_chip stmpe_gpio_irq_chip = {
+static const struct irq_chip stmpe_gpio_irq_chip = {
 	.name			= "stmpe-gpio",
 	.irq_bus_lock		= stmpe_gpio_irq_lock,
 	.irq_bus_sync_unlock	= stmpe_gpio_irq_sync_unlock,
 	.irq_mask		= stmpe_gpio_irq_mask,
 	.irq_unmask		= stmpe_gpio_irq_unmask,
 	.irq_set_type		= stmpe_gpio_irq_set_type,
+	.flags			= IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
 };
 
 #define MAX_GPIOS 24
@@ -511,7 +515,7 @@ static int stmpe_gpio_probe(struct platform_device *pdev)
 		}
 
 		girq = &stmpe_gpio->chip.irq;
-		girq->chip = &stmpe_gpio_irq_chip;
+		gpio_irq_chip_set_chip(girq, &stmpe_gpio_irq_chip);
 		/* This will let us handle the parent IRQ in the driver */
 		girq->parent_handler = NULL;
 		girq->num_parents = 0;

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 4/9] gpio: thunderx: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (2 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 3/9] gpio: stmpe: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 5/9] gpio: tqmx86: " Linus Walleij
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

Whereas in most cases we put the gpiochip_[enable|disable]_irq()
calls in the .irq_mask() and .irq_unmask() callbacks, here
we need to put them in the .irq_enable() and .irq_disable()
callbacks, as this driver uses both .irq_mask() and
.irq_mask_ack().

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-thunderx.c | 26 ++++++++++++++++----------
 1 file changed, 16 insertions(+), 10 deletions(-)

diff --git a/drivers/gpio/gpio-thunderx.c b/drivers/gpio/gpio-thunderx.c
index cc62c6e64103..8521c6aacace 100644
--- a/drivers/gpio/gpio-thunderx.c
+++ b/drivers/gpio/gpio-thunderx.c
@@ -354,16 +354,22 @@ static int thunderx_gpio_irq_set_type(struct irq_data *d,
 	return IRQ_SET_MASK_OK;
 }
 
-static void thunderx_gpio_irq_enable(struct irq_data *data)
+static void thunderx_gpio_irq_enable(struct irq_data *d)
 {
-	irq_chip_enable_parent(data);
-	thunderx_gpio_irq_unmask(data);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+	gpiochip_enable_irq(gc, irqd_to_hwirq(d));
+	irq_chip_enable_parent(d);
+	thunderx_gpio_irq_unmask(d);
 }
 
-static void thunderx_gpio_irq_disable(struct irq_data *data)
+static void thunderx_gpio_irq_disable(struct irq_data *d)
 {
-	thunderx_gpio_irq_mask(data);
-	irq_chip_disable_parent(data);
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+	thunderx_gpio_irq_mask(d);
+	irq_chip_disable_parent(d);
+	gpiochip_disable_irq(gc, irqd_to_hwirq(d));
 }
 
 /*
@@ -372,7 +378,7 @@ static void thunderx_gpio_irq_disable(struct irq_data *data)
  * semantics and other acknowledgment tasks associated with the GPIO
  * mechanism.
  */
-static struct irq_chip thunderx_gpio_irq_chip = {
+static const struct irq_chip thunderx_gpio_irq_chip = {
 	.name			= "GPIO",
 	.irq_enable		= thunderx_gpio_irq_enable,
 	.irq_disable		= thunderx_gpio_irq_disable,
@@ -383,8 +389,8 @@ static struct irq_chip thunderx_gpio_irq_chip = {
 	.irq_eoi		= irq_chip_eoi_parent,
 	.irq_set_affinity	= irq_chip_set_affinity_parent,
 	.irq_set_type		= thunderx_gpio_irq_set_type,
-
-	.flags			= IRQCHIP_SET_TYPE_MASKED
+	.flags			= IRQCHIP_SET_TYPE_MASKED | IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
 };
 
 static int thunderx_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
@@ -526,7 +532,7 @@ static int thunderx_gpio_probe(struct pci_dev *pdev,
 	chip->set_multiple = thunderx_gpio_set_multiple;
 	chip->set_config = thunderx_gpio_set_config;
 	girq = &chip->irq;
-	girq->chip = &thunderx_gpio_irq_chip;
+	gpio_irq_chip_set_chip(girq, &thunderx_gpio_irq_chip);
 	girq->fwnode = of_node_to_fwnode(dev->of_node);
 	girq->parent_domain =
 		irq_get_irq_data(txgpio->msix_entries[0].vector)->domain;

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 5/9] gpio: tqmx86: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (3 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 4/9] gpio: thunderx: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 6/9] gpio: visconti: " Linus Walleij
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-tqmx86.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/gpio/gpio-tqmx86.c b/drivers/gpio/gpio-tqmx86.c
index e739dcea61b2..6f8bd1155db7 100644
--- a/drivers/gpio/gpio-tqmx86.c
+++ b/drivers/gpio/gpio-tqmx86.c
@@ -15,6 +15,7 @@
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
+#include <linux/seq_file.h>
 #include <linux/slab.h>
 
 #define TQMX86_NGPIO	8
@@ -34,7 +35,6 @@
 
 struct tqmx86_gpio_data {
 	struct gpio_chip	chip;
-	struct irq_chip		irq_chip;
 	void __iomem		*io_base;
 	int			irq;
 	raw_spinlock_t		spinlock;
@@ -122,6 +122,7 @@ static void tqmx86_gpio_irq_mask(struct irq_data *data)
 	gpiic &= ~mask;
 	tqmx86_gpio_write(gpio, gpiic, TQMX86_GPIIC);
 	raw_spin_unlock_irqrestore(&gpio->spinlock, flags);
+	gpiochip_disable_irq(&gpio->chip, irqd_to_hwirq(data));
 }
 
 static void tqmx86_gpio_irq_unmask(struct irq_data *data)
@@ -134,6 +135,7 @@ static void tqmx86_gpio_irq_unmask(struct irq_data *data)
 
 	mask = TQMX86_GPII_MASK << (offset * TQMX86_GPII_BITS);
 
+	gpiochip_enable_irq(&gpio->chip, irqd_to_hwirq(data));
 	raw_spin_lock_irqsave(&gpio->spinlock, flags);
 	gpiic = tqmx86_gpio_read(gpio, TQMX86_GPIIC);
 	gpiic &= ~mask;
@@ -226,6 +228,22 @@ static void tqmx86_init_irq_valid_mask(struct gpio_chip *chip,
 	clear_bit(3, valid_mask);
 }
 
+static void tqmx86_gpio_irq_print_chip(struct irq_data *d, struct seq_file *p)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+	seq_printf(p, gc->label);
+}
+
+static const struct irq_chip tqmx86_gpio_irq_chip = {
+	.irq_mask = tqmx86_gpio_irq_mask,
+	.irq_unmask = tqmx86_gpio_irq_unmask,
+	.irq_set_type = tqmx86_gpio_irq_set_type,
+	.irq_print_chip = tqmx86_gpio_irq_print_chip,
+	.flags = IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
 static int tqmx86_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -277,14 +295,8 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
 	pm_runtime_enable(&pdev->dev);
 
 	if (irq > 0) {
-		struct irq_chip *irq_chip = &gpio->irq_chip;
 		u8 irq_status;
 
-		irq_chip->name = chip->label;
-		irq_chip->irq_mask = tqmx86_gpio_irq_mask;
-		irq_chip->irq_unmask = tqmx86_gpio_irq_unmask;
-		irq_chip->irq_set_type = tqmx86_gpio_irq_set_type;
-
 		/* Mask all interrupts */
 		tqmx86_gpio_write(gpio, 0, TQMX86_GPIIC);
 
@@ -293,7 +305,7 @@ static int tqmx86_gpio_probe(struct platform_device *pdev)
 		tqmx86_gpio_write(gpio, irq_status, TQMX86_GPIIS);
 
 		girq = &chip->irq;
-		girq->chip = irq_chip;
+		gpio_irq_chip_set_chip(girq, &tqmx86_gpio_irq_chip);
 		girq->parent_handler = tqmx86_gpio_irq_handler;
 		girq->num_parents = 1;
 		girq->parents = devm_kcalloc(&pdev->dev, 1,

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 6/9] gpio: visconti: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (4 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 5/9] gpio: tqmx86: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 7/9] gpio: xgs-iproc: " Linus Walleij
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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>
---
 drivers/gpio/gpio-visconti.c | 50 ++++++++++++++++++++++++++++++++++----------
 1 file changed, 39 insertions(+), 11 deletions(-)

diff --git a/drivers/gpio/gpio-visconti.c b/drivers/gpio/gpio-visconti.c
index 5e108ba9956a..82639e81303e 100644
--- a/drivers/gpio/gpio-visconti.c
+++ b/drivers/gpio/gpio-visconti.c
@@ -15,6 +15,7 @@
 #include <linux/io.h>
 #include <linux/of_irq.h>
 #include <linux/platform_device.h>
+#include <linux/seq_file.h>
 #include <linux/bitops.h>
 
 /* register offset */
@@ -31,7 +32,7 @@ struct visconti_gpio {
 	void __iomem *base;
 	spinlock_t lock; /* protect gpio register */
 	struct gpio_chip gpio_chip;
-	struct irq_chip irq_chip;
+	struct device *dev;
 };
 
 static int visconti_gpio_irq_set_type(struct irq_data *d, unsigned int type)
@@ -119,11 +120,45 @@ static int visconti_gpio_populate_parent_fwspec(struct gpio_chip *chip,
 	return 0;
 }
 
+static void visconti_gpio_mask_irq(struct irq_data *d)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+	irq_chip_mask_parent(d);
+	gpiochip_disable_irq(gc, irqd_to_hwirq(d));
+}
+
+static void visconti_gpio_unmask_irq(struct irq_data *d)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+	gpiochip_enable_irq(gc, irqd_to_hwirq(d));
+	irq_chip_unmask_parent(d);
+}
+
+static void visconti_gpio_irq_print_chip(struct irq_data *d, struct seq_file *p)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct visconti_gpio *priv = gpiochip_get_data(gc);
+
+	seq_printf(p, dev_name(priv->dev));
+}
+
+static const struct irq_chip visconti_gpio_irq_chip = {
+	.irq_mask = visconti_gpio_mask_irq,
+	.irq_unmask = visconti_gpio_unmask_irq,
+	.irq_eoi = irq_chip_eoi_parent,
+	.irq_set_type = visconti_gpio_irq_set_type,
+	.irq_print_chip = visconti_gpio_irq_print_chip,
+	.flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND |
+		 IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
 static int visconti_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
 	struct visconti_gpio *priv;
-	struct irq_chip *irq_chip;
 	struct gpio_irq_chip *girq;
 	struct irq_domain *parent;
 	struct device_node *irq_parent;
@@ -134,6 +169,7 @@ static int visconti_gpio_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	spin_lock_init(&priv->lock);
+	priv->dev = dev;
 
 	priv->base = devm_platform_ioremap_resource(pdev, 0);
 	if (IS_ERR(priv->base))
@@ -164,16 +200,8 @@ static int visconti_gpio_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	irq_chip = &priv->irq_chip;
-	irq_chip->name = dev_name(dev);
-	irq_chip->irq_mask = irq_chip_mask_parent;
-	irq_chip->irq_unmask = irq_chip_unmask_parent;
-	irq_chip->irq_eoi = irq_chip_eoi_parent;
-	irq_chip->irq_set_type = visconti_gpio_irq_set_type;
-	irq_chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND;
-
 	girq = &priv->gpio_chip.irq;
-	girq->chip = irq_chip;
+	gpio_irq_chip_set_chip(girq, &visconti_gpio_irq_chip);
 	girq->fwnode = of_node_to_fwnode(dev->of_node);
 	girq->parent_domain = parent;
 	girq->child_to_parent_hwirq = visconti_gpio_child_to_parent_hwirq;

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 7/9] gpio: xgs-iproc: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (5 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 6/9] gpio: visconti: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 8/9] gpio: xilinx: " Linus Walleij
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-xgs-iproc.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/drivers/gpio/gpio-xgs-iproc.c b/drivers/gpio/gpio-xgs-iproc.c
index fd88500399c6..2d23b27d55af 100644
--- a/drivers/gpio/gpio-xgs-iproc.c
+++ b/drivers/gpio/gpio-xgs-iproc.c
@@ -11,6 +11,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/platform_device.h>
+#include <linux/seq_file.h>
 #include <linux/spinlock.h>
 
 #define IPROC_CCA_INT_F_GPIOINT		BIT(0)
@@ -27,7 +28,6 @@
 #define IPROC_GPIO_CCA_INT_EDGE		0x24
 
 struct iproc_gpio_chip {
-	struct irq_chip irqchip;
 	struct gpio_chip gc;
 	spinlock_t lock;
 	struct device *dev;
@@ -69,6 +69,7 @@ static void iproc_gpio_irq_unmask(struct irq_data *d)
 	u32 irq = d->irq;
 	u32 int_mask, irq_type, event_mask;
 
+	gpiochip_enable_irq(gc, pin);
 	spin_lock_irqsave(&chip->lock, flags);
 	irq_type = irq_get_trigger_type(irq);
 	event_mask = readl_relaxed(chip->base + IPROC_GPIO_CCA_INT_EVENT_MASK);
@@ -110,6 +111,7 @@ static void iproc_gpio_irq_mask(struct irq_data *d)
 			       chip->base + IPROC_GPIO_CCA_INT_LEVEL_MASK);
 	}
 	spin_unlock_irqrestore(&chip->lock, flags);
+	gpiochip_disable_irq(gc, pin);
 }
 
 static int iproc_gpio_irq_set_type(struct irq_data *d, u32 type)
@@ -191,6 +193,24 @@ static irqreturn_t iproc_gpio_irq_handler(int irq, void *data)
 	return int_bits ? IRQ_HANDLED : IRQ_NONE;
 }
 
+static void iproc_gpio_irq_print_chip(struct irq_data *d, struct seq_file *p)
+{
+	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+	struct iproc_gpio_chip *chip = to_iproc_gpio(gc);
+
+	seq_printf(p, dev_name(chip->dev));
+}
+
+static const struct irq_chip iproc_gpio_irq_chip = {
+	.irq_ack = iproc_gpio_irq_ack,
+	.irq_mask = iproc_gpio_irq_mask,
+	.irq_unmask = iproc_gpio_irq_unmask,
+	.irq_set_type = iproc_gpio_irq_set_type,
+	.irq_print_chip = iproc_gpio_irq_print_chip,
+	.flags = IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
 static int iproc_gpio_probe(struct platform_device *pdev)
 {
 	struct device *dev = &pdev->dev;
@@ -230,16 +250,8 @@ static int iproc_gpio_probe(struct platform_device *pdev)
 	irq = platform_get_irq(pdev, 0);
 	if (irq > 0) {
 		struct gpio_irq_chip *girq;
-		struct irq_chip *irqc;
 		u32 val;
 
-		irqc = &chip->irqchip;
-		irqc->name = dev_name(dev);
-		irqc->irq_ack = iproc_gpio_irq_ack;
-		irqc->irq_mask = iproc_gpio_irq_mask;
-		irqc->irq_unmask = iproc_gpio_irq_unmask;
-		irqc->irq_set_type = iproc_gpio_irq_set_type;
-
 		chip->intr = devm_platform_ioremap_resource(pdev, 1);
 		if (IS_ERR(chip->intr))
 			return PTR_ERR(chip->intr);
@@ -261,7 +273,7 @@ static int iproc_gpio_probe(struct platform_device *pdev)
 		}
 
 		girq = &chip->gc.irq;
-		girq->chip = irqc;
+		gpio_irq_chip_set_chip(girq, &iproc_gpio_irq_chip);
 		/* This will let us handle the parent IRQ in the driver */
 		girq->parent_handler = NULL;
 		girq->num_parents = 0;

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 8/9] gpio: xilinx: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (6 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 7/9] gpio: xgs-iproc: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20  9:55 ` [PATCH 9/9] gpio: xlp: " Linus Walleij
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-xilinx.c | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/gpio/gpio-xilinx.c b/drivers/gpio/gpio-xilinx.c
index e248809965ca..1fa66f2a667f 100644
--- a/drivers/gpio/gpio-xilinx.c
+++ b/drivers/gpio/gpio-xilinx.c
@@ -68,7 +68,6 @@ struct xgpio_instance {
 	DECLARE_BITMAP(dir, 64);
 	spinlock_t gpio_lock;	/* For serializing operations */
 	int irq;
-	struct irq_chip irqchip;
 	DECLARE_BITMAP(enable, 64);
 	DECLARE_BITMAP(rising_edge, 64);
 	DECLARE_BITMAP(falling_edge, 64);
@@ -416,6 +415,8 @@ static void xgpio_irq_mask(struct irq_data *irq_data)
 		xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, temp);
 	}
 	spin_unlock_irqrestore(&chip->gpio_lock, flags);
+
+	gpiochip_disable_irq(&chip->gc, irq_offset);
 }
 
 /**
@@ -431,6 +432,8 @@ static void xgpio_irq_unmask(struct irq_data *irq_data)
 	u32 old_enable = xgpio_get_value32(chip->enable, bit);
 	u32 mask = BIT(bit / 32), val;
 
+	gpiochip_enable_irq(&chip->gc, irq_offset);
+
 	spin_lock_irqsave(&chip->gpio_lock, flags);
 
 	__set_bit(bit, chip->enable);
@@ -544,6 +547,16 @@ static void xgpio_irqhandler(struct irq_desc *desc)
 	chained_irq_exit(irqchip, desc);
 }
 
+static const struct irq_chip xgpio_irq_chip = {
+	.name = "gpio-xilinx",
+	.irq_ack = xgpio_irq_ack,
+	.irq_mask = xgpio_irq_mask,
+	.irq_unmask = xgpio_irq_unmask,
+	.irq_set_type = xgpio_set_irq_type,
+	.flags = IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
+};
+
 /**
  * xgpio_probe - Probe method for the GPIO device.
  * @pdev: pointer to the platform device
@@ -653,12 +666,6 @@ static int xgpio_probe(struct platform_device *pdev)
 	if (chip->irq <= 0)
 		goto skip_irq;
 
-	chip->irqchip.name = "gpio-xilinx";
-	chip->irqchip.irq_ack = xgpio_irq_ack;
-	chip->irqchip.irq_mask = xgpio_irq_mask;
-	chip->irqchip.irq_unmask = xgpio_irq_unmask;
-	chip->irqchip.irq_set_type = xgpio_set_irq_type;
-
 	/* Disable per-channel interrupts */
 	xgpio_writereg(chip->regs + XGPIO_IPIER_OFFSET, 0);
 	/* Clear any existing per-channel interrupts */
@@ -668,7 +675,7 @@ static int xgpio_probe(struct platform_device *pdev)
 	xgpio_writereg(chip->regs + XGPIO_GIER_OFFSET, XGPIO_GIER_IE);
 
 	girq = &chip->gc.irq;
-	girq->chip = &chip->irqchip;
+	gpio_irq_chip_set_chip(girq, &xgpio_irq_chip);
 	girq->parent_handler = xgpio_irqhandler;
 	girq->num_parents = 1;
 	girq->parents = devm_kcalloc(&pdev->dev, 1,

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 9/9] gpio: xlp: Convert to immutable irq_chip
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (7 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 8/9] gpio: xilinx: " Linus Walleij
@ 2023-03-20  9:55 ` Linus Walleij
  2023-03-20 11:10 ` [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Marc Zyngier
  2023-03-22 16:52 ` Bartosz Golaszewski
  10 siblings, 0 replies; 13+ messages in thread
From: Linus Walleij @ 2023-03-20  9:55 UTC (permalink / raw)
  To: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek
  Cc: linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Linus Walleij, Marc Zyngier

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

In this case the driver uses .mask_ack() and .unmask()
and since I have a vague idea about the semantics of
.mask_ack() I added .irq_enable() to the existing .irq_disable()
and called into the gpiolib core from those callbacks
instead of mask/unmask.

Cc: Marc Zyngier <maz@kernel.org>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/gpio/gpio-xlp.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/gpio/gpio-xlp.c b/drivers/gpio/gpio-xlp.c
index 0199f545335f..b4b52213bcd9 100644
--- a/drivers/gpio/gpio-xlp.c
+++ b/drivers/gpio/gpio-xlp.c
@@ -90,6 +90,13 @@ static void xlp_gpio_set_reg(void __iomem *addr, unsigned gpio, int state)
 	writel(value, addr + regset);
 }
 
+static void xlp_gpio_irq_enable(struct irq_data *d)
+{
+	struct gpio_chip *gc  = irq_data_get_irq_chip_data(d);
+
+	gpiochip_enable_irq(gc, irqd_to_hwirq(d));
+}
+
 static void xlp_gpio_irq_disable(struct irq_data *d)
 {
 	struct gpio_chip *gc  = irq_data_get_irq_chip_data(d);
@@ -100,6 +107,7 @@ static void xlp_gpio_irq_disable(struct irq_data *d)
 	xlp_gpio_set_reg(priv->gpio_intr_en, d->hwirq, 0x0);
 	__clear_bit(d->hwirq, priv->gpio_enabled_mask);
 	spin_unlock_irqrestore(&priv->lock, flags);
+	gpiochip_disable_irq(gc, irqd_to_hwirq(d));
 }
 
 static void xlp_gpio_irq_mask_ack(struct irq_data *d)
@@ -163,10 +171,12 @@ static int xlp_gpio_set_irq_type(struct irq_data *d, unsigned int type)
 static struct irq_chip xlp_gpio_irq_chip = {
 	.name		= "XLP-GPIO",
 	.irq_mask_ack	= xlp_gpio_irq_mask_ack,
+	.irq_enable	= xlp_gpio_irq_enable,
 	.irq_disable	= xlp_gpio_irq_disable,
 	.irq_set_type	= xlp_gpio_set_irq_type,
 	.irq_unmask	= xlp_gpio_irq_unmask,
-	.flags		= IRQCHIP_ONESHOT_SAFE,
+	.flags		= IRQCHIP_ONESHOT_SAFE | IRQCHIP_IMMUTABLE,
+	GPIOCHIP_IRQ_RESOURCE_HELPERS,
 };
 
 static void xlp_gpio_generic_handler(struct irq_desc *desc)
@@ -272,7 +282,7 @@ static int xlp_gpio_probe(struct platform_device *pdev)
 	spin_lock_init(&priv->lock);
 
 	girq = &gc->irq;
-	girq->chip = &xlp_gpio_irq_chip;
+	gpio_irq_chip_set_chip(girq, &xlp_gpio_irq_chip);
 	girq->parent_handler = xlp_gpio_generic_handler;
 	girq->num_parents = 1;
 	girq->parents = devm_kcalloc(&pdev->dev, 1,

-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/9] gpio: rda: Convert to immutable irq_chip
  2023-03-20  9:55 ` [PATCH 1/9] gpio: rda: Convert to immutable irq_chip Linus Walleij
@ 2023-03-20 10:34   ` Manivannan Sadhasivam
  0 siblings, 0 replies; 13+ messages in thread
From: Manivannan Sadhasivam @ 2023-03-20 10:34 UTC (permalink / raw)
  To: Linus Walleij
  Cc: linux-gpio, Bartosz Golaszewski, Thorsten Scherer,
	Uwe Kleine-König, Pengutronix Kernel Team, Maxime Coquelin,
	Alexandre Torgue, Robert Richter, Nobuhiro Iwamatsu, Ray Jui,
	Scott Branden, Broadcom internal kernel review list,
	Shubhrajyoti Datta, Srinivas Neeli, Michal Simek,
	linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Marc Zyngier

On Mon, Mar 20, 2023 at 10:55:08AM +0100, Linus Walleij wrote:
> Convert the driver to immutable irq-chip with a bit of
> intuition.
> 
> Cc: Marc Zyngier <maz@kernel.org>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

Acked-by: Manivannan Sadhasivam <mani@kernel.org>

Thanks,
Mani

> ---
>  drivers/gpio/gpio-rda.c | 22 +++++++++++++---------
>  1 file changed, 13 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpio/gpio-rda.c b/drivers/gpio/gpio-rda.c
> index 62ba18b3a602..dd568907d389 100644
> --- a/drivers/gpio/gpio-rda.c
> +++ b/drivers/gpio/gpio-rda.c
> @@ -38,7 +38,6 @@ struct rda_gpio {
>  	struct gpio_chip chip;
>  	void __iomem *base;
>  	spinlock_t lock;
> -	struct irq_chip irq_chip;
>  	int irq;
>  };
>  
> @@ -74,6 +73,7 @@ static void rda_gpio_irq_mask(struct irq_data *data)
>  	value |= BIT(offset) << RDA_GPIO_IRQ_FALL_SHIFT;
>  
>  	writel_relaxed(value, base + RDA_GPIO_INT_CTRL_CLR);
> +	gpiochip_disable_irq(chip, offset);
>  }
>  
>  static void rda_gpio_irq_ack(struct irq_data *data)
> @@ -154,6 +154,7 @@ static void rda_gpio_irq_unmask(struct irq_data *data)
>  	u32 offset = irqd_to_hwirq(data);
>  	u32 trigger = irqd_get_trigger_type(data);
>  
> +	gpiochip_enable_irq(chip, offset);
>  	rda_gpio_set_irq(chip, offset, trigger);
>  }
>  
> @@ -195,6 +196,16 @@ static void rda_gpio_irq_handler(struct irq_desc *desc)
>  	chained_irq_exit(ic, desc);
>  }
>  
> +static const struct irq_chip rda_gpio_irq_chip = {
> +	.name = "rda-gpio",
> +	.irq_ack = rda_gpio_irq_ack,
> +	.irq_mask = rda_gpio_irq_mask,
> +	.irq_unmask = rda_gpio_irq_unmask,
> +	.irq_set_type = rda_gpio_irq_set_type,
> +	.flags = IRQCHIP_SKIP_SET_WAKE | IRQCHIP_IMMUTABLE,
> +	GPIOCHIP_IRQ_RESOURCE_HELPERS,
> +};
> +
>  static int rda_gpio_probe(struct platform_device *pdev)
>  {
>  	struct device *dev = &pdev->dev;
> @@ -241,15 +252,8 @@ static int rda_gpio_probe(struct platform_device *pdev)
>  	rda_gpio->chip.base = -1;
>  
>  	if (rda_gpio->irq >= 0) {
> -		rda_gpio->irq_chip.name = "rda-gpio",
> -		rda_gpio->irq_chip.irq_ack = rda_gpio_irq_ack,
> -		rda_gpio->irq_chip.irq_mask = rda_gpio_irq_mask,
> -		rda_gpio->irq_chip.irq_unmask = rda_gpio_irq_unmask,
> -		rda_gpio->irq_chip.irq_set_type = rda_gpio_irq_set_type,
> -		rda_gpio->irq_chip.flags = IRQCHIP_SKIP_SET_WAKE,
> -
>  		girq = &rda_gpio->chip.irq;
> -		girq->chip = &rda_gpio->irq_chip;
> +		gpio_irq_chip_set_chip(girq, &rda_gpio_irq_chip);
>  		girq->handler = handle_bad_irq;
>  		girq->default_type = IRQ_TYPE_NONE;
>  		girq->parent_handler = rda_gpio_irq_handler;
> 
> -- 
> 2.34.1
> 

-- 
மணிவண்ணன் சதாசிவம்

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (8 preceding siblings ...)
  2023-03-20  9:55 ` [PATCH 9/9] gpio: xlp: " Linus Walleij
@ 2023-03-20 11:10 ` Marc Zyngier
  2023-03-22 16:52 ` Bartosz Golaszewski
  10 siblings, 0 replies; 13+ messages in thread
From: Marc Zyngier @ 2023-03-20 11:10 UTC (permalink / raw)
  To: Linus Walleij
  Cc: linux-gpio, Bartosz Golaszewski, Manivannan Sadhasivam,
	Thorsten Scherer, Uwe Kleine-König, Pengutronix Kernel Team,
	Maxime Coquelin, Alexandre Torgue, Robert Richter,
	Nobuhiro Iwamatsu, Ray Jui, Scott Branden,
	Broadcom internal kernel review list, Shubhrajyoti Datta,
	Srinivas Neeli, Michal Simek, linux-arm-kernel, linux-unisoc,
	linux-kernel, linux-stm32

On Mon, 20 Mar 2023 09:55:07 +0000,
Linus Walleij <linus.walleij@linaro.org> wrote:
> 
> Following up on my first series with this second series
> concluding all the low-hanging immutable irqchip conversions
> in the GPIO subsystem. These are all I could easily
> convert.
> 
> The remaining irqchips are not using the GPIOLIB_IRQCHIP
> for one or another reason, or too complex for me to
> deal with. Mostly they are using generic irqchip, and
> I guess those are fine as-is.
> 
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

FWIW:

Reviewed-by: Marc Zyngier <maz@kernel.org>

	M.

-- 
Without deviation from the norm, progress is not possible.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2
  2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
                   ` (9 preceding siblings ...)
  2023-03-20 11:10 ` [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Marc Zyngier
@ 2023-03-22 16:52 ` Bartosz Golaszewski
  10 siblings, 0 replies; 13+ messages in thread
From: Bartosz Golaszewski @ 2023-03-22 16:52 UTC (permalink / raw)
  To: Linus Walleij
  Cc: linux-gpio, Manivannan Sadhasivam, Thorsten Scherer,
	Uwe Kleine-König, Pengutronix Kernel Team, Maxime Coquelin,
	Alexandre Torgue, Robert Richter, Nobuhiro Iwamatsu, Ray Jui,
	Scott Branden, Broadcom internal kernel review list,
	Shubhrajyoti Datta, Srinivas Neeli, Michal Simek,
	linux-arm-kernel, linux-unisoc, linux-kernel, linux-stm32,
	Marc Zyngier

On Mon, Mar 20, 2023 at 10:55 AM Linus Walleij <linus.walleij@linaro.org> wrote:
>
> Following up on my first series with this second series
> concluding all the low-hanging immutable irqchip conversions
> in the GPIO subsystem. These are all I could easily
> convert.
>
> The remaining irqchips are not using the GPIOLIB_IRQCHIP
> for one or another reason, or too complex for me to
> deal with. Mostly they are using generic irqchip, and
> I guess those are fine as-is.
>
> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
> ---
> Linus Walleij (9):
>       gpio: rda: Convert to immutable irq_chip
>       gpio: siox: Convert to immutable irq_chip
>       gpio: stmpe: Convert to immutable irq_chip
>       gpio: thunderx: Convert to immutable irq_chip
>       gpio: tqmx86: Convert to immutable irq_chip
>       gpio: visconti: Convert to immutable irq_chip
>       gpio: xgs-iproc: Convert to immutable irq_chip
>       gpio: xilinx: Convert to immutable irq_chip
>       gpio: xlp: Convert to immutable irq_chip
>
>  drivers/gpio/gpio-rda.c       | 22 +++++++------
>  drivers/gpio/gpio-siox.c      | 75 ++++++++++++++++++++++---------------------
>  drivers/gpio/gpio-stmpe.c     |  8 +++--
>  drivers/gpio/gpio-thunderx.c  | 26 +++++++++------
>  drivers/gpio/gpio-tqmx86.c    | 28 +++++++++++-----
>  drivers/gpio/gpio-visconti.c  | 50 ++++++++++++++++++++++-------
>  drivers/gpio/gpio-xgs-iproc.c | 32 ++++++++++++------
>  drivers/gpio/gpio-xilinx.c    | 23 ++++++++-----
>  drivers/gpio/gpio-xlp.c       | 14 ++++++--
>  9 files changed, 181 insertions(+), 97 deletions(-)
> ---
> base-commit: fe15c26ee26efa11741a7b632e9f23b01aca4cc6
> change-id: 20230316-immutable-chips-2-ad2808db8054
>
> Best regards,
> --
> Linus Walleij <linus.walleij@linaro.org>
>

Series applied, thanks!

Bart

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2023-03-22 16:53 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-20  9:55 [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Linus Walleij
2023-03-20  9:55 ` [PATCH 1/9] gpio: rda: Convert to immutable irq_chip Linus Walleij
2023-03-20 10:34   ` Manivannan Sadhasivam
2023-03-20  9:55 ` [PATCH 2/9] gpio: siox: " Linus Walleij
2023-03-20  9:55 ` [PATCH 3/9] gpio: stmpe: " Linus Walleij
2023-03-20  9:55 ` [PATCH 4/9] gpio: thunderx: " Linus Walleij
2023-03-20  9:55 ` [PATCH 5/9] gpio: tqmx86: " Linus Walleij
2023-03-20  9:55 ` [PATCH 6/9] gpio: visconti: " Linus Walleij
2023-03-20  9:55 ` [PATCH 7/9] gpio: xgs-iproc: " Linus Walleij
2023-03-20  9:55 ` [PATCH 8/9] gpio: xilinx: " Linus Walleij
2023-03-20  9:55 ` [PATCH 9/9] gpio: xlp: " Linus Walleij
2023-03-20 11:10 ` [PATCH 0/9] Mass convert GPIO IRQ chips to be immutable part 2 Marc Zyngier
2023-03-22 16:52 ` Bartosz Golaszewski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).