--- v16
+++ v9
@@ -1,96 +1,88 @@
-Add conversion from videomode to drm_display_mode
+Add helper to get drm_display_mode from devicetree.
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>
---
- drivers/gpu/drm/drm_modes.c | 37 +++++++++++++++++++++++++++++++++++++
- include/drm/drmP.h | 5 +++++
- 2 files changed, 42 insertions(+)
+ drivers/gpu/drm/drm_modes.c | 35 ++++++++++++++++++++++++++++++++++-
+ include/drm/drmP.h | 6 ++++++
+ 2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
-index 59450f3..184a22d 100644
+index 42ea099..c3ae5d2 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
-@@ -35,6 +35,7 @@
+@@ -35,7 +35,8 @@
#include <linux/export.h>
#include <drm/drmP.h>
#include <drm/drm_crtc.h>
-+#include <video/videomode.h>
+-#include <linux/videomode.h>
++#include <linux/of.h>
++#include <linux/of_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);
+@@ -540,6 +541,38 @@ int display_mode_from_videomode(struct videomode *vm, struct drm_display_mode *d
+ EXPORT_SYMBOL_GPL(display_mode_from_videomode);
+ #endif
-+#if IS_ENABLED(CONFIG_VIDEOMODE)
-+int drm_display_mode_from_videomode(const struct videomode *vm,
-+ struct drm_display_mode *dmode)
++#if IS_ENABLED(CONFIG_OF_VIDEOMODE)
++/**
++ * of_get_drm_display_mode - get a drm_display_mode from devicetree
++ * @np: device_node with the timing specification
++ * @dmode: will be set to the return value
++ * @index: index into the list of display timings in devicetree
++ *
++ * 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_timings and
++ * work with that instead.
++ */
++int of_get_drm_display_mode(struct device_node *np, struct drm_display_mode *dmode,
++ unsigned int index)
+{
-+ 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;
++ 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;
++ display_mode_from_videomode(&vm, dmode);
+
-+ 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);
++ pr_info("%s: got %dx%d display mode from %s\n", __func__, vm.hactive,
++ vm.vactive, np->name);
++ drm_mode_debug_printmodeline(dmode);
+
+ return 0;
++
+}
-+EXPORT_SYMBOL_GPL(drm_display_mode_from_videomode);
++EXPORT_SYMBOL_GPL(of_get_drm_display_mode);
+#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 3fd8280..5fbb0fe 100644
+index 1e0d846..e8f46a1 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
-@@ -85,6 +85,8 @@ struct module;
- struct drm_file;
- struct drm_device;
+@@ -56,6 +56,7 @@
+ #include <linux/cdev.h>
+ #include <linux/mutex.h>
+ #include <linux/slab.h>
++#include <linux/of.h>
+ #include <linux/videomode.h>
+ #if defined(__alpha__) || defined(__powerpc__)
+ #include <asm/pgtable.h> /* For pte_wrprotect */
+@@ -1459,6 +1460,11 @@ drm_mode_create_from_cmdline_mode(struct drm_device *dev,
+ extern int display_mode_from_videomode(struct videomode *vm,
+ struct drm_display_mode *dmode);
+ #endif
++#if IS_ENABLED(CONFIG_OF_VIDEOMODE)
++extern int of_get_drm_display_mode(struct device_node *np,
++ struct drm_display_mode *dmode,
++ unsigned int index);
++#endif
-+struct videomode;
-+
- #include <drm/drm_os_linux.h>
- #include <drm/drm_hashtab.h>
- #include <drm/drm_mm.h>
-@@ -1454,6 +1456,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);
--
1.7.10.4