linux/drivers/pinctrl
Daniel Kurtz 8bbed1eef0 pinctrl/amd: only handle irq if it is pending and unmasked
The AMD pinctrl driver demultiplexes GPIO interrupts and fires off their
individual handlers.

If one of these GPIO irqs is configured as a level interrupt, and its
downstream handler is a threaded ONESHOT interrupt, the GPIO interrupt
source is masked by handle_level_irq() until the eventual return of the
threaded irq handler.  During this time the level GPIO interrupt status
will still report as high until the actual gpio source is cleared - both
in the individual GPIO interrupt status bit (INTERRUPT_STS_OFF) and in
its corresponding "WAKE_INT_STATUS_REG" bit.

Thus, if another GPIO interrupt occurs during this time,
amd_gpio_irq_handler() will see that the (masked-and-not-yet-cleared)
level irq is still pending and incorrectly call its handler again.

To fix this, have amd_gpio_irq_handler() check for both interrupts status
and mask before calling generic_handle_irq().

Note: Is it possible that this bug was the source of the interrupt storm
on Ryzen when using chained interrupts before commit ba714a9c1d
("pinctrl/amd: Use regular interrupt instead of chained")?

Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2018-07-29 22:43:31 +02:00
..
actions pinctrl: actions: fix unsigned less than zero comparison 2018-07-02 16:05:01 +02:00
aspeed pinctrl: aspeed: Fix documentation 2018-06-28 16:13:12 +02:00
bcm treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
berlin pinctrl: berlin: add the as370 SoC pinctrl driver 2018-07-29 21:42:32 +02:00
freescale pinctrl: imx: add driver for i.MX8MQ 2018-07-16 14:46:11 +02:00
intel pinctrl: baytrail: Mark expected switch fall-throughs 2018-07-16 14:46:11 +02:00
mediatek pinctrl: mt7622: Fix probe fail by misuse the selector 2018-07-17 10:50:14 +02:00
meson pinctrl: meson: add gen_clk pins 2018-07-16 14:46:11 +02:00
mvebu pinctrl: armada-37xx: add suspend/resume support 2018-06-29 14:41:10 +02:00
nomadik pinctrl: nomadik: Drop U8540/9540 support 2018-03-23 03:38:14 +01:00
pxa
qcom pinctrl: qcom: spmi-gpio: Fix pmic_gpio_config_get() to be compliant 2018-07-09 13:16:01 +02:00
samsung pinctrl: samsung: Write external wakeup interrupt mask 2018-07-24 21:56:41 +02:00
sh-pfc pinctrl: sh-pfc: r8a77990: Add USB3.0 pins, groups and functions 2018-07-16 14:46:38 +02:00
sirf treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
spear treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
sprd treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
stm32 pinctrl: stm32: add syscfg mask parameter 2018-07-29 22:14:59 +02:00
sunxi treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
tegra treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
ti treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
uniphier This is the bulk of pin control changes for v4.18. 2018-06-07 13:56:45 -07:00
vt8500 treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
zte treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
core.c pinctrl: core: Return selector to the pinctrl driver 2018-07-17 10:48:25 +02:00
core.h pinctrl: core: Remove broken remove_last group and pinmux functions 2018-07-17 10:49:49 +02:00
devicetree.c pinctrl: devicetree: Fix dt_to_map_one_config handling of hogs 2018-03-02 09:41:21 +01:00
devicetree.h
Kconfig pinctrl: mcp23s08: Kconfig: update to reflect supported features 2018-06-18 07:56:05 +02:00
Makefile pinctrl: actions: Add Actions S900 pinctrl driver 2018-05-02 14:36:08 +02:00
pinconf-generic.c
pinconf.c
pinconf.h
pinctrl-amd.c pinctrl/amd: only handle irq if it is pending and unmasked 2018-07-29 22:43:31 +02:00
pinctrl-amd.h pinctrl/amd: fix gpio irq level in debugfs 2018-07-29 22:20:15 +02:00
pinctrl-artpec6.c pinctrl: artpec-6: Add smaller groups for uarts 2018-03-01 17:04:09 +01:00
pinctrl-as3722.c
pinctrl-at91-pio4.c pinctrl: at91-pio4: Remove redundant return value check 2018-07-16 14:46:11 +02:00
pinctrl-at91.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-at91.h
pinctrl-axp209.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-coh901.c
pinctrl-coh901.h
pinctrl-da850-pupd.c
pinctrl-digicolor.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-falcon.c
pinctrl-gemini.c pinctrl: gemini: Mask properly 2018-06-26 09:51:42 +02:00
pinctrl-ingenic.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-lantiq.c treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-lantiq.h
pinctrl-lpc18xx.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-max77620.c
pinctrl-mcp23s08.c pinctrl: mcp23s08: debugfs: Do not restore the INTF register 2018-06-18 07:56:05 +02:00
pinctrl-ocelot.c pinctrl: ocelot: fix gpio4 twi function 2018-07-16 14:46:11 +02:00
pinctrl-oxnas.c
pinctrl-palmas.c
pinctrl-pic32.c
pinctrl-pic32.h
pinctrl-pistachio.c
pinctrl-rk805.c
pinctrl-rockchip.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-rza1.c pinctrl: rza1: Fix selector use for groups and functions 2018-07-17 10:49:33 +02:00
pinctrl-single.c pinctrl: single: Fix missing unlock on error path 2018-07-17 10:50:05 +02:00
pinctrl-st.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-sx150x.c pinctrl: sx150x: Add a static gpio/pinctrl pin range mapping 2018-01-18 11:04:47 +01:00
pinctrl-tb10x.c
pinctrl-u300.c
pinctrl-utils.c
pinctrl-utils.h
pinctrl-xway.c treewide: devm_kzalloc() -> devm_kcalloc() 2018-06-12 16:19:22 -07:00
pinctrl-zynq.c
pinmux.c pinctrl: pinmux: Return selector to the pinctrl driver 2018-07-17 10:48:47 +02:00
pinmux.h pinctrl: core: Remove broken remove_last group and pinmux functions 2018-07-17 10:49:49 +02:00