1
linux/drivers/pinctrl
Sergey Matsievskiy 93b8ddc545 pinctrl: ocelot: fix system hang on level based interrupts
The current implementation only calls chained_irq_enter() and
chained_irq_exit() if it detects pending interrupts.

```
for (i = 0; i < info->stride; i++) {
	uregmap_read(info->map, id_reg + 4 * i, &reg);
	if (!reg)
		continue;

	chained_irq_enter(parent_chip, desc);
```

However, in case of GPIO pin configured in level mode and the parent
controller configured in edge mode, GPIO interrupt might be lowered by the
hardware. In the result, if the interrupt is short enough, the parent
interrupt is still pending while the GPIO interrupt is cleared;
chained_irq_enter() never gets called and the system hangs trying to
service the parent interrupt.

Moving chained_irq_enter() and chained_irq_exit() outside the for loop
ensures that they are called even when GPIO interrupt is lowered by the
hardware.

The similar code with chained_irq_enter() / chained_irq_exit() functions
wrapping interrupt checking loop may be found in many other drivers:
```
grep -r -A 10 chained_irq_enter drivers/pinctrl
```

Cc: stable@vger.kernel.org
Signed-off-by: Sergey Matsievskiy <matsievskiysv@gmail.com>
Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Link: https://lore.kernel.org/20241012105743.12450-2-matsievskiysv@gmail.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2024-10-12 22:04:38 +02:00
..
actions
aspeed pinctrl: aspeed-g6: Add NCSI pin group config 2024-06-26 12:41:07 +02:00
bcm pinctrl: bcm2835: fix module autoloading 2024-08-24 16:46:33 +02:00
berlin pinctrl: berlin: Make use of struct pinfunction 2024-06-17 09:23:34 +02:00
cirrus pinctrl: madera: Simplify with dev_err_probe() 2024-09-02 10:28:53 +02:00
freescale pinctrl: freescale: imx-scmi: Use kmemdup_array instead of kmemdup for multiple allocation 2024-08-26 10:47:42 +02:00
intel pinctrl: intel: platform: Add Panther Lake to the list of supported 2024-10-03 13:14:31 +03:00
mediatek This is the bulk of pin control changes for the v6.12 kernel cycle: 2024-09-23 13:15:23 -07:00
meson pinctrl: meson: Constify some structures 2024-08-23 18:01:42 +02:00
mvebu pinctrl: mvebu: Fix devinit_dove_pinctrl_probe function 2024-09-02 10:08:46 +02:00
nomadik pinctrl: nomadik: Use kmemdup_array instead of kmemdup for multiple allocation 2024-08-30 23:38:26 +02:00
nuvoton pinctrl: nuvoton: fix a double free in ma35_pinctrl_dt_node_to_map_func() 2024-10-11 21:54:58 +02:00
nxp pinctrl: s32cc: add update and overwrite options when setting pinconf 2024-08-05 10:17:43 +02:00
pxa
qcom pinctrl: qcom: x1e80100: Bypass PDC wakeup parent for now 2024-09-02 11:07:48 +02:00
realtek pinctrl: realtek: Constify struct regmap_config 2024-08-05 09:07:41 +02:00
renesas pinctrl: renesas: rzg2l: Move pinconf_to_config_argument() call outside of switch cases 2024-09-02 10:13:59 +02:00
samsung pinctrl: samsung: Use kmemdup_array instead of kmemdup for multiple allocation 2024-08-23 15:40:55 +02:00
sophgo pinctrl: sophgo: fix double free in cv1800_pctrl_dt_node_to_map() 2024-10-10 21:12:59 +02:00
spear pinctrl: spear: Use scope based of_node_put() cleanups 2024-06-26 11:56:15 +02:00
sprd pinctrl: sprd: Use scope based of_node_put() cleanups 2024-06-26 11:56:05 +02:00
starfive pinctrl: starfive: jh7110: Correct the level trigger configuration of iev register 2024-08-23 18:14:45 +02:00
stm32 pinctrl: stm32: check devm_kasprintf() returned value 2024-10-01 14:03:34 +02:00
sunplus
sunxi pinctrl: sunxi: Use devm_clk_get_enabled() helpers 2024-09-02 10:06:13 +02:00
tegra pinctrl: tegra: Use scope based of_node_put() cleanups 2024-06-26 11:55:34 +02:00
ti pinctrl: ti: ti-iodelay: Constify struct ti_iodelay_reg_data 2024-08-05 09:22:33 +02:00
uniphier
visconti
vt8500
core.c pinctrl: Remove redundant null pointer checks in pinctrl_remove_device_debugfs() 2024-09-05 15:09:47 +02:00
core.h pinctrl: pinmux: Add a convenient define PINCTRL_FUNCTION_DESC() 2024-06-17 09:24:13 +02:00
devicetree.c
devicetree.h
Kconfig soc: convert ep93xx to devicetree 2024-09-26 12:00:25 -07:00
Makefile soc: convert ep93xx to devicetree 2024-09-26 12:00:25 -07:00
pinconf-generic.c pinctrl: pinconf-generic: Add support for "input-schmitt-microvolt" property 2024-08-04 00:54:49 +02:00
pinconf.c
pinconf.h
pinctrl-amd.c
pinctrl-amd.h
pinctrl-apple-gpio.c pinctrl: apple: check devm_kasprintf() returned value 2024-10-01 14:03:34 +02:00
pinctrl-artpec6.c
pinctrl-as3722.c
pinctrl-at91-pio4.c pinctrl: at91: Use scope based of_node_put() cleanups 2024-06-26 11:57:55 +02:00
pinctrl-at91.c pinctrl: at91: make it work with current gpiolib 2024-08-23 17:32:01 +02:00
pinctrl-at91.h
pinctrl-aw9523.c pinctrl: aw9523: add missing mutex_destroy 2024-10-02 15:48:38 +02:00
pinctrl-axp209.c
pinctrl-bm1880.c
pinctrl-cy8c95x0.c pinctrl: pinctrl-cy8c95x0: Fix regcache 2024-09-13 13:14:18 +02:00
pinctrl-da850-pupd.c
pinctrl-da9062.c pinctrl: da9062: replace gpiochip_get_desc() with gpio_device_get_desc() 2024-06-25 09:12:48 +02:00
pinctrl-digicolor.c
pinctrl-ep93xx.c pinctrl: ep93xx: Fix raster pins typo 2024-09-16 11:16:15 +00:00
pinctrl-equilibrium.c pinctrl: equilibrium: Use scope based of_node_put() cleanups 2024-07-03 14:40:38 +02:00
pinctrl-equilibrium.h pinctrl: equilibrium: Make use of struct pinfunction 2024-06-17 09:23:43 +02:00
pinctrl-eyeq5.c pinctrl: eyeq5: add platform driver 2024-08-04 00:51:28 +02:00
pinctrl-falcon.c
pinctrl-gemini.c
pinctrl-ingenic.c pinctrl: ingenic: Convert to use func member 2024-06-17 09:24:42 +02:00
pinctrl-k210.c pinctrl: k210: Use devm_clk_get_enabled() helpers 2024-09-02 10:26:18 +02:00
pinctrl-keembay.c pinctrl: keembay: Fix func conversion in keembay_build_functions() 2024-06-17 09:26:28 +02:00
pinctrl-lantiq.c
pinctrl-lantiq.h
pinctrl-loongson2.c
pinctrl-lpc18xx.c
pinctrl-max77620.c
pinctrl-mcp23s08_i2c.c pinctrl: add missing MODULE_DESCRIPTION() macros 2024-06-17 10:59:31 +02:00
pinctrl-mcp23s08_spi.c pinctrl: add missing MODULE_DESCRIPTION() macros 2024-06-17 10:59:31 +02:00
pinctrl-mcp23s08.c pinctrl: add missing MODULE_DESCRIPTION() macros 2024-06-17 10:59:31 +02:00
pinctrl-mcp23s08.h
pinctrl-microchip-sgpio.c
pinctrl-mlxbf3.c pinctrl: mlxbf3: Fix return value check for devm_platform_ioremap_resource 2024-06-26 12:41:07 +02:00
pinctrl-ocelot.c pinctrl: ocelot: fix system hang on level based interrupts 2024-10-12 22:04:38 +02:00
pinctrl-palmas.c
pinctrl-pef2256.c
pinctrl-pic32.c
pinctrl-pic32.h
pinctrl-pistachio.c
pinctrl-rk805.c
pinctrl-rockchip.c This is the bulk of pin control changes for the v6.12 kernel cycle: 2024-09-23 13:15:23 -07:00
pinctrl-rockchip.h pinctrl: rockchip: Add rk3576 pinctrl support 2024-08-23 17:47:17 +02:00
pinctrl-scmi.c pinctrl: scmi: add blocklist 2024-06-17 09:26:04 +02:00
pinctrl-single.c This is the bulk of pin control changes for the v6.12 kernel cycle: 2024-09-23 13:15:23 -07:00
pinctrl-st.c pinctrl: st: Use scope based of_node_put() cleanups 2024-06-17 09:21:38 +02:00
pinctrl-stmfx.c pinctrl: stmfx: Use string_choices API instead of ternary operator 2024-08-31 00:11:29 +02:00
pinctrl-sx150x.c
pinctrl-tb10x.c pinctrl: add missing MODULE_DESCRIPTION() macros 2024-06-17 10:59:31 +02:00
pinctrl-tps6594.c Pin control bulk changes for the v6.11 kernel series: 2024-07-21 10:25:59 -07:00
pinctrl-utils.c drivers/pinctrl: Switch to use kmemdup_array() 2024-08-26 10:27:52 +02:00
pinctrl-utils.h
pinctrl-xway.c
pinctrl-zynq.c pinctrl: pinctrl-zynq: fix module autoloading 2024-08-24 16:31:10 +02:00
pinctrl-zynqmp.c pinctrl: zynqmp: Support muxing individual pins 2024-06-17 10:47:06 +02:00
pinmux.c pinctrl: Join split messages and remove double whitespace 2024-09-02 10:14:21 +02:00
pinmux.h pinctrl: pinmux: Remove unused members from struct function_desc 2024-06-17 09:25:11 +02:00