]> git.karo-electronics.de Git - linux-beck.git/commitdiff
fbmon: add videomode helpers
authorSteffen Trumtrar <s.trumtrar@pengutronix.de>
Wed, 14 Nov 2012 09:55:04 +0000 (10:55 +0100)
committerSteffen Trumtrar <s.trumtrar@pengutronix.de>
Thu, 24 Jan 2013 08:03:59 +0000 (09:03 +0100)
Add a function to convert from the generic videomode to a fb_videomode.

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
include/linux/fb.h

index cef65574db6c09bd906d3ab2eac8c235f208dedf..17ce135a18fda8329391f730ac247752e960bd33 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/pci.h>
 #include <linux/slab.h>
 #include <video/edid.h>
+#include <video/videomode.h>
 #ifdef CONFIG_PPC_OF
 #include <asm/prom.h>
 #include <asm/pci-bridge.h>
@@ -1373,6 +1374,57 @@ int fb_get_mode(int flags, u32 val, struct fb_var_screeninfo *var, struct fb_inf
        kfree(timings);
        return err;
 }
+
+#if IS_ENABLED(CONFIG_VIDEOMODE)
+int fb_videomode_from_videomode(const struct videomode *vm,
+                               struct fb_videomode *fbmode)
+{
+       unsigned int htotal, vtotal;
+
+       fbmode->xres = vm->hactive;
+       fbmode->left_margin = vm->hback_porch;
+       fbmode->right_margin = vm->hfront_porch;
+       fbmode->hsync_len = vm->hsync_len;
+
+       fbmode->yres = vm->vactive;
+       fbmode->upper_margin = vm->vback_porch;
+       fbmode->lower_margin = vm->vfront_porch;
+       fbmode->vsync_len = vm->vsync_len;
+
+       /* prevent division by zero in KHZ2PICOS macro */
+       fbmode->pixclock = vm->pixelclock ?
+                       KHZ2PICOS(vm->pixelclock / 1000) : 0;
+
+       fbmode->sync = 0;
+       fbmode->vmode = 0;
+       if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH)
+               fbmode->sync |= FB_SYNC_HOR_HIGH_ACT;
+       if (vm->dmt_flags & VESA_DMT_HSYNC_HIGH)
+               fbmode->sync |= FB_SYNC_VERT_HIGH_ACT;
+       if (vm->data_flags & DISPLAY_FLAGS_INTERLACED)
+               fbmode->vmode |= FB_VMODE_INTERLACED;
+       if (vm->data_flags & DISPLAY_FLAGS_DOUBLESCAN)
+               fbmode->vmode |= FB_VMODE_DOUBLE;
+       fbmode->flag = 0;
+
+       htotal = vm->hactive + vm->hfront_porch + vm->hback_porch +
+                vm->hsync_len;
+       vtotal = vm->vactive + vm->vfront_porch + vm->vback_porch +
+                vm->vsync_len;
+       /* prevent division by zero */
+       if (htotal && vtotal) {
+               fbmode->refresh = vm->pixelclock / (htotal * vtotal);
+       /* a mode must have htotal and vtotal != 0 or it is invalid */
+       } else {
+               fbmode->refresh = 0;
+               return -EINVAL;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(fb_videomode_from_videomode);
+#endif
+
 #else
 int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var)
 {
index c7a95714b1fe68e7f9b67e990a384cac0f490044..100a1765b787d77285e2b1772915be0afe2d3674 100644 (file)
@@ -19,6 +19,7 @@ struct vm_area_struct;
 struct fb_info;
 struct device;
 struct file;
+struct videomode;
 
 /* Definitions below are used in the parsed monitor specs */
 #define FB_DPMS_ACTIVE_OFF     1
@@ -714,6 +715,9 @@ 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 fb_videomode_from_videomode(const struct videomode *vm,
+                                      struct fb_videomode *fbmode);
+
 /* drivers/video/modedb.c */
 #define VESA_MODEDB_SIZE 34
 extern void fb_var_to_videomode(struct fb_videomode *mode,