drm/i915: duplicate desired mode for use by fbcon.
authorDave Airlie <airlied@linux.ie>
Wed, 22 Apr 2009 08:52:14 +0000 (18:52 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 12 Jun 2009 05:00:01 +0000 (15:00 +1000)
duplicate the mode into fbcon storage, so when we free modes later
we don't just lose this.

Signed-off-by: Dave Airlie <airlied@redhat.com>

drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_fb.c

index b32a51f..028f5b6 100644 (file)
@@ -2310,6 +2310,8 @@ static void intel_crtc_destroy(struct drm_crtc *crtc)
 {
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
+       if (intel_crtc->mode_set.mode)
+               drm_mode_destroy(crtc->dev, intel_crtc->mode_set.mode);
        drm_crtc_cleanup(crtc);
        kfree(intel_crtc);
 }
index cbd2ba8..0ecf6b7 100644 (file)
@@ -674,8 +674,12 @@ static int intelfb_multi_fb_probe_crtc(struct drm_device *dev, struct drm_crtc *
        par->crtc_ids[0] = crtc->base.id;
 
        modeset->num_connectors = conn_count;
-       if (modeset->mode != modeset->crtc->desired_mode)
-               modeset->mode = modeset->crtc->desired_mode;
+       if (modeset->crtc->desired_mode) {
+               if (modeset->mode)
+                       drm_mode_destroy(dev, modeset->mode);
+               modeset->mode = drm_mode_duplicate(dev,
+                                                  modeset->crtc->desired_mode);
+       }
 
        par->crtc_count = 1;
 
@@ -824,8 +828,12 @@ static int intelfb_single_fb_probe(struct drm_device *dev)
                par->crtc_ids[crtc_count++] = crtc->base.id;
 
                modeset->num_connectors = conn_count;
-               if (modeset->mode != modeset->crtc->desired_mode)
-                       modeset->mode = modeset->crtc->desired_mode;
+               if (modeset->crtc->desired_mode) {
+                       if (modeset->mode)
+                               drm_mode_destroy(dev, modeset->mode);
+                       modeset->mode = drm_mode_duplicate(dev,
+                                                          modeset->crtc->desired_mode);
+               }
        }
        par->crtc_count = crtc_count;