patch-2.3.14 linux/drivers/video/macmodes.c

Next file: linux/drivers/video/matroxfb.c
Previous file: linux/drivers/video/macfb.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.13/linux/drivers/video/macmodes.c linux/drivers/video/macmodes.c
@@ -14,240 +14,151 @@
 
 #include <video/macmodes.h>
 
-struct mac_mode {
-    int number;
-    u32 xres;
-    u32 yres;
-    u32 pixclock;
-    u32 left_margin;
-    u32 right_margin;
-    u32 upper_margin;
-    u32 lower_margin;
-    u32 hsync_len;
-    u32 vsync_len;
-    u32 sync;
-    u32 vmode;
-};
-
-
-    /* 512x384, 60Hz, Interlaced (NTSC) */
-
-#if 0
-static const struct mac_mode mac_mode_1 = {
-    VMODE_512_384_60I, 512, 384,
-    pixclock, left, right, upper, lower, hslen, vslen,
-    sync, FB_VMODE_INTERLACED
-};
-#endif
-
-    /* 512x384, 60Hz, Non-Interlaced */
-
-#if 0
-static const struct mac_mode mac_mode_2 = {
-    VMODE_512_384_60, 512, 384,
-    pixclock, left, right, upper, lower, hslen, vslen,
-    sync, FB_VMODE_NONINTERLACED
-};
-#endif
-
-    /* 640x480, 50Hz, Interlaced (PAL) */
-
-#if 0
-static const struct mac_mode mac_mode_3 = {
-    VMODE_640_480_50I, 640, 480,
-    pixclock, left, right, upper, lower, hslen, vslen,
-    sync, FB_VMODE_INTERLACED
-};
-#endif
-
-    /* 640x480, 60Hz, Interlaced (NTSC) */
-
-#if 0
-static const struct mac_mode mac_mode_4 = {
-    VMODE_640_480_60I, 640, 480,
-    pixclock, left, right, upper, lower, hslen, vslen,
-    sync, FB_VMODE_INTERLACED
-};
-#endif
 
-    /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
-
-static const struct mac_mode mac_mode_5 = {
-    VMODE_640_480_60, 640, 480,
-    39722, 32, 32, 33, 10, 96, 2,
-    0, FB_VMODE_NONINTERLACED
-};
-
-    /* 640x480, 67Hz, Non-Interlaced (30.0 MHz dotclock) */
+    /*
+     *  MacOS video mode definitions
+     *
+     *  Order IS important! If you change these, don't forget to update
+     *  mac_modes[] below!
+     */
 
-static const struct mac_mode mac_mode_6 = {
-    VMODE_640_480_67, 640, 480,
-    33334, 80, 80, 39, 3, 64, 3,
-    0, FB_VMODE_NONINTERLACED
-};
+#define DEFAULT_MODEDB_INDEX	0
 
