linux/drivers/pinctrl/renesas
Claudiu Beznea f8bb150f22 pinctrl: renesas: rzg2l: Fix ISEL restore on resume
commit 44bf66122c upstream.

Commit 1d2da79708 ("pinctrl: renesas: rzg2l: Avoid configuring ISEL in
gpio_irq_{en,dis}able*()") dropped the configuration of ISEL from
struct irq_chip::{irq_enable, irq_disable} APIs and moved it to
struct gpio_chip::irq::{child_to_parent_hwirq,
child_irq_domain_ops::free} APIs to fix spurious IRQs.

After commit 1d2da79708 ("pinctrl: renesas: rzg2l: Avoid configuring ISEL
in gpio_irq_{en,dis}able*()"), ISEL was no longer configured properly on
resume. This is because the pinctrl resume code used
struct irq_chip::irq_enable  (called from rzg2l_gpio_irq_restore()) to
reconfigure the wakeup interrupts. Some drivers (e.g. Ethernet) may also
reconfigure non-wakeup interrupts on resume through their own code,
eventually calling struct irq_chip::irq_enable.

Fix this by adding ISEL configuration back into the
struct irq_chip::irq_enable API and on resume path for wakeup interrupts.

As struct irq_chip::irq_enable needs now to lock to update the ISEL,
convert the struct rzg2l_pinctrl::lock to a raw spinlock and replace the
locking API calls with the raw variants. Otherwise the lockdep reports
invalid wait context when probing the adv7511 module on RZ/G2L:

 [ BUG: Invalid wait context ]
 6.17.0-rc5-next-20250911-00001-gfcfac22533c9 #18 Not tainted
 -----------------------------
 (udev-worker)/165 is trying to lock:
 ffff00000e3664a8 (&pctrl->lock){....}-{3:3}, at: rzg2l_gpio_irq_enable+0x38/0x78
 other info that might help us debug this:
 context-{5:5}
 3 locks held by (udev-worker)/165:
 #0: ffff00000e890108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0x90/0x1ac
 #1: ffff000011c07240 (request_class){+.+.}-{4:4}, at: __setup_irq+0xb4/0x6dc
 #2: ffff000011c070c8 (lock_class){....}-{2:2}, at: __setup_irq+0xdc/0x6dc
 stack backtrace:
 CPU: 1 UID: 0 PID: 165 Comm: (udev-worker) Not tainted 6.17.0-rc5-next-20250911-00001-gfcfac22533c9 #18 PREEMPT
 Hardware name: Renesas SMARC EVK based on r9a07g044l2 (DT)
 Call trace:
 show_stack+0x18/0x24 (C)
 dump_stack_lvl+0x90/0xd0
 dump_stack+0x18/0x24
 __lock_acquire+0xa14/0x20b4
 lock_acquire+0x1c8/0x354
 _raw_spin_lock_irqsave+0x60/0x88
 rzg2l_gpio_irq_enable+0x38/0x78
 irq_enable+0x40/0x8c
 __irq_startup+0x78/0xa4
 irq_startup+0x108/0x16c
 __setup_irq+0x3c0/0x6dc
 request_threaded_irq+0xec/0x1ac
 devm_request_threaded_irq+0x80/0x134
 adv7511_probe+0x928/0x9a4 [adv7511]
 i2c_device_probe+0x22c/0x3dc
 really_probe+0xbc/0x2a0
 __driver_probe_device+0x78/0x12c
 driver_probe_device+0x40/0x164
 __driver_attach+0x9c/0x1ac
 bus_for_each_dev+0x74/0xd0
 driver_attach+0x24/0x30
 bus_add_driver+0xe4/0x208
 driver_register+0x60/0x128
 i2c_register_driver+0x48/0xd0
 adv7511_init+0x5c/0x1000 [adv7511]
 do_one_initcall+0x64/0x30c
 do_init_module+0x58/0x23c
 load_module+0x1bcc/0x1d40
 init_module_from_file+0x88/0xc4
 idempotent_init_module+0x188/0x27c
 __arm64_sys_finit_module+0x68/0xac
 invoke_syscall+0x48/0x110
 el0_svc_common.constprop.0+0xc0/0xe0
 do_el0_svc+0x1c/0x28
 el0_svc+0x4c/0x160
 el0t_64_sync_handler+0xa0/0xe4
 el0t_64_sync+0x198/0x19c

Having ISEL configuration back into the struct irq_chip::irq_enable API
should be safe with respect to spurious IRQs, as in the probe case IRQs
are enabled anyway in struct gpio_chip::irq::child_to_parent_hwirq. No
spurious IRQs were detected on suspend/resume, boot, ethernet link
insert/remove tests (executed on RZ/G3S). Boot, ethernet link
insert/remove tests were also executed successfully on RZ/G2L.

Fixes: 1d2da79708 ("pinctrl: renesas: rzg2l: Avoid configuring ISEL in gpio_irq_{en,dis}able*(")
Cc: stable@vger.kernel.org
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://patch.msgid.link/20250912095308.3603704-1-claudiu.beznea.uj@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
[claudiu.beznea:
 - in rzg2l_write_oen() kept v6.12 code and use
   raw_spin_lock_irqsave()/raw_spin_unlock_irqrestore()
 - in rzg2l_gpio_set() kept v6.12 code and use raw_spin_unlock_irqrestore()
 - in rzg2l_pinctrl_resume_noirq() kept v6.12 code
 - manually adjust rzg3s_oen_write(), rzv2h_oen_write() to use
   raw_spin_lock_irqsave()/raw_spin_unlock_irqrestore()]
Signed-off-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2026-01-08 10:14:27 +01:00
..
core.c pinctrl: renesas: Allow the compiler to optimize away sh_pfc_pm 2024-02-21 16:34:33 +01:00
core.h pinctrl: renesas: Move R-Car bias helpers to sh_pfc.h 2021-03-24 10:38:29 +01:00
gpio.c treewide: rename pinctrl_gpio_direction_output_new() 2023-11-04 10:23:22 +01:00
Kconfig pinctrl: renesas: Select PINCTRL_RZG2L for RZ/V2H(P) SoC 2024-12-05 14:02:02 +01:00
Makefile pinctrl: renesas: Initial R8A779H0 (R-Car V4M) PFC support 2024-02-20 11:43:48 +01:00
pfc-emev2.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a73a4.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a779a0.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a779f0.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a779g0.c pinctrl: renesas: r8a779g0: Add INTC-EX pins, groups, and function 2024-07-01 11:27:39 +02:00
pfc-r8a779h0.c pinctrl: renesas: r8a779h0: Remove unneeded separators 2024-07-01 11:27:39 +02:00
pfc-r8a7740.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a7778.c pinctrl: renesas: r8a7778: Add LBSC pins, groups, and functions 2023-10-13 09:38:04 +02:00
pfc-r8a7779.c pinctrl: renesas: r8a7779: s/LSBC/LBSC/ 2023-09-11 13:24:39 +02:00
pfc-r8a7790.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a7791.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a7792.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a7794.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a7796.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a77470.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a77951.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a77965.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a77970.c pinctrl: renesas: Fix spaces followed by tabs 2023-05-09 11:51:33 +02:00
pfc-r8a77980.c pinctrl: renesas: Fix spaces followed by tabs 2023-05-09 11:51:33 +02:00
pfc-r8a77990.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-r8a77995.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh73a0.c pinctrl: renesas: sh73a0: Use rdev_get_drvdata() 2024-07-01 11:27:38 +02:00
pfc-sh7203.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7264.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7269.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7720.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7722.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7723.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7724.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7734.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7757.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7785.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-sh7786.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pfc-shx3.c pinctrl: renesas: Annotate sentinels in tables 2023-03-30 15:39:05 +02:00
pinctrl-rza1.c pinctrl: renesas: Use scope based of_node_put() cleanups 2024-05-28 09:29:22 +02:00
pinctrl-rza2.c pinctrl: renesas: rza2: Fix potential NULL pointer dereference 2025-05-02 07:59:14 +02:00
pinctrl-rzg2l.c pinctrl: renesas: rzg2l: Fix ISEL restore on resume 2026-01-08 10:14:27 +01:00
pinctrl-rzn1.c pinctrl: renesas: rzn1: Use for_each_child_of_node_scoped() 2024-06-07 14:12:10 +02:00
pinctrl-rzv2m.c pinctrl: renesas: rzv2m: Fix missing of_node_put() call 2025-04-10 14:39:21 +02:00
pinctrl.c pinctrl: renesas: Use int type to store negative error codes 2025-10-15 11:59:59 +02:00
sh_pfc.h pinctrl: renesas: Initial R8A779H0 (R-Car V4M) PFC support 2024-02-20 11:43:48 +01:00