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 pinctrl: pxa2xx: Make use of struct pingroup 2024-03-28 09:44:20 +01:00
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 pinctrl: sppctl: use gpiochip_dup_line_label() 2023-12-08 09:26:37 +01:00
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 pinctrl: devicetree: fix refcount leak in pinctrl_dt_to_map() 2024-04-16 15:32:48 +02:00
devicetree.h pinctrl: Clean up headers 2022-10-24 17:06:48 +03:00
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 pinctrl: Convert unsigned to unsigned int 2023-12-04 15:32:42 +01:00
pinconf.h
pinctrl-amd.c genirq: Introduce IRQF_COND_ONESHOT and use it in pinctrl-amd 2024-03-25 23:45:21 +01:00
pinctrl-amd.h pinctrl: amd: Mask non-wake source pins with interrupt enabled at suspend 2023-12-04 15:46:02 +01:00
pinctrl-apple-gpio.c pinctrl: apple: check devm_kasprintf() returned value 2024-10-01 14:03:34 +02:00
pinctrl-artpec6.c pinctrl: artpec6: Convert to platform remove callback returning void 2023-10-10 15:39:10 +02:00
pinctrl-as3722.c pinctrl: as3722: Use devm_gpiochip_add_data() to simplify remove path 2023-11-24 11:22:12 +01:00
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: axp209: drop the wrapper around pinctrl_gpio_direction_input() 2023-11-04 10:23:22 +01:00
pinctrl-bm1880.c pinctrl: bm1880: Add missing header(s) 2022-10-24 12:53:33 +03:00
pinctrl-cy8c95x0.c pinctrl: pinctrl-cy8c95x0: Fix regcache 2024-09-13 13:14:18 +02:00
pinctrl-da850-pupd.c pinctrl: da850-pupd: Drop empty platform remove function 2022-12-29 02:02:46 +01:00
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: digicolor: Use proper headers and drop OF dependency 2023-01-16 15:14:03 +01:00
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: lantiq: Remove unused of_gpio.h inclusion 2023-06-16 15:04:34 +02:00
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: Add missing header(s) 2022-10-24 17:06:46 +03:00
pinctrl-lantiq.h
pinctrl-loongson2.c pinctrl: loongson2: fix module autoloading 2024-04-17 10:43:50 +02:00
pinctrl-lpc18xx.c pinctrl: Explicitly include correct DT includes 2023-07-20 21:41:24 +02:00
pinctrl-max77620.c pinctrl: max77620: Remove an unused fields in struct max77620_pin_info and max77620_pctrl_info 2024-04-04 21:03:25 +02:00
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: mcp23s08: Simplify probe()/mcp23s08_spi_regmap_init() 2023-10-10 13:39:38 +02:00
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 treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 445 2019-06-05 17:37:18 +02:00
pinctrl-pistachio.c pinctrl: pistachio: Convert to immutable irq_chip 2023-04-20 16:07:40 +02:00
pinctrl-rk805.c pinctrl: rk805: Add rk816 pinctrl support 2024-05-03 09:15:33 +01:00
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: Convert unsigned to unsigned int 2023-12-04 15:32:42 +01:00
pinctrl-xway.c pinctrl: Use device_get_match_data() 2023-10-30 14:50:42 +01:00
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