diff options
author | Yangbo Lu <yangbo.lu@nxp.com> | 2020-04-10 10:47:05 +0800 |
---|---|---|
committer | Petr Štetiar <ynezz@true.cz> | 2020-05-07 12:53:06 +0200 |
commit | cddd4591404fb4c53dc0b3c0b15b942cdbed4356 (patch) | |
tree | 392c1179de46b0f804e3789edca19069b64e6b44 /target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch | |
parent | d1d2c0b5579ea4f69a42246c9318539d61ba1999 (diff) | |
download | upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.gz upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.tar.bz2 upstream-cddd4591404fb4c53dc0b3c0b15b942cdbed4356.zip |
layerscape: add patches-5.4
Add patches for linux-5.4. The patches are from NXP LSDK-20.04 release
which was tagged LSDK-20.04-V5.4.
https://source.codeaurora.org/external/qoriq/qoriq-components/linux/
For boards LS1021A-IOT, and Traverse-LS1043 which are not involved in
LSDK, port the dts patches from 4.14.
The patches are sorted into the following categories:
301-arch-xxxx
302-dts-xxxx
303-core-xxxx
701-net-xxxx
801-audio-xxxx
802-can-xxxx
803-clock-xxxx
804-crypto-xxxx
805-display-xxxx
806-dma-xxxx
807-gpio-xxxx
808-i2c-xxxx
809-jailhouse-xxxx
810-keys-xxxx
811-kvm-xxxx
812-pcie-xxxx
813-pm-xxxx
814-qe-xxxx
815-sata-xxxx
816-sdhc-xxxx
817-spi-xxxx
818-thermal-xxxx
819-uart-xxxx
820-usb-xxxx
821-vfio-xxxx
Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
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.patch | 80 |
1 files changed, 80 insertions, 0 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 new file mode 100644 index 0000000000..01d2772138 --- /dev/null +++ b/target/linux/layerscape/patches-5.4/807-gpio-0001-gpio-mpc8xxx-change-irq-handler-from-chained-to-norm.patch @@ -0,0 +1,80 @@ +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); |