|
@@ -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)
|
|
|
{
|