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

Commit 66ff31da authored by Kuogee Hsieh's avatar Kuogee Hsieh
Browse files

msm: mdss: do not shut down edp link during link training



Use locks to prevent shutting down edp link at panel off if link
training is ongoing, since EDP Link training requires that link
is in running state.

Change-Id: I79715675f0a919815dfc60689215f4771400b28a
Signed-off-by: default avatarKuogee Hsieh <khsieh@codeaurora.org>
parent 01364e16
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -597,6 +597,8 @@ int mdss_edp_off(struct mdss_panel_data *pdata)
	}
	pr_debug("%s:+, cont_splash=%d\n", __func__, edp_drv->cont_splash);

	/* wait until link training is completed */
	mutex_lock(&edp_drv->train_mutex);

	INIT_COMPLETION(edp_drv->idle_comp);
	mdss_edp_state_ctrl(edp_drv, ST_PUSH_IDLE);
@@ -632,6 +634,8 @@ int mdss_edp_off(struct mdss_panel_data *pdata)

	pr_debug("%s-: state_ctrl=%x\n", __func__,
				edp_read(edp_drv->base + 0x8));

	mutex_unlock(&edp_drv->train_mutex);
	return 0;
}

@@ -810,7 +814,6 @@ static void mdss_edp_do_link_train(struct mdss_edp_drv_pdata *ep)
	if (ep->cont_splash)
		return;

	INIT_COMPLETION(ep->train_comp);
	mdss_edp_link_train(ep);
}

+1 −0
Original line number Diff line number Diff line
@@ -315,6 +315,7 @@ struct mdss_edp_drv_pdata {
	struct completion idle_comp;
	struct completion video_comp;
	struct mutex aux_mutex;
	struct mutex train_mutex;
	u32 aux_cmd_busy;
	u32 aux_cmd_i2c;
	int aux_trans_num;
+9 −2
Original line number Diff line number Diff line
@@ -1196,7 +1196,6 @@ static int edp_link_rate_down_shift(struct mdss_edp_drv_pdata *ep)
static void edp_clear_training_pattern(struct mdss_edp_drv_pdata *ep)
{
	pr_debug("%s:\n", __func__);
	edp_write(ep->base + EDP_STATE_CTRL, 0);
	edp_train_pattern_set_write(ep, 0);
	usleep(ep->dpcd.training_read_interval);
}
@@ -1224,6 +1223,7 @@ train_start:
	mdss_edp_config_ctrl(ep);
	mdss_edp_lane_power_ctrl(ep, 1);

	mdss_edp_state_ctrl(ep, 0);
	edp_clear_training_pattern(ep);
	usleep(ep->dpcd.training_read_interval);

@@ -1240,6 +1240,7 @@ train_start:

	pr_debug("%s: Training 1 completed successfully", __func__);

	mdss_edp_state_ctrl(ep, 0);
	edp_clear_training_pattern(ep);
	ret = edp_start_link_train_2(ep);
	if (ret < 0) {
@@ -1312,12 +1313,18 @@ int mdss_edp_sink_power_state(struct mdss_edp_drv_pdata *ep, char state)

int mdss_edp_link_train(struct mdss_edp_drv_pdata *ep)
{
	return edp_aux_link_train(ep);
	int ret;

	mutex_lock(&ep->train_mutex);
	ret = edp_aux_link_train(ep);
	mutex_unlock(&ep->train_mutex);
	return ret;
}

void mdss_edp_aux_init(struct mdss_edp_drv_pdata *ep)
{
	mutex_init(&ep->aux_mutex);
	mutex_init(&ep->train_mutex);
	init_completion(&ep->aux_comp);
	init_completion(&ep->train_comp);
	init_completion(&ep->idle_comp);