]> Pileus Git - ~andy/linux/blobdiff - drivers/gpu/drm/drm_crtc_helper.c
Merge branch 'x86-reboot-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / drivers / gpu / drm / drm_crtc_helper.c
index 84a4a809793ff7bcf7fdf68e9d28555eb5e5b8ba..81118893264c26e3cd472827dee324e6570dad04 100644 (file)
@@ -37,6 +37,7 @@
 #include "drm_fourcc.h"
 #include "drm_crtc_helper.h"
 #include "drm_fb_helper.h"
+#include "drm_edid.h"
 
 static bool drm_kms_helper_poll = true;
 module_param_named(poll, drm_kms_helper_poll, bool, 0600);
@@ -44,12 +45,12 @@ module_param_named(poll, drm_kms_helper_poll, bool, 0600);
 static void drm_mode_validate_flag(struct drm_connector *connector,
                                   int flags)
 {
-       struct drm_display_mode *mode, *t;
+       struct drm_display_mode *mode;
 
        if (flags == (DRM_MODE_FLAG_DBLSCAN | DRM_MODE_FLAG_INTERLACE))
                return;
 
-       list_for_each_entry_safe(mode, t, &connector->modes, head) {
+       list_for_each_entry(mode, &connector->modes, head) {
                if ((mode->flags & DRM_MODE_FLAG_INTERLACE) &&
                                !(flags & DRM_MODE_FLAG_INTERLACE))
                        mode->status = MODE_NO_INTERLACE;
@@ -87,7 +88,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
                                            uint32_t maxX, uint32_t maxY)
 {
        struct drm_device *dev = connector->dev;
-       struct drm_display_mode *mode, *t;
+       struct drm_display_mode *mode;
        struct drm_connector_helper_funcs *connector_funcs =
                connector->helper_private;
        int count = 0;
@@ -96,7 +97,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", connector->base.id,
                        drm_get_connector_name(connector));
        /* set all modes to the unverified state */
-       list_for_each_entry_safe(mode, t, &connector->modes, head)
+       list_for_each_entry(mode, &connector->modes, head)
                mode->status = MODE_UNVERIFIED;
 
        if (connector->force) {
@@ -118,7 +119,12 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
                goto prune;
        }
 
-       count = (*connector_funcs->get_modes)(connector);
+#ifdef CONFIG_DRM_LOAD_EDID_FIRMWARE
+       count = drm_load_edid_firmware(connector);
+       if (count == 0)
+#endif
+               count = (*connector_funcs->get_modes)(connector);
+
        if (count == 0 && connector->status == connector_status_connected)
                count = drm_add_modes_noedid(connector, 1024, 768);
        if (count == 0)
@@ -136,7 +142,7 @@ int drm_helper_probe_single_connector_modes(struct drm_connector *connector,
                mode_flags |= DRM_MODE_FLAG_DBLSCAN;
        drm_mode_validate_flag(connector, mode_flags);
 
-       list_for_each_entry_safe(mode, t, &connector->modes, head) {
+       list_for_each_entry(mode, &connector->modes, head) {
                if (mode->status == MODE_OK)
                        mode->status = connector_funcs->mode_valid(connector,
                                                                   mode);
@@ -152,7 +158,7 @@ prune:
 
        DRM_DEBUG_KMS("[CONNECTOR:%d:%s] probed modes :\n", connector->base.id,
                        drm_get_connector_name(connector));
-       list_for_each_entry_safe(mode, t, &connector->modes, head) {
+       list_for_each_entry(mode, &connector->modes, head) {
                mode->vrefresh = drm_mode_vrefresh(mode);
 
                drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
@@ -352,6 +358,8 @@ bool drm_crtc_helper_set_mode(struct drm_crtc *crtc,
                return true;
 
        adjusted_mode = drm_mode_duplicate(dev, mode);
+       if (!adjusted_mode)
+               return false;
 
        saved_hwmode = crtc->hwmode;
        saved_mode = crtc->mode;