summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAbhishek Kharbanda <akharban@codeaurora.org>2013-07-02 15:14:06 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 20:19:11 -0700
commit2a86f9cdaefeb3f45730cb6d5cebcd4c423bb990 (patch)
tree7d3cf24874eedf21e6657ef895ca78008b018871 /drivers
parentbe44c0b29da82dc26e16865bd4320ec393524674 (diff)
mdss: hdmi: Disabling software DDC requests
Disable software DDC request before moving to part3 of HDCP authentication and re-enable it on before reading EDID. This is done to avoid any DDC bus arbitration issues while handing over from software DDC control to hardware DDC control. Change-Id: Iffde0147e497c1411d867c22c3674b73ceb95bac CRs-Fixed: 484366 Signed-off-by: Abhishek Kharbanda <akharban@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_hdcp.c10
-rw-r--r--drivers/video/fbdev/msm/mdss_hdmi_tx.c6
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_hdcp.c b/drivers/video/fbdev/msm/mdss_hdmi_hdcp.c
index 1666b6643cd5..bcd5f28b2ad0 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_hdcp.c
+++ b/drivers/video/fbdev/msm/mdss_hdmi_hdcp.c
@@ -895,6 +895,7 @@ static void hdmi_hdcp_auth_work(struct work_struct *work)
struct delayed_work *dw = to_delayed_work(work);
struct hdmi_hdcp_ctrl *hdcp_ctrl = container_of(dw,
struct hdmi_hdcp_ctrl, hdcp_auth_work);
+ struct dss_io_data *io;
if (!hdcp_ctrl) {
DEV_ERR("%s: invalid input\n", __func__);
@@ -907,6 +908,11 @@ static void hdmi_hdcp_auth_work(struct work_struct *work)
return;
}
+ io = hdcp_ctrl->init_data.core_io;
+ /* Enabling Software DDC */
+ DSS_REG_W_ND(io, HDMI_DDC_ARBITRATION , DSS_REG_R(io,
+ HDMI_DDC_ARBITRATION) & ~(BIT(4)));
+
rc = hdmi_hdcp_authentication_part1(hdcp_ctrl);
if (rc) {
DEV_DBG("%s: %s: HDCP Auth Part I failed\n", __func__,
@@ -920,6 +926,10 @@ static void hdmi_hdcp_auth_work(struct work_struct *work)
HDCP_STATE_NAME);
goto error;
}
+ /* Disabling software DDC before going into part3 to make sure
+ * there is no Arbitratioon between software and hardware for DDC */
+ DSS_REG_W_ND(io, HDMI_DDC_ARBITRATION , DSS_REG_R(io,
+ HDMI_DDC_ARBITRATION) | (BIT(4)));
error:
/*
diff --git a/drivers/video/fbdev/msm/mdss_hdmi_tx.c b/drivers/video/fbdev/msm/mdss_hdmi_tx.c
index 6af4690af551..60618ab0bdb6 100644
--- a/drivers/video/fbdev/msm/mdss_hdmi_tx.c
+++ b/drivers/video/fbdev/msm/mdss_hdmi_tx.c
@@ -866,13 +866,14 @@ error:
static void hdmi_tx_hpd_int_work(struct work_struct *work)
{
struct hdmi_tx_ctrl *hdmi_ctrl = NULL;
+ struct dss_io_data *io;
hdmi_ctrl = container_of(work, struct hdmi_tx_ctrl, hpd_int_work);
if (!hdmi_ctrl || !hdmi_ctrl->hpd_initialized) {
DEV_DBG("%s: invalid input\n", __func__);
return;
}
-
+ io = &hdmi_ctrl->pdata.io[HDMI_TX_CORE_IO];
DEV_DBG("%s: Got HPD interrupt\n", __func__);
if (hdmi_ctrl->hpd_state) {
@@ -880,6 +881,9 @@ static void hdmi_tx_hpd_int_work(struct work_struct *work)
DEV_ERR("%s: Failed to enable ddc power\n", __func__);
return;
}
+ /* Enable SW DDC before EDID read */
+ DSS_REG_W_ND(io, HDMI_DDC_ARBITRATION ,
+ DSS_REG_R(io, HDMI_DDC_ARBITRATION) & ~(BIT(4)));
hdmi_tx_read_sink_info(hdmi_ctrl);
hdmi_tx_send_cable_notification(hdmi_ctrl, 1);