]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.15
authorSasha Levin <sashal@kernel.org>
Sun, 22 Oct 2023 13:38:09 +0000 (09:38 -0400)
committerSasha Levin <sashal@kernel.org>
Sun, 22 Oct 2023 13:38:09 +0000 (09:38 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.15/gpio-vf610-make-irq_chip-immutable.patch [new file with mode: 0644]
queue-5.15/gpio-vf610-mask-the-gpio-irq-in-system-suspend-and-s.patch [new file with mode: 0644]
queue-5.15/series

diff --git a/queue-5.15/gpio-vf610-make-irq_chip-immutable.patch b/queue-5.15/gpio-vf610-make-irq_chip-immutable.patch
new file mode 100644 (file)
index 0000000..9153f91
--- /dev/null
@@ -0,0 +1,123 @@
+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
+
diff --git a/queue-5.15/gpio-vf610-mask-the-gpio-irq-in-system-suspend-and-s.patch b/queue-5.15/gpio-vf610-mask-the-gpio-irq-in-system-suspend-and-s.patch
new file mode 100644 (file)
index 0000000..fa9882a
--- /dev/null
@@ -0,0 +1,42 @@
+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
+
index d69a2bc6a680a4ddad618d1fac0f1fd780eb1da5..dfe46f3c1588bde4407b4dca992229276049f9e8 100644 (file)
@@ -133,3 +133,5 @@ platform-x86-asus-wmi-change-asus_wmi_brn_down-code-from-0x20-to-0x2e.patch
 platform-x86-asus-wmi-map-0x2a-code-ignore-0x2b-and-0x2c-events.patch
 gpio-vf610-set-value-before-the-direction-to-avoid-a-glitch.patch
 asoc-pxa-fix-a-memory-leak-in-probe.patch
+gpio-vf610-make-irq_chip-immutable.patch
+gpio-vf610-mask-the-gpio-irq-in-system-suspend-and-s.patch