summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/video/fbdev/msm/mdss_edp.c5
-rw-r--r--drivers/video/fbdev/msm/mdss_edp.h1
-rw-r--r--drivers/video/fbdev/msm/mdss_edp_aux.c11
3 files changed, 14 insertions, 3 deletions
diff --git a/drivers/video/fbdev/msm/mdss_edp.c b/drivers/video/fbdev/msm/mdss_edp.c
index 85400342d27f..19bc1b144321 100644
--- a/drivers/video/fbdev/msm/mdss_edp.c
+++ b/drivers/video/fbdev/msm/mdss_edp.c
@@ -591,6 +591,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);
@@ -624,6 +626,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;
}
@@ -802,7 +806,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);
}
diff --git a/drivers/video/fbdev/msm/mdss_edp.h b/drivers/video/fbdev/msm/mdss_edp.h
index e57d6898194a..78563b556265 100644
--- a/drivers/video/fbdev/msm/mdss_edp.h
+++ b/drivers/video/fbdev/msm/mdss_edp.h
@@ -316,6 +316,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;
diff --git a/drivers/video/fbdev/msm/mdss_edp_aux.c b/drivers/video/fbdev/msm/mdss_edp_aux.c
index 208e8122ebcc..7aa9792e8c6f 100644
--- a/drivers/video/fbdev/msm/mdss_edp_aux.c
+++ b/drivers/video/fbdev/msm/mdss_edp_aux.c
@@ -1193,7 +1193,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);
}
@@ -1221,6 +1220,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);
@@ -1237,6 +1237,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) {
@@ -1309,12 +1310,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);