18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * linux/drivers/video/macmodes.c -- Standard MacOS video modes 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 1998 Geert Uytterhoeven 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * 2000 - Removal of OpenFirmware dependencies by: 78c2ecf20Sopenharmony_ci * - Ani Joshi 88c2ecf20Sopenharmony_ci * - Brad Douglas <brad@neruo.com> 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * 2001 - Documented with DocBook 118c2ecf20Sopenharmony_ci * - Brad Douglas <brad@neruo.com> 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 148c2ecf20Sopenharmony_ci * License. See the file COPYING in the main directory of this archive for 158c2ecf20Sopenharmony_ci * more details. 168c2ecf20Sopenharmony_ci */ 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <linux/errno.h> 198c2ecf20Sopenharmony_ci#include <linux/fb.h> 208c2ecf20Sopenharmony_ci#include <linux/string.h> 218c2ecf20Sopenharmony_ci#include <linux/module.h> 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci#include "macmodes.h" 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci /* 268c2ecf20Sopenharmony_ci * MacOS video mode definitions 278c2ecf20Sopenharmony_ci * 288c2ecf20Sopenharmony_ci * Order IS important! If you change these, don't forget to update 298c2ecf20Sopenharmony_ci * mac_modes[] below! 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci#define DEFAULT_MODEDB_INDEX 0 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic const struct fb_videomode mac_modedb[] = { 358c2ecf20Sopenharmony_ci { 368c2ecf20Sopenharmony_ci /* 512x384, 60Hz, Non-Interlaced (15.67 MHz dot clock) */ 378c2ecf20Sopenharmony_ci "mac2", 60, 512, 384, 63828, 80, 16, 19, 1, 32, 3, 388c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 398c2ecf20Sopenharmony_ci }, { 408c2ecf20Sopenharmony_ci /* 640x480, 60 Hz, Non-Interlaced (25.175 MHz dotclock) */ 418c2ecf20Sopenharmony_ci "mac5", 60, 640, 480, 39722, 32, 32, 33, 10, 96, 2, 428c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 438c2ecf20Sopenharmony_ci }, { 448c2ecf20Sopenharmony_ci /* 640x480, 67Hz, Non-Interlaced (30.0 MHz dotclock) */ 458c2ecf20Sopenharmony_ci "mac6", 67, 640, 480, 33334, 80, 80, 39, 3, 64, 3, 468c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 478c2ecf20Sopenharmony_ci }, { 488c2ecf20Sopenharmony_ci /* 640x870, 75Hz (portrait), Non-Interlaced (57.28 MHz dot clock) */ 498c2ecf20Sopenharmony_ci "mac7", 75, 640, 870, 17457, 80, 32, 42, 3, 80, 3, 508c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 518c2ecf20Sopenharmony_ci }, { 528c2ecf20Sopenharmony_ci /* 800x600, 56 Hz, Non-Interlaced (36.00 MHz dotclock) */ 538c2ecf20Sopenharmony_ci "mac9", 56, 800, 600, 27778, 112, 40, 22, 1, 72, 2, 548c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 558c2ecf20Sopenharmony_ci }, { 568c2ecf20Sopenharmony_ci /* 800x600, 60 Hz, Non-Interlaced (40.00 MHz dotclock) */ 578c2ecf20Sopenharmony_ci "mac10", 60, 800, 600, 25000, 72, 56, 23, 1, 128, 4, 588c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 598c2ecf20Sopenharmony_ci }, { 608c2ecf20Sopenharmony_ci /* 800x600, 72 Hz, Non-Interlaced (50.00 MHz dotclock) */ 618c2ecf20Sopenharmony_ci "mac11", 72, 800, 600, 20000, 48, 72, 23, 37, 120, 6, 628c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 638c2ecf20Sopenharmony_ci }, { 648c2ecf20Sopenharmony_ci /* 800x600, 75 Hz, Non-Interlaced (49.50 MHz dotclock) */ 658c2ecf20Sopenharmony_ci "mac12", 75, 800, 600, 20203, 144, 32, 21, 1, 80, 3, 668c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 678c2ecf20Sopenharmony_ci }, { 688c2ecf20Sopenharmony_ci /* 832x624, 75Hz, Non-Interlaced (57.6 MHz dotclock) */ 698c2ecf20Sopenharmony_ci "mac13", 75, 832, 624, 17362, 208, 48, 39, 1, 64, 3, 708c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 718c2ecf20Sopenharmony_ci }, { 728c2ecf20Sopenharmony_ci /* 1024x768, 60 Hz, Non-Interlaced (65.00 MHz dotclock) */ 738c2ecf20Sopenharmony_ci "mac14", 60, 1024, 768, 15385, 144, 40, 29, 3, 136, 6, 748c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 758c2ecf20Sopenharmony_ci }, { 768c2ecf20Sopenharmony_ci /* 1024x768, 72 Hz, Non-Interlaced (75.00 MHz dotclock) */ 778c2ecf20Sopenharmony_ci "mac15", 72, 1024, 768, 13334, 128, 40, 29, 3, 136, 6, 788c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 798c2ecf20Sopenharmony_ci }, { 808c2ecf20Sopenharmony_ci /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */ 818c2ecf20Sopenharmony_ci "mac16", 75, 1024, 768, 12699, 176, 16, 28, 1, 96, 3, 828c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 838c2ecf20Sopenharmony_ci }, { 848c2ecf20Sopenharmony_ci /* 1024x768, 75 Hz, Non-Interlaced (78.75 MHz dotclock) */ 858c2ecf20Sopenharmony_ci "mac17", 75, 1024, 768, 12699, 160, 32, 28, 1, 96, 3, 868c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 878c2ecf20Sopenharmony_ci }, { 888c2ecf20Sopenharmony_ci /* 1152x870, 75 Hz, Non-Interlaced (100.0 MHz dotclock) */ 898c2ecf20Sopenharmony_ci "mac18", 75, 1152, 870, 10000, 128, 48, 39, 3, 128, 3, 908c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 918c2ecf20Sopenharmony_ci }, { 928c2ecf20Sopenharmony_ci /* 1280x960, 75 Hz, Non-Interlaced (126.00 MHz dotclock) */ 938c2ecf20Sopenharmony_ci "mac19", 75, 1280, 960, 7937, 224, 32, 36, 1, 144, 3, 948c2ecf20Sopenharmony_ci 0, FB_VMODE_NONINTERLACED 958c2ecf20Sopenharmony_ci }, { 968c2ecf20Sopenharmony_ci /* 1280x1024, 75 Hz, Non-Interlaced (135.00 MHz dotclock) */ 978c2ecf20Sopenharmony_ci "mac20", 75, 1280, 1024, 7408, 232, 64, 38, 1, 112, 3, 988c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 998c2ecf20Sopenharmony_ci }, { 1008c2ecf20Sopenharmony_ci /* 1152x768, 60 Hz, Titanium PowerBook */ 1018c2ecf20Sopenharmony_ci "mac21", 60, 1152, 768, 15386, 158, 26, 29, 3, 136, 6, 1028c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 1038c2ecf20Sopenharmony_ci }, { 1048c2ecf20Sopenharmony_ci /* 1600x1024, 60 Hz, Non-Interlaced (112.27 MHz dotclock) */ 1058c2ecf20Sopenharmony_ci "mac22", 60, 1600, 1024, 8908, 88, 104, 1, 10, 16, 1, 1068c2ecf20Sopenharmony_ci FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT, FB_VMODE_NONINTERLACED 1078c2ecf20Sopenharmony_ci } 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci#if 0 1108c2ecf20Sopenharmony_ci /* Anyone who has timings for these? */ 1118c2ecf20Sopenharmony_ci { 1128c2ecf20Sopenharmony_ci /* VMODE_512_384_60I: 512x384, 60Hz, Interlaced (NTSC) */ 1138c2ecf20Sopenharmony_ci "mac1", 60, 512, 384, pixclock, left, right, upper, lower, hslen, vslen, 1148c2ecf20Sopenharmony_ci sync, FB_VMODE_INTERLACED 1158c2ecf20Sopenharmony_ci }, { 1168c2ecf20Sopenharmony_ci /* VMODE_640_480_50I: 640x480, 50Hz, Interlaced (PAL) */ 1178c2ecf20Sopenharmony_ci "mac3", 50, 640, 480, pixclock, left, right, upper, lower, hslen, vslen, 1188c2ecf20Sopenharmony_ci sync, FB_VMODE_INTERLACED 1198c2ecf20Sopenharmony_ci }, { 1208c2ecf20Sopenharmony_ci /* VMODE_640_480_60I: 640x480, 60Hz, Interlaced (NTSC) */ 1218c2ecf20Sopenharmony_ci "mac4", 60, 640, 480, pixclock, left, right, upper, lower, hslen, vslen, 1228c2ecf20Sopenharmony_ci sync, FB_VMODE_INTERLACED 1238c2ecf20Sopenharmony_ci }, { 1248c2ecf20Sopenharmony_ci /* VMODE_768_576_50I: 768x576, 50Hz (PAL full frame), Interlaced */ 1258c2ecf20Sopenharmony_ci "mac8", 50, 768, 576, pixclock, left, right, upper, lower, hslen, vslen, 1268c2ecf20Sopenharmony_ci sync, FB_VMODE_INTERLACED 1278c2ecf20Sopenharmony_ci }, 1288c2ecf20Sopenharmony_ci#endif 1298c2ecf20Sopenharmony_ci}; 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci /* 1338c2ecf20Sopenharmony_ci * Mapping between MacOS video mode numbers and video mode definitions 1348c2ecf20Sopenharmony_ci * 1358c2ecf20Sopenharmony_ci * These MUST be ordered in 1368c2ecf20Sopenharmony_ci * - increasing resolution 1378c2ecf20Sopenharmony_ci * - decreasing pixel clock period 1388c2ecf20Sopenharmony_ci */ 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_cistatic const struct mode_map { 1418c2ecf20Sopenharmony_ci int vmode; 1428c2ecf20Sopenharmony_ci const struct fb_videomode *mode; 1438c2ecf20Sopenharmony_ci} mac_modes[] = { 1448c2ecf20Sopenharmony_ci /* 512x384 */ 1458c2ecf20Sopenharmony_ci { VMODE_512_384_60, &mac_modedb[0] }, 1468c2ecf20Sopenharmony_ci /* 640x480 */ 1478c2ecf20Sopenharmony_ci { VMODE_640_480_60, &mac_modedb[1] }, 1488c2ecf20Sopenharmony_ci { VMODE_640_480_67, &mac_modedb[2] }, 1498c2ecf20Sopenharmony_ci /* 640x870 */ 1508c2ecf20Sopenharmony_ci { VMODE_640_870_75P, &mac_modedb[3] }, 1518c2ecf20Sopenharmony_ci /* 800x600 */ 1528c2ecf20Sopenharmony_ci { VMODE_800_600_56, &mac_modedb[4] }, 1538c2ecf20Sopenharmony_ci { VMODE_800_600_60, &mac_modedb[5] }, 1548c2ecf20Sopenharmony_ci { VMODE_800_600_75, &mac_modedb[7] }, 1558c2ecf20Sopenharmony_ci { VMODE_800_600_72, &mac_modedb[6] }, 1568c2ecf20Sopenharmony_ci /* 832x624 */ 1578c2ecf20Sopenharmony_ci { VMODE_832_624_75, &mac_modedb[8] }, 1588c2ecf20Sopenharmony_ci /* 1024x768 */ 1598c2ecf20Sopenharmony_ci { VMODE_1024_768_60, &mac_modedb[9] }, 1608c2ecf20Sopenharmony_ci { VMODE_1024_768_70, &mac_modedb[10] }, 1618c2ecf20Sopenharmony_ci { VMODE_1024_768_75V, &mac_modedb[11] }, 1628c2ecf20Sopenharmony_ci { VMODE_1024_768_75, &mac_modedb[12] }, 1638c2ecf20Sopenharmony_ci /* 1152x768 */ 1648c2ecf20Sopenharmony_ci { VMODE_1152_768_60, &mac_modedb[16] }, 1658c2ecf20Sopenharmony_ci /* 1152x870 */ 1668c2ecf20Sopenharmony_ci { VMODE_1152_870_75, &mac_modedb[13] }, 1678c2ecf20Sopenharmony_ci /* 1280x960 */ 1688c2ecf20Sopenharmony_ci { VMODE_1280_960_75, &mac_modedb[14] }, 1698c2ecf20Sopenharmony_ci /* 1280x1024 */ 1708c2ecf20Sopenharmony_ci { VMODE_1280_1024_75, &mac_modedb[15] }, 1718c2ecf20Sopenharmony_ci /* 1600x1024 */ 1728c2ecf20Sopenharmony_ci { VMODE_1600_1024_60, &mac_modedb[17] }, 1738c2ecf20Sopenharmony_ci { -1, NULL } 1748c2ecf20Sopenharmony_ci}; 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci /* 1788c2ecf20Sopenharmony_ci * Mapping between monitor sense values and MacOS video mode numbers 1798c2ecf20Sopenharmony_ci */ 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistatic const struct monitor_map { 1828c2ecf20Sopenharmony_ci int sense; 1838c2ecf20Sopenharmony_ci int vmode; 1848c2ecf20Sopenharmony_ci} mac_monitors[] = { 1858c2ecf20Sopenharmony_ci { 0x000, VMODE_1280_1024_75 }, /* 21" RGB */ 1868c2ecf20Sopenharmony_ci { 0x114, VMODE_640_870_75P }, /* Portrait Monochrome */ 1878c2ecf20Sopenharmony_ci { 0x221, VMODE_512_384_60 }, /* 12" RGB*/ 1888c2ecf20Sopenharmony_ci { 0x331, VMODE_1280_1024_75 }, /* 21" RGB (Radius) */ 1898c2ecf20Sopenharmony_ci { 0x334, VMODE_1280_1024_75 }, /* 21" mono (Radius) */ 1908c2ecf20Sopenharmony_ci { 0x335, VMODE_1280_1024_75 }, /* 21" mono */ 1918c2ecf20Sopenharmony_ci { 0x40A, VMODE_640_480_60I }, /* NTSC */ 1928c2ecf20Sopenharmony_ci { 0x51E, VMODE_640_870_75P }, /* Portrait RGB */ 1938c2ecf20Sopenharmony_ci { 0x603, VMODE_832_624_75 }, /* 12"-16" multiscan */ 1948c2ecf20Sopenharmony_ci { 0x60b, VMODE_1024_768_70 }, /* 13"-19" multiscan */ 1958c2ecf20Sopenharmony_ci { 0x623, VMODE_1152_870_75 }, /* 13"-21" multiscan */ 1968c2ecf20Sopenharmony_ci { 0x62b, VMODE_640_480_67 }, /* 13"/14" RGB */ 1978c2ecf20Sopenharmony_ci { 0x700, VMODE_640_480_50I }, /* PAL */ 1988c2ecf20Sopenharmony_ci { 0x714, VMODE_640_480_60I }, /* NTSC */ 1998c2ecf20Sopenharmony_ci { 0x717, VMODE_800_600_75 }, /* VGA */ 2008c2ecf20Sopenharmony_ci { 0x72d, VMODE_832_624_75 }, /* 16" RGB (Goldfish) */ 2018c2ecf20Sopenharmony_ci { 0x730, VMODE_768_576_50I }, /* PAL (Alternate) */ 2028c2ecf20Sopenharmony_ci { 0x73a, VMODE_1152_870_75 }, /* 3rd party 19" */ 2038c2ecf20Sopenharmony_ci { 0x73f, VMODE_640_480_67 }, /* no sense lines connected at all */ 2048c2ecf20Sopenharmony_ci { 0xBEEF, VMODE_1600_1024_60 }, /* 22" Apple Cinema Display */ 2058c2ecf20Sopenharmony_ci { -1, VMODE_640_480_60 }, /* catch-all, must be last */ 2068c2ecf20Sopenharmony_ci}; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci/** 2098c2ecf20Sopenharmony_ci * mac_vmode_to_var - converts vmode/cmode pair to var structure 2108c2ecf20Sopenharmony_ci * @vmode: MacOS video mode 2118c2ecf20Sopenharmony_ci * @cmode: MacOS color mode 2128c2ecf20Sopenharmony_ci * @var: frame buffer video mode structure 2138c2ecf20Sopenharmony_ci * 2148c2ecf20Sopenharmony_ci * Converts a MacOS vmode/cmode pair to a frame buffer video 2158c2ecf20Sopenharmony_ci * mode structure. 2168c2ecf20Sopenharmony_ci * 2178c2ecf20Sopenharmony_ci * Returns negative errno on error, or zero for success. 2188c2ecf20Sopenharmony_ci * 2198c2ecf20Sopenharmony_ci */ 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ciint mac_vmode_to_var(int vmode, int cmode, struct fb_var_screeninfo *var) 2228c2ecf20Sopenharmony_ci{ 2238c2ecf20Sopenharmony_ci const struct fb_videomode *mode = NULL; 2248c2ecf20Sopenharmony_ci const struct mode_map *map; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci for (map = mac_modes; map->vmode != -1; map++) 2278c2ecf20Sopenharmony_ci if (map->vmode == vmode) { 2288c2ecf20Sopenharmony_ci mode = map->mode; 2298c2ecf20Sopenharmony_ci break; 2308c2ecf20Sopenharmony_ci } 2318c2ecf20Sopenharmony_ci if (!mode) 2328c2ecf20Sopenharmony_ci return -EINVAL; 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci memset(var, 0, sizeof(struct fb_var_screeninfo)); 2358c2ecf20Sopenharmony_ci switch (cmode) { 2368c2ecf20Sopenharmony_ci case CMODE_8: 2378c2ecf20Sopenharmony_ci var->bits_per_pixel = 8; 2388c2ecf20Sopenharmony_ci var->red.offset = 0; 2398c2ecf20Sopenharmony_ci var->red.length = 8; 2408c2ecf20Sopenharmony_ci var->green.offset = 0; 2418c2ecf20Sopenharmony_ci var->green.length = 8; 2428c2ecf20Sopenharmony_ci var->blue.offset = 0; 2438c2ecf20Sopenharmony_ci var->blue.length = 8; 2448c2ecf20Sopenharmony_ci break; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci case CMODE_16: 2478c2ecf20Sopenharmony_ci var->bits_per_pixel = 16; 2488c2ecf20Sopenharmony_ci var->red.offset = 10; 2498c2ecf20Sopenharmony_ci var->red.length = 5; 2508c2ecf20Sopenharmony_ci var->green.offset = 5; 2518c2ecf20Sopenharmony_ci var->green.length = 5; 2528c2ecf20Sopenharmony_ci var->blue.offset = 0; 2538c2ecf20Sopenharmony_ci var->blue.length = 5; 2548c2ecf20Sopenharmony_ci break; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci case CMODE_32: 2578c2ecf20Sopenharmony_ci var->bits_per_pixel = 32; 2588c2ecf20Sopenharmony_ci var->red.offset = 16; 2598c2ecf20Sopenharmony_ci var->red.length = 8; 2608c2ecf20Sopenharmony_ci var->green.offset = 8; 2618c2ecf20Sopenharmony_ci var->green.length = 8; 2628c2ecf20Sopenharmony_ci var->blue.offset = 0; 2638c2ecf20Sopenharmony_ci var->blue.length = 8; 2648c2ecf20Sopenharmony_ci var->transp.offset = 24; 2658c2ecf20Sopenharmony_ci var->transp.length = 8; 2668c2ecf20Sopenharmony_ci break; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci default: 2698c2ecf20Sopenharmony_ci return -EINVAL; 2708c2ecf20Sopenharmony_ci } 2718c2ecf20Sopenharmony_ci var->xres = mode->xres; 2728c2ecf20Sopenharmony_ci var->yres = mode->yres; 2738c2ecf20Sopenharmony_ci var->xres_virtual = mode->xres; 2748c2ecf20Sopenharmony_ci var->yres_virtual = mode->yres; 2758c2ecf20Sopenharmony_ci var->height = -1; 2768c2ecf20Sopenharmony_ci var->width = -1; 2778c2ecf20Sopenharmony_ci var->pixclock = mode->pixclock; 2788c2ecf20Sopenharmony_ci var->left_margin = mode->left_margin; 2798c2ecf20Sopenharmony_ci var->right_margin = mode->right_margin; 2808c2ecf20Sopenharmony_ci var->upper_margin = mode->upper_margin; 2818c2ecf20Sopenharmony_ci var->lower_margin = mode->lower_margin; 2828c2ecf20Sopenharmony_ci var->hsync_len = mode->hsync_len; 2838c2ecf20Sopenharmony_ci var->vsync_len = mode->vsync_len; 2848c2ecf20Sopenharmony_ci var->sync = mode->sync; 2858c2ecf20Sopenharmony_ci var->vmode = mode->vmode; 2868c2ecf20Sopenharmony_ci return 0; 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ciEXPORT_SYMBOL(mac_vmode_to_var); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci/** 2918c2ecf20Sopenharmony_ci * mac_var_to_vmode - convert var structure to MacOS vmode/cmode pair 2928c2ecf20Sopenharmony_ci * @var: frame buffer video mode structure 2938c2ecf20Sopenharmony_ci * @vmode: MacOS video mode 2948c2ecf20Sopenharmony_ci * @cmode: MacOS color mode 2958c2ecf20Sopenharmony_ci * 2968c2ecf20Sopenharmony_ci * Converts a frame buffer video mode structure to a MacOS 2978c2ecf20Sopenharmony_ci * vmode/cmode pair. 2988c2ecf20Sopenharmony_ci * 2998c2ecf20Sopenharmony_ci * Returns negative errno on error, or zero for success. 3008c2ecf20Sopenharmony_ci * 3018c2ecf20Sopenharmony_ci */ 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciint mac_var_to_vmode(const struct fb_var_screeninfo *var, int *vmode, 3048c2ecf20Sopenharmony_ci int *cmode) 3058c2ecf20Sopenharmony_ci{ 3068c2ecf20Sopenharmony_ci const struct mode_map *map; 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci if (var->bits_per_pixel <= 8) 3098c2ecf20Sopenharmony_ci *cmode = CMODE_8; 3108c2ecf20Sopenharmony_ci else if (var->bits_per_pixel <= 16) 3118c2ecf20Sopenharmony_ci *cmode = CMODE_16; 3128c2ecf20Sopenharmony_ci else if (var->bits_per_pixel <= 32) 3138c2ecf20Sopenharmony_ci *cmode = CMODE_32; 3148c2ecf20Sopenharmony_ci else 3158c2ecf20Sopenharmony_ci return -EINVAL; 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci /* 3188c2ecf20Sopenharmony_ci * Find the mac_mode with a matching resolution or failing that, the 3198c2ecf20Sopenharmony_ci * closest larger resolution. Skip modes with a shorter pixel clock period. 3208c2ecf20Sopenharmony_ci */ 3218c2ecf20Sopenharmony_ci for (map = mac_modes; map->vmode != -1; map++) { 3228c2ecf20Sopenharmony_ci const struct fb_videomode *mode = map->mode; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci if (var->xres > mode->xres || var->yres > mode->yres) 3258c2ecf20Sopenharmony_ci continue; 3268c2ecf20Sopenharmony_ci if (var->xres_virtual > mode->xres || var->yres_virtual > mode->yres) 3278c2ecf20Sopenharmony_ci continue; 3288c2ecf20Sopenharmony_ci if (var->pixclock > mode->pixclock) 3298c2ecf20Sopenharmony_ci continue; 3308c2ecf20Sopenharmony_ci if ((var->vmode & FB_VMODE_MASK) != mode->vmode) 3318c2ecf20Sopenharmony_ci continue; 3328c2ecf20Sopenharmony_ci *vmode = map->vmode; 3338c2ecf20Sopenharmony_ci 3348c2ecf20Sopenharmony_ci /* 3358c2ecf20Sopenharmony_ci * Having found a good resolution, find the matching pixel clock 3368c2ecf20Sopenharmony_ci * or failing that, the closest longer pixel clock period. 3378c2ecf20Sopenharmony_ci */ 3388c2ecf20Sopenharmony_ci map++; 3398c2ecf20Sopenharmony_ci while (map->vmode != -1) { 3408c2ecf20Sopenharmony_ci const struct fb_videomode *clk_mode = map->mode; 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci if (mode->xres != clk_mode->xres || mode->yres != clk_mode->yres) 3438c2ecf20Sopenharmony_ci break; 3448c2ecf20Sopenharmony_ci if (var->pixclock > mode->pixclock) 3458c2ecf20Sopenharmony_ci break; 3468c2ecf20Sopenharmony_ci if (mode->vmode != clk_mode->vmode) 3478c2ecf20Sopenharmony_ci continue; 3488c2ecf20Sopenharmony_ci *vmode = map->vmode; 3498c2ecf20Sopenharmony_ci map++; 3508c2ecf20Sopenharmony_ci } 3518c2ecf20Sopenharmony_ci return 0; 3528c2ecf20Sopenharmony_ci } 3538c2ecf20Sopenharmony_ci return -EINVAL; 3548c2ecf20Sopenharmony_ci} 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci/** 3578c2ecf20Sopenharmony_ci * mac_map_monitor_sense - Convert monitor sense to vmode 3588c2ecf20Sopenharmony_ci * @sense: Macintosh monitor sense number 3598c2ecf20Sopenharmony_ci * 3608c2ecf20Sopenharmony_ci * Converts a Macintosh monitor sense number to a MacOS 3618c2ecf20Sopenharmony_ci * vmode number. 3628c2ecf20Sopenharmony_ci * 3638c2ecf20Sopenharmony_ci * Returns MacOS vmode video mode number. 3648c2ecf20Sopenharmony_ci * 3658c2ecf20Sopenharmony_ci */ 3668c2ecf20Sopenharmony_ci 3678c2ecf20Sopenharmony_ciint mac_map_monitor_sense(int sense) 3688c2ecf20Sopenharmony_ci{ 3698c2ecf20Sopenharmony_ci const struct monitor_map *map; 3708c2ecf20Sopenharmony_ci 3718c2ecf20Sopenharmony_ci for (map = mac_monitors; map->sense != -1; map++) 3728c2ecf20Sopenharmony_ci if (map->sense == sense) 3738c2ecf20Sopenharmony_ci break; 3748c2ecf20Sopenharmony_ci return map->vmode; 3758c2ecf20Sopenharmony_ci} 3768c2ecf20Sopenharmony_ciEXPORT_SYMBOL(mac_map_monitor_sense); 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci/** 3798c2ecf20Sopenharmony_ci * mac_find_mode - find a video mode 3808c2ecf20Sopenharmony_ci * @var: frame buffer user defined part of display 3818c2ecf20Sopenharmony_ci * @info: frame buffer info structure 3828c2ecf20Sopenharmony_ci * @mode_option: video mode name (see mac_modedb[]) 3838c2ecf20Sopenharmony_ci * @default_bpp: default color depth in bits per pixel 3848c2ecf20Sopenharmony_ci * 3858c2ecf20Sopenharmony_ci * Finds a suitable video mode. Tries to set mode specified 3868c2ecf20Sopenharmony_ci * by @mode_option. If the name of the wanted mode begins with 3878c2ecf20Sopenharmony_ci * 'mac', the Mac video mode database will be used, otherwise it 3888c2ecf20Sopenharmony_ci * will fall back to the standard video mode database. 3898c2ecf20Sopenharmony_ci * 3908c2ecf20Sopenharmony_ci * Note: Function marked as __init and can only be used during 3918c2ecf20Sopenharmony_ci * system boot. 3928c2ecf20Sopenharmony_ci * 3938c2ecf20Sopenharmony_ci * Returns error code from fb_find_mode (see fb_find_mode 3948c2ecf20Sopenharmony_ci * function). 3958c2ecf20Sopenharmony_ci * 3968c2ecf20Sopenharmony_ci */ 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ciint mac_find_mode(struct fb_var_screeninfo *var, struct fb_info *info, 3998c2ecf20Sopenharmony_ci const char *mode_option, unsigned int default_bpp) 4008c2ecf20Sopenharmony_ci{ 4018c2ecf20Sopenharmony_ci const struct fb_videomode *db = NULL; 4028c2ecf20Sopenharmony_ci unsigned int dbsize = 0; 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci if (mode_option && !strncmp(mode_option, "mac", 3)) { 4058c2ecf20Sopenharmony_ci mode_option += 3; 4068c2ecf20Sopenharmony_ci db = mac_modedb; 4078c2ecf20Sopenharmony_ci dbsize = ARRAY_SIZE(mac_modedb); 4088c2ecf20Sopenharmony_ci } 4098c2ecf20Sopenharmony_ci return fb_find_mode(var, info, mode_option, db, dbsize, 4108c2ecf20Sopenharmony_ci &mac_modedb[DEFAULT_MODEDB_INDEX], default_bpp); 4118c2ecf20Sopenharmony_ci} 4128c2ecf20Sopenharmony_ciEXPORT_SYMBOL(mac_find_mode); 4138c2ecf20Sopenharmony_ci 4148c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 415