diff options
| author | Abhishek Kharbanda <akharban@codeaurora.org> | 2013-07-02 15:14:06 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 20:19:11 -0700 |
| commit | 2a86f9cdaefeb3f45730cb6d5cebcd4c423bb990 (patch) | |
| tree | 7d3cf24874eedf21e6657ef895ca78008b018871 /drivers | |
| parent | be44c0b29da82dc26e16865bd4320ec393524674 (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.c | 10 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdmi_tx.c | 6 |
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); |
