From 3301ea2fe9ee56afa600e79c9c5e8d7a36add960 Mon Sep 17 00:00:00 2001 From: Chaoyi Chen Date: Tue, 11 Feb 2025 01:37:32 +0000 Subject: [PATCH] drm/rockchip: vop: move devm_request_irq to the end of vop_bind At MOS environment, the irq handle may be triggered immediately after request irq, the irq handle maybe access vop memory, e.g., vop_isr() -> vop_wb_handler() access vop->wb->regs, so move devm_request_irq() to the end of this function to make sure vop is initialized. Change-Id: Ie124576bf2333f63ec3985c321a3c368e28b34be Signed-off-by: Chaoyi Chen --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index 4565465318c3..4540702bc924 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -5399,10 +5399,6 @@ static int vop_bind(struct device *dev, struct device *master, void *data) spin_lock_init(&vop->irq_lock); mutex_init(&vop->vop_lock); - ret = devm_request_irq(dev, vop->irq, vop_isr, - IRQF_SHARED, dev_name(dev), vop); - if (ret) - return ret; ret = vop_create_crtc(vop); if (ret) return ret; @@ -5466,7 +5462,21 @@ static int vop_bind(struct device *dev, struct device *master, void *data) rockchip_drm_dma_init_device(drm_dev, dev); + ret = devm_request_irq(dev, vop->irq, vop_isr, + IRQF_SHARED, dev_name(dev), vop); + if (ret) + goto err_pm_detach; + return 0; + +err_pm_detach: + if (vop->genpd_dev1) + dev_pm_domain_detach(vop->genpd_dev1, true); + if (vop->genpd_dev0) + dev_pm_domain_detach(vop->genpd_dev0, true); + pm_runtime_disable(dev); + vop_destroy_crtc(vop); + return ret; } static void vop_unbind(struct device *dev, struct device *master, void *data)