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
bcm pinctrl: bcm2835: fix module autoloading 2024-08-24 16:46:33 +02:00
berlin
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
sprd
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
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
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.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-digicolor.c
pinctrl-ep93xx.c pinctrl: ep93xx: Fix raster pins typo 2024-09-16 11:16:15 +00:00
pinctrl-equilibrium.c
pinctrl-equilibrium.h
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-k210.c pinctrl: k210: Use devm_clk_get_enabled() helpers 2024-09-02 10:26:18 +02:00
pinctrl-keembay.c
pinctrl-lantiq.c
pinctrl-lantiq.h
pinctrl-loongson2.c
pinctrl-lpc18xx.c
pinctrl-max77620.c
pinctrl-mcp23s08.c
pinctrl-mcp23s08.h
pinctrl-mcp23s08_i2c.c
pinctrl-mcp23s08_spi.c
pinctrl-microchip-sgpio.c
pinctrl-mlxbf3.c
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-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-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-tps6594.c
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
pinmux.c pinctrl: Join split messages and remove double whitespace 2024-09-02 10:14:21 +02:00
pinmux.h