Sfoglia il codice sorgente

Merge "disp: msm: Ensure clean slate when starting and stopping HDCP"

qctecmdr 6 anni fa
parent
commit
e683dcbce3
3 ha cambiato i file con 16 aggiunte e 5 eliminazioni
  1. 1 1
      msm/dp/dp_display.c
  2. 8 2
      msm/dp/dp_hdcp2p2.c
  3. 7 2
      msm/sde_hdcp_2x.c

+ 1 - 1
msm/dp/dp_display.c

@@ -387,12 +387,12 @@ static void dp_display_hdcp_cb_work(struct work_struct *work)
 				return;
 			}
 			dp_display_hdcp_register_streams(dp);
-			status->hdcp_state = HDCP_STATE_AUTHENTICATING;
 			if (ops && ops->reauthenticate) {
 				rc = ops->reauthenticate(data);
 				if (rc)
 					pr_err("failed rc=%d\n", rc);
 			}
+			status->hdcp_state = HDCP_STATE_AUTHENTICATING;
 		} else {
 			pr_debug("not reauthenticating, cable disconnected\n");
 		}

+ 8 - 2
msm/dp/dp_hdcp2p2.c

@@ -196,16 +196,20 @@ static int dp_hdcp2p2_wakeup(struct hdcp_transport_wakeup_data *data)
 	switch (data->cmd) {
 	case HDCP_TRANSPORT_CMD_STATUS_SUCCESS:
 		atomic_set(&ctrl->auth_state, HDCP_STATE_AUTHENTICATED);
+		kfifo_put(&ctrl->cmd_q, data->cmd);
+		wake_up(&ctrl->wait_q);
 		break;
 	case HDCP_TRANSPORT_CMD_STATUS_FAILED:
 		atomic_set(&ctrl->auth_state, HDCP_STATE_AUTH_FAIL);
+		kfifo_put(&ctrl->cmd_q, data->cmd);
+		kthread_park(ctrl->thread);
 		break;
 	default:
+		kfifo_put(&ctrl->cmd_q, data->cmd);
+		wake_up(&ctrl->wait_q);
 		break;
 	}
 
-	kfifo_put(&ctrl->cmd_q, data->cmd);
-	wake_up(&ctrl->wait_q);
 exit:
 	return 0;
 }
@@ -310,6 +314,8 @@ static int dp_hdcp2p2_authenticate(void *input)
 	ctrl->sink_status = SINK_CONNECTED;
 	atomic_set(&ctrl->auth_state, HDCP_STATE_AUTHENTICATING);
 
+	kthread_park(ctrl->thread);
+	kfifo_reset(&ctrl->cmd_q);
 	kthread_unpark(ctrl->thread);
 
 	cdata.context = input;

+ 7 - 2
msm/sde_hdcp_2x.c

@@ -832,9 +832,16 @@ static int sde_hdcp_2x_wakeup(struct sde_hdcp_2x_wakeup_data *data)
 		if (!atomic_cmpxchg(&hdcp->enable_pending, 0, 1)) {
 			hdcp->device_type = data->device_type;
 			kfifo_put(&hdcp->cmd_q, data->cmd);
+			kthread_unpark(hdcp->thread);
 			wake_up(&hdcp->wait_q);
 		}
 		break;
+	case HDCP_2X_CMD_DISABLE:
+		if (!atomic_xchg(&hdcp->hdcp_off, 1))
+			kfifo_put(&hdcp->cmd_q, HDCP_2X_CMD_STOP);
+		kfifo_put(&hdcp->cmd_q, data->cmd);
+		kthread_park(hdcp->thread);
+		break;
 	case HDCP_2X_CMD_STOP:
 		atomic_set(&hdcp->hdcp_off, 1);
 
@@ -929,8 +936,6 @@ static int sde_hdcp_2x_main(void *data)
 			atomic_set(&hdcp->enable_pending, 0);
 			break;
 		case HDCP_2X_CMD_DISABLE:
-			if (!atomic_xchg(&hdcp->hdcp_off, 1))
-				sde_hdcp_2x_clean(hdcp);
 			sde_hdcp_2x_disable(hdcp);
 			break;
 		case HDCP_2X_CMD_START: