disp: msm: sde: refactor dsi_display_get_modes function

Refactor the function 'dsi_display_get_modes' to
reduce its complexity.

Change-Id: I1a8ecaa780e5070bac7fa40404677c0a8a5d7cd8
Signed-off-by: Shamika Joshi <quic_shamjosh@quicinc.com>
This commit is contained in:
Shamika Joshi
2022-03-07 17:19:21 -08:00
parent cc993be15a
commit 896e10ee2d

View File

@@ -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;