aboutsummaryrefslogtreecommitdiff
path: root/linux-core/intel_fb.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2007-11-26 14:05:49 +1100
committerDave Airlie <airlied@redhat.com>2007-11-26 14:05:49 +1100
commit53b4e0cb789151164a0a43b55058319667847aaf (patch)
treeb2e3e1cdce58d1897085e26f09e16058bcedaa66 /linux-core/intel_fb.c
parenta20587e3950f849deb1e723a0b4455a19f7b3fb8 (diff)
drm: make fb modes use usermode add/remove interface
this stops usermode from getting a mode in the crtc it can't make sense off.
Diffstat (limited to 'linux-core/intel_fb.c')
-rw-r--r--linux-core/intel_fb.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c
index 564a913e..3a4ffc7f 100644
--- a/linux-core/intel_fb.c
+++ b/linux-core/intel_fb.c
@@ -47,6 +47,7 @@
struct intelfb_par {
struct drm_device *dev;
struct drm_crtc *crtc;
+ struct drm_display_mode *fb_mode;
};
static int
@@ -107,7 +108,6 @@ static int intelfb_check_var(struct fb_var_screeninfo *var,
struct intelfb_par *par = info->par;
struct drm_device *dev = par->dev;
struct drm_framebuffer *fb = par->crtc->fb;
- struct drm_display_mode *drm_mode;
struct drm_output *output;
int depth, found = 0;
@@ -275,6 +275,7 @@ static int intelfb_set_par(struct fb_info *info)
return -EINVAL;
}
#else
+
drm_mode = drm_mode_create(dev);
drm_mode->hdisplay = var->xres;
drm_mode->hsync_start = drm_mode->hdisplay + var->right_margin;
@@ -290,18 +291,16 @@ static int intelfb_set_par(struct fb_info *info)
drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V);
#endif
+ drm_mode_addmode(dev, drm_mode);
+ if (par->fb_mode)
+ drm_mode_rmmode(dev, par->fb_mode);
+
+ par->fb_mode = drm_mode;
drm_mode_debug_printmodeline(dev, drm_mode);
if (!drm_crtc_set_mode(par->crtc, drm_mode, 0, 0))
return -EINVAL;
- /* Have to destroy our created mode if we're not searching the mode
- * list for it.
- */
-#if 1
- drm_mode_destroy(dev, drm_mode);
-#endif
-
return 0;
}