diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index e5948d324c..2a039c9b40 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -5748,55 +5748,17 @@ error: return rc; } -static int dsi_display_get_mode_count_no_lock(struct dsi_display *display, - u32 *count) -{ - struct dsi_dfps_capabilities dfps_caps; - struct dsi_dyn_clk_caps *dyn_clk_caps; - int num_dfps_rates, num_bit_clks, rc = 0; - - if (!display || !display->panel) { - DSI_ERR("invalid display:%d panel:%d\n", display != NULL, - display ? display->panel != NULL : 0); - return -EINVAL; - } - - *count = display->panel->num_timing_nodes; - - rc = dsi_panel_get_dfps_caps(display->panel, &dfps_caps); - if (rc) { - DSI_ERR("[%s] failed to get dfps caps from panel\n", - display->name); - return rc; - } - - num_dfps_rates = !dfps_caps.dfps_support ? 1 : dfps_caps.dfps_list_len; - - dyn_clk_caps = &(display->panel->dyn_clk_caps); - - num_bit_clks = !dyn_clk_caps->dyn_clk_support ? 1 : - dyn_clk_caps->bit_clk_list_len; - - /* Inflate num_of_modes by fps and bit clks in dfps */ - *count = display->panel->num_timing_nodes * - num_dfps_rates * num_bit_clks; - - return 0; -} - int dsi_display_get_mode_count(struct dsi_display *display, u32 *count) { - int rc; - if (!display || !display->panel) { DSI_ERR("invalid display:%d panel:%d\n", display != NULL, - display ? display->panel != NULL : 0); + display ? display->panel != NULL : 0); return -EINVAL; } mutex_lock(&display->display_lock); - rc = dsi_display_get_mode_count_no_lock(display, count); + *count = display->panel->num_display_modes; mutex_unlock(&display->display_lock); return 0; @@ -5829,7 +5791,7 @@ static void _dsi_display_populate_bit_clks(struct dsi_display *display, if (cfg->data_lanes & DSI_DATA_LANE_3) lanes++; - dsi_display_get_mode_count_no_lock(display, &total_modes); + total_modes = display->panel->num_display_modes; for (i = start; i < end; i++) { src = &display->modes[i]; @@ -5881,8 +5843,8 @@ int dsi_display_get_modes(struct dsi_display *display, struct dsi_dfps_capabilities dfps_caps; struct dsi_display_ctrl *ctrl; struct dsi_host_common_cfg *host = &display->panel->host_config; - bool is_split_link; - u32 num_dfps_rates, panel_mode_count, total_mode_count; + bool is_split_link, is_cmd_mode; + u32 num_dfps_rates, timing_mode_count, display_mode_count; u32 sublinks_count, mode_idx, array_idx = 0; struct dsi_dyn_clk_caps *dyn_clk_caps; int i, start, end, rc = -EINVAL; @@ -5900,11 +5862,9 @@ int dsi_display_get_modes(struct dsi_display *display, if (display->modes) goto exit; - rc = dsi_display_get_mode_count_no_lock(display, &total_mode_count); - if (rc) - goto error; + display_mode_count = display->panel->num_display_modes; - display->modes = kcalloc(total_mode_count, sizeof(*display->modes), + display->modes = kcalloc(display_mode_count, sizeof(*display->modes), GFP_KERNEL); if (!display->modes) { rc = -ENOMEM; @@ -5922,20 +5882,20 @@ int dsi_display_get_modes(struct dsi_display *display, num_dfps_rates = !dfps_caps.dfps_support ? 1 : dfps_caps.dfps_list_len; - panel_mode_count = display->panel->num_timing_nodes; + timing_mode_count = display->panel->num_timing_nodes; - for (mode_idx = 0; mode_idx < panel_mode_count; mode_idx++) { - struct dsi_display_mode panel_mode; + for (mode_idx = 0; mode_idx < timing_mode_count; mode_idx++) { + struct dsi_display_mode display_mode; int topology_override = NO_OVERRIDE; u32 frame_threshold_us = ctrl->ctrl->frame_threshold_time_us; if (display->cmdline_timing == mode_idx) topology_override = display->cmdline_topology; - memset(&panel_mode, 0, sizeof(panel_mode)); + memset(&display_mode, 0, sizeof(display_mode)); rc = dsi_panel_get_mode(display->panel, mode_idx, - &panel_mode, + &display_mode, topology_override); if (rc) { DSI_ERR("[%s] failed to get mode idx %d from panel\n", @@ -5943,38 +5903,43 @@ int dsi_display_get_modes(struct dsi_display *display, goto error; } + is_cmd_mode = (display_mode.panel_mode == DSI_OP_CMD_MODE); + /* Calculate dsi frame transfer time */ - if (display->panel->panel_mode == DSI_OP_CMD_MODE) { + if (is_cmd_mode) { dsi_panel_calc_dsi_transfer_time( &display->panel->host_config, - &panel_mode, frame_threshold_us); - panel_mode.priv_info->dsi_transfer_time_us = - panel_mode.timing.dsi_transfer_time_us; - panel_mode.priv_info->min_dsi_clk_hz = - panel_mode.timing.min_dsi_clk_hz; + &display_mode, frame_threshold_us); + display_mode.priv_info->dsi_transfer_time_us = + display_mode.timing.dsi_transfer_time_us; + display_mode.priv_info->min_dsi_clk_hz = + display_mode.timing.min_dsi_clk_hz; - panel_mode.priv_info->mdp_transfer_time_us = - panel_mode.priv_info->dsi_transfer_time_us; - panel_mode.timing.mdp_transfer_time_us = - panel_mode.timing.dsi_transfer_time_us; + display_mode.priv_info->mdp_transfer_time_us = + display_mode.priv_info->dsi_transfer_time_us; + display_mode.timing.mdp_transfer_time_us = + display_mode.timing.dsi_transfer_time_us; } is_split_link = host->split_link.split_link_enabled; sublinks_count = host->split_link.num_sublinks; if (is_split_link && sublinks_count > 1) { - panel_mode.timing.h_active *= sublinks_count; - panel_mode.timing.h_front_porch *= sublinks_count; - panel_mode.timing.h_sync_width *= sublinks_count; - panel_mode.timing.h_back_porch *= sublinks_count; - panel_mode.timing.h_skew *= sublinks_count; - panel_mode.pixel_clk_khz *= sublinks_count; + display_mode.timing.h_active *= sublinks_count; + display_mode.timing.h_front_porch *= sublinks_count; + display_mode.timing.h_sync_width *= sublinks_count; + display_mode.timing.h_back_porch *= sublinks_count; + display_mode.timing.h_skew *= sublinks_count; + display_mode.pixel_clk_khz *= sublinks_count; } else { - panel_mode.timing.h_active *= display->ctrl_count; - panel_mode.timing.h_front_porch *= display->ctrl_count; - panel_mode.timing.h_sync_width *= display->ctrl_count; - panel_mode.timing.h_back_porch *= display->ctrl_count; - panel_mode.timing.h_skew *= display->ctrl_count; - panel_mode.pixel_clk_khz *= display->ctrl_count; + display_mode.timing.h_active *= display->ctrl_count; + display_mode.timing.h_front_porch *= + display->ctrl_count; + display_mode.timing.h_sync_width *= + display->ctrl_count; + display_mode.timing.h_back_porch *= + display->ctrl_count; + display_mode.timing.h_skew *= display->ctrl_count; + display_mode.pixel_clk_khz *= display->ctrl_count; } start = array_idx; @@ -5989,10 +5954,10 @@ int dsi_display_get_modes(struct dsi_display *display, goto error; } - memcpy(sub_mode, &panel_mode, sizeof(panel_mode)); + memcpy(sub_mode, &display_mode, sizeof(display_mode)); array_idx++; - if (!dfps_caps.dfps_support) + if (!dfps_caps.dfps_support || is_cmd_mode) continue; curr_refresh_rate = sub_mode->timing.refresh_rate; @@ -6033,12 +5998,10 @@ int dsi_display_get_panel_vfp(void *dsi_display, if (!display) return -EINVAL; - rc = dsi_display_get_mode_count(display, &count); - if (rc) - return rc; - mutex_lock(&display->display_lock); + count = display->panel->num_display_modes; + if (display->panel && display->panel->cur_mode) refresh_rate = display->panel->cur_mode->timing.refresh_rate; @@ -6081,9 +6044,9 @@ int dsi_display_get_default_lms(void *dsi_display, u32 *num_lm) *num_lm = 0; - rc = dsi_display_get_mode_count(display, &count); - if (rc) - return rc; + mutex_lock(&display->display_lock); + count = display->panel->num_display_modes; + mutex_unlock(&display->display_lock); if (!display->modes) { struct dsi_display_mode *m; @@ -6116,9 +6079,9 @@ int dsi_display_find_mode(struct dsi_display *display, *out_mode = NULL; - rc = dsi_display_get_mode_count(display, &count); - if (rc) - return rc; + mutex_lock(&display->display_lock); + count = display->panel->num_display_modes; + mutex_unlock(&display->display_lock); if (!display->modes) { struct dsi_display_mode *m; diff --git a/msm/dsi/dsi_display.h b/msm/dsi/dsi_display.h index de26a7224f..6dadddeb18 100644 --- a/msm/dsi/dsi_display.h +++ b/msm/dsi/dsi_display.h @@ -359,7 +359,7 @@ int dsi_display_get_mode_count(struct dsi_display *display, u32 *count); * dsi_display_get_modes() - get modes supported by display * @display: Handle to display. * @modes; Output param, list of DSI modes. Number of modes matches - * count returned by dsi_display_get_mode_count + * count got from display->panel->num_display_modes; * * Return: error code. */ diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 9f74660840..8c3cf3df29 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -3445,8 +3445,11 @@ int dsi_panel_get_mode_count(struct dsi_panel *panel) { const u32 SINGLE_MODE_SUPPORT = 1; struct dsi_parser_utils *utils; - struct device_node *timings_np; + struct device_node *timings_np, *child_np; + int num_dfps_rates, num_bit_clks; + int num_video_modes = 0, num_cmd_modes = 0; int count, rc = 0; + void *utils_data = NULL; if (!panel) { DSI_ERR("invalid params\n"); @@ -3479,6 +3482,28 @@ int dsi_panel_get_mode_count(struct dsi_panel *panel) count = SINGLE_MODE_SUPPORT; panel->num_timing_nodes = count; + dsi_for_each_child_node(timings_np, child_np) { + utils_data = child_np; + if (utils->read_bool(utils->data, "qcom,mdss-dsi-video-mode")) + num_video_modes++; + else if (utils->read_bool(utils->data, + "qcom,mdss-dsi-cmd-mode")) + num_cmd_modes++; + else if (panel->panel_mode == DSI_OP_VIDEO_MODE) + num_video_modes++; + else if (panel->panel_mode == DSI_OP_CMD_MODE) + num_cmd_modes++; + } + + num_dfps_rates = !panel->dfps_caps.dfps_support ? 1 : + panel->dfps_caps.dfps_list_len; + + num_bit_clks = !panel->dyn_clk_caps.dyn_clk_support ? 1 : + panel->dyn_clk_caps.bit_clk_list_len; + + /* Inflate num_of_modes by fps and bit clks in dfps */ + panel->num_display_modes = (num_cmd_modes * num_bit_clks) + + (num_video_modes * num_bit_clks * num_dfps_rates); error: return rc; diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index c7303bd581..40052b896d 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -171,6 +171,7 @@ struct dsi_panel { struct dsi_display_mode *cur_mode; u32 num_timing_nodes; + u32 num_display_modes; struct dsi_regulator_info power_info; struct dsi_backlight_config bl_config;