--- v7
+++ v17
@@ -1,83 +1,98 @@
-Add helper to get fb_videomode from devicetree.
+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/video/fbmon.c | 40 ++++++++++++++++++++++++++++++++++++++++
- include/linux/fb.h | 3 +++
- 2 files changed, 43 insertions(+)
+ drivers/gpu/drm/drm_modes.c | 37 +++++++++++++++++++++++++++++++++++++
+ include/drm/drmP.h | 5 +++++
+ 2 files changed, 42 insertions(+)
-diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
-index b9e6ab3..871aa76 100644
---- a/drivers/video/fbmon.c
-+++ b/drivers/video/fbmon.c
-@@ -1408,6 +1408,46 @@ int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode)
- EXPORT_SYMBOL_GPL(videomode_to_fb_videomode);
- #endif
+diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
+index d8da30e..9f3f20b 100644
+--- a/drivers/gpu/drm/drm_modes.c
++++ b/drivers/gpu/drm/drm_modes.c
+@@ -35,6 +35,7 @@
+ #include <linux/export.h>
+ #include <drm/drmP.h>
+ #include <drm/drm_crtc.h>
++#include <video/videomode.h>
-+#if IS_ENABLED(CONFIG_OF_VIDEOMODE)
-+static void dump_fb_videomode(struct fb_videomode *m)
+ /**
+ * 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)
+{
-+ pr_debug("fb_videomode = %ux%u@%uHz (%ukHz) %u %u %u %u %u %u %u %u %u\n",
-+ m->xres, m->yres, m->refresh, m->pixclock, m->left_margin,
-+ m->right_margin, m->upper_margin, m->lower_margin,
-+ m->hsync_len, m->vsync_len, m->sync, m->vmode, m->flag);
-+}
++ 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;
+
-+/**
-+ * of_get_fb_videomode - get a fb_videomode from devicetree
-+ * @np: device_node with the timing specification
-+ * @fb: will be set to the return value
-+ * @index: index into the list of display timings in devicetree
-+ *
-+ * DESCRIPTION:
-+ * This function is expensive and should only be used, if only one mode is to be
-+ * read from DT. To get multiple modes start with of_get_display_timing_list ond
-+ * work with that instead.
-+ */
-+int of_get_fb_videomode(struct device_node *np, struct fb_videomode *fb,
-+ int index)
-+{
-+ struct videomode vm;
-+ int ret;
++ 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;
+
-+ ret = of_get_videomode(np, &vm, index);
-+ if (ret)
-+ return ret;
++ dmode->clock = vm->pixelclock / 1000;
+
-+ videomode_to_fb_videomode(&vm, fb);
-+
-+ pr_info("%s: got %dx%d display mode from %s\n", __func__, vm.hactive,
-+ vm.vactive, np->name);
-+ dump_fb_videomode(fb);
++ 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(of_get_fb_videomode);
++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
+diff --git a/include/drm/drmP.h b/include/drm/drmP.h
+index fad21c9..d5c06ff 100644
+--- a/include/drm/drmP.h
++++ b/include/drm/drmP.h
+@@ -85,6 +85,8 @@ struct module;
+ struct drm_file;
+ struct drm_device;
- #else
- int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
-diff --git a/include/linux/fb.h b/include/linux/fb.h
-index 46c665b..9892fd6 100644
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -14,6 +14,8 @@
- #include <linux/backlight.h>
- #include <linux/slab.h>
- #include <asm/io.h>
-+#include <linux/of.h>
-+#include <linux/of_videomode.h>
++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);
- struct vm_area_struct;
- struct fb_info;
-@@ -714,6 +716,7 @@ extern void fb_destroy_modedb(struct fb_videomode *modedb);
- extern int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb);
- extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter);
-
-+extern int of_get_fb_videomode(struct device_node *np, struct fb_videomode *fb, int index);
- extern int videomode_to_fb_videomode(struct videomode *vm, struct fb_videomode *fbmode);
-
- /* drivers/video/modedb.c */
++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);
--
1.7.10.4