hdmi:rk3036/rk3128: fix picture flicker error when setting audio.
authorZheng Yang <zhengyang@rock-chips.com>
Tue, 14 Jul 2015 02:02:37 +0000 (10:02 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Tue, 14 Jul 2015 02:02:37 +0000 (10:02 +0800)
Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c

index 47ebf02d48f1c2b1e19f22c1ef30e47f17469dd9..64d21851ca29e5351064321c421a30782a98bc63 100644 (file)
@@ -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;
 }