Hi Niklas, On Sat, 30 Aug 2025 at 23:10, Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx> wrote: > This RFC/PATCH tries to address an issue with the Renesas CMT driver > design. The driver do PM and clock handling in struct clock_event_device > callbacks. This leads to LOCKDEP warnings and I think hints at a larger > issue. > > ============================= > [ BUG: Invalid wait context ] > 6.17.0-rc3-arm64-renesas-03071-gb3c4f4122b28-dirty #21 Not tainted > ----------------------------- > swapper/1/0 is trying to lock: > ffff00000898d180 (&dev->power.lock){-...}-{3:3}, at: __pm_runtime_resume+0x38/0x88 > ccree e6601000.crypto: ARM CryptoCell 630P Driver: HW version 0xAF400001/0xDCC63000, Driver version 5.0 > other info that might help us debug this: > ccree e6601000.crypto: ARM ccree device initialized > context-{5:5} > 2 locks held by swapper/1/0: > #0: ffff80008173c298 (tick_broadcast_lock){-...}-{2:2}, at: __tick_broadcast_oneshot_control+0xa4/0x3a8 > #1: ffff0000089a5858 (&ch->lock){....}-{2:2} > usbcore: registered new interface driver usbhid > , at: sh_cmt_start+0x30/0x364 > stack backtrace: > CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 6.17.0-rc3-arm64-renesas-03071-gb3c4f4122b28-dirty #21 PREEMPT > Hardware name: Renesas Salvator-X 2nd version board based on r8a77965 (DT) > Call trace: > show_stack+0x14/0x1c (C) > dump_stack_lvl+0x6c/0x90 > dump_stack+0x14/0x1c > __lock_acquire+0x904/0x1584 > lock_acquire+0x220/0x34c > _raw_spin_lock_irqsave+0x58/0x80 > __pm_runtime_resume+0x38/0x88 > sh_cmt_start+0x54/0x364 > sh_cmt_clock_event_set_oneshot+0x64/0xb8 > clockevents_switch_state+0xfc/0x13c > tick_broadcast_set_event+0x30/0xa4 > __tick_broadcast_oneshot_control+0x1e0/0x3a8 > tick_broadcast_oneshot_control+0x30/0x40 > cpuidle_enter_state+0x40c/0x680 > cpuidle_enter+0x30/0x40 > do_idle+0x1f4/0x26c > cpu_startup_entry+0x34/0x40 > secondary_start_kernel+0x11c/0x13c > __secondary_switched+0x74/0x78 > > This series tries to address this by instead doing PM and clock > management at probe time, and leaving them on for the CMT channels that > are used as clock events. The CMT design is a bit messy as channels can > be used both as clock sources and events. And the design to do the > housekeeping for clock sources seems to be valid and is kept. > > This is posted as an RFC as there is one other driver in-tree that > suffers form similar issues. I intend to try and refactor that away too, > but would like to try and get some feedback first. > > The work is tested on R-Car M3N. > > Niklas Söderlund (2): > clocksource/drivers/sh_cmt: Split start/stop of clock source and > events > clocksource/drivers/sh_cmt: Do not power down channels used for events Thanks for your series! I can confirm this fixes the issue on e.g. R-Car Gen3, where the CMT can be used for clock events or as a clock source, so Tested-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> On R-Mobile A1, the CMT is also used for periodic clock events. Your series seems to fix one invalid context, and expose a "new" one (lockdep shuts down after the first report): sh_cmt e6138000.timer: ch0: used for clock events sh_cmt e6138000.timer: ch0: used for periodic clock events ============================= [ BUG: Invalid wait context ] 6.17.0-rc5-armadillo-06055-g57d9d685e295 #872 Not tainted ----------------------------- swapper/0/1 is trying to lock: c0e5ae28 (enable_lock){....}-{3:3}, at: clk_enable_lock+0x38/0xc4 other info that might help us debug this: context-{5:5} 2 locks held by swapper/0/1: #0: c218e488 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xd8/0xf8 #1: c2201038 (&ch->lock){....}-{2:2}, at: sh_cmt_probe+0x598/0x780 stack backtrace: CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.17.0-rc5-armadillo-06055-g57d9d685e295 #872 NONE Hardware name: Generic R8A7740 (Flattened Device Tree) Call trace: unwind_backtrace from show_stack+0x10/0x14 show_stack from dump_stack_lvl+0x44/0x74 dump_stack_lvl from __lock_acquire+0x41c/0x17e8 __lock_acquire from lock_acquire+0x208/0x28c lock_acquire from _raw_spin_lock_irqsave+0x50/0x64 - _raw_spin_lock_irqsave from __pm_runtime_resume+0x54/0x80 - __pm_runtime_resume from sh_cmt_start+0x60/0x26c - sh_cmt_start from sh_cmt_clock_event_set_state+0x60/0xe8 - sh_cmt_clock_event_set_state from clockevents_switch_state+0x90/0x138 - clockevents_switch_state from clockevents_register_device+0x78/0xe8 - clockevents_register_device from sh_cmt_probe+0x588/0x700 + _raw_spin_lock_irqsave from clk_enable_lock+0x38/0xc4 + clk_enable_lock from clk_core_enable_lock+0xc/0x2c + clk_core_enable_lock from sh_cmt_enable+0x28/0x1c8 + sh_cmt_enable from sh_cmt_probe+0x5a4/0x780 sh_cmt_probe from platform_probe+0x58/0x90 platform_probe from really_probe+0x128/0x28c really_probe from __driver_probe_device+0x16c/0x18c __driver_probe_device from driver_probe_device+0x2c/0xa8 driver_probe_device from __driver_attach+0xe4/0xf8 __driver_attach from bus_for_each_dev+0x84/0xc8 bus_for_each_dev from bus_add_driver+0xd0/0x1d8 bus_add_driver from driver_register+0xb8/0x100 driver_register from do_one_initcall+0x74/0x1cc do_one_initcall from kernel_init_freeable+0x224/0x294 kernel_init_freeable from kernel_init+0x14/0x12c kernel_init from ret_from_fork+0x14/0x28 Exception stack(0xe0851fb0 to 0xe0851ff8) 1fa0: 00000000 00000000 00000000 00000000 1fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 1fe0: 00000000 00000000 00000000 00000000 00000013 00000000 Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds