From 62e744244ff39bccadb1b97efb49b7782dfcd881 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Tue, 6 Jul 2021 15:08:43 +0800 Subject: [PATCH] drm/rockchip: drv: add rockchip default mode when enable force output Signed-off-by: Sandy Huang Change-Id: Iebc75e54f4bef12baac694fc54a45af33540c783 --- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 80ab47b65555..14b3d89a2be0 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -91,6 +91,7 @@ struct rockchip_drm_mode_set { unsigned int hue; bool mode_changed; + bool force_output; int ratio; }; @@ -562,6 +563,8 @@ of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route) else set->hue = 50; + set->force_output = of_property_read_bool(route, "force-output"); + if (!of_property_read_u32(route, "cubic_lut,offset", &val)) { private->cubic_lut[crtc->index].enable = true; private->cubic_lut[crtc->index].offset = val; @@ -580,7 +583,8 @@ of_parse_display_resource(struct drm_device *drm_dev, struct device_node *route) } static int rockchip_drm_fill_connector_modes(struct drm_connector *connector, - uint32_t maxX, uint32_t maxY) + uint32_t maxX, uint32_t maxY, + bool force_output) { struct drm_device *dev = connector->dev; struct drm_display_mode *mode; @@ -598,6 +602,8 @@ static int rockchip_drm_fill_connector_modes(struct drm_connector *connector, list_for_each_entry(mode, &connector->modes, head) mode->status = MODE_STALE; + if (force_output) + connector->force = DRM_FORCE_ON; if (connector->force) { if (connector->force == DRM_FORCE_ON || connector->force == DRM_FORCE_ON_DIGITAL) @@ -656,6 +662,8 @@ static int rockchip_drm_fill_connector_modes(struct drm_connector *connector, if (count == 0 && connector->status == connector_status_connected) count = drm_add_modes_noedid(connector, 1024, 768); + if (force_output) + count += rockchip_drm_add_modes_noedid(connector); if (count == 0) goto prune; @@ -744,7 +752,7 @@ static int setup_initial_state(struct drm_device *drm_dev, if (encoder_funcs->loader_protect) encoder_funcs->loader_protect(conn_state->best_encoder, true); conn_state->best_encoder->loader_protect = true; - num_modes = rockchip_drm_fill_connector_modes(connector, 4096, 4096); + num_modes = rockchip_drm_fill_connector_modes(connector, 4096, 4096, set->force_output); if (!num_modes) { dev_err(drm_dev->dev, "connector[%s] can't found any modes\n", connector->name); @@ -1086,6 +1094,8 @@ static void show_loader_logo(struct drm_device *drm_dev) */ list_for_each_entry_safe(set, tmp, &mode_set_list, head) { + if (set->force_output) + set->connector->force = DRM_FORCE_UNSPECIFIED; list_del(&set->head); kfree(set); }