Inter-revision diff: patch 6

Comparing v16 (message) to v9 (message)

--- 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
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help