octeontx: fix gpio irq request
authorTim Harvey <tharvey@gateworks.com>
Thu, 28 May 2020 14:58:34 +0000 (07:58 -0700)
committerPetr Štetiar <ynezz@true.cz>
Wed, 3 Jun 2020 14:49:28 +0000 (16:49 +0200)
This fixes a regression in 5.4 that causes a crash when a driver requests
an ARM GPIO for an IRQ.

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
target/linux/octeontx/patches-5.4/0002-gpio-thunderx-fix-irq_request_resources.patch [new file with mode: 0644]

diff --git a/target/linux/octeontx/patches-5.4/0002-gpio-thunderx-fix-irq_request_resources.patch b/target/linux/octeontx/patches-5.4/0002-gpio-thunderx-fix-irq_request_resources.patch
new file mode 100644 (file)
index 0000000..8c4de51
--- /dev/null
@@ -0,0 +1,46 @@
+From e8287ec10f21877eb0ac4c1fb4e89e42d8bc10da Mon Sep 17 00:00:00 2001
+From: Tim Harvey <tharvey@gateworks.com>
+Date: Wed, 11 Mar 2020 08:19:45 -0700
+Subject: [PATCH 2/7] gpio: thunderx: fix irq_request_resources
+
+If there are no parent resources do not call irq_chip_request_resources_parent
+at all as this will return an error.
+
+This resolves a regression where devices using a thunderx gpio as an interrupt
+would fail probing.
+
+Fixes: 0d04d0c ("gpio: thunderx: Use the default parent apis for {request,release}_resources")
+Signed-off-by: Tim Harvey <tharvey@gateworks.com>
+---
+ drivers/gpio/gpio-thunderx.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpio/gpio-thunderx.c b/drivers/gpio/gpio-thunderx.c
+index 715371b..feda2a2 100644
+--- a/drivers/gpio/gpio-thunderx.c
++++ b/drivers/gpio/gpio-thunderx.c
+@@ -363,15 +363,18 @@ static int thunderx_gpio_irq_request_resources(struct irq_data *data)
+ {
+       struct thunderx_line *txline = irq_data_get_irq_chip_data(data);
+       struct thunderx_gpio *txgpio = txline->txgpio;
++      struct irq_data *parent_data = data->parent_data;
+       int r;
+       r = gpiochip_lock_as_irq(&txgpio->chip, txline->line);
+       if (r)
+               return r;
+-      r = irq_chip_request_resources_parent(data);
+-      if (r)
+-              gpiochip_unlock_as_irq(&txgpio->chip, txline->line);
++      if (parent_data && parent_data->chip->irq_request_resources) {
++              r = irq_chip_request_resources_parent(data);
++              if (r)
++                      gpiochip_unlock_as_irq(&txgpio->chip, txline->line);
++      }
+       return r;
+ }
+-- 
+2.7.4
+