summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_dp.c23
-rw-r--r--drivers/video/fbdev/msm/mdss_hdcp_1x.c8
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