From 48fe186846bdec6df9195c0381d8d34ebbea53a7 Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Tue, 11 Jan 2022 16:50:56 +0800 Subject: [PATCH] drm/rockchip: dw_hdmi: Fix other platforms using RK3588 unique resources Signed-off-by: Algea Cao Change-Id: I96b59ac25697e4c1b91ce3eb5109dcb52a639346 --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 29 ++++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index db59747f661e..994fa64fb45e 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -1283,10 +1283,12 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi) return PTR_ERR(hdmi->regmap); } - hdmi->vo1_regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,vo1_grf"); - if (IS_ERR(hdmi->vo1_regmap)) { - DRM_DEV_ERROR(hdmi->dev, "Unable to get rockchip,vo1_grf\n"); - return PTR_ERR(hdmi->vo1_regmap); + if (hdmi->is_hdmi_qp) { + hdmi->vo1_regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,vo1_grf"); + if (IS_ERR(hdmi->vo1_regmap)) { + DRM_DEV_ERROR(hdmi->dev, "Unable to get rockchip,vo1_grf\n"); + return PTR_ERR(hdmi->vo1_regmap); + } } hdmi->phyref_clk = devm_clk_get(hdmi->dev, "vpll"); @@ -3125,9 +3127,11 @@ static void dw_hdmi_rockchip_unbind(struct device *dev, struct device *master, { struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); - cancel_delayed_work(&hdmi->work); - flush_workqueue(hdmi->workqueue); - destroy_workqueue(hdmi->workqueue); + if (hdmi->is_hdmi_qp) { + cancel_delayed_work(&hdmi->work); + flush_workqueue(hdmi->workqueue); + destroy_workqueue(hdmi->workqueue); + } if (hdmi->sub_dev.connector) rockchip_drm_unregister_sub_dev(&hdmi->sub_dev); @@ -3165,9 +3169,14 @@ static void dw_hdmi_rockchip_shutdown(struct platform_device *pdev) if (!hdmi) return; - cancel_delayed_work(&hdmi->work); - flush_workqueue(hdmi->workqueue); - dw_hdmi_suspend(hdmi->hdmi); + + if (hdmi->is_hdmi_qp) { + cancel_delayed_work(&hdmi->work); + flush_workqueue(hdmi->workqueue); + dw_hdmi_qp_suspend(hdmi->dev, hdmi->hdmi_qp); + } else { + dw_hdmi_suspend(hdmi->hdmi); + } pm_runtime_put_sync(&pdev->dev); }