drm_modes: add videomode helpers
authorSteffen Trumtrar <s.trumtrar@pengutronix.de>
Wed, 14 Nov 2012 10:22:52 +0000 (11:22 +0100)
committerSteffen Trumtrar <s.trumtrar@pengutronix.de>
Thu, 24 Jan 2013 08:04:09 +0000 (09:04 +0100)
Add conversion from videomode to drm_display_mode

Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de>
Acked-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Afzal Mohammed <Afzal@ti.com>
Tested-by: Rob Clark <robclark@gmail.com>
Tested-by: Leela Krishna Amudala <leelakrishna.a@gmail.com>
drivers/gpu/drm/drm_modes.c
include/drm/drmP.h

index d8da30e90db5ba63308ddc6e7418573dff351b01..9f3f20bde399374c6ecd848bdace3ee261f345b0 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/export.h>
 #include <drm/drmP.h>
 #include <drm/drm_crtc.h>
+#include <video/videomode.h>
 
 /**
  * drm_mode_debug_printmodeline - debug print a mode
@@ -504,6 +505,42 @@ drm_gtf_mode(struct drm_device *dev, int hdisplay, int vdisplay, int vrefresh,
 }
 EXPORT_SYMBOL(drm_gtf_mode);
 
+#if IS_ENABLED(CONFIG_VIDEOMODE)
+int drm_display_mode_from_videomode(const struct videomode *vm,
+                                   struct drm_display_mode *dmode)
+{
+       dmode->hdisplay = vm->hactive;
+       dmode->hsync_start = dmode->hdisplay + vm->hfront_porch;
+       dmode->hsync_end = dmode->hsync_start + vm->hsync_len;
+       dmode->htotal = dmode->hsync_end + vm->hback_porch;
+
+       dmode->vdisplay = vm->vactive;
+       dmode->vsync_start = dmode->vdisplay + vm->vfront_porch;
+       dmode->vsync_end = dmode->vsync_start + vm->vsync_len;
+       dmode->vtotal = dmode->vsync_end + vm->vback_porch;
+
+       dmode->clock = vm->pixelclock / 1000;
+
+       dmode->flags = 0;
+       if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH)
+               dmode->flags |= DRM_MODE_FLAG_PHSYNC;
+       else if (vm->dmt_flags & VESA_DMT_HSYNC_LOW)
+               dmode->flags |= DRM_MODE_FLAG_NHSYNC;
+       if (vm->dmt_flags & VESA_DMT_VSYNC_HIGH)
+               dmode->flags |= DRM_MODE_FLAG_PVSYNC;
+       else if (vm->dmt_flags & VESA_DMT_VSYNC_LOW)
+               dmode->flags |= DRM_MODE_FLAG_NVSYNC;
+       if (vm->data_flags & DISPLAY_FLAGS_INTERLACED)
+               dmode->flags |= DRM_MODE_FLAG_INTERLACE;
+       if (vm->data_flags & DISPLAY_FLAGS_DOUBLESCAN)
+               dmode->flags |= DRM_MODE_FLAG_DBLSCAN;
+       drm_mode_set_name(dmode);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(drm_display_mode_from_videomode);
+#endif
+
 /**
  * drm_mode_set_name - set the name on a mode
  * @mode: name will be set in this mode
index fad21c927a3884e7b7c230f8cea24263f2ed73a9..d5c06ffb7a310163187a4e8963ecd36abf7a0d54 100644 (file)
@@ -85,6 +85,8 @@ struct module;
 struct drm_file;
 struct drm_device;
 
+struct videomode;
+
 #include <drm/drm_os_linux.h>
 #include <drm/drm_hashtab.h>
 #include <drm/drm_mm.h>
@@ -1456,6 +1458,9 @@ extern struct drm_display_mode *
 drm_mode_create_from_cmdline_mode(struct drm_device *dev,
                                  struct drm_cmdline_mode *cmd);
 
+extern int drm_display_mode_from_videomode(const struct videomode *vm,
+                                          struct drm_display_mode *dmode);
+
 /* Modesetting support */
 extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
 extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc);