diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c index dd48b05033b0..8cca5aedcb78 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hdmi_tx_main.c @@ -3909,7 +3909,8 @@ static void hdmitx_hpd_plugin_handler(struct work_struct *work) } mutex_lock(&setclk_mutex); pr_info(SYS "plugin\n"); - hdev->HWOp.CntlMisc(hdev, MISC_I2C_REACTIVE, 0); + if (hdev->chip_type >= MESON_CPU_ID_G12A) + hdev->HWOp.CntlMisc(hdev, MISC_I2C_RESET, 0); hdev->hdmitx_event &= ~HDMI_TX_HPD_PLUGIN; /* start reading E-EDID */ if (hdev->repeater_tx) @@ -3923,6 +3924,8 @@ static void hdmitx_hpd_plugin_handler(struct work_struct *work) hdev->HWOp.CntlConfig(hdev, CONF_HDMI_DVI_MODE, HDMI_MODE); mutex_lock(&getedid_mutex); + if (hdev->chip_type < MESON_CPU_ID_G12A) + hdev->HWOp.CntlMisc(hdev, MISC_I2C_REACTIVE, 0); mutex_unlock(&getedid_mutex); if (hdev->repeater_tx) { if (check_fbc_special(&hdev->EDID_buf[0]) diff --git a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c index af5dad258974..8f252a2fd1b6 100644 --- a/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c +++ b/drivers/amlogic/media/vout/hdmitx/hdmi_tx_20/hw/hdmi_tx_hw.c @@ -4319,6 +4319,7 @@ static void hdmitx_getediddata(unsigned char *des, unsigned char *src) /* * Note: read 8 Bytes of EDID data every time */ +#define EDID_WAIT_TIMEOUT 10 static void hdmitx_read_edid(unsigned char *rx_edid) { unsigned int timeout = 0; @@ -4328,6 +4329,7 @@ static void hdmitx_read_edid(unsigned char *rx_edid) /* Program SLAVE/ADDR */ hdmitx_wr_reg(HDMITX_DWC_I2CM_SLAVE, 0x50); + hdmitx_wr_reg(HDMITX_DWC_IH_I2CM_STAT0, 1 << 1); /* Read complete EDID data sequentially */ while (byte_num < 128 * blk_no) { hdmitx_wr_reg(HDMITX_DWC_I2CM_ADDRESS, byte_num&0xff); @@ -4341,11 +4343,11 @@ static void hdmitx_read_edid(unsigned char *rx_edid) /* Wait until I2C done */ timeout = 0; while ((!(hdmitx_rd_reg(HDMITX_DWC_IH_I2CM_STAT0) & (1 << 1))) - && (timeout < 3)) { + && (timeout < EDID_WAIT_TIMEOUT)) { mdelay(2); timeout++; } - if (timeout == 3) + if (timeout == EDID_WAIT_TIMEOUT) pr_info(HW "ddc timeout\n"); hdmitx_wr_reg(HDMITX_DWC_IH_I2CM_STAT0, 1 << 1); /* Read back 8 bytes */ @@ -5050,6 +5052,13 @@ static int hdmitx_cntl_misc(struct hdmitx_dev *hdev, unsigned int cmd, } hdmitx_set_reg_bits(HDMITX_DWC_MC_CLKDIS, !!argv, 6, 1); break; + case MISC_I2C_RESET: + hdmitx_set_reg_bits(HDMITX_TOP_SW_RESET, 1, 9, 1); + usleep_range(1000, 2000); + hdmitx_set_reg_bits(HDMITX_TOP_SW_RESET, 0, 9, 1); + usleep_range(1000, 2000); + hdmi_hwi_init(hdev); + break; case MISC_I2C_REACTIVE: hdmitx_hdcp_opr(4); hdmitx_set_reg_bits(HDMITX_DWC_A_HDCPCFG1, 0, 0, 1); diff --git a/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h b/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h index 8352f3d90d1d..5b85d4314b83 100644 --- a/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h +++ b/include/linux/amlogic/media/vout/hdmi_tx/hdmi_tx_module.h @@ -565,7 +565,8 @@ struct hdmitx_dev { #define MISC_HDCP_CLKDIS (CMD_MISC_OFFSET + 0x0e) #define MISC_TMDS_RXSENSE (CMD_MISC_OFFSET + 0x0f) #define MISC_I2C_REACTIVE (CMD_MISC_OFFSET + 0x10) -#define MISC_READ_AVMUTE_OP (CMD_MISC_OFFSET + 0x11) +#define MISC_I2C_RESET (CMD_MISC_OFFSET + 0x11) +#define MISC_READ_AVMUTE_OP (CMD_MISC_OFFSET + 0x12) /*********************************************************************** * Get State //GetState