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

Commit 611f3aa4 authored by Ajay Singh Parmar's avatar Ajay Singh Parmar Committed by Steve Cohen
Browse files

drm/msm/dp: avoid audio reconfig delays



During link maintenance, disable audio first and then proceed
further. Once the maintenance is completed, re-enable the audio.
Currently audio disable/enable is done after link maintenance
which introduces delays for next sink request. Avoid audio delays
to fix DisplayPort CTS issues.

CRs-Fixed: 2146479
Change-Id: Icb881552842e711e7660a96c64f00a6d1312a47c
Signed-off-by: default avatarAjay Singh Parmar <aparmar@codeaurora.org>
Signed-off-by: default avatarSteve Cohen <cohens@codeaurora.org>
parent 923b6721
Loading
Loading
Loading
Loading
+20 −42
Original line number Diff line number Diff line
@@ -1168,9 +1168,17 @@ static bool dp_ctrl_use_fixed_nvid(struct dp_ctrl_private *ctrl)
	return false;
}

static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl)
static int dp_ctrl_link_maintenance(struct dp_ctrl *dp_ctrl)
{
	int ret = 0;
	struct dp_ctrl_private *ctrl;

	if (!dp_ctrl) {
		pr_err("Invalid input data\n");
		return -EINVAL;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);

	ctrl->dp_ctrl.push_idle(&ctrl->dp_ctrl);
	ctrl->dp_ctrl.reset(&ctrl->dp_ctrl);
@@ -1214,9 +1222,17 @@ static int dp_ctrl_link_maintenance(struct dp_ctrl_private *ctrl)
	return ret;
}

static void dp_ctrl_process_phy_test_request(struct dp_ctrl_private *ctrl)
static void dp_ctrl_process_phy_test_request(struct dp_ctrl *dp_ctrl)
{
	int ret = 0;
	struct dp_ctrl_private *ctrl;

	if (!dp_ctrl) {
		pr_err("Invalid input data\n");
		return;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);

	if (!ctrl->link->phy_params.phy_test_pattern_sel) {
		pr_debug("no test pattern selected by sink\n");
@@ -1294,45 +1310,6 @@ static void dp_ctrl_send_phy_test_pattern(struct dp_ctrl_private *ctrl)
			dp_link_get_phy_test_pattern(pattern_requested));
}

static bool dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl)
{
	struct dp_ctrl_private *ctrl;
	u32 sink_request = 0x0;
	bool req_handled = false;

	if (!dp_ctrl) {
		pr_err("invalid input\n");
		goto end;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);
	sink_request = ctrl->link->sink_request;

	if (sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) {
		pr_info("PHY_TEST_PATTERN\n");
		dp_ctrl_process_phy_test_request(ctrl);

		req_handled = true;
	}

	if (sink_request & DP_LINK_STATUS_UPDATED) {
		pr_info("DP_LINK_STATUS_UPDATED\n");
		dp_ctrl_link_maintenance(ctrl);

		req_handled = true;
	}

	if (sink_request & DP_TEST_LINK_TRAINING) {
		pr_info("DP_TEST_LINK_TRAINING\n");
		ctrl->link->send_test_response(ctrl->link);
		dp_ctrl_link_maintenance(ctrl);

		req_handled = true;
	}
end:
	return req_handled;
}

static void dp_ctrl_reset(struct dp_ctrl *dp_ctrl)
{
	struct dp_ctrl_private *ctrl;
@@ -1505,7 +1482,8 @@ struct dp_ctrl *dp_ctrl_get(struct dp_ctrl_in *in)
	dp_ctrl->abort     = dp_ctrl_abort;
	dp_ctrl->isr       = dp_ctrl_isr;
	dp_ctrl->reset	   = dp_ctrl_reset;
	dp_ctrl->handle_sink_request = dp_ctrl_handle_sink_request;
	dp_ctrl->link_maintenance = dp_ctrl_link_maintenance;
	dp_ctrl->process_phy_test_request = dp_ctrl_process_phy_test_request;

	return dp_ctrl;
error:
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ struct dp_ctrl {
	void (*abort)(struct dp_ctrl *dp_ctrl);
	void (*isr)(struct dp_ctrl *dp_ctrl);
	bool (*handle_sink_request)(struct dp_ctrl *dp_ctrl);
	void (*process_phy_test_request)(struct dp_ctrl *dp_ctrl);
	int (*link_maintenance)(struct dp_ctrl *dp_ctrl);
};

struct dp_ctrl_in {
+28 −11
Original line number Diff line number Diff line
@@ -654,9 +654,23 @@ static int dp_display_usbpd_disconnect_cb(struct device *dev)
	return rc;
}

static void dp_display_handle_maintenance_req(struct dp_display_private *dp)
{
	mutex_lock(&dp->audio->ops_lock);

	if (dp->audio_supported)
		dp->audio->off(dp->audio);

	dp->ctrl->link_maintenance(dp->ctrl);

	if (dp->audio_supported)
		dp->audio->on(dp->audio);

	mutex_unlock(&dp->audio->ops_lock);
}

static void dp_display_attention_work(struct work_struct *work)
{
	bool req_handled;
	struct dp_display_private *dp = container_of(work,
			struct dp_display_private, attention_work);

@@ -687,17 +701,20 @@ static void dp_display_attention_work(struct work_struct *work)
		return;
	}

	mutex_lock(&dp->audio->ops_lock);
	req_handled = dp->ctrl->handle_sink_request(dp->ctrl);
	mutex_unlock(&dp->audio->ops_lock);
	if (dp->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) {
		dp->ctrl->process_phy_test_request(dp->ctrl);
		return;
	}

	/*
	 * reconfigure audio if test was executed
	 * which could have changed the controller's state
	 */
	if (req_handled && dp->audio_supported) {
		dp->audio->off(dp->audio);
		dp->audio->on(dp->audio);
	if (dp->link->sink_request & DP_LINK_STATUS_UPDATED) {
		dp_display_handle_maintenance_req(dp);
		return;
	}

	if (dp->link->sink_request & DP_TEST_LINK_TRAINING) {
		dp->link->send_test_response(dp->link);
		dp_display_handle_maintenance_req(dp);
		return;
	}
}