summaryrefslogtreecommitdiff
path: root/msm/dp/dp_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'msm/dp/dp_display.c')
-rw-r--r--msm/dp/dp_display.c46
1 files changed, 37 insertions, 9 deletions
diff --git a/msm/dp/dp_display.c b/msm/dp/dp_display.c
index c58c7f7c..2ff34baf 100644
--- a/msm/dp/dp_display.c
+++ b/msm/dp/dp_display.c
@@ -712,7 +712,7 @@ static void dp_display_send_hpd_event(struct dp_display_private *dp)
snprintf(pattern, HPD_STRING_SIZE, "pattern=%d",
dp->link->test_video.test_video_pattern);
- DP_DEBUG("[%s]:[%s] [%s] [%s]\n", name, status, bpp, pattern);
+ DP_INFO("[%s]:[%s] [%s] [%s]\n", name, status, bpp, pattern);
envp[0] = name;
envp[1] = status;
envp[2] = bpp;
@@ -1167,6 +1167,12 @@ static void dp_display_stream_disable(struct dp_display_private *dp,
return;
}
+ if (dp_panel->stream_id == DP_STREAM_MAX ||
+ !dp->active_panels[dp_panel->stream_id]) {
+ DP_ERR("panel is already disabled\n");
+ return;
+ }
+
DP_DEBUG("stream_id=%d, active_stream_cnt=%d\n",
dp_panel->stream_id, dp->active_stream_cnt);
@@ -1334,6 +1340,7 @@ static void dp_display_attention_work(struct work_struct *work)
{
struct dp_display_private *dp = container_of(work,
struct dp_display_private, attention_work);
+ int rc = 0;
SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_ENTRY, dp->state);
mutex_lock(&dp->session_lock);
@@ -1397,16 +1404,20 @@ static void dp_display_attention_work(struct work_struct *work)
if (dp->link->sink_request & DP_TEST_LINK_TRAINING) {
SDE_EVT32_EXTERNAL(dp->state, DP_TEST_LINK_TRAINING);
dp->link->send_test_response(dp->link);
- dp->ctrl->link_maintenance(dp->ctrl);
+ rc = dp->ctrl->link_maintenance(dp->ctrl);
}
if (dp->link->sink_request & DP_LINK_STATUS_UPDATED) {
SDE_EVT32_EXTERNAL(dp->state, DP_LINK_STATUS_UPDATED);
- dp->ctrl->link_maintenance(dp->ctrl);
+ rc = dp->ctrl->link_maintenance(dp->ctrl);
}
- dp_audio_enable(dp, true);
+ if (!rc)
+ dp_audio_enable(dp, true);
+
mutex_unlock(&dp->session_lock);
+ if (rc)
+ goto end;
if (dp->link->sink_request & (DP_TEST_LINK_PHY_TEST_PATTERN |
DP_TEST_LINK_TRAINING))
@@ -1430,6 +1441,8 @@ cp_irq:
mst_attention:
dp_display_mst_attention(dp);
+
+end:
SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, dp->state);
}
@@ -1893,7 +1906,7 @@ end:
mutex_unlock(&dp->session_lock);
SDE_EVT32_EXTERNAL(SDE_EVTLOG_FUNC_EXIT, dp->state);
- return 0;
+ return rc;
}
static int dp_display_set_stream_info(struct dp_display *dp_display,
@@ -2309,7 +2322,6 @@ static enum drm_mode_status dp_display_validate_mode(
const struct msm_resource_caps_info *avail_res)
{
struct dp_display_private *dp;
- struct drm_dp_link *link_info;
u32 mode_rate_khz = 0, supported_rate_khz = 0, mode_bpp = 0;
struct dp_panel *dp_panel;
struct dp_debug *debug;
@@ -2338,8 +2350,6 @@ static enum drm_mode_status dp_display_validate_mode(
goto end;
}
- link_info = &dp->panel->link_info;
-
debug = dp->debug;
if (!debug)
goto end;
@@ -2352,7 +2362,7 @@ static enum drm_mode_status dp_display_validate_mode(
mode_rate_khz = mode->clock * mode_bpp;
rate = drm_dp_bw_code_to_link_rate(dp->link->link_params.bw_code);
- supported_rate_khz = link_info->num_lanes * rate * 8;
+ supported_rate_khz = dp->link->link_params.lane_count * rate * 8;
tmds_max_clock = dp_panel->connector->display_info.max_tmds_clock;
if (mode_rate_khz > supported_rate_khz) {
@@ -2539,6 +2549,11 @@ static int dp_display_config_hdr(struct dp_display *dp_display, void *panel,
return -EINVAL;
}
+ if (!dp_display_state_is(DP_STATE_ENABLED)) {
+ dp_display_state_show("[not enabled]");
+ return 0;
+ }
+
/*
* In rare cases where HDR metadata is updated independently
* flush the HDR metadata immediately instead of relying on
@@ -2560,12 +2575,20 @@ static int dp_display_setup_colospace(struct dp_display *dp_display,
u32 colorspace)
{
struct dp_panel *dp_panel;
+ struct dp_display_private *dp;
if (!dp_display || !panel) {
pr_err("invalid input\n");
return -EINVAL;
}
+ dp = container_of(dp_display, struct dp_display_private, dp_display);
+
+ if (!dp_display_state_is(DP_STATE_ENABLED)) {
+ dp_display_state_show("[not enabled]");
+ return 0;
+ }
+
dp_panel = panel;
return dp_panel->set_colorspace(dp_panel, colorspace);
@@ -2898,6 +2921,11 @@ static int dp_display_update_pps(struct dp_display *dp_display,
return -EINVAL;
}
+ if (!dp_display_state_is(DP_STATE_ENABLED)) {
+ dp_display_state_show("[not enabled]");
+ return 0;
+ }
+
dp_panel = sde_conn->drv_panel;
dp_panel->update_pps(dp_panel, pps_cmd);
return 0;