iommu/rockchip: fix devm_free_irq

RK3128 vop-iommu skip request the irq due to register read issue.
So don't free irq when shut down or belowing error will output

[  102.107589] WARNING: CPU: 3 PID: 1013 at kernel/irq/devres.c:143 devm_free_irq+0x68/0x9c
[  102.115720] Modules linked in:
[  102.118862] CPU: 3 PID: 1013 Comm: init Not tainted 5.10.110 #15
[  102.124907] Hardware name: Generic DT based system
[  102.129732] Backtrace:
[  102.132230] [<c0bb9218>] (dump_backtrace) from [<c0bb95b8>] (show_stack+0x20/0x24)
[  102.139843]  r7:600f0013 r6:c0e96442 r5:00000000 r4:c1219d6c
[  102.145553] [<c0bb9598>] (show_stack) from [<c0bbc7f8>] (dump_stack_lvl+0x94/0xac)
[  102.153171] [<c0bbc764>] (dump_stack_lvl) from [<c0bbc824>] (dump_stack+0x14/0x1c)
[  102.160780]  r7:00000000 r6:00000000 r5:00000009 r4:c017ac34
[  102.166488] [<c0bbc810>] (dump_stack) from [<c011fd80>] (__warn+0xd4/0x100)
[  102.173497] [<c011fcac>] (__warn) from [<c0bb9cd8>] (warn_slowpath_fmt+0x8c/0xc4)
[  102.181026]  r9:00000000 r8:00000009 r7:c017ac34 r6:0000008f r5:c0df4ea4 r4:c353c000
[  102.188820] [<c0bb9c50>] (warn_slowpath_fmt) from [<c017ac34>] (devm_free_irq+0x68/0x9c)
[  102.196962]  r9:c0e44260 r8:c128d018 r7:c12ea690 r6:c1a17f40 r5:0000002e r4:c353c000
[  102.204759] [<c017abcc>] (devm_free_irq) from [<c051e934>] (rk_iommu_shutdown+0x58/0x5c)
[  102.212895]  r6:c1a17f40 r5:00000001 r4:c197ec00
[  102.217558] [<c051e8dc>] (rk_iommu_shutdown) from [<c05b134c>] (platform_drv_shutdown+0x2c/0x30)
[  102.226385]  r7:c12ea690 r6:c12285f0 r5:c197ec10 r4:c197ec14
[  102.232094] [<c05b1320>] (platform_drv_shutdown) from [<c05ad464>] (device_shutdown+0x15c/0x1dc)
[  102.240938] [<c05ad308>] (device_shutdown) from [<c01441d4>] (kernel_restart_prepare+0x3c/0x48)
[  102.249684]  r10:00000058 r9:01234567 r8:00000010 r7:c353c000 r6:4321fedc r5:c11168ec
[  102.257548]  r4:00000000
[  102.260124] [<c0144198>] (kernel_restart_prepare) from [<c01442f4>] (kernel_restart+0x1c/0x60)
[  102.268785] [<c01442d8>] (kernel_restart) from [<c01445d8>] (__do_sys_reboot+0x154/0x1e0)
[  102.277004]  r5:c11168ec r4:00000000
[  102.280617] [<c0144484>] (__do_sys_reboot) from [<c01446d4>] (sys_reboot+0x18/0x1c)
[  102.288326]  r9:c353c000 r8:c01002c4 r7:00000058 r6:005241c4 r5:00524140 r4:00000000
[  102.296121] [<c01446bc>] (sys_reboot) from [<c0100060>] (ret_fast_syscall+0x0/0x54)
[  102.303821] Exception stack(0xc353dfa8 to 0xc353dff0)
[  102.308912] dfa0:                   00000000 00524140 fee1dead 28121969 01234567 00000010
[  102.317141] dfc0: 00000000 00524140 005241c4 00000058 beddbefc 0044b1a8 b6f39d00 b6f3a010
[  102.325364] dfe0: 00523b5c beddbc90 004dadf4 b6e584c8
[  102.330545] ---[ end trace adc766c58fa6634f ]---
[  102.335275] ------------[ cut here ]------------
[  102.339948] WARNING: CPU: 3 PID: 1013 at kernel/irq/manage.c:1756 free_irq+0x26c/0x29c
[  102.347907] Trying to free already-free IRQ 46
[  102.352381] Modules linked in:
[  102.355479] CPU: 3 PID: 1013 Comm: init Tainted: G        W         5.10.110 #15
[  102.362907] Hardware name: Generic DT based system
[  102.367721] Backtrace:
[  102.370212] [<c0bb9218>] (dump_backtrace) from [<c0bb95b8>] (show_stack+0x20/0x24)
[  102.377824]  r7:600f0093 r6:c0e96442 r5:00000000 r4:c1219d6c
[  102.383532] [<c0bb9598>] (show_stack) from [<c0bbc7f8>] (dump_stack_lvl+0x94/0xac)
[  102.391150] [<c0bbc764>] (dump_stack_lvl) from [<c0bbc824>] (dump_stack+0x14/0x1c)
[  102.398759]  r7:c353dd34 r6:00000000 r5:00000009 r4:c017823c
[  102.404466] [<c0bbc810>] (dump_stack) from [<c011fd80>] (__warn+0xd4/0x100)
[  102.411473] [<c011fcac>] (__warn) from [<c0bb9cd8>] (warn_slowpath_fmt+0x8c/0xc4)
[  102.419002]  r9:c0df48e7 r8:00000009 r7:c017823c r6:000006dc r5:c0df4854 r4:c353c000
[  102.426799] [<c0bb9c50>] (warn_slowpath_fmt) from [<c017823c>] (free_irq+0x26c/0x29c)
[  102.434676]  r9:600f0013 r8:0000002e r7:c1a17f40 r6:c1978a6c r5:00000000 r4:c1978a00
[  102.442471] [<c0177fd0>] (free_irq) from [<c017ac40>] (devm_free_irq+0x74/0x9c)
[  102.449832]  r10:c197ec54 r9:c0e44260 r8:c128d018 r7:c12ea690 r6:c1a17f40 r5:0000002e
[  102.457700]  r4:c353c000
[  102.460278] [<c017abcc>] (devm_free_irq) from [<c051e934>] (rk_iommu_shutdown+0x58/0x5c)
[  102.468414]  r6:c1a17f40 r5:00000001 r4:c197ec00
[  102.473075] [<c051e8dc>] (rk_iommu_shutdown) from [<c05b134c>] (platform_drv_shutdown+0x2c/0x30)
[  102.481901]  r7:c12ea690 r6:c12285f0 r5:c197ec10 r4:c197ec14
[  102.487611] [<c05b1320>] (platform_drv_shutdown) from [<c05ad464>] (device_shutdown+0x15c/0x1dc)
[  102.496453] [<c05ad308>] (device_shutdown) from [<c01441d4>] (kernel_restart_prepare+0x3c/0x48)
[  102.505200]  r10:00000058 r9:01234567 r8:00000010 r7:c353c000 r6:4321fedc r5:c11168ec
[  102.513066]  r4:00000000
[  102.515642] [<c0144198>] (kernel_restart_prepare) from [<c01442f4>] (kernel_restart+0x1c/0x60)
[  102.524302] [<c01442d8>] (kernel_restart) from [<c01445d8>] (__do_sys_reboot+0x154/0x1e0)
[  102.532521]  r5:c11168ec r4:00000000
[  102.536134] [<c0144484>] (__do_sys_reboot) from [<c01446d4>] (sys_reboot+0x18/0x1c)
[  102.543833]  r9:c353c000 r8:c01002c4 r7:00000058 r6:005241c4 r5:00524140 r4:00000000
[  102.551626] [<c01446bc>] (sys_reboot) from [<c0100060>] (ret_fast_syscall+0x0/0x54)
[  102.559324] Exception stack(0xc353dfa8 to 0xc353dff0)
[  102.564414] dfa0:                   00000000 00524140 fee1dead 28121969 01234567 00000010
[  102.572641] dfc0: 00000000 00524140 005241c4 00000058 beddbefc 0044b1a8 b6f39d00 b6f3a010
[  102.580864] dfe0: 00523b5c beddbc90 004dadf4 b6e584c8
[  102.585947] ---[ end trace adc766c58fa66350 ]---

Change-Id: Ic0603d4d00528dc6b5ef6d480b15d3c14585dec3
Signed-off-by: Simon Xue <xxm@rock-chips.com>
This commit is contained in:
Simon Xue
2022-12-01 10:17:54 +08:00
parent f07500720b
commit 22dccf0395
+4
View File
@@ -1960,12 +1960,16 @@ static void rk_iommu_shutdown(struct platform_device *pdev)
struct rk_iommu *iommu = platform_get_drvdata(pdev);
int i;
if (iommu->skip_read)
goto skip_free_irq;
for (i = 0; i < iommu->num_irq; i++) {
int irq = platform_get_irq(pdev, i);
devm_free_irq(iommu->dev, irq, iommu);
}
skip_free_irq:
pm_runtime_force_suspend(&pdev->dev);
}