video: rockchip: hdmiv1: fix no sound/noise problem
authorSugar Zhang <sugar.zhang@rock-chips.com>
Wed, 14 Oct 2015 06:18:40 +0000 (14:18 +0800)
committerGerrit Code Review <gerrit@rock-chips.com>
Wed, 14 Oct 2015 08:27:20 +0000 (16:27 +0800)
when hdmi mute audio, need to reset the audio logic and fifo.
otherwise, this may lead no sound/noise sometimes.

this patch add power down hdmi audio logic when mute audio,
and then power up hdmi audio logic when unmute audio.

Change-Id: Ifb8beac9690764b4ec1c6d3e1dfdb4253a05df51
Signed-off-by: Sugar Zhang <sugar.zhang@rock-chips.com>
drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c
drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.h

index fd3b8038b0cd1f892035358dca77e941e8387164..1a47a5b3ea3d7f6a9421a62a46cc73a3b3d4b4a0 100644 (file)
@@ -581,8 +581,8 @@ static int rockchip_hdmiv1_config_video(struct hdmi *hdmi_drv,
                return 0;
        /* Disable video and audio output */
        hdmi_msk_reg(hdmi_dev, AV_MUTE,
-                    m_AUDIO_MUTE | m_VIDEO_BLACK,
-                    v_AUDIO_MUTE(1) | v_VIDEO_MUTE(1));
+                    m_AUDIO_MUTE | m_AUDIO_PD | m_VIDEO_BLACK,
+                    v_AUDIO_MUTE(1) | v_AUDIO_PD(1) | v_VIDEO_MUTE(1));
 
        /* Input video mode is SDR RGB24bit,
           Data enable signal from external */
@@ -799,7 +799,7 @@ static int rockchip_hdmiv1_config_audio(struct hdmi *hdmi_drv,
 
        /* set_audio source I2S */
        if (hdmi_dev->audiosrc == HDMI_AUDIO_SRC_IIS) {
-               hdmi_writel(hdmi_dev, AUDIO_CTRL1, 0x00);
+               hdmi_writel(hdmi_dev, AUDIO_CTRL1, 0x01);
                hdmi_writel(hdmi_dev, AUDIO_SAMPLE_RATE, rate);
                hdmi_writel(hdmi_dev, AUDIO_I2S_MODE,
                            v_I2S_MODE(I2S_STANDARD) |
@@ -857,8 +857,12 @@ int rockchip_hdmiv1_control_output(struct hdmi *hdmi_drv, int enable)
 
                if (mutestatus && (m_AUDIO_MUTE | m_VIDEO_BLACK)) {
                        hdmi_msk_reg(hdmi_dev, AV_MUTE,
-                                    m_AUDIO_MUTE | m_VIDEO_BLACK,
-                                    v_AUDIO_MUTE(0) | v_VIDEO_MUTE(0));
+                                    m_AUDIO_MUTE |
+                                    m_AUDIO_PD |
+                                    m_VIDEO_BLACK,
+                                    v_AUDIO_MUTE(0) |
+                                    v_AUDIO_PD(0) |
+                                    v_VIDEO_MUTE(0));
                }
                rockchip_hdmiv1_av_mute(hdmi_drv, 0);
        } else {
@@ -866,10 +870,11 @@ int rockchip_hdmiv1_control_output(struct hdmi *hdmi_drv, int enable)
                if (enable & HDMI_VIDEO_MUTE)
                        mutestatus |= v_VIDEO_MUTE(1);
                if (enable & HDMI_AUDIO_MUTE)
-                       mutestatus |= v_AUDIO_MUTE(1);
+                       mutestatus |= (v_AUDIO_MUTE(1) | v_AUDIO_PD(1));
                hdmi_msk_reg(hdmi_dev, AV_MUTE,
-                            m_AUDIO_MUTE | m_VIDEO_BLACK,
+                            m_AUDIO_MUTE | m_AUDIO_PD | m_VIDEO_BLACK,
                             mutestatus);
+
                if (enable == (HDMI_VIDEO_MUTE | HDMI_AUDIO_MUTE)) {
                        rockchip_hdmiv1_av_mute(hdmi_drv, 1);
                        msleep(100);
index e9d085d767b8f015a4ab7c7082a0986ebf71a27d..b8f48d59ea00dbcb828d4466c96c4a3f1339d5aa 100644 (file)
@@ -141,10 +141,12 @@ enum {
 #define AV_MUTE                                0x05
 #define m_AVMUTE_CLEAR         (1 << 7)
 #define m_AVMUTE_ENABLE                (1 << 6)
+#define m_AUDIO_PD             (1 << 2)
 #define m_AUDIO_MUTE           (1 << 1)
 #define m_VIDEO_BLACK          (1 << 0)
 #define v_AVMUTE_CLEAR(n)      (n << 7)
 #define v_AVMUTE_ENABLE(n)     (n << 6)
+#define v_AUDIO_PD(n)          (n << 2)
 #define v_AUDIO_MUTE(n)                (n << 1)
 #define v_VIDEO_MUTE(n)                (n << 0)