162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * linux/drivers/video/macmodes.c -- Standard MacOS video modes 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 1998 Geert Uytterhoeven 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * 2000 - Removal of OpenFirmware dependencies by: 762306a36Sopenharmony_ci * - Ani Joshi 862306a36Sopenharmony_ci * - Brad Douglas <brad@neruo.com> 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * 2001 - Documented with DocBook 1162306a36Sopenharmony_ci * - Brad Douglas <brad@neruo.com> 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 1462306a36Sopenharmony_ci * License. See the file COPYING in the main directory of this archive for 1562306a36Sopenharmony_ci * more details. 1662306a36Sopenharmony_ci */ 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <linux/errno.h> 1962306a36Sopenharmony_ci#include <linux/fb.h> 2062306a36Sopenharmony_ci#include <linux/string.h> 2162306a36Sopenharmony_ci#include <linux/module.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include "macmodes.h" 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci /* 2662306a36Sopenharmony_ci * MacOS video mode definitions 2762306a36Sopenharmony_ci * 2862306a36Sopenharmony_ci * Order IS important! If you change these, don't forget to update 2962306a36Sopenharmony_ci * mac_modes[] below! 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define DEFAULT_MODEDB_INDEX 0 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic const struct fb_videomode mac_modedb[] = { 3562306a36Sopenharmony_ci { 3662306a36Sopenharmony_ci /* 512x384, 60Hz, Non-Interlaced (15.67 MHz dot clock) */ 3762306a36Sopenharmony_ci "mac2", 60, 512, 384, 63828, 80, 16, 19, 1, 32, 3, 3862306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 3962306a36Sopenharmony_ci }, { 4062306a36Sopenharmony_ci /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */ 4162306a36Sopenharmony_ci "mac5", 60, 640, 480, 39722, 32, 32, 33, 10, 96, 2, 4262306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 4362306a36Sopenharmony_ci }, { 4462306a36Sopenharmony_ci /* 640x480, 67Hz, Non-Interlaced (30.0 MHz dotclock) */ 4562306a36Sopenharmony_ci "mac6", 67, 640, 480, 33334, 80, 80, 39, 3, 64, 3, 4662306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 4762306a36Sopenharmony_ci }, { 4862306a36Sopenharmony_ci /* 640x870, 75Hz (portrait), Non-Interlaced (57.28 MHz dot clock) */ 4962306a36Sopenharmony_ci "mac7", 75, 640, 870, 17457, 80, 32, 42, 3, 80, 3, 5062306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 5162306a36Sopenharmony_ci }, { 5262306a36Sopenharmony_ci /* 800x600, 56 Hz, Non-Interlaced (36.00 MHz dotclock) */ 5362306a36Sopenharmony_ci "mac9", 56, 800, 600, 27778, 112, 40, 22, 1, 72, 2, 5462306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 5562306a36Sopenharmony_ci }, { 5662306a36Sopenharmony_ci /* 800x600, 60 Hz, Non-Interlaced (40.00 MHz dotclock) */ 5762306a36Sopenharmony_ci "mac10", 60, 800, 600, 25000, 72, 56, 23, 1, 128, 4, 5862306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 5962306a36Sopenharmony_ci }, { 6062306a36Sopenharmony_ci /* 800x600, 72 Hz, Non-Interlaced (50.00 MHz dotclock) */ 6162306a36Sopenharmony_ci "mac11", 72, 800, 600, 20000, 48, 72, 23, 37, 120, 6, 6262306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 6362306a36Sopenharmony_ci }, { 6462306a36Sopenharmony_ci /* 800x600, 75 Hz, Non-Interlaced (49.50 MHz dotclock) */ 6562306a36Sopenharmony_ci "mac12", 75, 800, 600, 20203, 144, 32, 21, 1, 80, 3, 6662306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 6762306a36Sopenharmony_ci }, { 6862306a36Sopenharmony_ci /* 832x624, 75Hz, Non-Interlaced (57.6 MHz dotclock) */ 6962306a36Sopenharmony_ci "mac13", 75, 832, 624, 17362, 208, 48, 39, 1, 64, 3, 7062306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 7162306a36Sopenharmony_ci }, { 7262306a36Sopenharmony_ci /* 1024x768, 60 Hz, Non-Interlaced (65.00 MHz dotclock) */ 7362306a36Sopenharmony_ci "mac14", 60, 1024, 768, 15385, 144, 40, 29, 3, 136, 6, 7462306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 7562306a36Sopenharmony_ci }, { 7662306a36Sopenharmony_ci /* 1024x768, 72 Hz, Non-Interlaced (75.00 MHz dotclock) */ 7762306a36Sopenharmony_ci "mac15", 72, 1024, 768, 13334, 128, 40, 29, 3, 136, 6, 7862306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 7962306a36Sopenharmony_ci }, { 8062306a36Sopenharmony_ci /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */ 8162306a36Sopenharmony_ci "mac16", 75, 1024, 768, 12699, 176, 16, 28, 1, 96, 3, 8262306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 8362306a36Sopenharmony_ci }, { 8462306a36Sopenharmony_ci /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */ 8562306a36Sopenharmony_ci "mac17", 75, 1024, 768, 12699, 160, 32, 28, 1, 96, 3, 8662306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 8762306a36Sopenharmony_ci }, { 8862306a36Sopenharmony_ci /* 1152x870, 75 Hz, Non-Interlaced (100.0 MHz dotclock) */ 8962306a36Sopenharmony_ci "mac18", 75, 1152, 870, 10000, 128, 48, 39, 3, 128, 3, 9062306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 9162306a36Sopenharmony_ci }, { 9262306a36Sopenharmony_ci /* 1280x960, 75 Hz, Non-Interlaced (126.00 MHz dotclock) */ 9362306a36Sopenharmony_ci "mac19", 75, 1280, 960, 7937, 224, 32, 36, 1, 144, 3, 9462306a36Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 9562306a36Sopenharmony_ci }, { 9662306a36Sopenharmony_ci /* 1280x1024, 75 Hz, Non-Interlaced (135.00 MHz dotclock) */ 9762306a36Sopenharmony_ci "mac20", 75, 1280, 1024, 7408, 232, 64, 38, 1, 112, 3, 9862306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 9962306a36Sopenharmony_ci }, { 10062306a36Sopenharmony_ci /* 1152x768, 60 Hz, Titanium PowerBook */ 10162306a36Sopenharmony_ci "mac21", 60, 1152, 768, 15386, 158, 26, 29, 3, 136, 6, 10262306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 10362306a36Sopenharmony_ci }, { 10462306a36Sopenharmony_ci /* 1600x1024, 60 Hz, Non-Interlaced (112.27 MHz dotclock) */ 10562306a36Sopenharmony_ci "mac22", 60, 1600, 1024, 8908, 88, 104, 1, 10, 16, 1, 10662306a36Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 10762306a36Sopenharmony_ci } 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci#if 0 11062306a36Sopenharmony_ci /* Anyone who has timings for these? */ 11162306a36Sopenharmony_ci { 11262306a36Sopenharmony_ci /* VMODE_512_384_60I: 512x384, 60Hz, Interlaced (NTSC) */ 11362306a36Sopenharmony_ci "mac1", 60, 512, 384, pixclock, left, right, upper, lower, hslen, vslen, 11462306a36Sopenharmony_ci sync, FB_VMODE_INTERLACED 11562306a36Sopenharmony_ci }, { 11662306a36Sopenharmony_ci /* VMODE_640_480_50I: 640x480, 50Hz, Interlaced (PAL) */ 11762306a36Sopenharmony_ci "mac3", 50, 640, 480, pixclock, left, right, upper, lower, hslen, vslen, 11862306a36Sopenharmony_ci sync, FB_VMODE_INTERLACED 11962306a36Sopenharmony_ci }, { 12062306a36Sopenharmony_ci /* VMODE_640_480_60I: 640x480, 60Hz, Interlaced (NTSC) */ 12162306a36Sopenharmony_ci "mac4", 60, 640, 480, pixclock, left, right, upper, lower, hslen, vslen, 12262306a36Sopenharmony_ci sync, FB_VMODE_INTERLACED 12362306a36Sopenharmony_ci }, { 12462306a36Sopenharmony_ci /* VMODE_768_576_50I: 768x576, 50Hz (PAL full frame), Interlaced */ 12562306a36Sopenharmony_ci "mac8", 50, 768, 576, pixclock, left, right, upper, lower, hslen, vslen, 12662306a36Sopenharmony_ci sync, FB_VMODE_INTERLACED 12762306a36Sopenharmony_ci }, 12862306a36Sopenharmony_ci#endif 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci /* 13362306a36Sopenharmony_ci * Mapping between MacOS video mode numbers and video mode definitions 13462306a36Sopenharmony_ci * 13562306a36Sopenharmony_ci * These MUST be ordered in 13662306a36Sopenharmony_ci * - increasing resolution 13762306a36Sopenharmony_ci * - decreasing pixel clock period 13862306a36Sopenharmony_ci */ 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic const struct mode_map { 14162306a36Sopenharmony_ci int vmode; 14262306a36Sopenharmony_ci const struct fb_videomode *mode; 14362306a36Sopenharmony_ci} mac_modes[] = { 14462306a36Sopenharmony_ci /* 512x384 */ 14562306a36Sopenharmony_ci { VMODE_512_384_60, &mac_modedb[0] }, 14662306a36Sopenharmony_ci /* 640x480 */ 14762306a36Sopenharmony_ci { VMODE_640_480_60, &mac_modedb[1] }, 14862306a36Sopenharmony_ci { VMODE_640_480_67, &mac_modedb[2] }, 14962306a36Sopenharmony_ci /* 640x870 */ 15062306a36Sopenharmony_ci { VMODE_640_870_75P, &mac_modedb[3] }, 15162306a36Sopenharmony_ci /* 800x600 */ 15262306a36Sopenharmony_ci { VMODE_800_600_56, &mac_modedb[4] }, 15362306a36Sopenharmony_ci { VMODE_800_600_60, &mac_modedb[5] }, 15462306a36Sopenharmony_ci { VMODE_800_600_75, &mac_modedb[7] }, 15562306a36Sopenharmony_ci { VMODE_800_600_72, &mac_modedb[6] }, 15662306a36Sopenharmony_ci /* 832x624 */ 15762306a36Sopenharmony_ci { VMODE_832_624_75, &mac_modedb[8] }, 15862306a36Sopenharmony_ci /* 1024x768 */ 15962306a36Sopenharmony_ci { VMODE_1024_768_60, &mac_modedb[9] }, 16062306a36Sopenharmony_ci { VMODE_1024_768_70, &mac_modedb[10] }, 16162306a36Sopenharmony_ci { VMODE_1024_768_75V, &mac_modedb[11] }, 16262306a36Sopenharmony_ci { VMODE_1024_768_75, &mac_modedb[12] }, 16362306a36Sopenharmony_ci /* 1152x768 */ 16462306a36Sopenharmony_ci { VMODE_1152_768_60, &mac_modedb[16] }, 16562306a36Sopenharmony_ci /* 1152x870 */ 16662306a36Sopenharmony_ci { VMODE_1152_870_75, &mac_modedb[13] }, 16762306a36Sopenharmony_ci /* 1280x960 */ 16862306a36Sopenharmony_ci { VMODE_1280_960_75, &mac_modedb[14] }, 16962306a36Sopenharmony_ci /* 1280x1024 */ 17062306a36Sopenharmony_ci { VMODE_1280_1024_75, &mac_modedb[15] }, 17162306a36Sopenharmony_ci /* 1600x1024 */ 17262306a36Sopenharmony_ci { VMODE_1600_1024_60, &mac_modedb[17] }, 17362306a36Sopenharmony_ci { -1, NULL } 17462306a36Sopenharmony_ci}; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci /* 17862306a36Sopenharmony_ci * Mapping between monitor sense values and MacOS video mode numbers 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistatic const struct monitor_map { 18262306a36Sopenharmony_ci int sense; 18362306a36Sopenharmony_ci int vmode; 18462306a36Sopenharmony_ci} mac_monitors[] = { 18562306a36Sopenharmony_ci { 0x000, VMODE_1280_1024_75 }, /* 21" RGB */ 18662306a36Sopenharmony_ci { 0x114, VMODE_640_870_75P }, /* Portrait Monochrome */ 18762306a36Sopenharmony_ci { 0x221, VMODE_512_384_60 }, /* 12" RGB*/ 18862306a36Sopenharmony_ci { 0x331, VMODE_1280_1024_75 }, /* 21" RGB (Radius) */ 18962306a36Sopenharmony_ci { 0x334, VMODE_1280_1024_75 }, /* 21" mono (Radius) */ 19062306a36Sopenharmony_ci { 0x335, VMODE_1280_1024_75 }, /* 21" mono */ 19162306a36Sopenharmony_ci { 0x40A, VMODE_640_480_60I }, /* NTSC */ 19262306a36Sopenharmony_ci { 0x51E, VMODE_640_870_75P }, /* Portrait RGB */ 19362306a36Sopenharmony_ci { 0x603, VMODE_832_624_75 }, /* 12"-16" multiscan */ 19462306a36Sopenharmony_ci { 0x60b, VMODE_1024_768_70 }, /* 13"-19" multiscan */ 19562306a36Sopenharmony_ci { 0x623, VMODE_1152_870_75 }, /* 13"-21" multiscan */ 19662306a36Sopenharmony_ci { 0x62b, VMODE_640_480_67 }, /* 13"/14" RGB */ 19762306a36Sopenharmony_ci { 0x700, VMODE_640_480_50I }, /* PAL */ 19862306a36Sopenharmony_ci { 0x714, VMODE_640_480_60I }, /* NTSC */ 19962306a36Sopenharmony_ci { 0x717, VMODE_800_600_75 }, /* VGA */ 20062306a36Sopenharmony_ci { 0x72d, VMODE_832_624_75 }, /* 16" RGB (Goldfish) */ 20162306a36Sopenharmony_ci { 0x730, VMODE_768_576_50I }, /* PAL (Alternate) */ 20262306a36Sopenharmony_ci { 0x73a, VMODE_1152_870_75 }, /* 3rd party 19" */ 20362306a36Sopenharmony_ci { 0x73f, VMODE_640_480_67 }, /* no sense lines connected at all */ 20462306a36Sopenharmony_ci { 0xBEEF, VMODE_1600_1024_60 }, /* 22" Apple Cinema Display */ 20562306a36Sopenharmony_ci { -1, VMODE_640_480_60 }, /* catch-all, must be last */ 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci/** 20962306a36Sopenharmony_ci * mac_vmode_to_var - converts vmode/cmode pair to var structure 21062306a36Sopenharmony_ci * @vmode: MacOS video mode 21162306a36Sopenharmony_ci * @cmode: MacOS color mode 21262306a36Sopenharmony_ci * @var: frame buffer video mode structure 21362306a36Sopenharmony_ci * 21462306a36Sopenharmony_ci * Converts a MacOS vmode/cmode pair to a frame buffer video 21562306a36Sopenharmony_ci * mode structure. 21662306a36Sopenharmony_ci * 21762306a36Sopenharmony_ci * Returns negative errno on error, or zero for success. 21862306a36Sopenharmony_ci * 21962306a36Sopenharmony_ci */ 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ciint mac_vmode_to_var(int vmode, int cmode, struct fb_var_screeninfo *var) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci const struct fb_videomode *mode = NULL; 22462306a36Sopenharmony_ci const struct mode_map *map; 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci for (map = mac_modes; map->vmode != -1; map++) 22762306a36Sopenharmony_ci if (map->vmode == vmode) { 22862306a36Sopenharmony_ci mode = map->mode; 22962306a36Sopenharmony_ci break; 23062306a36Sopenharmony_ci } 23162306a36Sopenharmony_ci if (!mode) 23262306a36Sopenharmony_ci return -EINVAL; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci memset(var, 0, sizeof(struct fb_var_screeninfo)); 23562306a36Sopenharmony_ci switch (cmode) { 23662306a36Sopenharmony_ci case CMODE_8: 23762306a36Sopenharmony_ci var->bits_per_pixel = 8; 23862306a36Sopenharmony_ci var->red.offset = 0; 23962306a36Sopenharmony_ci var->red.length = 8; 24062306a36Sopenharmony_ci var->green.offset = 0; 24162306a36Sopenharmony_ci var->green.length = 8; 24262306a36Sopenharmony_ci var->blue.offset = 0; 24362306a36Sopenharmony_ci var->blue.length = 8; 24462306a36Sopenharmony_ci break; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci case CMODE_16: 24762306a36Sopenharmony_ci var->bits_per_pixel = 16; 24862306a36Sopenharmony_ci var->red.offset = 10; 24962306a36Sopenharmony_ci var->red.length = 5; 25062306a36Sopenharmony_ci var->green.offset = 5; 25162306a36Sopenharmony_ci var->green.length = 5; 25262306a36Sopenharmony_ci var->blue.offset = 0; 25362306a36Sopenharmony_ci var->blue.length = 5; 25462306a36Sopenharmony_ci break; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci case CMODE_32: 25762306a36Sopenharmony_ci var->bits_per_pixel = 32; 25862306a36Sopenharmony_ci var->red.offset = 16; 25962306a36Sopenharmony_ci var->red.length = 8; 26062306a36Sopenharmony_ci var->green.offset = 8; 26162306a36Sopenharmony_ci var->green.length = 8; 26262306a36Sopenharmony_ci var->blue.offset = 0; 26362306a36Sopenharmony_ci var->blue.length = 8; 26462306a36Sopenharmony_ci var->transp.offset = 24; 26562306a36Sopenharmony_ci var->transp.length = 8; 26662306a36Sopenharmony_ci break; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci default: 26962306a36Sopenharmony_ci return -EINVAL; 27062306a36Sopenharmony_ci } 27162306a36Sopenharmony_ci var->xres = mode->xres; 27262306a36Sopenharmony_ci var->yres = mode->yres; 27362306a36Sopenharmony_ci var->xres_virtual = mode->xres; 27462306a36Sopenharmony_ci var->yres_virtual = mode->yres; 27562306a36Sopenharmony_ci var->height = -1; 27662306a36Sopenharmony_ci var->width = -1; 27762306a36Sopenharmony_ci var->pixclock = mode->pixclock; 27862306a36Sopenharmony_ci var->left_margin = mode->left_margin; 27962306a36Sopenharmony_ci var->right_margin = mode->right_margin; 28062306a36Sopenharmony_ci var->upper_margin = mode->upper_margin; 28162306a36Sopenharmony_ci var->lower_margin = mode->lower_margin; 28262306a36Sopenharmony_ci var->hsync_len = mode->hsync_len; 28362306a36Sopenharmony_ci var->vsync_len = mode->vsync_len; 28462306a36Sopenharmony_ci var->sync = mode->sync; 28562306a36Sopenharmony_ci var->vmode = mode->vmode; 28662306a36Sopenharmony_ci return 0; 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ciEXPORT_SYMBOL(mac_vmode_to_var); 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci/** 29162306a36Sopenharmony_ci * mac_var_to_vmode - convert var structure to MacOS vmode/cmode pair 29262306a36Sopenharmony_ci * @var: frame buffer video mode structure 29362306a36Sopenharmony_ci * @vmode: MacOS video mode 29462306a36Sopenharmony_ci * @cmode: MacOS color mode 29562306a36Sopenharmony_ci * 29662306a36Sopenharmony_ci * Converts a frame buffer video mode structure to a MacOS 29762306a36Sopenharmony_ci * vmode/cmode pair. 29862306a36Sopenharmony_ci * 29962306a36Sopenharmony_ci * Returns negative errno on error, or zero for success. 30062306a36Sopenharmony_ci * 30162306a36Sopenharmony_ci */ 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ciint mac_var_to_vmode(const struct fb_var_screeninfo *var, int *vmode, 30462306a36Sopenharmony_ci int *cmode) 30562306a36Sopenharmony_ci{ 30662306a36Sopenharmony_ci const struct mode_map *map; 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ci if (var->bits_per_pixel <= 8) 30962306a36Sopenharmony_ci *cmode = CMODE_8; 31062306a36Sopenharmony_ci else if (var->bits_per_pixel <= 16) 31162306a36Sopenharmony_ci *cmode = CMODE_16; 31262306a36Sopenharmony_ci else if (var->bits_per_pixel <= 32) 31362306a36Sopenharmony_ci *cmode = CMODE_32; 31462306a36Sopenharmony_ci else 31562306a36Sopenharmony_ci return -EINVAL; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci /* 31862306a36Sopenharmony_ci * Find the mac_mode with a matching resolution or failing that, the 31962306a36Sopenharmony_ci * closest larger resolution. Skip modes with a shorter pixel clock period. 32062306a36Sopenharmony_ci */ 32162306a36Sopenharmony_ci for (map = mac_modes; map->vmode != -1; map++) { 32262306a36Sopenharmony_ci const struct fb_videomode *mode = map->mode; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci if (var->xres > mode->xres || var->yres > mode->yres) 32562306a36Sopenharmony_ci continue; 32662306a36Sopenharmony_ci if (var->xres_virtual > mode->xres || var->yres_virtual > mode->yres) 32762306a36Sopenharmony_ci continue; 32862306a36Sopenharmony_ci if (var->pixclock > mode->pixclock) 32962306a36Sopenharmony_ci continue; 33062306a36Sopenharmony_ci if ((var->vmode & FB_VMODE_MASK) != mode->vmode) 33162306a36Sopenharmony_ci continue; 33262306a36Sopenharmony_ci *vmode = map->vmode; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci /* 33562306a36Sopenharmony_ci * Having found a good resolution, find the matching pixel clock 33662306a36Sopenharmony_ci * or failing that, the closest longer pixel clock period. 33762306a36Sopenharmony_ci */ 33862306a36Sopenharmony_ci map++; 33962306a36Sopenharmony_ci while (map->vmode != -1) { 34062306a36Sopenharmony_ci const struct fb_videomode *clk_mode = map->mode; 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci if (mode->xres != clk_mode->xres || mode->yres != clk_mode->yres) 34362306a36Sopenharmony_ci break; 34462306a36Sopenharmony_ci if (var->pixclock > mode->pixclock) 34562306a36Sopenharmony_ci break; 34662306a36Sopenharmony_ci if (mode->vmode != clk_mode->vmode) 34762306a36Sopenharmony_ci continue; 34862306a36Sopenharmony_ci *vmode = map->vmode; 34962306a36Sopenharmony_ci map++; 35062306a36Sopenharmony_ci } 35162306a36Sopenharmony_ci return 0; 35262306a36Sopenharmony_ci } 35362306a36Sopenharmony_ci return -EINVAL; 35462306a36Sopenharmony_ci} 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci/** 35762306a36Sopenharmony_ci * mac_map_monitor_sense - Convert monitor sense to vmode 35862306a36Sopenharmony_ci * @sense: Macintosh monitor sense number 35962306a36Sopenharmony_ci * 36062306a36Sopenharmony_ci * Converts a Macintosh monitor sense number to a MacOS 36162306a36Sopenharmony_ci * vmode number. 36262306a36Sopenharmony_ci * 36362306a36Sopenharmony_ci * Returns MacOS vmode video mode number. 36462306a36Sopenharmony_ci * 36562306a36Sopenharmony_ci */ 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ciint mac_map_monitor_sense(int sense) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci const struct monitor_map *map; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_ci for (map = mac_monitors; map->sense != -1; map++) 37262306a36Sopenharmony_ci if (map->sense == sense) 37362306a36Sopenharmony_ci break; 37462306a36Sopenharmony_ci return map->vmode; 37562306a36Sopenharmony_ci} 37662306a36Sopenharmony_ciEXPORT_SYMBOL(mac_map_monitor_sense); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci/** 37962306a36Sopenharmony_ci * mac_find_mode - find a video mode 38062306a36Sopenharmony_ci * @var: frame buffer user defined part of display 38162306a36Sopenharmony_ci * @info: frame buffer info structure 38262306a36Sopenharmony_ci * @mode_option: video mode name (see mac_modedb[]) 38362306a36Sopenharmony_ci * @default_bpp: default color depth in bits per pixel 38462306a36Sopenharmony_ci * 38562306a36Sopenharmony_ci * Finds a suitable video mode. Tries to set mode specified 38662306a36Sopenharmony_ci * by @mode_option. If the name of the wanted mode begins with 38762306a36Sopenharmony_ci * 'mac', the Mac video mode database will be used, otherwise it 38862306a36Sopenharmony_ci * will fall back to the standard video mode database. 38962306a36Sopenharmony_ci * 39062306a36Sopenharmony_ci * Note: Function marked as __init and can only be used during 39162306a36Sopenharmony_ci * system boot. 39262306a36Sopenharmony_ci * 39362306a36Sopenharmony_ci * Returns error code from fb_find_mode (see fb_find_mode 39462306a36Sopenharmony_ci * function). 39562306a36Sopenharmony_ci * 39662306a36Sopenharmony_ci */ 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ciint mac_find_mode(struct fb_var_screeninfo *var, struct fb_info *info, 39962306a36Sopenharmony_ci const char *mode_option, unsigned int default_bpp) 40062306a36Sopenharmony_ci{ 40162306a36Sopenharmony_ci const struct fb_videomode *db = NULL; 40262306a36Sopenharmony_ci unsigned int dbsize = 0; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci if (mode_option && !strncmp(mode_option, "mac", 3)) { 40562306a36Sopenharmony_ci mode_option += 3; 40662306a36Sopenharmony_ci db = mac_modedb; 40762306a36Sopenharmony_ci dbsize = ARRAY_SIZE(mac_modedb); 40862306a36Sopenharmony_ci } 40962306a36Sopenharmony_ci return fb_find_mode(var, info, mode_option, db, dbsize, 41062306a36Sopenharmony_ci &mac_modedb[DEFAULT_MODEDB_INDEX], default_bpp); 41162306a36Sopenharmony_ci} 41262306a36Sopenharmony_ciEXPORT_SYMBOL(mac_find_mode); 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 415