]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Mon, 29 Jan 2024 13:31:30 +0000 (08:31 -0500)
committerSasha Levin <sashal@kernel.org>
Mon, 29 Jan 2024 13:31:30 +0000 (08:31 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/drm-exynos-gsc-minor-fix-for-loop-iteration-in-gsc_r.patch [new file with mode: 0644]
queue-4.19/gpio-eic-sprd-clear-interrupt-after-set-the-interrup.patch [new file with mode: 0644]
queue-4.19/series

diff --git a/queue-4.19/drm-exynos-gsc-minor-fix-for-loop-iteration-in-gsc_r.patch b/queue-4.19/drm-exynos-gsc-minor-fix-for-loop-iteration-in-gsc_r.patch
new file mode 100644 (file)
index 0000000..ce597a0
--- /dev/null
@@ -0,0 +1,39 @@
+From c6882426823610a5f87184a3f49eb66085086c70 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 20 Dec 2023 12:53:15 +0300
+Subject: drm/exynos: gsc: minor fix for loop iteration in gsc_runtime_resume
+
+From: Fedor Pchelkin <pchelkin@ispras.ru>
+
+[ Upstream commit 4050957c7c2c14aa795dbf423b4180d5ac04e113 ]
+
+Do not forget to call clk_disable_unprepare() on the first element of
+ctx->clocks array.
+
+Found by Linux Verification Center (linuxtesting.org).
+
+Fixes: 8b7d3ec83aba ("drm/exynos: gsc: Convert driver to IPP v2 core API")
+Signed-off-by: Fedor Pchelkin <pchelkin@ispras.ru>
+Reviewed-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Signed-off-by: Inki Dae <inki.dae@samsung.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/exynos/exynos_drm_gsc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
+index d71188b982cb..4a93d87c2096 100644
+--- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c
++++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
+@@ -1322,7 +1322,7 @@ static int __maybe_unused gsc_runtime_resume(struct device *dev)
+       for (i = 0; i < ctx->num_clocks; i++) {
+               ret = clk_prepare_enable(ctx->clocks[i]);
+               if (ret) {
+-                      while (--i > 0)
++                      while (--i >= 0)
+                               clk_disable_unprepare(ctx->clocks[i]);
+                       return ret;
+               }
+-- 
+2.43.0
+
diff --git a/queue-4.19/gpio-eic-sprd-clear-interrupt-after-set-the-interrup.patch b/queue-4.19/gpio-eic-sprd-clear-interrupt-after-set-the-interrup.patch
new file mode 100644 (file)
index 0000000..44710c3
--- /dev/null
@@ -0,0 +1,160 @@
+From 3c22d164d0b7cbbfc277fcf30248832f90d747eb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jan 2024 15:38:48 +0800
+Subject: gpio: eic-sprd: Clear interrupt after set the interrupt type
+
+From: Wenhua Lin <Wenhua.Lin@unisoc.com>
+
+[ Upstream commit 84aef4ed59705585d629e81d633a83b7d416f5fb ]
+
+The raw interrupt status of eic maybe set before the interrupt is enabled,
+since the eic interrupt has a latch function, which would trigger the
+interrupt event once enabled it from user side. To solve this problem,
+interrupts generated before setting the interrupt trigger type are ignored.
+
+Fixes: 25518e024e3a ("gpio: Add Spreadtrum EIC driver support")
+Acked-by: Chunyan Zhang <zhang.lyra@gmail.com>
+Signed-off-by: Wenhua Lin <Wenhua.Lin@unisoc.com>
+Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpio/gpio-eic-sprd.c | 32 ++++++++++++++++++++++++++++----
+ 1 file changed, 28 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpio/gpio-eic-sprd.c b/drivers/gpio/gpio-eic-sprd.c
+index 4f1af323ec03..cfa36c0de5b6 100644
+--- a/drivers/gpio/gpio-eic-sprd.c
++++ b/drivers/gpio/gpio-eic-sprd.c
+@@ -318,20 +318,27 @@ static int sprd_eic_irq_set_type(struct irq_data *data, unsigned int flow_type)
+               switch (flow_type) {
+               case IRQ_TYPE_LEVEL_HIGH:
+                       sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IEV, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IC, 1);
+                       break;
+               case IRQ_TYPE_LEVEL_LOW:
+                       sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IEV, 0);
++                      sprd_eic_update(chip, offset, SPRD_EIC_DBNC_IC, 1);
+                       break;
+               case IRQ_TYPE_EDGE_RISING:
+               case IRQ_TYPE_EDGE_FALLING:
+               case IRQ_TYPE_EDGE_BOTH:
+                       state = sprd_eic_get(chip, offset);
+-                      if (state)
++                      if (state) {
+                               sprd_eic_update(chip, offset,
+                                               SPRD_EIC_DBNC_IEV, 0);
+-                      else
++                              sprd_eic_update(chip, offset,
++                                              SPRD_EIC_DBNC_IC, 1);
++                      } else {
+                               sprd_eic_update(chip, offset,
+                                               SPRD_EIC_DBNC_IEV, 1);
++                              sprd_eic_update(chip, offset,
++                                              SPRD_EIC_DBNC_IC, 1);
++                      }
+                       break;
+               default:
+                       return -ENOTSUPP;
+@@ -343,20 +350,27 @@ static int sprd_eic_irq_set_type(struct irq_data *data, unsigned int flow_type)
+               switch (flow_type) {
+               case IRQ_TYPE_LEVEL_HIGH:
+                       sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTPOL, 0);
++                      sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTCLR, 1);
+                       break;
+               case IRQ_TYPE_LEVEL_LOW:
+                       sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTPOL, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_LATCH_INTCLR, 1);
+                       break;
+               case IRQ_TYPE_EDGE_RISING:
+               case IRQ_TYPE_EDGE_FALLING:
+               case IRQ_TYPE_EDGE_BOTH:
+                       state = sprd_eic_get(chip, offset);
+-                      if (state)
++                      if (state) {
+                               sprd_eic_update(chip, offset,
+                                               SPRD_EIC_LATCH_INTPOL, 0);
+-                      else
++                              sprd_eic_update(chip, offset,
++                                              SPRD_EIC_LATCH_INTCLR, 1);
++                      } else {
+                               sprd_eic_update(chip, offset,
+                                               SPRD_EIC_LATCH_INTPOL, 1);
++                              sprd_eic_update(chip, offset,
++                                              SPRD_EIC_LATCH_INTCLR, 1);
++                      }
+                       break;
+               default:
+                       return -ENOTSUPP;
+@@ -370,29 +384,34 @@ static int sprd_eic_irq_set_type(struct irq_data *data, unsigned int flow_type)
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_edge_irq);
+                       break;
+               case IRQ_TYPE_EDGE_FALLING:
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 0);
++                      sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_edge_irq);
+                       break;
+               case IRQ_TYPE_EDGE_BOTH:
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_edge_irq);
+                       break;
+               case IRQ_TYPE_LEVEL_HIGH:
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 1);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_level_irq);
+                       break;
+               case IRQ_TYPE_LEVEL_LOW:
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTMODE, 1);
+                       sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTPOL, 0);
++                      sprd_eic_update(chip, offset, SPRD_EIC_ASYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_level_irq);
+                       break;
+               default:
+@@ -405,29 +424,34 @@ static int sprd_eic_irq_set_type(struct irq_data *data, unsigned int flow_type)
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_edge_irq);
+                       break;
+               case IRQ_TYPE_EDGE_FALLING:
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 0);
++                      sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_edge_irq);
+                       break;
+               case IRQ_TYPE_EDGE_BOTH:
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_edge_irq);
+                       break;
+               case IRQ_TYPE_LEVEL_HIGH:
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 1);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 1);
++                      sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_level_irq);
+                       break;
+               case IRQ_TYPE_LEVEL_LOW:
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTBOTH, 0);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTMODE, 1);
+                       sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTPOL, 0);
++                      sprd_eic_update(chip, offset, SPRD_EIC_SYNC_INTCLR, 1);
+                       irq_set_handler_locked(data, handle_level_irq);
+                       break;
+               default:
+-- 
+2.43.0
+
index 3c6f9acce5f2cd1fef376991a70bdf20fdc950b4..0bd5256d406a9a321f4b37845c99c3e056aa104b 100644 (file)
@@ -40,3 +40,5 @@ gpiolib-acpi-ignore-touchpad-wakeup-on-gpd-g1619-04.patch
 drm-don-t-unref-the-same-fb-many-times-by-mistake-due-to-deadlock-handling.patch
 drm-bridge-nxp-ptn3460-fix-i2c_master_send-error-checking.patch
 drm-bridge-nxp-ptn3460-simplify-some-error-checking.patch
+drm-exynos-gsc-minor-fix-for-loop-iteration-in-gsc_r.patch
+gpio-eic-sprd-clear-interrupt-after-set-the-interrup.patch