From cf05417063aac4b732d3ae2ca832ed635d1c14ef Mon Sep 17 00:00:00 2001 From: Shunqing Chen Date: Fri, 13 Dec 2019 09:05:28 +0800 Subject: [PATCH] drm: rockchip: dw-hdmi: fix the issue of hdmi unbind error Change-Id: Ida30cf7f38209ee730ca87589e22f9cdbaef4953 Signed-off-by: Shunqing Chen --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 8 ++------ drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 12 +++++++++--- include/drm/bridge/dw_hdmi.h | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index ac9771387c43..26fcacf2d056 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -4007,10 +4007,8 @@ static void dw_hdmi_reg_initial(struct dw_hdmi *hdmi) } } -void dw_hdmi_suspend(struct device *dev) +void dw_hdmi_suspend(struct device *dev, struct dw_hdmi *hdmi) { - struct dw_hdmi *hdmi = dev_get_drvdata(dev); - if (!hdmi) { dev_warn(dev, "Hdmi has not been initialized\n"); return; @@ -4039,10 +4037,8 @@ void dw_hdmi_suspend(struct device *dev) } EXPORT_SYMBOL_GPL(dw_hdmi_suspend); -void dw_hdmi_resume(struct device *dev) +void dw_hdmi_resume(struct device *dev, struct dw_hdmi *hdmi) { - struct dw_hdmi *hdmi = dev_get_drvdata(dev); - if (!hdmi) { dev_warn(dev, "Hdmi has not been initialized\n"); return; diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 13edcb1cb67d..82e3bca29d94 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -1397,7 +1397,9 @@ static int dw_hdmi_rockchip_probe(struct platform_device *pdev) static void dw_hdmi_rockchip_shutdown(struct platform_device *pdev) { - dw_hdmi_suspend(&pdev->dev); + struct rockchip_hdmi *hdmi = platform_get_drvdata(pdev); + + dw_hdmi_suspend(&pdev->dev, hdmi->hdmi); pm_runtime_put_sync(&pdev->dev); } @@ -1411,7 +1413,9 @@ static int dw_hdmi_rockchip_remove(struct platform_device *pdev) static int dw_hdmi_rockchip_suspend(struct device *dev) { - dw_hdmi_suspend(dev); + struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); + + dw_hdmi_suspend(dev, hdmi->hdmi); pm_runtime_put_sync(dev); return 0; @@ -1419,8 +1423,10 @@ static int dw_hdmi_rockchip_suspend(struct device *dev) static int dw_hdmi_rockchip_resume(struct device *dev) { + struct rockchip_hdmi *hdmi = dev_get_drvdata(dev); + pm_runtime_get_sync(dev); - dw_hdmi_resume(dev); + dw_hdmi_resume(dev, hdmi->hdmi); return 0; } diff --git a/include/drm/bridge/dw_hdmi.h b/include/drm/bridge/dw_hdmi.h index e3c06ba2ce04..f4c2ba072d31 100644 --- a/include/drm/bridge/dw_hdmi.h +++ b/include/drm/bridge/dw_hdmi.h @@ -188,8 +188,8 @@ void dw_hdmi_unbind(struct dw_hdmi *hdmi); struct dw_hdmi *dw_hdmi_bind(struct platform_device *pdev, struct drm_encoder *encoder, const struct dw_hdmi_plat_data *plat_data); -void dw_hdmi_suspend(struct device *dev); -void dw_hdmi_resume(struct device *dev); +void dw_hdmi_suspend(struct device *dev, struct dw_hdmi *hdmi); +void dw_hdmi_resume(struct device *dev, struct dw_hdmi *hdmi); void dw_hdmi_setup_rx_sense(struct dw_hdmi *hdmi, bool hpd, bool rx_sense);