-    /* 640x870, 75Hz (portrait), Non-Interlaced */
+static const struct fb_videomode mac_modedb[] = {
+    {
+	/* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */
+	"mac5", 60, 640, 480, 39722, 32, 32, 33, 10, 96, 2,
+	0, FB_VMODE_NONINTERLACED
+    }, {
+	/* 640x480, 67Hz, Non-Interlaced (30.0 MHz dotclock) */
+	"mac6", 67, 640, 480, 33334, 80, 80, 39, 3, 64, 3,
+	0, FB_VMODE_NONINTERLACED
+    }, {
+	/* 800x600, 56 Hz, Non-Interlaced (36.00 MHz dotclock) */
+	"mac9", 56, 800, 600, 27778, 112, 40, 22, 1, 72, 2,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 800x600, 60 Hz, Non-Interlaced (40.00 MHz dotclock) */
+	"mac10", 60, 800, 600, 25000, 72, 56, 23, 1, 128, 4,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 800x600, 72 Hz, Non-Interlaced (50.00 MHz dotclock) */
+	"mac11", 72, 800, 600, 20000, 48, 72, 23, 37, 120, 6,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 800x600, 75 Hz, Non-Interlaced (49.50 MHz dotclock) */
+	"mac12", 75, 800, 600, 20203, 144, 32, 21, 1, 80, 3,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 832x624, 75Hz, Non-Interlaced (57.6 MHz dotclock) */
+	"mac13", 75, 832, 624, 17362, 208, 48, 39, 1, 64, 3,
+	0, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1024x768, 60 Hz, Non-Interlaced (65.00 MHz dotclock) */
+	"mac14", 60, 1024, 768, 15385, 144, 40, 29, 3, 136, 6,
+	0, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1024x768, 72 Hz, Non-Interlaced (75.00 MHz dotclock) */
+	"mac15", 72, 1024, 768, 13334, 128, 40, 29, 3, 136, 6,
+	0, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */
+	"mac16", 75, 1024, 768, 12699, 176, 16, 28, 1, 96, 3,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */
+	"mac17", 75, 1024, 768, 12699, 160, 32, 28, 1, 96, 3,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1152x870, 75 Hz, Non-Interlaced (100.0 MHz dotclock) */
+	"mac18", 75, 1152, 870, 10000, 128, 48, 39, 3, 128, 3,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1280x960, 75 Hz, Non-Interlaced (126.00 MHz dotclock) */
+	"mac19", 75, 1280, 960, 7937, 224, 32, 36, 1, 144, 3,
+	0, FB_VMODE_NONINTERLACED
+    }, {
+	/* 1280x1024, 75 Hz, Non-Interlaced (135.00 MHz dotclock) */
+	"mac20", 75, 1280, 1024, 7408, 232, 64, 38, 1, 112, 3,
+	FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
+    },
 
 #if 0
-static const struct mac_mode mac_mode_7 = {
-    VMODE_640_870_75P, 640, 870,
-    pixclock, left, right, upper, lower, hslen, vslen,
-    sync, FB_VMODE_NONINTERLACED
-};
+    /* Anyone who has timings for these? */
+    {
+	/* VMODE_512_384_60I: 512x384, 60Hz, Interlaced (NTSC) */
+	"mac1", 60, 512, 384, pixclock, left, right, upper, lower, hslen, vslen,
+	sync, FB_VMODE_INTERLACED
+    }, {
+	/* VMODE_512_384_60: 512x384, 60Hz, Non-Interlaced */
+    	"mac2", 60, 512, 384, pixclock, left, right, upper, lower, hslen, vslen,
+	sync, FB_VMODE_NONINTERLACED
+    }, {
+	/* VMODE_640_480_50I: 640x480, 50Hz, Interlaced (PAL) */
+	"mac3", 50, 640, 480, pixclock, left, right, upper, lower, hslen, vslen,
+	sync, FB_VMODE_INTERLACED
+    }, {
+	/* VMODE_640_480_60I: 640x480, 60Hz, Interlaced (NTSC) */
+	"mac4", 60, 640, 480, pixclock, left, right, upper, lower, hslen, vslen,
+	sync, FB_VMODE_INTERLACED
+    }, {
+	/* VMODE_640_870_75P: 640x870, 75Hz (portrait), Non-Interlaced */
+	"mac7", 75, 640, 870, pixclock, left, right, upper, lower, hslen, vslen,
+	sync, FB_VMODE_NONINTERLACED
+    }, {
+	/* VMODE_768_576_50I: 768x576, 50Hz (PAL full frame), Interlaced */
+	"mac8", 50, 768, 576, pixclock, left, right, upper, lower, hslen, vslen,
+	sync, FB_VMODE_INTERLACED
+    },
 #endif
-
-    /* 768x576, 50Hz (PAL full frame), Interlaced */
-
-#if 0
-static const struct mac_mode mac_mode_8 = {
-    VMODE_768_576_50I, 768, 576,
-    pixclock, left, right, upper, lower, hslen, vslen,
-    sync, FB_VMODE_INTERLACED
 };
-#endif
 
-    /* 800x600, 56 Hz, Non-Interlaced (36.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_9 = {
-    VMODE_800_600_56, 800, 600,
-    27778, 112, 40, 22, 1, 72, 2,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 800x600, 60 Hz, Non-Interlaced (40.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_10 = {
-    VMODE_800_600_60, 800, 600,
-    25000, 72, 56, 23, 1, 128, 4,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 800x600, 72 Hz, Non-Interlaced (50.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_11 = {
-    VMODE_800_600_72, 800, 600,
-    20000, 48, 72, 23, 37, 120, 6,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 800x600, 75 Hz, Non-Interlaced (49.50 MHz dotclock) */
-
-static const struct mac_mode mac_mode_12 = {
-    VMODE_800_600_75, 800, 600,
-    20203, 144, 32, 21, 1, 80, 3,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 832x624, 75Hz, Non-Interlaced (57.6 MHz */
-
-static const struct mac_mode mac_mode_13 = {
-    VMODE_832_624_75, 832, 624,
-    17362, 208, 48, 39, 1, 64, 3,
-    0, FB_VMODE_NONINTERLACED
-};
-
-    /* 1024x768, 60 Hz, Non-Interlaced (65.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_14 = {
-    VMODE_1024_768_60, 1024, 768,
-    15385, 144, 40, 29, 3, 136, 6,
-    0, FB_VMODE_NONINTERLACED
-};
-
-    /* 1024x768, 72 Hz, Non-Interlaced (75.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_15 = {
-    VMODE_1024_768_70, 1024, 768,
-    13334, 128, 40, 29, 3, 136, 6,
-    0, FB_VMODE_NONINTERLACED
-};
-
-    /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */
-
-static const struct mac_mode mac_mode_16 = {
-    VMODE_1024_768_75V, 1024, 768,
-    12699, 176, 16, 28, 1, 96, 3,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */
-
-static const struct mac_mode mac_mode_17 = {
-    VMODE_1024_768_75, 1024, 768,
-    12699, 160, 32, 28, 1, 96, 3,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 1152x870, 75 Hz, Non-Interlaced (100.0 MHz dotclock) */
-
-static const struct mac_mode mac_mode_18 = {
-    VMODE_1152_870_75, 1152, 870,
-    10000, 128, 48, 39, 3, 128, 3,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
-
-    /* 1280x960, 75 Hz, Non-Interlaced (126.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_19 = {
-    VMODE_1280_960_75, 1280, 960,
-    7937, 224, 32, 36, 1, 144, 3,
-    0, FB_VMODE_NONINTERLACED
-};
-
-    /* 1280x1024, 75 Hz, Non-Interlaced (135.00 MHz dotclock) */
-
-static const struct mac_mode mac_mode_20 = {
-    VMODE_1280_1024_75, 1280, 1024,
-    7408, 232, 64, 38, 1, 112, 3,
-    FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED
-};
 
+    /*
+     *  Mapping between MacOS video mode numbers and video mode definitions
+     *
+     *  These MUST be ordered in
+     *    - increasing resolution
+     *    - decreasing refresh rate
+     */
 
-static const struct mac_mode *mac_modes[20] = {
-    NULL,		/* 512x384, 60Hz interlaced (NTSC) */
-    NULL,		/* 512x384, 60Hz */
-    NULL,		/* 640x480, 50Hz interlaced (PAL) */
-    NULL,		/* 640x480, 60Hz interlaced (NTSC) */
-    &mac_mode_5,	/* 640x480, 60Hz (VGA) */
-    &mac_mode_6,	/* 640x480, 67Hz */
-    NULL,		/* 640x870, 75Hz (portrait) */
-    NULL,		/* 768x576, 50Hz (PAL full frame) */
-    &mac_mode_9,	/* 800x600, 56Hz */
-    &mac_mode_10,	/* 800x600, 60Hz */
-    &mac_mode_11,	/* 800x600, 72Hz */
-    &mac_mode_12,	/* 800x600, 75Hz */
-    &mac_mode_13,	/* 832x624, 75Hz */
-    &mac_mode_14,	/* 1024x768, 60Hz */
-    &mac_mode_15,	/* 1024x768, 70Hz (or 72Hz?) */
-    &mac_mode_16,	/* 1024x768, 75Hz (VESA) */
-    &mac_mode_17,	/* 1024x768, 75Hz */
-    &mac_mode_18,	/* 1152x870, 75Hz */
-    &mac_mode_19,	/* 1280x960, 75Hz */
-    &mac_mode_20,	/* 1280x1024, 75Hz */
+static const struct mode_map {
+    int vmode;
+    const struct fb_videomode *mode;
+} mac_modes[] = {
+    /* 640x480 */
+    { VMODE_640_480_67, &mac_modedb[1] },
+    { VMODE_640_480_60, &mac_modedb[0] },
+    /* 800x600 */
+    { VMODE_800_600_75, &mac_modedb[5] },
+    { VMODE_800_600_72, &mac_modedb[4] },
+    { VMODE_800_600_60, &mac_modedb[3] },
+    { VMODE_800_600_56, &mac_modedb[2] },
+    /* 832x624 */
+    { VMODE_832_624_75, &mac_modedb[6] },
+    /* 1024x768 */
+    { VMODE_1024_768_75, &mac_modedb[10] },
+    { VMODE_1024_768_75V, &mac_modedb[9] },
+    { VMODE_1024_768_70, &mac_modedb[8] },
+    { VMODE_1024_768_60, &mac_modedb[7] },
+    /* 1152x870 */
+    { VMODE_1152_870_75, &mac_modedb[11] },
+    /* 1280x960 */
+    { VMODE_1280_960_75, &mac_modedb[12] },
+    /* 1280x1024 */
+    { VMODE_1280_1024_75, &mac_modedb[13] },
+    { -1, NULL }
 };
 
-static const struct mac_mode *mac_modes_inv[] = {
-    &mac_mode_6,	/* 640x480, 67Hz */
-    &mac_mode_5,	/* 640x480, 60Hz (VGA) */
-    &mac_mode_12,	/* 800x600, 75Hz */
-    &mac_mode_11,	/* 800x600, 72Hz */
-    &mac_mode_10,	/* 800x600, 60Hz */
-    &mac_mode_9,	/* 800x600, 56Hz */
-    &mac_mode_13,	/* 832x624, 75Hz */
-    &mac_mode_17,	/* 1024x768, 75Hz */
-    &mac_mode_16,	/* 1024x768, 75Hz (VESA) */
-    &mac_mode_15,	/* 1024x768, 70Hz (or 72Hz?) */
-    &mac_mode_14,	/* 1024x768, 60Hz */
-    &mac_mode_18,	/* 1152x870, 75Hz */
-    &mac_mode_19,	/* 1280x960, 75Hz */
-    &mac_mode_20,	/* 1280x1024, 75Hz */
-};
 
+    /*
+     *  Mapping between monitor sense values and MacOS video mode numbers
+     */
 
-static struct mon_map {
+static const struct monitor_map {
     int sense;
     int vmode;
-} monitor_map[] = {
+} mac_monitors[] = {
     { 0x000, VMODE_1280_1024_75 },	/* 21" RGB */
     { 0x114, VMODE_640_870_75P },	/* Portrait Monochrome */
     { 0x221, VMODE_512_384_60 },	/* 12" RGB*/
@@ -277,11 +188,14 @@
 
 int mac_vmode_to_var(int vmode, int cmode, struct fb_var_screeninfo *var)
 {
-    const struct mac_mode *mode = NULL;
-
-    if (vmode > 0 && vmode <= VMODE_MAX)
-	mode = mac_modes[vmode-1];
+    const struct fb_videomode *mode = NULL;
+    const struct mode_map *map;
 
+    for (map = mac_modes; map->vmode != -1; map++)
+	if (map->vmode == vmode) {
+	    mode = map->mode;
+	    break;
+	}
     if (!mode)
 	return -EINVAL;
 
@@ -348,7 +262,8 @@
 int mac_var_to_vmode(const struct fb_var_screeninfo *var, int *vmode,
 		     int *cmode)
 {
-    unsigned int i;
+    const struct fb_videomode *mode = NULL;
+    const struct mode_map *map;
 
     if (var->bits_per_pixel <= 8)
 	*cmode = CMODE_8;
@@ -359,8 +274,8 @@
     else
 	return -EINVAL;
 
-    for (i = 0; i < sizeof(mac_modes_inv)/sizeof(*mac_modes_inv); i++) {
-	const struct mac_mode *mode = mac_modes_inv[i];
+    for (map = mac_modes; map->vmode != -1; map++) {
+	mode = map->mode;
 	if (var->xres > mode->xres || var->yres > mode->yres)
 	    continue;
 	if (var->xres_virtual > mode->xres || var->yres_virtual > mode->yres)
@@ -369,7 +284,7 @@
 	    continue;
 	if ((var->vmode & FB_VMODE_MASK) != mode->vmode)
 	    continue;
-	*vmode = mode->number;
+	*vmode = map->vmode;
 	return 0;
     }
     return -EINVAL;
@@ -382,10 +297,32 @@
 
 int mac_map_monitor_sense(int sense)
 {
-    struct mon_map *map;
+    const struct monitor_map *map;
 
-    for (map = monitor_map; map->sense >= 0; ++map)
+    for (map = mac_monitors; map->sense != -1; map++)
 	if (map->sense == sense)
 	    break;
     return map->vmode;
+}
+
+
+    /*
+     *  Find a suitable video mode
+     *
+     *  If the name of the wanted mode begins with `mac', use the Mac video
+     *  mode database, else fall back to the standard video mode database.
+     */
+
+int __init mac_find_mode(struct fb_var_screeninfo *var, struct fb_info *info,
+			 const char *mode_option, unsigned int default_bpp)
+{
+    const struct fb_videomode *db = NULL;
+    unsigned int dbsize = 0;
+
+    if (mode_option && !strncmp(mode_option, "mac", 3)) {
+	db = mac_modedb;
+	dbsize = sizeof(mac_modedb)/sizeof(*mac_modedb);
+    }
+    return fb_find_mode(var, info, mode_option, db, dbsize,
+			&mac_modedb[DEFAULT_MODEDB_INDEX], default_bpp);
 }

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)