From: Zheng Yang Date: Tue, 14 Jul 2015 02:02:37 +0000 (+0800) Subject: hdmi:rk3036/rk3128: fix picture flicker error when setting audio. X-Git-Tag: firefly_0821_release~3909 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=c8dad637efed422176d943d2d988a434697beb28;p=firefly-linux-kernel-4.4.55.git hdmi:rk3036/rk3128: fix picture flicker error when setting audio. Signed-off-by: Zheng Yang --- diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c b/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c index 47ebf02d48f1..64d21851ca29 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c @@ -823,16 +823,17 @@ int rockchip_hdmiv1_control_output(struct hdmi *hdmi_drv, int enable) if (enable == HDMI_AV_UNMUTE) { if (hdmi_dev->pwr_mode == LOWER_PWR) rockchip_hdmiv1_set_pwr_mode(hdmi_drv, NORMAL); - - rockchip_hdmiv1_sys_power(hdmi_drv, true); - rockchip_hdmiv1_sys_power(hdmi_drv, false); - delay100us(); - rockchip_hdmiv1_sys_power(hdmi_drv, true); - hdmi_writel(hdmi_dev, 0xce, 0x00); - delay100us(); - hdmi_writel(hdmi_dev, 0xce, 0x01); - hdmi_readl(hdmi_dev, AV_MUTE, &mutestatus); + if (mutestatus & m_VIDEO_BLACK) { + rockchip_hdmiv1_sys_power(hdmi_drv, true); + rockchip_hdmiv1_sys_power(hdmi_drv, false); + delay100us(); + rockchip_hdmiv1_sys_power(hdmi_drv, true); + hdmi_writel(hdmi_dev, 0xce, 0x00); + delay100us(); + hdmi_writel(hdmi_dev, 0xce, 0x01); + } + if (mutestatus && (m_AUDIO_MUTE | m_VIDEO_BLACK)) { hdmi_msk_reg(hdmi_dev, AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, @@ -840,12 +841,19 @@ int rockchip_hdmiv1_control_output(struct hdmi *hdmi_drv, int enable) } rockchip_hdmiv1_av_mute(hdmi_drv, 0); } else { + mutestatus = 0; + if (enable & HDMI_VIDEO_MUTE) + mutestatus |= v_VIDEO_MUTE(1); + if (enable & HDMI_AUDIO_MUTE) + mutestatus |= v_AUDIO_MUTE(1); hdmi_msk_reg(hdmi_dev, AV_MUTE, m_AUDIO_MUTE | m_VIDEO_BLACK, - v_AUDIO_MUTE(1) | v_VIDEO_MUTE(1)); - rockchip_hdmiv1_av_mute(hdmi_drv, 1); - msleep(100); - rockchip_hdmiv1_set_pwr_mode(hdmi_drv, LOWER_PWR); + mutestatus); + if (enable == (HDMI_VIDEO_MUTE | HDMI_AUDIO_MUTE)) { + rockchip_hdmiv1_av_mute(hdmi_drv, 1); + msleep(100); + rockchip_hdmiv1_set_pwr_mode(hdmi_drv, LOWER_PWR); + } } return 0; }