video/drm: rockchip_display: support get display mode from edid if client is not present

Change-Id: Ib8956972b7bbb6aaaac2e3c8a93e0d38d98abf6a
Signed-off-by: Wyon Bi <bivvy.bi@rock-chips.com>
This commit is contained in:
Wyon Bi 2019-03-04 14:48:16 +08:00 committed by Jianhong Chen
parent bdeba27611
commit 005d29a79d
1 changed files with 13 additions and 19 deletions

View File

@ -465,8 +465,6 @@ bool drm_mode_is_420(const struct drm_display_info *display,
static int display_get_timing(struct display_state *state)
{
struct connector_state *conn_state = &state->conn_state;
const struct rockchip_connector *conn = conn_state->connector;
const struct rockchip_connector_funcs *conn_funcs = conn->funcs;
struct drm_display_mode *mode = &conn_state->mode;
const struct drm_display_mode *m;
struct panel_state *panel_state = &state->panel_state;
@ -485,18 +483,6 @@ static int display_get_timing(struct display_state *state)
goto done;
}
if (conn_funcs->get_edid && !conn_funcs->get_edid(state)) {
int panel_bits_per_colourp;
if (!edid_get_drm_mode((void *)&conn_state->edid,
sizeof(conn_state->edid), mode,
&panel_bits_per_colourp)) {
printf("Using display timing from edid\n");
edid_print_info((void *)&conn_state->edid);
goto done;
}
}
printf("failed to find display timing\n");
return -ENODEV;
done:
@ -524,6 +510,7 @@ static int display_init(struct display_state *state)
struct rockchip_crtc *crtc = crtc_state->crtc;
const struct rockchip_crtc_funcs *crtc_funcs = crtc->funcs;
struct drm_display_mode *mode = &conn_state->mode;
int bpc;
int ret = 0;
static bool __print_once = false;
@ -576,13 +563,9 @@ static int display_init(struct display_state *state)
goto deinit;
}
if (conn_funcs->get_timing) {
ret = conn_funcs->get_timing(state);
} else if (panel_state->panel) {
if (panel_state->panel) {
ret = display_get_timing(state);
} else if (conn_state->bridge) {
int bpc;
ret = video_bridge_read_edid(conn_state->bridge->dev,
conn_state->edid, EDID_SIZE);
if (ret > 0) {
@ -591,6 +574,17 @@ static int display_init(struct display_state *state)
if (!ret)
edid_print_info((void *)&conn_state->edid);
}
} else if (conn_funcs->get_timing) {
ret = conn_funcs->get_timing(state);
} else if (conn_funcs->get_edid) {
ret = conn_funcs->get_edid(state);
if (!ret) {
ret = edid_get_drm_mode((void *)&conn_state->edid,
sizeof(conn_state->edid), mode,
&bpc);
if (!ret)
edid_print_info((void *)&conn_state->edid);
}
}
if (ret)