diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c index 84007b351444..6b8f334d5de9 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -2527,7 +2527,9 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) struct hdr_static_metadata *metedata = &connector->hdr_sink_metadata.hdmi_type1; struct edid *edid; - int ret = 0; + struct drm_display_mode *mode; + const u8 def_modes[6] = {4, 16, 31, 19, 17, 2}; + int i, ret = 0; if (!hdmi->ddc) return 0; @@ -2545,7 +2547,20 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) drm_mode_connector_update_hdr_property(connector, metedata); kfree(edid); } else { - dev_dbg(hdmi->dev, "failed to get edid\n"); + hdmi->sink_is_hdmi = true; + hdmi->sink_has_audio = true; + for (i = 0; i < sizeof(def_modes); i++) { + mode = drm_display_mode_from_vic_index(connector, + def_modes, + 31, i); + if (mode) { + if (!i) + mode->type = DRM_MODE_TYPE_PREFERRED; + drm_mode_probed_add(connector, mode); + ret++; + } + } + dev_info(hdmi->dev, "failed to get edid\n"); } return ret; diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 8eca40cb7363..51691345438c 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -3258,7 +3258,7 @@ static u8 svd_to_vic(u8 svd) return svd; } -static struct drm_display_mode * +struct drm_display_mode * drm_display_mode_from_vic_index(struct drm_connector *connector, const u8 *video_db, u8 video_len, u8 video_index) @@ -3283,6 +3283,7 @@ drm_display_mode_from_vic_index(struct drm_connector *connector, return newmode; } +EXPORT_SYMBOL(drm_display_mode_from_vic_index); /* * do_y420vdb_modes - Parse YCBCR 420 only modes diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index e47335a3a6b5..814407e1e432 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h @@ -495,4 +495,8 @@ void drm_edid_get_monitor_name(struct edid *edid, char *name, struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, int hsize, int vsize, int fresh, bool rb); +struct drm_display_mode * +drm_display_mode_from_vic_index(struct drm_connector *connector, + const u8 *video_db, u8 video_len, + u8 video_index); #endif /* __DRM_EDID_H__ */