aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch80
1 files changed, 0 insertions, 80 deletions
diff --git a/target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch b/target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch
deleted file mode 100644
index 01d2772138..0000000000
--- a/target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 8070fa91b95e20cd270c8d76bf45f2a5423358bf Mon Sep 17 00:00:00 2001
-From: Song Hui <hui.song_1@nxp.com>
-Date: Fri, 6 Sep 2019 19:42:59 +0800
-Subject: [PATCH] gpio/mpc8xxx: change irq handler from chained to normal
-
-More than one gpio controllers can share one interrupt, change the
-driver to request shared irq.
-
-While this will work, it will mess up userspace accounting of the number
-of interrupts per second in tools such as vmstat. The reason is that
-for every GPIO interrupt, /proc/interrupts records the count against GIC
-interrupt 68 or 69, as well as the GPIO itself. So, for every GPIO
-interrupt, the total number of interrupts that the system has seen
-increments by two.
-
-Signed-off-by: Laurentiu Tudor <Laurentiu.Tudor@nxp.com>
-Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
-Signed-off-by: Song Hui <hui.song_1@nxp.com>
----
- drivers/gpio/gpio-mpc8xxx.c | 30 +++++++++++++++++++-----------
- 1 file changed, 19 insertions(+), 11 deletions(-)
-
---- a/drivers/gpio/gpio-mpc8xxx.c
-+++ b/drivers/gpio/gpio-mpc8xxx.c
-@@ -22,6 +22,7 @@
- #include <linux/irq.h>
- #include <linux/gpio/driver.h>
- #include <linux/bitops.h>
-+#include <linux/interrupt.h>
-
- #define MPC8XXX_GPIO_PINS 32
-
-@@ -127,20 +128,19 @@ static int mpc8xxx_gpio_to_irq(struct gp
- return -ENXIO;
- }
-
--static void mpc8xxx_gpio_irq_cascade(struct irq_desc *desc)
-+static irqreturn_t mpc8xxx_gpio_irq_cascade(int irq, void *data)
- {
-- struct mpc8xxx_gpio_chip *mpc8xxx_gc = irq_desc_get_handler_data(desc);
-- struct irq_chip *chip = irq_desc_get_chip(desc);
-+ struct mpc8xxx_gpio_chip *mpc8xxx_gc = data;
- struct gpio_chip *gc = &mpc8xxx_gc->gc;
-- unsigned int mask;
-+ unsigned long mask;
-+ int i;
-
- mask = gc->read_reg(mpc8xxx_gc->regs + GPIO_IER)
- & gc->read_reg(mpc8xxx_gc->regs + GPIO_IMR);
-- if (mask)
-- generic_handle_irq(irq_linear_revmap(mpc8xxx_gc->irq,
-- 32 - ffs(mask)));
-- if (chip->irq_eoi)
-- chip->irq_eoi(&desc->irq_data);
-+ for_each_set_bit(i, &mask, 32)
-+ generic_handle_irq(irq_linear_revmap(mpc8xxx_gc->irq, 31 - i));
-+
-+ return IRQ_HANDLED;
- }
-
- static void mpc8xxx_irq_unmask(struct irq_data *d)
-@@ -414,8 +414,16 @@ static int mpc8xxx_probe(struct platform
- if (devtype->gpio_dir_in_init)
- devtype->gpio_dir_in_init(gc);
-
-- irq_set_chained_handler_and_data(mpc8xxx_gc->irqn,
-- mpc8xxx_gpio_irq_cascade, mpc8xxx_gc);
-+ ret = devm_request_irq(&pdev->dev, mpc8xxx_gc->irqn,
-+ mpc8xxx_gpio_irq_cascade,
-+ IRQF_NO_THREAD | IRQF_SHARED, "gpio-cascade",
-+ mpc8xxx_gc);
-+ if (ret) {
-+ dev_err(&pdev->dev, "%s: failed to devm_request_irq(%d), ret = %d\n",
-+ np->full_name, mpc8xxx_gc->irqn, ret);
-+ goto err;
-+ }
-+
- return 0;
- err:
- iounmap(mpc8xxx_gc->regs);