summaryrefslogtreecommitdiff
path: root/msm/dp
diff options
context:
space:
mode:
authorqctecmdr <qctecmdr@localhost>2020-02-20 19:02:08 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2020-02-20 19:02:08 -0800
commita787730c248ade20c0db7006c81dc5ece36fbb50 (patch)
tree670f1c4ec31f4da88cd8f760578e5593c271d650 /msm/dp
parent0285e07a4938a5d41ce3a1f57ea3c55f6a1d49a9 (diff)
parent86fe694d214f7d5ee3e011239538b481779c2f38 (diff)
downloaddisplay-drivers-a787730c248ade20c0db7006c81dc5ece36fbb50.tar.gz
Merge "disp: msm: hdcp: abort queued tasks while processing PM suspend"
Diffstat (limited to 'msm/dp')
-rw-r--r--msm/dp/dp_display.c18
-rw-r--r--msm/dp/dp_hdcp2p2.c14
2 files changed, 31 insertions, 1 deletions
diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c
index ad30e03b..cc702307 100644
--- a/msm/dp/dp_display.c
+++ b/msm/dp/dp_display.c
@@ -401,6 +401,22 @@ static void dp_display_hdcp_deregister_stream(struct dp_display_private *dp,
}
}
+static void dp_display_abort_hdcp(struct dp_display_private *dp,
+ bool abort)
+{
+ u32 i = HDCP_VERSION_2P2;
+ struct dp_hdcp_dev *dev = NULL;
+
+ while (i) {
+ dev = &dp->hdcp.dev[i];
+ i >>= 1;
+ if (!(dp->hdcp.source_cap & dev->ver))
+ continue;
+
+ dev->ops->abort(dev->fd, abort);
+ }
+}
+
static void dp_display_hdcp_cb_work(struct work_struct *work)
{
struct dp_display_private *dp;
@@ -851,6 +867,7 @@ static void dp_display_host_init(struct dp_display_private *dp)
dp->hpd->host_init(dp->hpd, &dp->catalog->hpd);
dp->ctrl->init(dp->ctrl, flip, reset);
enable_irq(dp->irq);
+ dp_display_abort_hdcp(dp, false);
dp_display_state_add(DP_STATE_INITIALIZED);
@@ -928,6 +945,7 @@ static void dp_display_host_deinit(struct dp_display_private *dp)
return;
}
+ dp_display_abort_hdcp(dp, true);
dp->ctrl->deinit(dp->ctrl);
dp->hpd->host_deinit(dp->hpd, &dp->catalog->hpd);
dp->power->deinit(dp->power);
diff --git a/msm/dp/dp_hdcp2p2.c b/msm/dp/dp_hdcp2p2.c
index c50cb897..fcbec753 100644
--- a/msm/dp/dp_hdcp2p2.c
+++ b/msm/dp/dp_hdcp2p2.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
*/
#include <linux/delay.h>
@@ -31,6 +31,7 @@ struct dp_hdcp2p2_ctrl {
DECLARE_KFIFO(cmd_q, enum hdcp_transport_wakeup_cmd, 8);
wait_queue_head_t wait_q;
atomic_t auth_state;
+ atomic_t abort;
enum dp_hdcp2p2_sink_status sink_status; /* Is sink connected */
struct dp_hdcp2p2_interrupts *intr;
struct sde_hdcp_init_data init_data;
@@ -151,6 +152,9 @@ static void dp_hdcp2p2_set_interrupts(struct dp_hdcp2p2_ctrl *ctrl, bool enable)
void __iomem *base = ctrl->init_data.dp_ahb->base;
struct dp_hdcp2p2_interrupts *intr = ctrl->intr;
+ if (atomic_read(&ctrl->abort))
+ return;
+
while (intr && intr->reg) {
struct dp_hdcp2p2_int_set *int_set = intr->int_set;
u32 interrupts = 0;
@@ -882,6 +886,13 @@ static int dp_hdcp2p2_main(void *data)
return 0;
}
+static void dp_hdcp2p2_abort(void *input, bool abort)
+{
+ struct dp_hdcp2p2_ctrl *ctrl = input;
+
+ atomic_set(&ctrl->abort, abort);
+}
+
void *sde_dp_hdcp2p2_init(struct sde_hdcp_init_data *init_data)
{
int rc;
@@ -896,6 +907,7 @@ void *sde_dp_hdcp2p2_init(struct sde_hdcp_init_data *init_data)
.set_mode = dp_hdcp2p2_register,
.on = dp_hdcp2p2_on,
.off = dp_hdcp2p2_off,
+ .abort = dp_hdcp2p2_abort,
.cp_irq = dp_hdcp2p2_cp_irq,
.register_streams = dp_hdcp2p2_register_streams,
.deregister_streams = dp_hdcp2p2_deregister_streams,