|
@@ -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
|