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

Commit 89912133 authored by Tatenda Chipeperekwa's avatar Tatenda Chipeperekwa
Browse files

drm/msm/dp: fix the controller programming sequence



Fix the controller programming sequence to ensure that all
hardware configuration (MSA, transfer unit, timing, etc.) are
done before the timing engine is enabled. This ensures the
controller is in the correct state before video data starts
flowing.

CRs-Fixed: 2250510
Change-Id: Ib77574afe01e5fb88e97bff740de7fba77afa900
Signed-off-by: default avatarTatenda Chipeperekwa <tatendac@codeaurora.org>
parent 1aacee8f
Loading
Loading
Loading
Loading
+23 −17
Original line number Diff line number Diff line
@@ -147,7 +147,7 @@ static void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl, enum dp_stream_id strm)

	if (!wait_for_completion_timeout(&ctrl->idle_comp,
			idle_pattern_completion_timeout_ms))
		pr_warn("PUSH_IDLE pattern timedout\n");
		pr_warn("PUSH_IDLE time out\n");

	pr_debug("mainlink off done\n");
}
@@ -179,11 +179,11 @@ static int dp_ctrl_wait4video_ready(struct dp_ctrl_private *ctrl)

	ret = wait_for_completion_timeout(&ctrl->video_comp, HZ / 2);
	if (ret <= 0) {
		pr_err("Link Train timedout\n");
		ret = -EINVAL;
		pr_err("SEND_VIDEO time out (%d)\n", ret);
		return -EINVAL;
	}

	return ret;
	return 0;
}

static int dp_ctrl_update_sink_vx_px(struct dp_ctrl_private *ctrl,
@@ -838,21 +838,22 @@ static void dp_ctrl_reset(struct dp_ctrl *dp_ctrl)
	ctrl->catalog->reset(ctrl->catalog);
}

static void dp_ctrl_send_video(struct dp_ctrl_private *ctrl)
{
	ctrl->catalog->state_ctrl(ctrl->catalog, ST_SEND_VIDEO);
}

static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl,
		struct dp_panel *panel)
{
	u32 x_int, y_frac_enum, lanes, bw_code;
	bool act_complete;

	if (!ctrl->mst_mode) {
		ctrl->catalog->state_ctrl(ctrl->catalog, ST_SEND_VIDEO);
	if (!ctrl->mst_mode)
		return 0;
	}

	DP_MST_DEBUG("mst stream channel allocation\n");

	panel->hw_cfg(panel);

	ctrl->catalog->channel_alloc(ctrl->catalog,
				panel->stream_id,
				panel->channel_start_slot,
@@ -875,8 +876,6 @@ static int dp_ctrl_mst_stream_setup(struct dp_ctrl_private *ctrl,
	DP_MST_DEBUG("mst lane_cnt:%d, bw:%d, x_int:%d, y_frac:%d\n",
			lanes, bw_code, x_int, y_frac_enum);

	ctrl->catalog->state_ctrl(ctrl->catalog, ST_SEND_VIDEO);

	ctrl->catalog->trigger_act(ctrl->catalog);
	msleep(20); /* needs 1 frame time */

@@ -897,8 +896,7 @@ static int dp_ctrl_stream_on(struct dp_ctrl *dp_ctrl, struct dp_panel *panel)
	struct dp_ctrl_private *ctrl;

	if (!dp_ctrl || !panel) {
		rc = -EINVAL;
		goto end;
		return -EINVAL;
	}

	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl);
@@ -906,7 +904,7 @@ static int dp_ctrl_stream_on(struct dp_ctrl *dp_ctrl, struct dp_panel *panel)
	rc = dp_ctrl_enable_stream_clocks(ctrl, panel);
	if (rc) {
		pr_err("failure on stream clock enable\n");
		goto end;
		return rc;
	}

	if (ctrl->link->sink_request & DP_TEST_LINK_PHY_TEST_PATTERN) {
@@ -914,15 +912,23 @@ static int dp_ctrl_stream_on(struct dp_ctrl *dp_ctrl, struct dp_panel *panel)
		return 0;
	}

	rc = panel->hw_cfg(panel);
	if (rc)
		return rc;

	dp_ctrl_send_video(ctrl);

	rc = dp_ctrl_mst_stream_setup(ctrl, panel);
	if (rc)
		goto end;
		return rc;

	rc = dp_ctrl_wait4video_ready(ctrl);
	if (rc)
		return rc;

	dp_ctrl_wait4video_ready(ctrl);
	link_ready = ctrl->catalog->mainlink_ready(ctrl->catalog);
	pr_debug("mainlink %s\n", link_ready ? "READY" : "NOT READY");

end:
	return rc;
}

+4 −3
Original line number Diff line number Diff line
@@ -1262,7 +1262,9 @@ static int dp_display_enable(struct dp_display *dp_display, void *panel)
	}

	rc = dp->ctrl->on(dp->ctrl, dp->mst.mst_active);
	if (!rc)
	if (rc)
		goto end;

	dp->power_on = true;

stream_setup:
@@ -1278,7 +1280,6 @@ static void dp_display_stream_post_enable(struct dp_display_private *dp,
{
	dp_panel->spd_config(dp_panel);
	dp_panel->setup_hdr(dp_panel, NULL);
	dp_panel->hw_cfg(dp_panel);

	dp_panel->audio->register_ext_disp(dp_panel->audio);
}