hdmi:rk3288/rk3368: polling avi status register instead of delay.
authorZheng Yang <zhengyang@rock-chips.com>
Tue, 18 Aug 2015 06:15:06 +0000 (14:15 +0800)
committerZheng Yang <zhengyang@rock-chips.com>
Tue, 18 Aug 2015 06:15:06 +0000 (14:15 +0800)
When sending avi introduced by commit 132ad528d034c38bd9b43bb8f08a5c2910a968c2,
we polling avi sending status register until avi is send,  instead of delay 100ms.

Signed-off-by: Zheng Yang <zhengyang@rock-chips.com>
drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.c
drivers/video/rockchip/hdmi/rockchip-hdmiv2/rockchip_hdmiv2_hw.h

index c1120f78c8cf86e6aebe00715841621574448928..e966be1e19f6a86a8c6ccd85db097e2836fdab2f 100755 (executable)
@@ -1132,6 +1132,9 @@ static void hdmi_dev_config_avi(struct hdmi_dev *hdmi_dev,
        unsigned char colorimetry, ext_colorimetry, aspect_ratio, y1y0;
        unsigned char rgb_quan_range = AVI_QUANTIZATION_RANGE_DEFAULT;
 
+       hdmi_msk_reg(hdmi_dev, FC_DATAUTO3, m_AVI_AUTO, v_AVI_AUTO(0));
+       hdmi_msk_reg(hdmi_dev, IH_FC_STAT1,
+                    m_AVI_INFOFRAME, v_AVI_INFOFRAME(1));
        /* Set AVI infoFrame Data byte1 */
        if (vpara->color_output == HDMI_COLOR_YCBCR444)
                y1y0 = AVI_COLOR_MODE_YCBCR444;
@@ -1200,6 +1203,7 @@ static void hdmi_dev_config_avi(struct hdmi_dev *hdmi_dev,
        /* Set AVI infoFrame Data byte5 */
        hdmi_msk_reg(hdmi_dev, FC_AVICONF3, m_FC_YQ | m_FC_CN,
                     v_FC_YQ(YQ_LIMITED_RANGE) | v_FC_CN(CN_GRAPHICS));
+       hdmi_msk_reg(hdmi_dev, FC_DATAUTO3, m_AVI_AUTO, v_AVI_AUTO(1));
 }
 
 static int hdmi_dev_config_vsi(struct hdmi *hdmi,
@@ -1577,6 +1581,10 @@ static int hdmi_dev_control_output(struct hdmi *hdmi, int enable)
                                vpara.vic = hdmi->vic;
                                vpara.color_output = HDMI_COLOR_RGB_0_255;
                                hdmi_dev_config_avi(hdmi_dev, &vpara);
+                               while ((!hdmi_readl(hdmi_dev, IH_FC_STAT1)) &
+                                      m_AVI_INFOFRAME) {
+                                       usleep_range(900, 1000);
+                               }
                        }
                }
 /*             if (enable & HDMI_AUDIO_MUTE) {
@@ -1585,7 +1593,6 @@ static int hdmi_dev_control_output(struct hdmi *hdmi, int enable)
                                     v_AUD_PACK_SAMPFIT(0x0F));
                }
 */             if (enable == (HDMI_VIDEO_MUTE | HDMI_AUDIO_MUTE)) {
-                       msleep(100);
                        if (hdmi->ops->hdcp_power_off_cb)
                                hdmi->ops->hdcp_power_off_cb(hdmi);
                        rockchip_hdmiv2_powerdown(hdmi_dev);
index 1c99c078a2617ddf126d947fc2457ebcfea587f5..e1c7b6d27e6a4fc0c314ea4bdaa00fc322dc08b8 100644 (file)
@@ -118,6 +118,8 @@ enum PHYTYPE {
 #define m_AVI_INFOFRAME                (1 << 1)
 #define m_GCP                  (1 << 0)
 
+#define v_AVI_INFOFRAME(n)     (((n)&0x01) << 1)
+
 #define IH_FC_STAT2                    0x0102
 #define m_LOWPRIO_OVERFLOW     (1 << 1)
 #define m_HIGHPRIO_OVERFLOW    (1 << 0)