rk3368 hdmi : fix the hdmi bitstream connot idenfify sometimes
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / rockchip-hdmiv2 / rockchip_hdmiv2_hw.c
index afa3b3974ed3f62cbbd06b66c336492708e0c7d0..7b710986b27454682cad3a2bef73d1b753f20088 100755 (executable)
@@ -1288,9 +1288,9 @@ static int hdmi_dev_config_video(struct hdmi *hdmi, struct hdmi_video *vpara)
                }
                hdmi_msk_reg(hdmi_dev, FC_DBGFORCE,
                             m_FC_FORCEVIDEO, v_FC_FORCEVIDEO(1));
+               hdmi_writel(hdmi_dev, MC_CLKDIS, m_HDCPCLK_DISABLE);
        }
 
-       hdmi_writel(hdmi_dev, MC_CLKDIS, m_HDCPCLK_DISABLE);
        if (rockchip_hdmiv2_video_framecomposer(hdmi, vpara) < 0)
                return -1;
 
@@ -1511,8 +1511,8 @@ static int hdmi_dev_config_audio(struct hdmi *hdmi, struct hdmi_audio *audio)
                        HDMIDBG("hbr mode.\n");
                        hdmi_writel(hdmi_dev, AUD_CONF2, 0x1);
                        word_length = I2S_24BIT_SAMPLE;
-               } else if ((HDMI_AUDIO_FS_48000 == audio->rate)
-                          || (HDMI_AUDIO_FS_192000 == audio->rate)) {
+               } else if ((HDMI_AUDIO_FS_48000 == audio->rate) ||
+                          (HDMI_AUDIO_FS_192000 == audio->rate)) {
                        HDMIDBG("nlpcm mode.\n");
                        hdmi_writel(hdmi_dev, AUD_CONF2, 0x2);
                        word_length = I2S_24BIT_SAMPLE;
@@ -1550,6 +1550,9 @@ static int hdmi_dev_config_audio(struct hdmi *hdmi, struct hdmi_audio *audio)
                     m_AUDIO_SAMPLE_RATE, v_AUDIO_SAMPLE_RATE(rate));
        hdmi_writel(hdmi_dev, FC_AUDSCHNLS8, ((~rate) << 4) | 0x2);
 
+       hdmi_msk_reg(hdmi_dev, AUD_CONF0,
+                    m_SW_AUD_FIFO_RST, v_SW_AUD_FIFO_RST(1));
+
        hdmi_dev_config_aai(hdmi_dev, audio);
 
        return 0;
@@ -1598,7 +1601,8 @@ static int hdmi_dev_insert(struct hdmi *hdmi)
        struct hdmi_dev *hdmi_dev = hdmi->property->priv;
 
        HDMIDBG("%s\n", __func__);
-       hdmi_writel(hdmi_dev, MC_CLKDIS, m_HDCPCLK_DISABLE);
+       if (!hdmi->uboot)
+               hdmi_writel(hdmi_dev, MC_CLKDIS, m_HDCPCLK_DISABLE);
        return HDMI_ERROR_SUCESS;
 }
 
@@ -1751,6 +1755,12 @@ irqreturn_t rockchip_hdmiv2_dev_irq(int irq, void *priv)
        if (hdcp2_int) {
                hdmi_writel(hdmi_dev, HDCP2REG_STAT, hdcp2_int);
                pr_info("hdcp2_int is 0x%02x\n", hdcp2_int);
+               if ((hdcp2_int & m_HDCP2_AUTH_FAIL ||
+                    hdcp2_int & m_HDCP2_AUTH_LOST) &&
+                   hdmi_dev->hdcp2_start) {
+                       pr_info("hdcp2 failed or lost\n");
+                       hdmi_dev->hdcp2_start();
+               }
        }
        return IRQ_HANDLED;
 }