}
}
-static int imx_hdp_connector_get_modes(struct drm_connector *connector)
+static int imx_hdp_default_video_modes(struct drm_connector *connector)
{
struct drm_display_mode *mode;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(edid_cea_modes); i++) {
+ mode = drm_mode_create(connector->dev);
+ if (!mode)
+ return -EINVAL;
+ drm_mode_copy(mode, &edid_cea_modes[i]);
+ mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+ drm_mode_probed_add(connector, mode);
+ }
+ return i;
+}
+
+static int imx_hdp_connector_get_modes(struct drm_connector *connector)
+{
struct imx_hdp *hdp = container_of(connector, struct imx_hdp, connector);
struct edid *edid;
int num_modes = 0;
- int ret;
- int i;
if (hdp->is_edid == true) {
edid = drm_do_get_edid(connector, hdp->ops->get_edid_block, &hdp->state);
edid->header[0], edid->header[1], edid->header[2], edid->header[3],
edid->header[4], edid->header[5], edid->header[6], edid->header[7]);
drm_connector_update_edid_property(connector, edid);
- ret = drm_add_edid_modes(connector, edid);
+ num_modes = drm_add_edid_modes(connector, edid);
+ if (num_modes == 0) {
+ dev_dbg(hdp->dev, "Invalid edid, use default video modes\n");
+ num_modes = imx_hdp_default_video_modes(connector);
+ }
kfree(edid);
+ } else {
+ dev_dbg(hdp->dev, "failed to get edid, use default video modes\n");
+ num_modes = imx_hdp_default_video_modes(connector);
}
} else {
- dev_dbg(hdp->dev, "failed to get edid\n");
- for (i = 0; i < ARRAY_SIZE(edid_cea_modes); i++) {
- mode = drm_mode_create(connector->dev);
- if (!mode)
- return -EINVAL;
- drm_mode_copy(mode, &edid_cea_modes[i]);
- mode->type |= DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
- drm_mode_probed_add(connector, mode);
- }
- num_modes = i;
+ dev_dbg(hdp->dev, "No EDID function, use default video mode\n");
+ num_modes = imx_hdp_default_video_modes(connector);
}
return num_modes;