diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index a53f777bff..e67639a529 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -6970,58 +6970,15 @@ void dsi_display_put_mode(struct dsi_display *display, dsi_panel_put_mode(mode); } -int dsi_display_get_modes(struct dsi_display *display, - struct dsi_display_mode **out_modes) +int dsi_display_get_modes_helper(struct dsi_display *display, + struct dsi_display_ctrl *ctrl, u32 timing_mode_count, + struct dsi_dfps_capabilities dfps_caps, struct dsi_qsync_capabilities *qsync_caps, + struct dsi_dyn_clk_caps *dyn_clk_caps) { - struct dsi_dfps_capabilities dfps_caps; - struct dsi_display_ctrl *ctrl; - struct dsi_host_common_cfg *host = &display->panel->host_config; + int dsc_modes = 0, nondsc_modes = 0, rc = 0, i, start, end; + u32 num_dfps_rates, mode_idx, sublinks_count, array_idx = 0; bool is_split_link, support_cmd_mode, support_video_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; - int dsc_modes = 0, nondsc_modes = 0; - struct dsi_qsync_capabilities *qsync_caps; - - if (!display || !out_modes) { - DSI_ERR("Invalid params\n"); - return -EINVAL; - } - - *out_modes = NULL; - ctrl = &display->ctrl[0]; - - mutex_lock(&display->display_lock); - - if (display->modes) - goto exit; - - display_mode_count = display->panel->num_display_modes; - - display->modes = kcalloc(display_mode_count, sizeof(*display->modes), - GFP_KERNEL); - if (!display->modes) { - rc = -ENOMEM; - goto error; - } - - 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); - goto error; - } - - qsync_caps = &(display->panel->qsync_caps); - dyn_clk_caps = &(display->panel->dyn_clk_caps); - - timing_mode_count = display->panel->num_timing_nodes; - - /* Validate command line timing */ - if ((display->cmdline_timing != NO_OVERRIDE) && - (display->cmdline_timing >= timing_mode_count)) - display->cmdline_timing = NO_OVERRIDE; + struct dsi_host_common_cfg *host = &display->panel->host_config; for (mode_idx = 0; mode_idx < timing_mode_count; mode_idx++) { struct dsi_display_mode display_mode; @@ -7038,7 +6995,8 @@ int dsi_display_get_modes(struct dsi_display *display, if (rc) { DSI_ERR("[%s] failed to get mode idx %d from panel\n", display->name, mode_idx); - goto error; + rc = -EINVAL; + return rc; } if (display->cmdline_timing == display_mode.mode_idx) { @@ -7104,7 +7062,7 @@ int dsi_display_get_modes(struct dsi_display *display, if (!sub_mode) { DSI_ERR("invalid mode data\n"); rc = -EFAULT; - goto error; + return rc; } memcpy(sub_mode, &display_mode, sizeof(display_mode)); @@ -7130,14 +7088,14 @@ int dsi_display_get_modes(struct dsi_display *display, sizeof(*sub_mode->priv_info), GFP_KERNEL); if (!sub_mode->priv_info) { rc = -ENOMEM; - goto error; + return rc; } rc = dsi_display_mode_dyn_clk_cpy(display, &display_mode, sub_mode); if (rc) { DSI_ERR("unable to copy dyn clock list\n"); - goto error; + return rc; } sub_mode->mode_idx += (array_idx - 1); @@ -7178,6 +7136,63 @@ int dsi_display_get_modes(struct dsi_display *display, if (dsc_modes && nondsc_modes) display->panel->dsc_switch_supported = true; + return rc; +} + +int dsi_display_get_modes(struct dsi_display *display, + struct dsi_display_mode **out_modes) +{ + struct dsi_dfps_capabilities dfps_caps; + struct dsi_display_ctrl *ctrl; + u32 timing_mode_count, display_mode_count; + struct dsi_dyn_clk_caps *dyn_clk_caps; + int rc = -EINVAL; + struct dsi_qsync_capabilities *qsync_caps; + + if (!display || !out_modes) { + DSI_ERR("Invalid params\n"); + return -EINVAL; + } + + *out_modes = NULL; + ctrl = &display->ctrl[0]; + + mutex_lock(&display->display_lock); + + if (display->modes) + goto exit; + + display_mode_count = display->panel->num_display_modes; + + display->modes = kcalloc(display_mode_count, sizeof(*display->modes), + GFP_KERNEL); + if (!display->modes) { + rc = -ENOMEM; + goto error; + } + + 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); + goto error; + } + + qsync_caps = &(display->panel->qsync_caps); + dyn_clk_caps = &(display->panel->dyn_clk_caps); + + timing_mode_count = display->panel->num_timing_nodes; + + /* Validate command line timing */ + if ((display->cmdline_timing != NO_OVERRIDE) && + (display->cmdline_timing >= timing_mode_count)) + display->cmdline_timing = NO_OVERRIDE; + + rc = dsi_display_get_modes_helper(display, ctrl, timing_mode_count, + dfps_caps, qsync_caps, dyn_clk_caps); + if (rc) + goto error; + exit: *out_modes = display->modes; rc = 0;