Merge tag 'drm-misc-next-2020-02-10' of git://anongit.freedesktop.org/drm/drm-misc...
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / drm_dp_mst_topology.c
index cce0b1b..a811247 100644 (file)
@@ -3499,9 +3499,9 @@ static int drm_dp_get_vc_payload_bw(u8 dp_link_bw, u8  dp_link_count)
 int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state)
 {
        int ret = 0;
-       int i = 0;
        struct drm_dp_mst_branch *mstb = NULL;
 
+       mutex_lock(&mgr->payload_lock);
        mutex_lock(&mgr->lock);
        if (mst_state == mgr->mst_state)
                goto out_unlock;
@@ -3509,6 +3509,8 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
        mgr->mst_state = mst_state;
        /* set the device into MST mode */
        if (mst_state) {
+               struct drm_dp_payload reset_pay;
+
                WARN_ON(mgr->mst_primary);
 
                /* get dpcd info */
@@ -3538,17 +3540,15 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
                drm_dp_mst_topology_get_mstb(mgr->mst_primary);
 
                ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
-                                                        DP_MST_EN | DP_UP_REQ_EN | DP_UPSTREAM_IS_SRC);
-               if (ret < 0) {
+                                        DP_MST_EN |
+                                        DP_UP_REQ_EN |
+                                        DP_UPSTREAM_IS_SRC);
+               if (ret < 0)
                        goto out_unlock;
-               }
 
-               {
-                       struct drm_dp_payload reset_pay;
-                       reset_pay.start_slot = 0;
-                       reset_pay.num_slots = 0x3f;
-                       drm_dp_dpcd_write_payload(mgr, 0, &reset_pay);
-               }
+               reset_pay.start_slot = 0;
+               reset_pay.num_slots = 0x3f;
+               drm_dp_dpcd_write_payload(mgr, 0, &reset_pay);
 
                queue_work(system_long_wq, &mgr->work);
 
@@ -3560,27 +3560,19 @@ int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool ms
                /* this can fail if the device is gone */
                drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
                ret = 0;
-               mutex_lock(&mgr->payload_lock);
-               memset(mgr->payloads, 0, mgr->max_payloads * sizeof(struct drm_dp_payload));
+               memset(mgr->payloads, 0,
+                      mgr->max_payloads * sizeof(mgr->payloads[0]));
+               memset(mgr->proposed_vcpis, 0,
+                      mgr->max_payloads * sizeof(mgr->proposed_vcpis[0]));
                mgr->payload_mask = 0;
                set_bit(0, &mgr->payload_mask);
-               for (i = 0; i < mgr->max_payloads; i++) {
-                       struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
-
-                       if (vcpi) {
-                               vcpi->vcpi = 0;
-                               vcpi->num_slots = 0;
-                       }
-                       mgr->proposed_vcpis[i] = NULL;
-               }
                mgr->vcpi_mask = 0;
-               mutex_unlock(&mgr->payload_lock);
-
                mgr->payload_id_table_cleared = false;
        }
 
 out_unlock:
        mutex_unlock(&mgr->lock);
+       mutex_unlock(&mgr->payload_lock);
        if (mstb)
                drm_dp_mst_topology_put_mstb(mstb);
        return ret;
@@ -3708,7 +3700,7 @@ static bool drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up)
 {
        int len;
        u8 replyblock[32];
-       int replylen, origlen, curreply;
+       int replylen, curreply;
        int ret;
        struct drm_dp_sideband_msg_rx *msg;
        int basereg = up ? DP_SIDEBAND_MSG_UP_REQ_BASE : DP_SIDEBAND_MSG_DOWN_REP_BASE;
@@ -3728,7 +3720,6 @@ static bool drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up)
        }
        replylen = msg->curchunk_len + msg->curchunk_hdrlen;
 
-       origlen = replylen;
        replylen -= len;
        curreply = len;
        while (replylen > 0) {