MLK-18556: hdp: Add default video modes
authorSandor Yu <Sandor.yu@nxp.com>
Mon, 11 Jun 2018 06:32:00 +0000 (14:32 +0800)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
Add default video modes if EDID read failed.

Signed-off-by: Sandor Yu <Sandor.yu@nxp.com>
drivers/gpu/drm/imx/hdp/imx-hdp.c

index 83bfb8a..e0c6605 100644 (file)
@@ -576,14 +576,27 @@ imx_hdp_connector_detect(struct drm_connector *connector, bool force)
        }
 }
 
-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);
@@ -592,20 +605,19 @@ static int imx_hdp_connector_get_modes(struct drm_connector *connector)
                                        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;