diff options
Diffstat (limited to 'msm/dp/dp_display.c')
-rw-r--r-- | msm/dp/dp_display.c | 46 |
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; |