11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/drivers/video/modedb.c -- Standard video mode database management 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Geert Uytterhoeven 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2001 - Documented with DocBook 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * - Brad Douglas <brad@neruo.com> 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is subject to the terms and conditions of the GNU General Public 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * License. See the file COPYING in the main directory of this archive for 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * more details. 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h> 155a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fb.h> 172cb96f86628d6e97fcbda5fe4d8d74876239834cAndy Shevchenko#include <linux/kernel.h> 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef DEBUG 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define name_matches(v, s, l) \ 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((v).name && !strncmp((s), (v).name, (l)) && strlen((v).name) == (l)) 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define res_matches(v, x, y) \ 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ((v).xres == (x) && (v).yres == (y)) 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef DEBUG 275ae121705bed9ea7425daef4d7d29038f7312f3fHarvey Harrison#define DPRINTK(fmt, args...) printk("modedb %s: " fmt, __func__ , ## args) 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DPRINTK(fmt, args...) 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 329a054fbac8f8441f48896b855a9e11c13e0c3dc8Geert Uytterhoevenconst char *fb_mode_option; 33659179b28f15ab1b1db5f8767090f5e728f115a1Geoff LevandEXPORT_SYMBOL_GPL(fb_mode_option); 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 35ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar/* 36ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar * Standard video mode definitions (taken from XFree86) 37ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar */ 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic const struct fb_videomode modedb[] = { 40ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x400 @ 70 Hz, 31.5 kHz hsync */ 42ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 640, 400, 39721, 40, 24, 39, 9, 96, 2, 0, 43ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 44ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x480 @ 60 Hz, 31.5 kHz hsync */ 46ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2, 0, 47ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 48ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 800x600 @ 56 Hz, 35.15 kHz hsync */ 50ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 56, 800, 600, 27777, 128, 24, 22, 1, 72, 2, 0, 51ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 52ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1024x768 @ 87 Hz interlaced, 35.5 kHz hsync */ 54ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 87, 1024, 768, 22271, 56, 24, 33, 8, 160, 8, 0, 55ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED }, 56ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x400 @ 85 Hz, 37.86 kHz hsync */ 58ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 640, 400, 31746, 96, 32, 41, 1, 64, 3, 59ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED }, 60ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x480 @ 72 Hz, 36.5 kHz hsync */ 62ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 72, 640, 480, 31746, 144, 40, 30, 8, 40, 3, 0, 63ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 64ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x480 @ 75 Hz, 37.50 kHz hsync */ 66ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 75, 640, 480, 31746, 120, 16, 16, 1, 64, 3, 0, 67ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 68ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 800x600 @ 60 Hz, 37.8 kHz hsync */ 70ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 800, 600, 25000, 88, 40, 23, 1, 128, 4, 71ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 72ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 73ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x480 @ 85 Hz, 43.27 kHz hsync */ 75ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 640, 480, 27777, 80, 56, 25, 1, 56, 3, 0, 76ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 77ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1152x864 @ 89 Hz interlaced, 44 kHz hsync */ 79ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 89, 1152, 864, 15384, 96, 16, 110, 1, 216, 10, 0, 80ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED }, 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 800x600 @ 72 Hz, 48.0 kHz hsync */ 82ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6, 83ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 84ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 85ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1024x768 @ 60 Hz, 48.4 kHz hsync */ 87ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1024, 768, 15384, 168, 8, 29, 3, 144, 6, 0, 88ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 89ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 640x480 @ 100 Hz, 53.01 kHz hsync */ 91ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 100, 640, 480, 21834, 96, 32, 36, 8, 96, 6, 0, 92ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 93ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1152x864 @ 60 Hz, 53.5 kHz hsync */ 95ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1152, 864, 11123, 208, 64, 16, 4, 256, 8, 0, 96ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 97ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 800x600 @ 85 Hz, 55.84 kHz hsync */ 99ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 800, 600, 16460, 160, 64, 36, 16, 64, 5, 0, 100ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 101ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1024x768 @ 70 Hz, 56.5 kHz hsync */ 103ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 0, 104ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 105ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 87 Hz interlaced, 51 kHz hsync */ 107ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 87, 1280, 1024, 12500, 56, 16, 128, 1, 216, 12, 0, 108ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED }, 109ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 800x600 @ 100 Hz, 64.02 kHz hsync */ 111ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 100, 800, 600, 14357, 160, 64, 30, 4, 64, 6, 0, 112ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 113ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1024x768 @ 76 Hz, 62.5 kHz hsync */ 115ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 76, 1024, 768, 11764, 208, 8, 36, 16, 120, 3, 0, 116ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 117ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1152x864 @ 70 Hz, 62.4 kHz hsync */ 119ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 1152, 864, 10869, 106, 56, 20, 1, 160, 10, 0, 120ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 121ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 61 Hz, 64.2 kHz hsync */ 123ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 61, 1280, 1024, 9090, 200, 48, 26, 1, 184, 3, 0, 124ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 125ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1400x1050 @ 60Hz, 63.9 kHz hsync */ 127ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1400, 1050, 9259, 136, 40, 13, 1, 112, 3, 0, 128ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 129ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1400x1050 @ 75,107 Hz, 82,392 kHz +hsync +vsync*/ 131ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 75, 1400, 1050, 7190, 120, 56, 23, 10, 112, 13, 132ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 133ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 134ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1400x1050 @ 60 Hz, ? kHz +hsync +vsync*/ 136ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1400, 1050, 9259, 128, 40, 12, 0, 112, 3, 137ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 138ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 139ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1024x768 @ 85 Hz, 70.24 kHz hsync */ 141ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 1024, 768, 10111, 192, 32, 34, 14, 160, 6, 0, 142ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 143ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1152x864 @ 78 Hz, 70.8 kHz hsync */ 145ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 78, 1152, 864, 9090, 228, 88, 32, 0, 84, 12, 0, 146ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 147ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 70 Hz, 74.59 kHz hsync */ 149ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 1280, 1024, 7905, 224, 32, 28, 8, 160, 8, 0, 150ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 151ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1600x1200 @ 60Hz, 75.00 kHz hsync */ 153ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3, 154ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 155ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 156ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1152x864 @ 84 Hz, 76.0 kHz hsync */ 158ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 84, 1152, 864, 7407, 184, 312, 32, 0, 128, 12, 0, 159ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 160ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 74 Hz, 78.85 kHz hsync */ 162ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 74, 1280, 1024, 7407, 256, 32, 34, 3, 144, 3, 0, 163ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 164ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1024x768 @ 100Hz, 80.21 kHz hsync */ 166ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 100, 1024, 768, 8658, 192, 32, 21, 3, 192, 10, 0, 167ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 168ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 76 Hz, 81.13 kHz hsync */ 170ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 76, 1280, 1024, 7407, 248, 32, 34, 3, 104, 3, 0, 171ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 172ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1600x1200 @ 70 Hz, 87.50 kHz hsync */ 174ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3, 0, 175ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 176ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1152x864 @ 100 Hz, 89.62 kHz hsync */ 178ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 100, 1152, 864, 7264, 224, 32, 17, 2, 128, 19, 0, 179ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 180ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 85 Hz, 91.15 kHz hsync */ 182ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3, 183ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 184ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 185ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1600x1200 @ 75 Hz, 93.75 kHz hsync */ 187ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, 188ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 189ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 190ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 191b0c87978216836455ef5fbcac6df1ce6679750b0Olaf Hering /* 1680x1050 @ 60 Hz, 65.191 kHz hsync */ 192ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1680, 1050, 6848, 280, 104, 30, 3, 176, 6, 193ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 194ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 195ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1600x1200 @ 85 Hz, 105.77 kHz hsync */ 197ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 1600, 1200, 4545, 272, 16, 37, 4, 192, 3, 198ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 199ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 200ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1280x1024 @ 100 Hz, 107.16 kHz hsync */ 202ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 100, 1280, 1024, 5502, 256, 32, 26, 7, 128, 15, 0, 203ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 204ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1800x1440 @ 64Hz, 96.15 kHz hsync */ 206ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 64, 1800, 1440, 4347, 304, 96, 46, 1, 192, 3, 207ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 208ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 209ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1800x1440 @ 70Hz, 104.52 kHz hsync */ 211ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 1800, 1440, 4000, 304, 96, 46, 1, 192, 3, 212ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 213ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 214ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 512x384 @ 78 Hz, 31.50 kHz hsync */ 216ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 78, 512, 384, 49603, 48, 16, 16, 1, 64, 3, 0, 217ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 218ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 512x384 @ 85 Hz, 34.38 kHz hsync */ 220ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 85, 512, 384, 45454, 48, 16, 16, 1, 64, 3, 0, 221ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 222ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 320x200 @ 70 Hz, 31.5 kHz hsync, 8:5 aspect ratio */ 224ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 70, 320, 200, 79440, 16, 16, 20, 4, 48, 1, 0, 225ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 226ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio */ 228ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 320, 240, 79440, 16, 16, 16, 5, 48, 1, 0, 229ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 230ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 320x240 @ 72 Hz, 36.5 kHz hsync */ 232ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 72, 320, 240, 63492, 16, 16, 16, 4, 48, 2, 0, 233ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 234ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 400x300 @ 56 Hz, 35.2 kHz hsync, 4:3 aspect ratio */ 236ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 56, 400, 300, 55555, 64, 16, 10, 1, 32, 1, 0, 237ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 238ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 400x300 @ 60 Hz, 37.8 kHz hsync */ 240ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 400, 300, 50000, 48, 16, 11, 1, 64, 2, 0, 241ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 242ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 400x300 @ 72 Hz, 48.0 kHz hsync */ 244ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 72, 400, 300, 40000, 32, 24, 11, 19, 64, 3, 0, 245ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 246ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 480x300 @ 56 Hz, 35.2 kHz hsync, 8:5 aspect ratio */ 248ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 56, 480, 300, 46176, 80, 16, 10, 1, 40, 1, 0, 249ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 250ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 480x300 @ 60 Hz, 37.8 kHz hsync */ 252ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 480, 300, 41858, 56, 16, 11, 1, 80, 2, 0, 253ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 254ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 480x300 @ 63 Hz, 39.6 kHz hsync */ 256ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 63, 480, 300, 40000, 56, 16, 11, 1, 80, 2, 0, 257ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 258ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 480x300 @ 72 Hz, 48.0 kHz hsync */ 260ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3, 0, 261ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_DOUBLE }, 262ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 263db6778db7eb1d974e1ae0da326530f09c13585acAntonino Daplas /* 1920x1200 @ 60 Hz, 74.5 Khz hsync */ 264ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1920, 1200, 5177, 128, 336, 1, 38, 208, 3, 265ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 266ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 267ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 2681dfcdfae5783fc10d7f8fcc336de838a44e7636cMichael Hanselmann /* 1152x768, 60 Hz, PowerBook G4 Titanium I and II */ 269ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1152, 768, 14047, 158, 26, 29, 3, 136, 6, 270ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 271ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 272ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 273f71689e4139a91c98cc476240aca40bd091d4538Dennis Munsie /* 1366x768, 60 Hz, 47.403 kHz hsync, WXGA 16:9 aspect ratio */ 274ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1366, 768, 13806, 120, 10, 14, 3, 32, 5, 0, 275ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 276ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 277545c4423335469de06af7f7c95e97c1122c1c818Alex /* 1280x800, 60 Hz, 47.403 kHz hsync, WXGA 16:10 aspect ratio */ 278ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 1280, 800, 12048, 200, 64, 24, 1, 136, 3, 0, 279ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED }, 280ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 281ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar /* 720x576i @ 50 Hz, 15.625 kHz hsync (PAL RGB) */ 282ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 50, 720, 576, 74074, 64, 16, 39, 5, 64, 5, 0, 283ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED }, 284ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 285ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar /* 800x520i @ 50 Hz, 15.625 kHz hsync (PAL RGB) */ 286ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 50, 800, 520, 58823, 144, 64, 72, 28, 80, 5, 0, 287ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED }, 288ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 28917ca20cb7d04a259c9194879f77466bde606dda5Mayuresh Janorkar /* 864x480 @ 60 Hz, 35.15 kHz hsync */ 290ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 864, 480, 27777, 1, 1, 1, 1, 0, 0, 291ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar 0, FB_VMODE_NONINTERLACED }, 2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_FB_MODE_HELPERS 2950ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetskiconst struct fb_videomode cea_modes[64] = { 2960ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #1: 640x480p@59.94/60Hz */ 2970ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [1] = { 298ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2, 0, 299ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3000ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3010ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #3: 720x480p@59.94/60Hz */ 3020ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [3] = { 303ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar NULL, 60, 720, 480, 37037, 60, 16, 30, 9, 62, 6, 0, 304ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3050ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3060ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #5: 1920x1080i@59.94/60Hz */ 3070ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [5] = { 3082006920a18cc9f499e5cccf9e6f1aa9f6120705eArnd Hannemann NULL, 60, 1920, 1080, 13763, 148, 88, 15, 2, 44, 5, 309ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 310ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED, 0, 3110ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3120ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #7: 720(1440)x480iH@59.94/60Hz */ 3130ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [7] = { 314ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar NULL, 60, 1440, 480, 18554/*37108*/, 114, 38, 15, 4, 124, 3, 0, 315ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED, 0, 3160ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3170ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #9: 720(1440)x240pH@59.94/60Hz */ 3180ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [9] = { 319ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar NULL, 60, 1440, 240, 18554, 114, 38, 16, 4, 124, 3, 0, 320ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3210ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3220ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #18: 720x576pH@50Hz */ 3230ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [18] = { 324ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar NULL, 50, 720, 576, 37037, 68, 12, 39, 5, 64, 5, 0, 325ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3260ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3270ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #19: 1280x720p@50Hz */ 3280ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [19] = { 3292006920a18cc9f499e5cccf9e6f1aa9f6120705eArnd Hannemann NULL, 50, 1280, 720, 13468, 220, 440, 20, 5, 40, 5, 330ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 331ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3320ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3330ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #20: 1920x1080i@50Hz */ 3340ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [20] = { 3352006920a18cc9f499e5cccf9e6f1aa9f6120705eArnd Hannemann NULL, 50, 1920, 1080, 13480, 148, 528, 15, 5, 528, 5, 336ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 337ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_INTERLACED, 0, 3380ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3390ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #32: 1920x1080p@23.98/24Hz */ 3400ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [32] = { 3412006920a18cc9f499e5cccf9e6f1aa9f6120705eArnd Hannemann NULL, 24, 1920, 1080, 13468, 148, 638, 36, 4, 44, 5, 342ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 343ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3440ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3450ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski /* #35: (2880)x480p4x@59.94/60Hz */ 3460ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski [35] = { 347ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar NULL, 60, 2880, 480, 9250, 240, 64, 30, 9, 248, 6, 0, 348ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar FB_VMODE_NONINTERLACED, 0, 3490ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski }, 3500ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski}; 3510ad83f6882c41df1a7fa387086029e162038c1f2Guennadi Liakhovetski 3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsconst struct fb_videomode vesa_modes[] = { 3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 0 640x350-85 VESA */ 3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 640, 350, 31746, 96, 32, 60, 32, 64, 3, 3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA}, 3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1 640x400-85 VESA */ 3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 640, 400, 31746, 96, 32, 41, 01, 64, 3, 3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 2 720x400-85 VESA */ 3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 721, 400, 28169, 108, 36, 42, 01, 72, 3, 3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 3 640x480-60 VESA */ 363ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 60, 640, 480, 39682, 48, 16, 33, 10, 96, 2, 3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 4 640x480-72 VESA */ 366ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 72, 640, 480, 31746, 128, 24, 29, 9, 40, 2, 3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 5 640x480-75 VESA */ 3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 75, 640, 480, 31746, 120, 16, 16, 01, 64, 3, 3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 6 640x480-85 VESA */ 3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 640, 480, 27777, 80, 56, 25, 01, 56, 3, 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 7 800x600-56 VESA */ 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 56, 800, 600, 27777, 128, 24, 22, 01, 72, 2, 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 8 800x600-60 VESA */ 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 800, 600, 25000, 88, 40, 23, 01, 128, 4, 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 9 800x600-72 VESA */ 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 72, 800, 600, 20000, 64, 56, 23, 37, 120, 6, 3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 10 800x600-75 VESA */ 3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 75, 800, 600, 20202, 160, 16, 21, 01, 80, 3, 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 11 800x600-85 VESA */ 3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 800, 600, 17761, 152, 32, 27, 01, 64, 3, 3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 12 1024x768i-43 VESA */ 3959d775e17b5b9a204a0cb746f1f7f6ef11f4d869dAntonino A. Daplas { NULL, 43, 1024, 768, 22271, 56, 8, 41, 0, 176, 8, 3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_INTERLACED, FB_MODE_IS_VESA }, 3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 13 1024x768-60 VESA */ 3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1024, 768, 15384, 160, 24, 29, 3, 136, 6, 4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 14 1024x768-70 VESA */ 4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 70, 1024, 768, 13333, 144, 24, 29, 3, 136, 6, 4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 15 1024x768-75 VESA */ 4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 75, 1024, 768, 12690, 176, 16, 28, 1, 96, 3, 4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 16 1024x768-85 VESA */ 4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 1024, 768, 10582, 208, 48, 36, 1, 96, 3, 4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 17 1152x864-75 VESA */ 4133efbb987c1ffcb82ad1b76b67fa26ec7c0c1448aJiri Moravec { NULL, 75, 1152, 864, 9259, 256, 64, 32, 1, 128, 3, 4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 18 1280x960-60 VESA */ 4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1280, 960, 9259, 312, 96, 36, 1, 112, 3, 4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 19 1280x960-85 VESA */ 4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 1280, 960, 6734, 224, 64, 47, 1, 160, 3, 4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 20 1280x1024-60 VESA */ 4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1280, 1024, 9259, 248, 48, 38, 1, 112, 3, 4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 21 1280x1024-75 VESA */ 4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 75, 1280, 1024, 7407, 248, 16, 38, 1, 144, 3, 4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 22 1280x1024-85 VESA */ 4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 1280, 1024, 6349, 224, 64, 44, 1, 160, 3, 4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 23 1600x1200-60 VESA */ 4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1600, 1200, 6172, 304, 64, 46, 1, 192, 3, 4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 24 1600x1200-65 VESA */ 4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 65, 1600, 1200, 5698, 304, 64, 46, 1, 192, 3, 4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 25 1600x1200-70 VESA */ 4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 70, 1600, 1200, 5291, 304, 64, 46, 1, 192, 3, 4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 26 1600x1200-75 VESA */ 449ccd8c79c5608fc4835dcb0244623ceae2489f72dMayuresh Janorkar { NULL, 75, 1600, 1200, 4938, 304, 64, 46, 1, 192, 3, 4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 27 1600x1200-85 VESA */ 4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 85, 1600, 1200, 4357, 304, 64, 46, 1, 192, 3, 4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 28 1792x1344-60 VESA */ 4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1792, 1344, 4882, 328, 128, 46, 1, 200, 3, 4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 29 1792x1344-75 VESA */ 4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 75, 1792, 1344, 3831, 352, 96, 69, 1, 216, 3, 4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 30 1856x1392-60 VESA */ 4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1856, 1392, 4580, 352, 96, 43, 1, 224, 3, 4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 31 1856x1392-75 VESA */ 4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 75, 1856, 1392, 3472, 352, 128, 104, 1, 224, 3, 4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 32 1920x1440-60 VESA */ 4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds { NULL, 60, 1920, 1440, 4273, 344, 128, 56, 1, 200, 3, 4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 33 1920x1440-75 VESA */ 4729d775e17b5b9a204a0cb746f1f7f6ef11f4d869dAntonino A. Daplas { NULL, 75, 1920, 1440, 3367, 352, 144, 56, 1, 224, 3, 4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED, FB_MODE_IS_VESA }, 4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(vesa_modes); 4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* CONFIG_FB_MODE_HELPERS */ 4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fb_try_mode - test a video mode 4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @var: frame buffer user defined part of display 4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @info: frame buffer info structure 4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode: frame buffer video mode structure 4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @bpp: color depth in bits per pixel 4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Tries a video mode to test it's validity for device @info. 4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Returns 1 on success. 4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 4901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int fb_try_mode(struct fb_var_screeninfo *var, struct fb_info *info, 4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct fb_videomode *mode, unsigned int bpp) 4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 494f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi int err = 0; 495f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 496f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("Trying mode %s %dx%d-%d@%d\n", 497f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi mode->name ? mode->name : "noname", 498f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi mode->xres, mode->yres, bpp, mode->refresh); 499f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->xres = mode->xres; 500f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->yres = mode->yres; 501f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->xres_virtual = mode->xres; 502f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->yres_virtual = mode->yres; 503f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->xoffset = 0; 504f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->yoffset = 0; 505f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->bits_per_pixel = bpp; 506f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->activate |= FB_ACTIVATE_TEST; 507f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->pixclock = mode->pixclock; 508f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->left_margin = mode->left_margin; 509f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->right_margin = mode->right_margin; 510f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->upper_margin = mode->upper_margin; 511f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->lower_margin = mode->lower_margin; 512f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->hsync_len = mode->hsync_len; 513f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->vsync_len = mode->vsync_len; 514f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->sync = mode->sync; 515f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->vmode = mode->vmode; 516f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (info->fbops->fb_check_var) 517f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi err = info->fbops->fb_check_var(var, info); 518f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi var->activate &= ~FB_ACTIVATE_TEST; 519f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return err; 5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 523f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * fb_find_mode - finds a valid video mode 524f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @var: frame buffer user defined part of display 525f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @info: frame buffer info structure 526f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @mode_option: string video mode to find 527f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @db: video mode database 528f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @dbsize: size of @db 529f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @default_mode: default video mode to fall back to 530f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @default_bpp: default color depth in bits per pixel 5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 532f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * Finds a suitable video mode, starting with the specified mode 533f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * in @mode_option with fallback to @default_mode. If 534f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * @default_mode fails, all modes in the video mode database will 535f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * be tried. 5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 537f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * Valid mode specifiers for @mode_option: 5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 539f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * <xres>x<yres>[M][R][-<bpp>][@<refresh>][i][m] or 540f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * <name>[-<bpp>][@<refresh>] 5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 542f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * with <xres>, <yres>, <bpp> and <refresh> decimal numbers and 543f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * <name> a string. 5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 54596fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * If 'M' is present after yres (and before refresh/bpp if present), 54696fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * the function will compute the timings using VESA(tm) Coordinated 54796fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * Video Timings (CVT). If 'R' is present after 'M', will compute with 54896fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * reduced blanking (for flatpanels). If 'i' is present, compute 54996fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * interlaced mode. If 'm' is present, add margins equal to 1.8% 55096fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * of xres rounded down to 8 pixels, and 1.8% of yres. The char 55196fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * 'i' and 'm' must be after 'M' and 'R'. Example: 55296fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * 55396fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * 1024x768MR-8@60m - Reduced blank with margins at 60Hz. 55496fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas * 555f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * NOTE: The passed struct @var is _not_ cleared! This allows you 556f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * to supply values for e.g. the grayscale and accel_flags fields. 5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 558f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * Returns zero for failure, 1 if using specified @mode_option, 559f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * 2 if using specified @mode_option with an ignored refresh rate, 560f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * 3 if default mode is used, 4 if fall back to any valid mode. 5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint fb_find_mode(struct fb_var_screeninfo *var, 5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_info *info, const char *mode_option, 5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct fb_videomode *db, unsigned int dbsize, 5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds const struct fb_videomode *default_mode, 5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned int default_bpp) 5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 570f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi int i; 57196fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas 572f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi /* Set up defaults */ 573f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!db) { 574f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi db = modedb; 575f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi dbsize = ARRAY_SIZE(modedb); 576f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 57796fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas 578f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!default_mode) 579f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi default_mode = &db[0]; 580f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 581f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!default_bpp) 582f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi default_bpp = 8; 583f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 584f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi /* Did the user specify a video mode? */ 585f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!mode_option) 586f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi mode_option = fb_mode_option; 587f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (mode_option) { 588f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi const char *name = mode_option; 589f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi unsigned int namelen = strlen(name); 590f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi int res_specified = 0, bpp_specified = 0, refresh_specified = 0; 591f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi unsigned int xres = 0, yres = 0, bpp = default_bpp, refresh = 0; 592f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi int yres_specified = 0, cvt = 0, rb = 0, interlace = 0; 593f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi int margins = 0; 594f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi u32 best, diff, tdiff; 595f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 596f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi for (i = namelen-1; i >= 0; i--) { 597f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi switch (name[i]) { 598f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case '@': 599f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi namelen = i; 600f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!refresh_specified && !bpp_specified && 601f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi !yres_specified) { 602f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi refresh = simple_strtol(&name[i+1], NULL, 603f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 10); 604f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi refresh_specified = 1; 605f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (cvt || rb) 606f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt = 0; 607f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } else 608f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi goto done; 609f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 610f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case '-': 611f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi namelen = i; 612f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!bpp_specified && !yres_specified) { 613f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi bpp = simple_strtol(&name[i+1], NULL, 614f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 10); 615f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi bpp_specified = 1; 616f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (cvt || rb) 617f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt = 0; 618f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } else 619f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi goto done; 620f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 621f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case 'x': 622f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!yres_specified) { 623f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi yres = simple_strtol(&name[i+1], NULL, 624f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 10); 625f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi yres_specified = 1; 626f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } else 627f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi goto done; 628f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 629f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case '0' ... '9': 630f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 631f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case 'M': 632f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!yres_specified) 633f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt = 1; 634f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 635f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case 'R': 636f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!cvt) 637f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi rb = 1; 638f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 639f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case 'm': 640f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!cvt) 641f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi margins = 1; 642f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 643f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi case 'i': 644f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!cvt) 645f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi interlace = 1; 646f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi break; 647f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi default: 648f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi goto done; 649f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 650f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 651f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (i < 0 && yres_specified) { 652f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi xres = simple_strtol(name, NULL, 10); 653f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi res_specified = 1; 654f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 655f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabidone: 656f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (cvt) { 657f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi struct fb_videomode cvt_mode; 658f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi int ret; 659f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 660f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("CVT mode %dx%d@%dHz%s%s%s\n", xres, yres, 661f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi (refresh) ? refresh : 60, 662f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi (rb) ? " reduced blanking" : "", 663f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi (margins) ? " with margins" : "", 664f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi (interlace) ? " interlaced" : ""); 665f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 666f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi memset(&cvt_mode, 0, sizeof(cvt_mode)); 667f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt_mode.xres = xres; 668f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt_mode.yres = yres; 669f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt_mode.refresh = (refresh) ? refresh : 60; 670f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 671f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (interlace) 672f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt_mode.vmode |= FB_VMODE_INTERLACED; 673f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi else 674f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi cvt_mode.vmode &= ~FB_VMODE_INTERLACED; 675f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 676f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi ret = fb_find_mode_cvt(&cvt_mode, margins, rb); 677f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 678f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!ret && !fb_try_mode(var, info, &cvt_mode, bpp)) { 679f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("modedb CVT: CVT mode ok\n"); 680f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return 1; 681f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 68296fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas 683f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("CVT mode invalid, getting mode from database\n"); 684f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 68596fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas 686f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("Trying specified video mode%s %ix%i\n", 687f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi refresh_specified ? "" : " (ignoring refresh rate)", 688f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi xres, yres); 68996fe6a2109db29cd15b90a093c16e6cb4b19371aAntonino A. Daplas 690f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!refresh_specified) { 691f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi /* 692f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * If the caller has provided a custom mode database and 693f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * a valid monspecs structure, we look for the mode with 694f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * the highest refresh rate. Otherwise we play it safe 695f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * it and try to find a mode with a refresh rate closest 696f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * to the standard 60 Hz. 697f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi */ 698f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (db != modedb && 699f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi info->monspecs.vfmin && info->monspecs.vfmax && 700f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi info->monspecs.hfmin && info->monspecs.hfmax && 701f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi info->monspecs.dclkmax) { 702f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi refresh = 1000; 703f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } else { 704f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi refresh = 60; 705f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 7061c5dd170927b1aa8e3a01d43d611b840336cdaf2Michal Januszewski } 7071c5dd170927b1aa8e3a01d43d611b840336cdaf2Michal Januszewski 708f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi diff = -1; 709f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi best = -1; 710f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi for (i = 0; i < dbsize; i++) { 711f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if ((name_matches(db[i], name, namelen) || 712f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi (res_specified && res_matches(db[i], xres, yres))) && 713f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi !fb_try_mode(var, info, &db[i], bpp)) { 714f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (refresh_specified && db[i].refresh == refresh) 715f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return 1; 716f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 7171c5dd170927b1aa8e3a01d43d611b840336cdaf2Michal Januszewski if (abs(db[i].refresh - refresh) < diff) { 7181c5dd170927b1aa8e3a01d43d611b840336cdaf2Michal Januszewski diff = abs(db[i].refresh - refresh); 7191c5dd170927b1aa8e3a01d43d611b840336cdaf2Michal Januszewski best = i; 7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 723f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (best != -1) { 724f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi fb_try_mode(var, info, &db[best], bpp); 725f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return (refresh_specified) ? 2 : 1; 726f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 7276b745b6fd02213f4b2fef2f2635985929fc5b8ccMichal Januszewski 728f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi diff = 2 * (xres + yres); 729f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi best = -1; 730f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("Trying best-fit modes\n"); 731f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi for (i = 0; i < dbsize; i++) { 732f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("Trying %ix%i\n", db[i].xres, db[i].yres); 733f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!fb_try_mode(var, info, &db[i], bpp)) { 734f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi tdiff = abs(db[i].xres - xres) + 735f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi abs(db[i].yres - yres); 736f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 737f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi /* 738f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * Penalize modes with resolutions smaller 739f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi * than requested. 740f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi */ 741f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (xres > db[i].xres || yres > db[i].yres) 742f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi tdiff += xres + yres; 743f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi 744f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (diff > tdiff) { 745f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi diff = tdiff; 746f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi best = i; 747f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 7486b745b6fd02213f4b2fef2f2635985929fc5b8ccMichal Januszewski } 7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 750f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (best != -1) { 751f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi fb_try_mode(var, info, &db[best], bpp); 752f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return 5; 753f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi } 7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 7551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 756f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("Trying default video mode\n"); 757f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!fb_try_mode(var, info, default_mode, default_bpp)) 758f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return 3; 7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 760f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("Trying all modes\n"); 761f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi for (i = 0; i < dbsize; i++) 762f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi if (!fb_try_mode(var, info, &db[i], default_bpp)) 763f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return 4; 7641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 765f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi DPRINTK("No valid mode found\n"); 766f92d39e926003f925dc6a8ea6be72a16869337aeTimur Tabi return 0; 7671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fb_var_to_videomode - convert fb_var_screeninfo to fb_videomode 7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode: pointer to struct fb_videomode 7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @var: pointer to struct fb_var_screeninfo 7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid fb_var_to_videomode(struct fb_videomode *mode, 7759791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven const struct fb_var_screeninfo *var) 7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 pixclock, hfreq, htotal, vtotal; 7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->name = NULL; 7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->xres = var->xres; 7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->yres = var->yres; 7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->pixclock = var->pixclock; 7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->hsync_len = var->hsync_len; 7841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->vsync_len = var->vsync_len; 7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->left_margin = var->left_margin; 7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->right_margin = var->right_margin; 7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->upper_margin = var->upper_margin; 7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->lower_margin = var->lower_margin; 7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->sync = var->sync; 7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->vmode = var->vmode & FB_VMODE_MASK; 7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->flag = FB_MODE_IS_FROM_VAR; 7928fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski mode->refresh = 0; 7938fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski 7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!var->pixclock) 7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pixclock = PICOS2KHZ(var->pixclock) * 1000; 7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds htotal = var->xres + var->right_margin + var->hsync_len + 8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->left_margin; 8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vtotal = var->yres + var->lower_margin + var->vsync_len + 8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->upper_margin; 8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (var->vmode & FB_VMODE_INTERLACED) 8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vtotal /= 2; 8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (var->vmode & FB_VMODE_DOUBLE) 8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds vtotal *= 2; 8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds hfreq = pixclock/htotal; 8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode->refresh = hfreq/vtotal; 8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fb_videomode_to_var - convert fb_videomode to fb_var_screeninfo 8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @var: pointer to struct fb_var_screeninfo 8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode: pointer to struct fb_videomode 8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid fb_videomode_to_var(struct fb_var_screeninfo *var, 8199791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven const struct fb_videomode *mode) 8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->xres = mode->xres; 8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->yres = mode->yres; 823dcfe2666ffd6316b764801db82092bc62db56e6fGeert Uytterhoeven var->xres_virtual = mode->xres; 824dcfe2666ffd6316b764801db82092bc62db56e6fGeert Uytterhoeven var->yres_virtual = mode->yres; 825dcfe2666ffd6316b764801db82092bc62db56e6fGeert Uytterhoeven var->xoffset = 0; 826dcfe2666ffd6316b764801db82092bc62db56e6fGeert Uytterhoeven var->yoffset = 0; 8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->pixclock = mode->pixclock; 8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->left_margin = mode->left_margin; 8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->right_margin = mode->right_margin; 8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->upper_margin = mode->upper_margin; 8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->lower_margin = mode->lower_margin; 832dcfe2666ffd6316b764801db82092bc62db56e6fGeert Uytterhoeven var->hsync_len = mode->hsync_len; 833dcfe2666ffd6316b764801db82092bc62db56e6fGeert Uytterhoeven var->vsync_len = mode->vsync_len; 8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->sync = mode->sync; 8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds var->vmode = mode->vmode & FB_VMODE_MASK; 8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fb_mode_is_equal - compare 2 videomodes 8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode1: first videomode 8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode2: second videomode 8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURNS: 8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 1 if equal, 0 if not 8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8469791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenint fb_mode_is_equal(const struct fb_videomode *mode1, 8479791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven const struct fb_videomode *mode2) 8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return (mode1->xres == mode2->xres && 8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->yres == mode2->yres && 8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->pixclock == mode2->pixclock && 8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->hsync_len == mode2->hsync_len && 8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->vsync_len == mode2->vsync_len && 8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->left_margin == mode2->left_margin && 8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->right_margin == mode2->right_margin && 8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->upper_margin == mode2->upper_margin && 8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->lower_margin == mode2->lower_margin && 8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->sync == mode2->sync && 8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode1->vmode == mode2->vmode); 8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fb_find_best_mode - find best matching videomode 8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @var: pointer to struct fb_var_screeninfo 8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: pointer to struct list_head of modelist 8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURNS: 8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * struct fb_videomode, NULL if none found 8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IMPORTANT: 8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This function assumes that all modelist entries in 8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * info->modelist are valid. 8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTES: 8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Finds best matching videomode which has an equal or greater dimension than 8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * var->xres and var->yres. If more than 1 videomode is found, will return 8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the videomode with the highest refresh rate 8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 8799791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenconst struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var, 8809791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven struct list_head *head) 8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *pos; 8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_modelist *modelist; 8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_videomode *mode, *best = NULL; 8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 diff = -1; 8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each(pos, head) { 8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 d; 8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist = list_entry(pos, struct fb_modelist, list); 8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds mode = &modelist->mode; 8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (mode->xres >= var->xres && mode->yres >= var->yres) { 8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds d = (mode->xres - var->xres) + 8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds (mode->yres - var->yres); 8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (diff > d) { 8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds diff = d; 8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds best = mode; 89917cc6281c12b26425209c58e3d8825a9568db3ccAntonino A. Daplas } else if (diff == d && best && 90017cc6281c12b26425209c58e3d8825a9568db3ccAntonino A. Daplas mode->refresh > best->refresh) 90117cc6281c12b26425209c58e3d8825a9568db3ccAntonino A. Daplas best = mode; 9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return best; 9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 9088fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski * fb_find_nearest_mode - find closest videomode 9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9108fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski * @mode: pointer to struct fb_videomode 9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: pointer to modelist 9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Finds best matching videomode, smaller or greater in dimension. 9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * If more than 1 videomode is found, will return the videomode with 9158fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski * the closest refresh rate. 9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9179791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenconst struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode, 9189791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven struct list_head *head) 9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *pos; 9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_modelist *modelist; 9228fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski struct fb_videomode *cmode, *best = NULL; 9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 diff = -1, diff_refresh = -1; 9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each(pos, head) { 9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 d; 9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist = list_entry(pos, struct fb_modelist, list); 9298fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski cmode = &modelist->mode; 9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9318fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski d = abs(cmode->xres - mode->xres) + 9328fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski abs(cmode->yres - mode->yres); 9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (diff > d) { 9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds diff = d; 935e504b84805c574cf18d705c610c9e4a8f6e61017Andrew Kephart diff_refresh = abs(cmode->refresh - mode->refresh); 9368fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski best = cmode; 9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } else if (diff == d) { 9388fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski d = abs(cmode->refresh - mode->refresh); 9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (diff_refresh > d) { 9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds diff_refresh = d; 9418fb6567e347a04d44b57e2b223cc5845859dfc6aMichal Januszewski best = cmode; 9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return best; 9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * fb_match_mode - find a videomode which exactly matches the timings in var 9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @var: pointer to struct fb_var_screeninfo 9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: pointer to struct list_head of modelist 9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * RETURNS: 9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * struct fb_videomode, NULL if none found 9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9579791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenconst struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var, 9589791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven struct list_head *head) 9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *pos; 9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_modelist *modelist; 9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_videomode *m, mode; 9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds fb_var_to_videomode(&mode, var); 9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each(pos, head) { 9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist = list_entry(pos, struct fb_modelist, list); 9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds m = &modelist->mode; 9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (fb_mode_is_equal(m, &mode)) 9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return m; 9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return NULL; 9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 975a8b1925430339be1464a9a028754d94984dacfdbBen Hutchings * fb_add_videomode - adds videomode entry to modelist 9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode: videomode to add 9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: struct list_head of modelist 9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTES: 9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Will only add unmatched mode entries 9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 9829791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenint fb_add_videomode(const struct fb_videomode *mode, struct list_head *head) 9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *pos; 9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_modelist *modelist; 9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_videomode *m; 9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int found = 0; 9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each(pos, head) { 9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist = list_entry(pos, struct fb_modelist, list); 9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds m = &modelist->mode; 9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (fb_mode_is_equal(m, mode)) { 9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds found = 1; 9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds break; 9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!found) { 9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist = kmalloc(sizeof(struct fb_modelist), 9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GFP_KERNEL); 10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (!modelist) 10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return -ENOMEM; 10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist->mode = *mode; 10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_add(&modelist->list, head); 10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return 0; 10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 1010a8b1925430339be1464a9a028754d94984dacfdbBen Hutchings * fb_delete_videomode - removed videomode entry from modelist 10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @mode: videomode to remove 10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: struct list_head of modelist 10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NOTES: 10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Will remove all matching mode entries 10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10179791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenvoid fb_delete_videomode(const struct fb_videomode *mode, 10189791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven struct list_head *head) 10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *pos, *n; 10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_modelist *modelist; 10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct fb_videomode *m; 10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each_safe(pos, n, head) { 10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds modelist = list_entry(pos, struct fb_modelist, list); 10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds m = &modelist->mode; 10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (fb_mode_is_equal(m, mode)) { 10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_del(pos); 10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(pos); 10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 1035a8b1925430339be1464a9a028754d94984dacfdbBen Hutchings * fb_destroy_modelist - destroy modelist 10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: struct list_head of modelist 10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid fb_destroy_modelist(struct list_head *head) 10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *pos, *n; 10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_for_each_safe(pos, n, head) { 10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds list_del(pos); 10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds kfree(pos); 10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10479953d236e94ce26639b0e05d2631d076889d08dfMichal JanuszewskiEXPORT_SYMBOL_GPL(fb_destroy_modelist); 10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/** 1050a8b1925430339be1464a9a028754d94984dacfdbBen Hutchings * fb_videomode_to_modelist - convert mode array to mode list 10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @modedb: array of struct fb_videomode 10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @num: number of entries in array 10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * @head: struct list_head of modelist 10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 10559791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenvoid fb_videomode_to_modelist(const struct fb_videomode *modedb, int num, 10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head *head) 10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int i; 10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds INIT_LIST_HEAD(head); 10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds for (i = 0; i < num; i++) { 10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds if (fb_add_videomode(&modedb[i], head)) 10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 10689791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoevenconst struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs, 10699791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven struct list_head *head) 1070003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas{ 1071003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas struct list_head *pos; 1072003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas struct fb_modelist *modelist; 10739791d763de8cca82b42a7a579e031db78e8011ffGeert Uytterhoeven const struct fb_videomode *m, *m1 = NULL, *md = NULL, *best = NULL; 1074003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas int first = 0; 1075003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1076003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (!head->prev || !head->next || list_empty(head)) 1077003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas goto finished; 1078003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1079003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas /* get the first detailed mode and the very first mode */ 1080003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas list_for_each(pos, head) { 1081003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas modelist = list_entry(pos, struct fb_modelist, list); 1082003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas m = &modelist->mode; 1083003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1084003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (!first) { 1085003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas m1 = m; 1086003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas first = 1; 1087003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1088003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1089003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (m->flag & FB_MODE_IS_FIRST) { 1090003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas md = m; 1091003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas break; 1092003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1093003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1094003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1095003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas /* first detailed timing is preferred */ 1096003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (specs->misc & FB_MISC_1ST_DETAIL) { 1097003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas best = md; 1098003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas goto finished; 1099003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1100003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1101003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas /* find best mode based on display width and height */ 1102003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (specs->max_x && specs->max_y) { 1103003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas struct fb_var_screeninfo var; 1104003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1105003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas memset(&var, 0, sizeof(struct fb_var_screeninfo)); 1106003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas var.xres = (specs->max_x * 7200)/254; 1107003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas var.yres = (specs->max_y * 7200)/254; 1108003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas m = fb_find_best_mode(&var, head); 1109003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (m) { 1110003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas best = m; 1111003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas goto finished; 1112003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1113003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1114003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1115003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas /* use first detailed mode */ 1116003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas if (md) { 1117003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas best = md; 1118003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas goto finished; 1119003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas } 1120003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 1121003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas /* last resort, use the very first mode */ 1122003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas best = m1; 1123003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplasfinished: 1124003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas return best; 1125003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas} 1126003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. DaplasEXPORT_SYMBOL(fb_find_best_display); 1127003cfc0c56977f1c3ce48ddfd2073b7c6d75a5d8Antonino A. Daplas 11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_videomode_to_var); 11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_var_to_videomode); 11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_mode_is_equal); 11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_add_videomode); 11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_match_mode); 11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_find_best_mode); 11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_find_nearest_mode); 11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_videomode_to_modelist); 11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(fb_find_mode); 11371bae852fb0beca3cc95b8de84efbc7254cae62e1Tormod VoldenEXPORT_SYMBOL(fb_find_mode_cvt); 1138