Merge tag 'of_videomode_helper' of git://git.pengutronix.de/git/str/linux into drm-next
videomode helpers for of + devicetree stuff, required for new kms drivers (not the fbdev maintainer). * tag 'of_videomode_helper' of git://git.pengutronix.de/git/str/linux: drm_modes: add of_videomode helpers drm_modes: add videomode helpers fbmon: add of_videomode helpers fbmon: add videomode helpers video: add of helper for display timings/videomode video: add display_timing and videomode viafb: rename display_timing to via_display_timing
This commit is contained in:
@@ -35,6 +35,8 @@
|
||||
#include <linux/export.h>
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc.h>
|
||||
#include <video/of_videomode.h>
|
||||
#include <video/videomode.h>
|
||||
|
||||
/**
|
||||
* drm_mode_debug_printmodeline - debug print a mode
|
||||
@@ -504,6 +506,74 @@ 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
|
||||
|
||||
#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, int index)
|
||||
{
|
||||
struct videomode vm;
|
||||
int ret;
|
||||
|
||||
ret = of_get_videomode(np, &vm, index);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
drm_display_mode_from_videomode(&vm, dmode);
|
||||
|
||||
pr_debug("%s: got %dx%d display mode from %s\n",
|
||||
of_node_full_name(np), vm.hactive, vm.vactive, np->name);
|
||||
drm_mode_debug_printmodeline(dmode);
|
||||
|
||||
return 0;
|
||||
}
|
||||
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
|
||||
|
Reference in New Issue
Block a user