Merge "disp: msm: dsi: select timing mode shared from kernel command line"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
be79c7242f
@@ -624,6 +624,7 @@ struct dsi_display_mode_priv_info {
|
|||||||
* @pixel_clk_khz: Pixel clock in Khz.
|
* @pixel_clk_khz: Pixel clock in Khz.
|
||||||
* @dsi_mode_flags: Flags to signal other drm components via private flags
|
* @dsi_mode_flags: Flags to signal other drm components via private flags
|
||||||
* @panel_mode: Panel mode
|
* @panel_mode: Panel mode
|
||||||
|
* @is_preferred: Is mode preferred
|
||||||
* @priv_info: Mode private info
|
* @priv_info: Mode private info
|
||||||
*/
|
*/
|
||||||
struct dsi_display_mode {
|
struct dsi_display_mode {
|
||||||
@@ -631,6 +632,7 @@ struct dsi_display_mode {
|
|||||||
u32 pixel_clk_khz;
|
u32 pixel_clk_khz;
|
||||||
u32 dsi_mode_flags;
|
u32 dsi_mode_flags;
|
||||||
enum dsi_op_mode panel_mode;
|
enum dsi_op_mode panel_mode;
|
||||||
|
bool is_preferred;
|
||||||
struct dsi_display_mode_priv_info *priv_info;
|
struct dsi_display_mode_priv_info *priv_info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#define to_dsi_display(x) container_of(x, struct dsi_display, host)
|
#define to_dsi_display(x) container_of(x, struct dsi_display, host)
|
||||||
#define INT_BASE_10 10
|
#define INT_BASE_10 10
|
||||||
#define NO_OVERRIDE -1
|
|
||||||
|
|
||||||
#define MISR_BUFF_SIZE 256
|
#define MISR_BUFF_SIZE 256
|
||||||
#define ESD_MODE_STRING_MAX_LEN 256
|
#define ESD_MODE_STRING_MAX_LEN 256
|
||||||
@@ -2196,26 +2195,23 @@ static void dsi_display_parse_cmdline_topology(struct dsi_display *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
str = strnstr(boot_str, ":config", strlen(boot_str));
|
str = strnstr(boot_str, ":config", strlen(boot_str));
|
||||||
if (!str)
|
if (str) {
|
||||||
goto end;
|
if (sscanf(str, ":config%lu", &cmdline_topology) != 1) {
|
||||||
|
DSI_ERR("invalid config index override: %s\n",
|
||||||
if (kstrtol(str + strlen(":config"), INT_BASE_10,
|
boot_str);
|
||||||
(unsigned long *)&cmdline_topology)) {
|
|
||||||
DSI_ERR("invalid config index override: %s\n", boot_str);
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
str = strnstr(boot_str, ":timing", strlen(boot_str));
|
str = strnstr(boot_str, ":timing", strlen(boot_str));
|
||||||
if (!str)
|
if (str) {
|
||||||
goto end;
|
if (sscanf(str, ":timing%lu", &cmdline_timing) != 1) {
|
||||||
|
DSI_ERR("invalid timing index override: %s\n",
|
||||||
if (kstrtol(str + strlen(":timing"), INT_BASE_10,
|
|
||||||
(unsigned long *)&cmdline_timing)) {
|
|
||||||
DSI_ERR("invalid timing index override: %s. resetting both timing and config\n",
|
|
||||||
boot_str);
|
boot_str);
|
||||||
cmdline_topology = NO_OVERRIDE;
|
cmdline_topology = NO_OVERRIDE;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
DSI_DEBUG("successfully parsed command line topology and timing\n");
|
DSI_DEBUG("successfully parsed command line topology and timing\n");
|
||||||
end:
|
end:
|
||||||
display->cmdline_topology = cmdline_topology;
|
display->cmdline_topology = cmdline_topology;
|
||||||
@@ -6241,13 +6237,21 @@ int dsi_display_get_modes(struct dsi_display *display,
|
|||||||
|
|
||||||
timing_mode_count = display->panel->num_timing_nodes;
|
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;
|
||||||
|
|
||||||
for (mode_idx = 0; mode_idx < timing_mode_count; mode_idx++) {
|
for (mode_idx = 0; mode_idx < timing_mode_count; mode_idx++) {
|
||||||
struct dsi_display_mode display_mode;
|
struct dsi_display_mode display_mode;
|
||||||
int topology_override = NO_OVERRIDE;
|
int topology_override = NO_OVERRIDE;
|
||||||
|
bool is_preferred = false;
|
||||||
u32 frame_threshold_us = ctrl->ctrl->frame_threshold_time_us;
|
u32 frame_threshold_us = ctrl->ctrl->frame_threshold_time_us;
|
||||||
|
|
||||||
if (display->cmdline_timing == mode_idx)
|
if (display->cmdline_timing == mode_idx) {
|
||||||
topology_override = display->cmdline_topology;
|
topology_override = display->cmdline_topology;
|
||||||
|
is_preferred = true;
|
||||||
|
}
|
||||||
|
|
||||||
memset(&display_mode, 0, sizeof(display_mode));
|
memset(&display_mode, 0, sizeof(display_mode));
|
||||||
|
|
||||||
@@ -6340,6 +6344,10 @@ int dsi_display_get_modes(struct dsi_display *display,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
_dsi_display_populate_bit_clks(display, start, end, &array_idx);
|
_dsi_display_populate_bit_clks(display, start, end, &array_idx);
|
||||||
|
if (is_preferred) {
|
||||||
|
/* Set first timing sub mode as preferred mode */
|
||||||
|
display->modes[start].is_preferred = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
|
@@ -882,9 +882,15 @@ int dsi_connector_get_modes(struct drm_connector *connector, void *data,
|
|||||||
}
|
}
|
||||||
m->width_mm = connector->display_info.width_mm;
|
m->width_mm = connector->display_info.width_mm;
|
||||||
m->height_mm = connector->display_info.height_mm;
|
m->height_mm = connector->display_info.height_mm;
|
||||||
/* set the first mode in list as preferred */
|
|
||||||
if (i == 0)
|
if (display->cmdline_timing != NO_OVERRIDE) {
|
||||||
|
/* get the preferred mode from dsi display mode */
|
||||||
|
if (modes[i].is_preferred)
|
||||||
m->type |= DRM_MODE_TYPE_PREFERRED;
|
m->type |= DRM_MODE_TYPE_PREFERRED;
|
||||||
|
} else if (i == 0) {
|
||||||
|
/* set the first mode in list as preferred */
|
||||||
|
m->type |= DRM_MODE_TYPE_PREFERRED;
|
||||||
|
}
|
||||||
drm_mode_probed_add(connector, m);
|
drm_mode_probed_add(connector, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _DSI_DRM_H_
|
#ifndef _DSI_DRM_H_
|
||||||
@@ -14,6 +14,8 @@
|
|||||||
|
|
||||||
#include "dsi_display.h"
|
#include "dsi_display.h"
|
||||||
|
|
||||||
|
#define NO_OVERRIDE -1
|
||||||
|
|
||||||
struct dsi_bridge {
|
struct dsi_bridge {
|
||||||
struct drm_bridge base;
|
struct drm_bridge base;
|
||||||
u32 id;
|
u32 id;
|
||||||
|
Reference in New Issue
Block a user