From 99c02a0206ede0fb66b0ff8ffd00869a3038380e Mon Sep 17 00:00:00 2001 From: Liang Chen Date: Wed, 11 May 2022 11:04:06 +0800 Subject: [PATCH] media: rockchip: hdmirx: use devm_request_irq() and remove invalid IRQF_ONESHOT The flag IRQF_ONESHOT is only for irq thread, so remove IRQF_ONESHOT for devm_request_irq(). And with IRQF_ONESHOT, when enable CONFIG_PREEMPT_RT, kernel will report bug: [ 4.953930][ C4] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:970 [ 4.953932][ C4] in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 1, name: swapper/0 [ 4.953936][ C4] INFO: lockdep is turned off. [ 4.953937][ C4] irq event stamp: 2481260 [ 4.953938][ C4] hardirqs last enabled at (2481259): [] _raw_spin_unlock_irqrestore+0x60/0xb8 [ 4.953946][ C4] hardirqs last disabled at (2481260): [] enter_el1_irq_or_nmi+0x20/0x54 [ 4.953951][ C4] softirqs last enabled at (2334926): [] __local_bh_enable_ip+0x1f4/0x258 [ 4.953957][ C4] softirqs last disabled at (2334920): [] local_bh_disable+0x4/0x30 [ 4.953963][ C4] Preemption disabled at: [ 4.953964][ C4] [] __raw_spin_lock_irqsave+0x3c/0x138 [ 4.953971][ C4] CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.10.66-rt53 #9 [ 4.953974][ C4] Hardware name: Rockchip RK3588 EVB1 LP4 V10 Board (DT) [ 4.953976][ C4] Call trace: [ 4.953977][ C4] dump_backtrace+0x0/0x1c4 [ 4.953983][ C4] show_stack+0x18/0x24 [ 4.953989][ C4] dump_stack_lvl+0xec/0x148 [ 4.953992][ C4] dump_stack+0x18/0x64 [ 4.953996][ C4] ___might_sleep+0x1b4/0x1c4 [ 4.954002][ C4] rt_spin_lock+0x70/0xd8 [ 4.954005][ C4] hdmirx_hdmi_irq_handler+0x44/0xcf4 [ 4.954008][ C4] __handle_irq_event_percpu+0xa8/0x1b4 [ 4.954015][ C4] handle_irq_event+0x8c/0x180 [ 4.954021][ C4] handle_fasteoi_irq+0x128/0x228 [ 4.954025][ C4] __handle_domain_irq+0xb0/0x11c [ 4.954030][ C4] gic_handle_irq+0x74/0x14c [ 4.954034][ C4] el1_irq+0xd0/0x1c0 [ 4.954037][ C4] _raw_spin_unlock_irqrestore+0x64/0xb8 [ 4.954043][ C4] __setup_irq+0x474/0x6a8 [ 4.954046][ C4] request_threaded_irq+0xfc/0x164 [ 4.954049][ C4] devm_request_threaded_irq+0x84/0xd4 [ 4.954054][ C4] hdmirx_probe+0xa2c/0x128c [ 4.954057][ C4] platform_drv_probe+0x94/0xbc [ 4.954061][ C4] really_probe+0x200/0x508 [ 4.954067][ C4] driver_probe_device+0x7c/0xb8 [ 4.954072][ C4] device_driver_attach+0x6c/0xac [ 4.954078][ C4] __driver_attach+0xc4/0x148 [ 4.954084][ C4] bus_for_each_dev+0x7c/0xc8 [ 4.954089][ C4] driver_attach+0x24/0x30 [ 4.954095][ C4] bus_add_driver+0x100/0x1e0 [ 4.954099][ C4] driver_register+0x78/0x110 [ 4.954106][ C4] __platform_driver_register+0x44/0x50 [ 4.954109][ C4] hdmirx_init+0x44/0x50 [ 4.954113][ C4] do_one_initcall+0x98/0x188 [ 4.954116][ C4] do_initcall_level+0xa0/0xc0 [ 4.954121][ C4] do_initcalls+0x54/0x94 [ 4.954125][ C4] do_basic_setup+0x24/0x30 [ 4.954130][ C4] kernel_init_freeable+0x98/0xf0 [ 4.954134][ C4] kernel_init+0x14/0x184 [ 4.954139][ C4] ret_from_fork+0x10/0x30 Signed-off-by: Liang Chen Change-Id: I32d3d7588e1eddc3f88fd5c1f47b6efef5da9e32 --- drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c index 8183485a6e4c..6ad405897759 100644 --- a/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c +++ b/drivers/media/platform/rockchip/hdmirx/rk_hdmirx.c @@ -3647,8 +3647,8 @@ static int hdmirx_probe(struct platform_device *pdev) cpumask_set_cpu(hdmirx_dev->bound_cpu, &cpumask); irq_set_affinity_hint(irq, &cpumask); hdmirx_dev->hdmi_irq = irq; - ret = devm_request_threaded_irq(dev, irq, hdmirx_hdmi_irq_handler, NULL, - IRQF_ONESHOT, RK_HDMIRX_DRVNAME"-hdmi", hdmirx_dev); + ret = devm_request_irq(dev, irq, hdmirx_hdmi_irq_handler, 0, + RK_HDMIRX_DRVNAME"-hdmi", hdmirx_dev); if (ret) { dev_err(dev, "request hdmi irq thread failed! ret:%d\n", ret); goto err_work_queues; @@ -3736,9 +3736,9 @@ static int hdmirx_probe(struct platform_device *pdev) cpumask_set_cpu(hdmirx_dev->bound_cpu, &cpumask); irq_set_affinity_hint(irq, &cpumask); hdmirx_dev->det_irq = irq; - ret = devm_request_threaded_irq(dev, irq, hdmirx_5v_det_irq_handler, - NULL, IRQF_ONESHOT | IRQF_TRIGGER_FALLING | - IRQF_TRIGGER_RISING, RK_HDMIRX_DRVNAME"-5v", hdmirx_dev); + ret = devm_request_irq(dev, irq, hdmirx_5v_det_irq_handler, + IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, + RK_HDMIRX_DRVNAME"-5v", hdmirx_dev); if (ret) { dev_err(dev, "request hdmirx-det gpio irq thread failed! ret:%d\n", ret); goto err_unreg_video_dev;