diff options
| author | Ajay Singh Parmar <aparmar@codeaurora.org> | 2016-10-27 22:44:06 -0700 |
|---|---|---|
| committer | Ajay Singh Parmar <aparmar@codeaurora.org> | 2016-10-27 22:53:58 -0700 |
| commit | d4a840722fd7559d65ffbd8be6c1924aec9b5568 (patch) | |
| tree | 0991f09f24a35aadb97e914581f3d93ca4a42d57 | |
| parent | 7963ee24855344e5ad6b1b3b2830b000c2a8fbb6 (diff) | |
msm: mdss: hdcp1x: handle hpd for hdcp use-cases
On receiving attention command from displayport with hpd high,
proceed with hdcp authentication. Also, once the authentication
is successful, enable the encryption.
Change-Id: I970545bbf99ba89804016844f5b294a7e762e6e5
Signed-off-by: Ajay Singh Parmar <aparmar@codeaurora.org>
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_dp.c | 23 | ||||
| -rw-r--r-- | drivers/video/fbdev/msm/mdss_hdcp_1x.c | 8 |
2 files changed, 19 insertions, 12 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dp.c b/drivers/video/fbdev/msm/mdss_dp.c index 22d3d45ccea3..87cb089efddd 100644 --- a/drivers/video/fbdev/msm/mdss_dp.c +++ b/drivers/video/fbdev/msm/mdss_dp.c @@ -2496,7 +2496,7 @@ static int mdss_dp_process_downstream_port_status_change( * (including cases when there are back to back HPD IRQ HIGH) indicating * the start of a new link training request or sink status update. */ -static void mdss_dp_process_hpd_irq_high(struct mdss_dp_drv_pdata *dp) +static int mdss_dp_process_hpd_irq_high(struct mdss_dp_drv_pdata *dp) { int ret = 0; @@ -2516,10 +2516,11 @@ static void mdss_dp_process_hpd_irq_high(struct mdss_dp_drv_pdata *dp) if (!ret) goto exit; + pr_debug("done\n"); exit: mdss_dp_reset_test_data(dp); - pr_debug("done\n"); + return ret; } /** @@ -2529,10 +2530,10 @@ exit: * This function will handle the HPD IRQ state transitions from HIGH to LOW, * indicating the end of a test request. */ -static void mdss_dp_process_hpd_irq_low(struct mdss_dp_drv_pdata *dp) +static int mdss_dp_process_hpd_irq_low(struct mdss_dp_drv_pdata *dp) { if (!dp->hpd_irq_clients_notified) - return; + return -EINVAL; pr_debug("enter: HPD IRQ low\n"); @@ -2546,6 +2547,7 @@ static void mdss_dp_process_hpd_irq_low(struct mdss_dp_drv_pdata *dp) mdss_dp_reset_test_data(dp); pr_debug("done\n"); + return 0; } static void usbpd_response_callback(struct usbpd_svid_handler *hdlr, u8 cmd, @@ -2593,14 +2595,11 @@ static void usbpd_response_callback(struct usbpd_svid_handler *hdlr, u8 cmd, dp_drv->hdcp.ops->cp_irq) dp_drv->hdcp.ops->cp_irq(dp_drv->hdcp.data); - mdss_dp_process_hpd_irq_high(dp_drv); - break; - } - - if (dp_drv->hpd_irq_toggled - && !dp_drv->alt_mode.dp_status.hpd_irq) { - mdss_dp_process_hpd_irq_low(dp_drv); - break; + if (!mdss_dp_process_hpd_irq_high(dp_drv)) + break; + } else if (dp_drv->hpd_irq_toggled) { + if (!mdss_dp_process_hpd_irq_low(dp_drv)) + break; } if (!dp_drv->alt_mode.dp_status.hpd_high) { diff --git a/drivers/video/fbdev/msm/mdss_hdcp_1x.c b/drivers/video/fbdev/msm/mdss_hdcp_1x.c index 1e0ad986afb1..a8182c2f0e76 100644 --- a/drivers/video/fbdev/msm/mdss_hdcp_1x.c +++ b/drivers/video/fbdev/msm/mdss_hdcp_1x.c @@ -1297,6 +1297,9 @@ static void hdcp_1x_int_work(struct work_struct *work) return; } + if (hdcp_ctrl->hdcp_state == HDCP_STATE_AUTHENTICATED) + hdcp1_set_enc(false); + mutex_lock(hdcp_ctrl->init_data.mutex); hdcp_ctrl->hdcp_state = HDCP_STATE_AUTH_FAIL; mutex_unlock(hdcp_ctrl->init_data.mutex); @@ -1385,6 +1388,8 @@ error: hdcp_ctrl->init_data.cb_data, hdcp_ctrl->hdcp_state); } + + hdcp1_set_enc(true); } else { DEV_DBG("%s: %s: HDCP state changed during authentication\n", __func__, HDCP_STATE_NAME); @@ -1506,6 +1511,9 @@ void hdcp_1x_off(void *input) return; } + if (hdcp_ctrl->hdcp_state == HDCP_STATE_AUTHENTICATED) + hdcp1_set_enc(false); + /* * Disable HDCP interrupts. * Also, need to set the state to inactive here so that any ongoing |
