diff options
author | qctecmdr <qctecmdr@localhost> | 2020-02-20 19:02:08 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2020-02-20 19:02:08 -0800 |
commit | a787730c248ade20c0db7006c81dc5ece36fbb50 (patch) | |
tree | 670f1c4ec31f4da88cd8f760578e5593c271d650 /msm/dp | |
parent | 0285e07a4938a5d41ce3a1f57ea3c55f6a1d49a9 (diff) | |
parent | 86fe694d214f7d5ee3e011239538b481779c2f38 (diff) | |
download | display-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.c | 18 | ||||
-rw-r--r-- | msm/dp/dp_hdcp2p2.c | 14 |
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, |