From bca2b269ae9bb99a0f39739c4e57199c9f853512 Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Fri, 16 Aug 2019 11:25:23 +0800 Subject: [PATCH] drm/rockchip: dw-hdmi: Fix hdmi timing err when switch color mode When switch color new hdmi phy config may not be set because hdmi phy is already on in upstream code. So we should power down hdmi phy first before power on hdmi phy when set new hdmi phy config. Change-Id: Icb1cf29931f1084cc70b0b320137260491497771 Signed-off-by: Algea Cao --- drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c index 360cd6833b40..e2be41a7ac38 100644 --- a/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c +++ b/drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c @@ -933,20 +933,25 @@ static const struct drm_encoder_helper_funcs dw_hdmi_rockchip_encoder_helper_fun .mode_set = dw_hdmi_rockchip_encoder_mode_set, }; -static int dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data, - const struct drm_display_info *display, - const struct drm_display_mode *mode) +static void +dw_hdmi_rockchip_genphy_disable(struct dw_hdmi *dw_hdmi, void *data) { struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; - return phy_power_on(hdmi->phy); + while (hdmi->phy->power_count > 0) + phy_power_off(hdmi->phy); } -static void dw_hdmi_rockchip_genphy_disable(struct dw_hdmi *dw_hdmi, void *data) +static int +dw_hdmi_rockchip_genphy_init(struct dw_hdmi *dw_hdmi, void *data, + const struct drm_display_info *display, + const struct drm_display_mode *mode) { struct rockchip_hdmi *hdmi = (struct rockchip_hdmi *)data; - phy_power_off(hdmi->phy); + dw_hdmi_rockchip_genphy_disable(dw_hdmi, data); + dw_hdmi_set_high_tmds_clock_ratio(dw_hdmi, display); + return phy_power_on(hdmi->phy); } static void dw_hdmi_rk3228_setup_hpd(struct dw_hdmi *dw_hdmi, void *data)