diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c index 886342654364..5faf346d125c 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.c @@ -914,18 +914,18 @@ static long hdmirx_ioctl(struct file *file, unsigned int cmd, } case HDMI_IOC_HDCP_ON: hdcp_enable = 1; - rx_set_hpd(0); + rx_set_cur_hpd(0); fsm_restart(); break; case HDMI_IOC_HDCP_OFF: hdcp_enable = 0; - rx_set_hpd(0); + rx_set_cur_hpd(0); hdmirx_hw_config(); fsm_restart(); break; case HDMI_IOC_EDID_UPDATE: if (rx.open_fg) { - rx_set_hpd(0); + rx_set_cur_hpd(0); edid_update_flag = 1; } #if 0 @@ -1332,7 +1332,7 @@ static ssize_t cec_set_state(struct device *dev, hdmi_cec_en = 1; else if (val == 2) { hdmi_cec_en = 1; - rx_force_hpd_cfg(1); + rx_set_port_hpd(ALL_PORTS, 1); } rx_pr("cec sts = %d\n", val); return count; @@ -1916,7 +1916,7 @@ static int hdmirx_suspend(struct platform_device *pdev, pm_message_t state) del_timer_sync(&hdevp->timer); /* set HPD low when cec off. */ if (!hdmi_cec_en) - rx_force_hpd_cfg(0); + rx_set_port_hpd(ALL_PORTS, 0); if (suspend_pddq_sel == 0) rx_pr("don't set phy pddq down\n"); @@ -1977,7 +1977,7 @@ static void hdmirx_shutdown(struct platform_device *pdev) del_timer_sync(&hdevp->timer); /* set HPD low when cec off. */ if (!hdmi_cec_en) - rx_force_hpd_cfg(0); + rx_set_port_hpd(ALL_PORTS, 0); /* phy powerdown */ hdmirx_phy_pddq(1); if (hdcp22_on) diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h index fcac817c118c..6114bff1098f 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_drv.h @@ -46,7 +46,7 @@ * * */ -#define RX_VER2 "ver.2018/07/30a" +#define RX_VER2 "ver.2018/08/07" /*print type*/ #define LOG_EN 0x01 @@ -134,6 +134,7 @@ struct hdmirx_dev_s { #define IOC_AUD_INFO _BIT(1) #define IOC_MPEGS_INFO _BIT(2) #define IOC_AVI_INFO _BIT(3) +#define ALL_PORTS ((1 << E_PORT_NUM) - 1) enum colorspace_e { E_COLOR_RGB, @@ -415,9 +416,6 @@ extern void skip_frame(unsigned int cnt); /* hotplug */ extern unsigned int pwr_sts; extern int pre_port; -extern void rx_set_hpd(bool en); -extern unsigned int rx_get_hdmi5v_sts(void); -extern unsigned int rx_get_hpd_sts(void); extern void hotplug_wait_query(void); extern void rx_send_hpd_pulse(void); diff --git a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c index 314aca0d4b05..7d3af12af550 100644 --- a/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c +++ b/drivers/amlogic/media/vin/tvin/hdmirx/hdmi_rx_hw.c @@ -1003,6 +1003,16 @@ static int TOP_init(void) /* delay cycles before n/cts update pulse */ data32 |= 7 << 0; hdmirx_wr_top(TOP_ACR_CNTL2, data32); + + data32 = 0; + /* bit4: hpd override, bit5: hpd reverse */ + data32 |= 1 << 4; + if (rx.chip_id == CHIP_ID_GXTVBB) + data32 |= 0 << 5; + else + data32 |= 1 << 5; + /* pull down all the hpd */ + hdmirx_wr_top(TOP_HPD_PWR5V, data32); return err; } @@ -1160,20 +1170,65 @@ void rx_hdcp14_config(const struct hdmi_rx_hdcp *hdcp) hdmirx_wr_bits_dwc(DWC_HDCP_CTRL, ENCRIPTION_ENABLE, 1); } -void rx_set_hpd(bool en) +void rx_set_term_enable(bool enable) { - if (en) { - hdmirx_wr_top(TOP_HPD_PWR5V, - hdmirx_rd_top(TOP_HPD_PWR5V)&(~(1<>= rx.port; + return tmp; } bool is_tmds_valid(void) @@ -1374,7 +1375,7 @@ void dump_unnormal_info(void) void rx_send_hpd_pulse(void) { - rx_set_hpd(0); + rx_set_cur_hpd(0); fsm_restart(); } @@ -1809,7 +1810,7 @@ void hdmirx_open_port(enum tvin_port_e port) } if (rx.state > FSM_HPD_LOW) rx.state = FSM_HPD_LOW; - rx_set_hpd(0); + rx_set_cur_hpd(0); /* need reset the whole module when switch port */ hdmirx_hw_config(); } else { @@ -1971,7 +1972,7 @@ void rx_main_state_machine(void) fsm_restart(); break; case FSM_HPD_LOW: - rx_set_hpd(0); + rx_set_cur_hpd(0); set_scdc_cfg(1, 0); rx.state = FSM_INIT; break; @@ -1994,7 +1995,7 @@ void rx_main_state_machine(void) clk_unstable_cnt = 0; esd_phy_rst_cnt = 0; pre_port = rx.port; - rx_set_hpd(1); + rx_set_cur_hpd(1); set_scdc_cfg(0, 1); /* rx.hdcp.hdcp_version = HDCP_VER_NONE; */ rx.state = FSM_WAIT_CLK_STABLE; @@ -2064,7 +2065,7 @@ void rx_main_state_machine(void) else rx.err_rec_mode = ERR_REC_HPD_RST; } else if (rx.err_rec_mode == ERR_REC_HPD_RST) { - rx_set_hpd(0); + rx_set_cur_hpd(0); rx.state = FSM_HPD_HIGH; rx.err_rec_mode = ERR_REC_END; } else { @@ -2146,7 +2147,7 @@ void rx_main_state_machine(void) rx.err_rec_mode = ERR_REC_HPD_RST; rx_set_eq_run_state(E_EQ_START); } else if (rx.err_rec_mode == ERR_REC_HPD_RST) { - rx_set_hpd(0); + rx_set_cur_hpd(0); rx.state = FSM_HPD_HIGH; rx.err_rec_mode = ERR_REC_END; } else @@ -2273,7 +2274,7 @@ void rx_main_state_machine(void) switch (rx.state) { case FSM_HPD_LOW: /* set_scdc_cfg(1, 1); */ - rx_set_hpd(0); + rx_set_cur_hpd(0); rx_irq_en(false); rx.state = FSM_INIT; set_scdc_cfg(1, 0); @@ -2302,7 +2303,7 @@ void rx_main_state_machine(void) } hpd_wait_cnt = 0; pre_port = rx.port; - rx_set_hpd(1); + rx_set_cur_hpd(1); set_scdc_cfg(0, 1); /* some box init hdcp authentication too early * and it may make the hdcp_version error @@ -2463,7 +2464,7 @@ void rx_main_state_machine(void) if (sig_unstable_reset_hpd_cnt >= sig_unstable_reset_hpd_max) { rx.state = FSM_HPD_HIGH; - rx_set_hpd(0); + rx_set_cur_hpd(0); sig_unstable_reset_hpd_cnt = 0; rx_pr( "unstable->HDMI5V_HIGH\n"); @@ -2866,7 +2867,7 @@ int hdmirx_debug(const char *buf, int size) rx_pr("duk--dump duk\n"); rx_pr("*****************\n"); } else if (strncmp(tmpbuf, "hpd", 3) == 0) - rx_set_hpd(tmpbuf[3] == '0' ? 0 : 1); + rx_set_cur_hpd(tmpbuf[3] == '0' ? 0 : 1); else if (strncmp(tmpbuf, "cable_status", 12) == 0) { size = hdmirx_rd_top(TOP_HPD_PWR5V) >> 20; rx_pr("cable_status = %x\n", size);