From 298e89389d989fc164e0819f0ba253dbd64f708e Mon Sep 17 00:00:00 2001 From: Sugar Zhang Date: Wed, 14 Oct 2015 14:18:40 +0800 Subject: [PATCH] video: rockchip: hdmiv1: fix no sound/noise problem 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 --- .../hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c | 19 ++++++++++++------- .../hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.h | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) 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 fd3b8038b0cd..1a47a5b3ea3d 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.c @@ -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); diff --git a/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.h b/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.h index e9d085d767b8..b8f48d59ea00 100644 --- a/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.h +++ b/drivers/video/rockchip/hdmi/rockchip-hdmiv1/rockchip_hdmiv1_hw.h @@ -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) -- 2.34.1