hdmirx: add control for hdcp hpd [1/1]
authorHang Cheng <hang.cheng@amlogic.com>
Wed, 11 Sep 2019 08:15:05 +0000 (16:15 +0800)
committerTao Zeng <tao.zeng@amlogic.com>
Thu, 12 Sep 2019 09:29:15 +0000 (02:29 -0700)
PD#SWPL-14041

Problem:
sometimes after hpcp_hpd 0->1, ESM doesn't
respond to AKE_INIT, it will lead to flash
red screen on TCL DCLS-HG50

Solution:
add control for hpcp_hpd, keep it high by default

Verify:
X301

Change-Id: I8f8e5c880400084d6ed252667460c4e397b9909d
Signed-off-by: Hang Cheng <hang.cheng@amlogic.com>
drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h
drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c
drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.h
drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_wrapper.c

index 21c2068..acfe0c7 100644 (file)
@@ -47,7 +47,7 @@
  *
  *
  */
-#define RX_VER2 "ver.2019/09/05"
+#define RX_VER2 "ver.2019/09/11"
 
 /*print type*/
 #define        LOG_EN          0x01
index d6ab837..d51a9ef 100644 (file)
@@ -102,6 +102,8 @@ int pll_rst_max = 5;
 int cdr_lock_level;
 int clock_lock_th = 2;
 int scdc_force_en;
+/* for hdcp_hpd debug, disable by default */
+bool hdcp_hpd_ctrl_en;
 
 /*------------------------variable define end------------------------------*/
 
@@ -1703,7 +1705,7 @@ void control_reset(void)
 void rx_esm_tmdsclk_en(bool en)
 {
        hdmirx_wr_bits_top(TOP_CLK_CNTL, HDCP22_TMDSCLK_EN, en);
-       if (hdcp22_on)
+       if (hdcp22_on && hdcp_hpd_ctrl_en)
                hdmirx_hdcp22_hpd(en);
        if (log_level & HDCP_LOG)
                rx_pr("%s:%d\n", __func__, en);
@@ -1995,11 +1997,15 @@ void hdmirx_20_init(void)
        hdmirx_wr_dwc(DWC_CHLOCK_CONFIG, data32);
 
        /* hdcp2.2 ctl */
-       if (hdcp22_on)
+       if (hdcp22_on) {
                /* set hdcp_hpd high later */
-               hdmirx_wr_dwc(DWC_HDCP22_CONTROL, 0);
-       else
+               if (hdcp_hpd_ctrl_en)
+                       hdmirx_wr_dwc(DWC_HDCP22_CONTROL, 0);
+               else
+                       hdmirx_wr_dwc(DWC_HDCP22_CONTROL, 0x1000);
+       } else {
                hdmirx_wr_dwc(DWC_HDCP22_CONTROL, 2);
+       }
 }
 
 
index 4c0dafc..447d353 100644 (file)
@@ -1118,6 +1118,7 @@ extern int top_intr_maskn_value;
 extern int hbr_force_8ch;
 extern int clock_lock_th;
 extern int scdc_force_en;
+extern bool hdcp_hpd_ctrl_en;
 extern void rx_get_best_eq_setting(void);
 extern void wr_reg_hhi(unsigned int offset, unsigned int val);
 extern void wr_reg_hhi_bits(unsigned int offset, unsigned int mask,
index 2dde4f0..f999d1a 100644 (file)
@@ -1734,6 +1734,8 @@ int rx_set_global_variable(const char *buf, int size)
                return pr_var(earc_cap_ds_update_hpd_en, index);
        if (set_pr_var(tmpbuf, scdc_force_en, value, &index, ret))
                return pr_var(scdc_force_en, index);
+       if (set_pr_var(tmpbuf, hdcp_hpd_ctrl_en, value, &index, ret))
+               return pr_var(hdcp_hpd_ctrl_en, index);
        return 0;
 }
 
@@ -1847,6 +1849,7 @@ void rx_get_global_variable(const char *buf)
        pr_var(en_take_dtd_space, i++);
        pr_var(earc_cap_ds_update_hpd_en, i++);
        pr_var(scdc_force_en, i++);
+       pr_var(hdcp_hpd_ctrl_en, i++);
 }
 
 void skip_frame(unsigned int cnt)
@@ -1984,6 +1987,7 @@ void rx_5v_monitor(void)
                pwr_sts = tmp_5v;
                rx.cur_5v_sts = (pwr_sts >> rx.port) & 1;
                hotplug_wait_query();
+               rx_pr("hotplug-0x%x\n", pwr_sts);
                if (rx.cur_5v_sts == 0) {
                        set_fsm_state(FSM_5V_LOST);
                        rx.err_code = ERR_5V_LOST;