Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 295ee599 authored by Ajay Singh Parmar's avatar Ajay Singh Parmar Committed by Gerrit - the friendly Code Review server
Browse files

drm/msm/dp: abort connect processing if cable is disconnected



In case DP cable is disconnected immediately after connect, abort
any processing DP driver is doing like reading EDID or DPCD or
link maintenance etc which requires AUX communication.
The AUX communication needs a physical connection with sink. If
it has already been broken, AUX communication will continue to
fail. Abort such transactions on disconnect to avoid unnecessary
delays in disconnect or next connect processing.

CRs-Fixed: 2184573
Change-Id: Id9e61169363ab94f7eb3d069aefb3b19f2d46b75
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
parent c9ab2da3
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -65,6 +65,8 @@ struct dp_display_private {
	bool power_on;
	bool audio_supported;

	atomic_t aborted;

	struct platform_device *pdev;
	struct dentry *root;
	struct completion notification_comp;
@@ -645,6 +647,11 @@ static int dp_display_handle_disconnect(struct dp_display_private *dp)
	int rc;

	rc = dp_display_process_hpd_low(dp);
	if (rc) {
		/* cancel any pending request */
		dp->ctrl->abort(dp->ctrl);
		dp->aux->abort(dp->aux);
	}

	mutex_lock(&dp->session_lock);
	if (rc && dp->power_on)
@@ -687,6 +694,7 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev)
		dp->link->psm_config(dp->link, &dp->panel->link_info, true);

	/* cancel any pending request */
	atomic_set(&dp->aborted, 1);
	dp->ctrl->abort(dp->ctrl);
	dp->aux->abort(dp->aux);

@@ -695,6 +703,7 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev)
	flush_workqueue(dp->wq);

	dp_display_handle_disconnect(dp);
	atomic_set(&dp->aborted, 0);
end:
	return rc;
}
@@ -786,6 +795,7 @@ static int dp_display_usbpd_attention_cb(struct device *dev)
		queue_delayed_work(dp->wq, &dp->connect_work, 0);
	} else {
		/* cancel any pending request */
		atomic_set(&dp->aborted, 1);
		dp->ctrl->abort(dp->ctrl);
		dp->aux->abort(dp->aux);

@@ -794,6 +804,7 @@ static int dp_display_usbpd_attention_cb(struct device *dev)
		flush_workqueue(dp->wq);

		dp_display_handle_disconnect(dp);
		atomic_set(&dp->aborted, 0);
	}

	return 0;
@@ -810,6 +821,11 @@ static void dp_display_connect_work(struct work_struct *work)
		return;
	}

	if (atomic_read(&dp->aborted)) {
		pr_err("aborted\n");
		return;
	}

	dp_display_process_hpd_high(dp);
}

@@ -1062,6 +1078,11 @@ static int dp_display_enable(struct dp_display *dp_display)
		goto end;
	}

	if (atomic_read(&dp->aborted)) {
		pr_err("aborted\n");
		goto end;
	}

	dp->aux->init(dp->aux, dp->parser->aux_cfg);

	rc = dp->ctrl->on(dp->ctrl);
@@ -1094,6 +1115,11 @@ static int dp_display_post_enable(struct dp_display *dp_display)
		goto end;
	}

	if (atomic_read(&dp->aborted)) {
		pr_err("aborted\n");
		goto end;
	}

	dp->panel->spd_config(dp->panel);

	if (dp->audio_supported) {
@@ -1369,6 +1395,7 @@ static int dp_display_probe(struct platform_device *pdev)
	dp->pdev = pdev;
	dp->name = "drm_dp";
	dp->audio_status = -ENODEV;
	atomic_set(&dp->aborted, 0);

	rc = dp_display_create_workqueue(dp);
	if (rc) {