--- /dev/null
+From 214d76e83736821433a7f68f504b2e93dc51d465 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Feb 2023 10:52:49 +0100
+Subject: gpio: vf610: make irq_chip immutable
+
+From: Alexander Stein <alexander.stein@ew.tq-group.com>
+
+[ Upstream commit e6ef4f8ede09f4af7cde000717b349b50bc62576 ]
+
+Since recently, the kernel is nagging about mutable irq_chips:
+
+ "not an immutable chip, please consider fixing it!"
+
+Drop the unneeded copy, flag it as IRQCHIP_IMMUTABLE, add the new
+helper functions and call the appropriate gpiolib functions.
+
+Signed-off-by: Alexander Stein <alexander.stein@ew.tq-group.com>
+Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+Stable-dep-of: 430232619791 ("gpio: vf610: mask the gpio irq in system suspend and support wakeup")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-vf610.c | 41 ++++++++++++++++++++++-----------------
+ 1 file changed, 23 insertions(+), 18 deletions(-)
+
+diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c
+index c3014f5f0faad..2f21440cbeb19 100644
+--- a/drivers/gpio/gpio-vf610.c
++++ b/drivers/gpio/gpio-vf610.c
+@@ -29,7 +29,6 @@ struct fsl_gpio_soc_data {
+
+ struct vf610_gpio_port {
+ struct gpio_chip gc;
+- struct irq_chip ic;
+ void __iomem *base;
+ void __iomem *gpio_base;
+ const struct fsl_gpio_soc_data *sdata;
+@@ -206,20 +205,24 @@ static int vf610_gpio_irq_set_type(struct irq_data *d, u32 type)
+
+ static void vf610_gpio_irq_mask(struct irq_data *d)
+ {
+- struct vf610_gpio_port *port =
+- gpiochip_get_data(irq_data_get_irq_chip_data(d));
+- void __iomem *pcr_base = port->base + PORT_PCR(d->hwirq);
++ struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
++ struct vf610_gpio_port *port = gpiochip_get_data(gc);
++ irq_hw_number_t gpio_num = irqd_to_hwirq(d);
++ void __iomem *pcr_base = port->base + PORT_PCR(gpio_num);
+
+ vf610_gpio_writel(0, pcr_base);
++ gpiochip_disable_irq(gc, gpio_num);
+ }
+
+ static void vf610_gpio_irq_unmask(struct irq_data *d)
+ {
+- struct vf610_gpio_port *port =
+- gpiochip_get_data(irq_data_get_irq_chip_data(d));
+- void __iomem *pcr_base = port->base + PORT_PCR(d->hwirq);
++ struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
++ struct vf610_gpio_port *port = gpiochip_get_data(gc);
++ irq_hw_number_t gpio_num = irqd_to_hwirq(d);
++ void __iomem *pcr_base = port->base + PORT_PCR(gpio_num);
+
+- vf610_gpio_writel(port->irqc[d->hwirq] << PORT_PCR_IRQC_OFFSET,
++ gpiochip_enable_irq(gc, gpio_num);
++ vf610_gpio_writel(port->irqc[gpio_num] << PORT_PCR_IRQC_OFFSET,
+ pcr_base);
+ }
+
+@@ -236,6 +239,17 @@ static int vf610_gpio_irq_set_wake(struct irq_data *d, u32 enable)
+ return 0;
+ }
+
++static const struct irq_chip vf610_irqchip = {
++ .name = "gpio-vf610",
++ .irq_ack = vf610_gpio_irq_ack,
++ .irq_mask = vf610_gpio_irq_mask,
++ .irq_unmask = vf610_gpio_irq_unmask,
++ .irq_set_type = vf610_gpio_irq_set_type,
++ .irq_set_wake = vf610_gpio_irq_set_wake,
++ .flags = IRQCHIP_IMMUTABLE,
++ GPIOCHIP_IRQ_RESOURCE_HELPERS,
++};
++
+ static void vf610_gpio_disable_clk(void *data)
+ {
+ clk_disable_unprepare(data);
+@@ -248,7 +262,6 @@ static int vf610_gpio_probe(struct platform_device *pdev)
+ struct vf610_gpio_port *port;
+ struct gpio_chip *gc;
+ struct gpio_irq_chip *girq;
+- struct irq_chip *ic;
+ int i;
+ int ret;
+
+@@ -315,14 +328,6 @@ static int vf610_gpio_probe(struct platform_device *pdev)
+ gc->direction_output = vf610_gpio_direction_output;
+ gc->set = vf610_gpio_set;
+
+- ic = &port->ic;
+- ic->name = "gpio-vf610";
+- ic->irq_ack = vf610_gpio_irq_ack;
+- ic->irq_mask = vf610_gpio_irq_mask;
+- ic->irq_unmask = vf610_gpio_irq_unmask;
+- ic->irq_set_type = vf610_gpio_irq_set_type;
+- ic->irq_set_wake = vf610_gpio_irq_set_wake;
+-
+ /* Mask all GPIO interrupts */
+ for (i = 0; i < gc->ngpio; i++)
+ vf610_gpio_writel(0, port->base + PORT_PCR(i));
+@@ -331,7 +336,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
+ vf610_gpio_writel(~0, port->base + PORT_ISFR);
+
+ girq = &gc->irq;
+- girq->chip = ic;
++ gpio_irq_chip_set_chip(girq, &vf610_irqchip);
+ girq->parent_handler = vf610_gpio_irq_handler;
+ girq->num_parents = 1;
+ girq->parents = devm_kcalloc(&pdev->dev, 1,
+--
+2.42.0
+
--- /dev/null
+From a04e48224ba6869719527c0fe39a6148097fe612 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Oct 2023 18:42:36 +0800
+Subject: gpio: vf610: mask the gpio irq in system suspend and support wakeup
+
+From: Haibo Chen <haibo.chen@nxp.com>
+
+[ Upstream commit 430232619791e7de95191f2cd8ebaa4c380d17d0 ]
+
+Add flag IRQCHIP_MASK_ON_SUSPEND to make sure gpio irq is masked on
+suspend, if lack this flag, current irq arctitecture will not mask
+the irq, and these unmasked gpio irq will wrongly wakeup the system
+even they are not config as wakeup source.
+
+Also add flag IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND to make sure the gpio
+irq which is configed as wakeup source can work as expect.
+
+Fixes: 7f2691a19627 ("gpio: vf610: add gpiolib/IRQ chip driver for Vybrid")
+Signed-off-by: Haibo Chen <haibo.chen@nxp.com>
+Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-vf610.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpio/gpio-vf610.c b/drivers/gpio/gpio-vf610.c
+index 2f21440cbeb19..68c1196136851 100644
+--- a/drivers/gpio/gpio-vf610.c
++++ b/drivers/gpio/gpio-vf610.c
+@@ -246,7 +246,8 @@ static const struct irq_chip vf610_irqchip = {
+ .irq_unmask = vf610_gpio_irq_unmask,
+ .irq_set_type = vf610_gpio_irq_set_type,
+ .irq_set_wake = vf610_gpio_irq_set_wake,
+- .flags = IRQCHIP_IMMUTABLE,
++ .flags = IRQCHIP_IMMUTABLE | IRQCHIP_MASK_ON_SUSPEND
++ | IRQCHIP_ENABLE_WAKEUP_ON_SUSPEND,
+ GPIOCHIP_IRQ_RESOURCE_HELPERS,
+ };
+
+--
+2.42.0
+