18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Silicon Motion SM7XX frame buffer device 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2006 Silicon Motion Technology Corp. 58c2ecf20Sopenharmony_ci * Authors: Ge Wang, gewang@siliconmotion.com 68c2ecf20Sopenharmony_ci * Boyod boyod.yang@siliconmotion.com.cn 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Copyright (C) 2009 Lemote, Inc. 98c2ecf20Sopenharmony_ci * Author: Wu Zhangjin, wuzhangjin@gmail.com 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * Copyright (C) 2011 Igalia, S.L. 128c2ecf20Sopenharmony_ci * Author: Javier M. Mellid <jmunhoz@igalia.com> 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 158c2ecf20Sopenharmony_ci * License. See the file COPYING in the main directory of this archive for 168c2ecf20Sopenharmony_ci * more details. 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * Framebuffer driver for Silicon Motion SM710, SM712, SM721 and SM722 chips 198c2ecf20Sopenharmony_ci */ 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#include <linux/io.h> 228c2ecf20Sopenharmony_ci#include <linux/fb.h> 238c2ecf20Sopenharmony_ci#include <linux/pci.h> 248c2ecf20Sopenharmony_ci#include <linux/init.h> 258c2ecf20Sopenharmony_ci#include <linux/slab.h> 268c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 278c2ecf20Sopenharmony_ci#include <linux/module.h> 288c2ecf20Sopenharmony_ci#include <linux/console.h> 298c2ecf20Sopenharmony_ci#include <linux/screen_info.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include <linux/pm.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include "sm712.h" 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci/* 368c2ecf20Sopenharmony_ci * Private structure 378c2ecf20Sopenharmony_ci */ 388c2ecf20Sopenharmony_cistruct smtcfb_info { 398c2ecf20Sopenharmony_ci struct pci_dev *pdev; 408c2ecf20Sopenharmony_ci struct fb_info *fb; 418c2ecf20Sopenharmony_ci u16 chip_id; 428c2ecf20Sopenharmony_ci u8 chip_rev_id; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci void __iomem *lfb; /* linear frame buffer */ 458c2ecf20Sopenharmony_ci void __iomem *dp_regs; /* drawing processor control regs */ 468c2ecf20Sopenharmony_ci void __iomem *vp_regs; /* video processor control regs */ 478c2ecf20Sopenharmony_ci void __iomem *cp_regs; /* capture processor control regs */ 488c2ecf20Sopenharmony_ci void __iomem *mmio; /* memory map IO port */ 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci u_int width; 518c2ecf20Sopenharmony_ci u_int height; 528c2ecf20Sopenharmony_ci u_int hz; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci u32 colreg[17]; 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_civoid __iomem *smtc_regbaseaddress; /* Memory Map IO starting address */ 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic const struct fb_var_screeninfo smtcfb_var = { 608c2ecf20Sopenharmony_ci .xres = 1024, 618c2ecf20Sopenharmony_ci .yres = 600, 628c2ecf20Sopenharmony_ci .xres_virtual = 1024, 638c2ecf20Sopenharmony_ci .yres_virtual = 600, 648c2ecf20Sopenharmony_ci .bits_per_pixel = 16, 658c2ecf20Sopenharmony_ci .red = {16, 8, 0}, 668c2ecf20Sopenharmony_ci .green = {8, 8, 0}, 678c2ecf20Sopenharmony_ci .blue = {0, 8, 0}, 688c2ecf20Sopenharmony_ci .activate = FB_ACTIVATE_NOW, 698c2ecf20Sopenharmony_ci .height = -1, 708c2ecf20Sopenharmony_ci .width = -1, 718c2ecf20Sopenharmony_ci .vmode = FB_VMODE_NONINTERLACED, 728c2ecf20Sopenharmony_ci .nonstd = 0, 738c2ecf20Sopenharmony_ci .accel_flags = FB_ACCELF_TEXT, 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic struct fb_fix_screeninfo smtcfb_fix = { 778c2ecf20Sopenharmony_ci .id = "smXXXfb", 788c2ecf20Sopenharmony_ci .type = FB_TYPE_PACKED_PIXELS, 798c2ecf20Sopenharmony_ci .visual = FB_VISUAL_TRUECOLOR, 808c2ecf20Sopenharmony_ci .line_length = 800 * 3, 818c2ecf20Sopenharmony_ci .accel = FB_ACCEL_SMI_LYNX, 828c2ecf20Sopenharmony_ci .type_aux = 0, 838c2ecf20Sopenharmony_ci .xpanstep = 0, 848c2ecf20Sopenharmony_ci .ypanstep = 0, 858c2ecf20Sopenharmony_ci .ywrapstep = 0, 868c2ecf20Sopenharmony_ci}; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistruct vesa_mode { 898c2ecf20Sopenharmony_ci char index[6]; 908c2ecf20Sopenharmony_ci u16 lfb_width; 918c2ecf20Sopenharmony_ci u16 lfb_height; 928c2ecf20Sopenharmony_ci u16 lfb_depth; 938c2ecf20Sopenharmony_ci}; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_cistatic const struct vesa_mode vesa_mode_table[] = { 968c2ecf20Sopenharmony_ci {"0x301", 640, 480, 8}, 978c2ecf20Sopenharmony_ci {"0x303", 800, 600, 8}, 988c2ecf20Sopenharmony_ci {"0x305", 1024, 768, 8}, 998c2ecf20Sopenharmony_ci {"0x307", 1280, 1024, 8}, 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci {"0x311", 640, 480, 16}, 1028c2ecf20Sopenharmony_ci {"0x314", 800, 600, 16}, 1038c2ecf20Sopenharmony_ci {"0x317", 1024, 768, 16}, 1048c2ecf20Sopenharmony_ci {"0x31A", 1280, 1024, 16}, 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci {"0x312", 640, 480, 24}, 1078c2ecf20Sopenharmony_ci {"0x315", 800, 600, 24}, 1088c2ecf20Sopenharmony_ci {"0x318", 1024, 768, 24}, 1098c2ecf20Sopenharmony_ci {"0x31B", 1280, 1024, 24}, 1108c2ecf20Sopenharmony_ci}; 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci/********************************************************************** 1138c2ecf20Sopenharmony_ci SM712 Mode table. 1148c2ecf20Sopenharmony_ci **********************************************************************/ 1158c2ecf20Sopenharmony_cistatic const struct modeinit vgamode[] = { 1168c2ecf20Sopenharmony_ci { 1178c2ecf20Sopenharmony_ci /* mode#0: 640 x 480 16Bpp 60Hz */ 1188c2ecf20Sopenharmony_ci 640, 480, 16, 60, 1198c2ecf20Sopenharmony_ci /* Init_MISC */ 1208c2ecf20Sopenharmony_ci 0xE3, 1218c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 1228c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x00, 0x0E, 1238c2ecf20Sopenharmony_ci }, 1248c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 1258c2ecf20Sopenharmony_ci 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 1268c2ecf20Sopenharmony_ci 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1278c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 1288c2ecf20Sopenharmony_ci }, 1298c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 1308c2ecf20Sopenharmony_ci 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 1318c2ecf20Sopenharmony_ci 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 1328c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 1338c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 1348c2ecf20Sopenharmony_ci 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 1358c2ecf20Sopenharmony_ci 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 1368c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 1378c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 1388c2ecf20Sopenharmony_ci 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, 1398c2ecf20Sopenharmony_ci }, 1408c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 1418c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 1428c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 1438c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 1448c2ecf20Sopenharmony_ci }, 1458c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 1468c2ecf20Sopenharmony_ci 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 1478c2ecf20Sopenharmony_ci 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, 1488c2ecf20Sopenharmony_ci }, 1498c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 1508c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 1518c2ecf20Sopenharmony_ci 0xFF, 1528c2ecf20Sopenharmony_ci }, 1538c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 1548c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 1558c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 1568c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 1578c2ecf20Sopenharmony_ci }, 1588c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 1598c2ecf20Sopenharmony_ci 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 1608c2ecf20Sopenharmony_ci 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1618c2ecf20Sopenharmony_ci 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 1628c2ecf20Sopenharmony_ci 0xFF, 1638c2ecf20Sopenharmony_ci }, 1648c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 1658c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 1668c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 1678c2ecf20Sopenharmony_ci 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 1688c2ecf20Sopenharmony_ci 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, 1698c2ecf20Sopenharmony_ci }, 1708c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 1718c2ecf20Sopenharmony_ci 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 1728c2ecf20Sopenharmony_ci 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 1738c2ecf20Sopenharmony_ci 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 1748c2ecf20Sopenharmony_ci }, 1758c2ecf20Sopenharmony_ci }, 1768c2ecf20Sopenharmony_ci { 1778c2ecf20Sopenharmony_ci /* mode#1: 640 x 480 24Bpp 60Hz */ 1788c2ecf20Sopenharmony_ci 640, 480, 24, 60, 1798c2ecf20Sopenharmony_ci /* Init_MISC */ 1808c2ecf20Sopenharmony_ci 0xE3, 1818c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 1828c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x00, 0x0E, 1838c2ecf20Sopenharmony_ci }, 1848c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 1858c2ecf20Sopenharmony_ci 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 1868c2ecf20Sopenharmony_ci 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1878c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 1888c2ecf20Sopenharmony_ci }, 1898c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 1908c2ecf20Sopenharmony_ci 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 1918c2ecf20Sopenharmony_ci 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 1928c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 1938c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 1948c2ecf20Sopenharmony_ci 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 1958c2ecf20Sopenharmony_ci 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 1968c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 1978c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 1988c2ecf20Sopenharmony_ci 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, 1998c2ecf20Sopenharmony_ci }, 2008c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 2018c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 2028c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 2038c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 2048c2ecf20Sopenharmony_ci }, 2058c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 2068c2ecf20Sopenharmony_ci 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 2078c2ecf20Sopenharmony_ci 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, 2088c2ecf20Sopenharmony_ci }, 2098c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 2108c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 2118c2ecf20Sopenharmony_ci 0xFF, 2128c2ecf20Sopenharmony_ci }, 2138c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 2148c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 2158c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 2168c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 2178c2ecf20Sopenharmony_ci }, 2188c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 2198c2ecf20Sopenharmony_ci 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 2208c2ecf20Sopenharmony_ci 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2218c2ecf20Sopenharmony_ci 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 2228c2ecf20Sopenharmony_ci 0xFF, 2238c2ecf20Sopenharmony_ci }, 2248c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 2258c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 2268c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 2278c2ecf20Sopenharmony_ci 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 2288c2ecf20Sopenharmony_ci 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, 2298c2ecf20Sopenharmony_ci }, 2308c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 2318c2ecf20Sopenharmony_ci 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 2328c2ecf20Sopenharmony_ci 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 2338c2ecf20Sopenharmony_ci 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 2348c2ecf20Sopenharmony_ci }, 2358c2ecf20Sopenharmony_ci }, 2368c2ecf20Sopenharmony_ci { 2378c2ecf20Sopenharmony_ci /* mode#0: 640 x 480 32Bpp 60Hz */ 2388c2ecf20Sopenharmony_ci 640, 480, 32, 60, 2398c2ecf20Sopenharmony_ci /* Init_MISC */ 2408c2ecf20Sopenharmony_ci 0xE3, 2418c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 2428c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x00, 0x0E, 2438c2ecf20Sopenharmony_ci }, 2448c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 2458c2ecf20Sopenharmony_ci 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 2468c2ecf20Sopenharmony_ci 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2478c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 2488c2ecf20Sopenharmony_ci }, 2498c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 2508c2ecf20Sopenharmony_ci 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 2518c2ecf20Sopenharmony_ci 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 2528c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 2538c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 2548c2ecf20Sopenharmony_ci 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 2558c2ecf20Sopenharmony_ci 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 2568c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 2578c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 2588c2ecf20Sopenharmony_ci 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, 2598c2ecf20Sopenharmony_ci }, 2608c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 2618c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 2628c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 2638c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 2648c2ecf20Sopenharmony_ci }, 2658c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 2668c2ecf20Sopenharmony_ci 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 2678c2ecf20Sopenharmony_ci 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, 2688c2ecf20Sopenharmony_ci }, 2698c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 2708c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 2718c2ecf20Sopenharmony_ci 0xFF, 2728c2ecf20Sopenharmony_ci }, 2738c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 2748c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 2758c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 2768c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 2778c2ecf20Sopenharmony_ci }, 2788c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 2798c2ecf20Sopenharmony_ci 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 2808c2ecf20Sopenharmony_ci 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 2818c2ecf20Sopenharmony_ci 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 2828c2ecf20Sopenharmony_ci 0xFF, 2838c2ecf20Sopenharmony_ci }, 2848c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 2858c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 2868c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 2878c2ecf20Sopenharmony_ci 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 2888c2ecf20Sopenharmony_ci 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, 2898c2ecf20Sopenharmony_ci }, 2908c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 2918c2ecf20Sopenharmony_ci 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 2928c2ecf20Sopenharmony_ci 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 2938c2ecf20Sopenharmony_ci 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 2948c2ecf20Sopenharmony_ci }, 2958c2ecf20Sopenharmony_ci }, 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci { /* mode#2: 800 x 600 16Bpp 60Hz */ 2988c2ecf20Sopenharmony_ci 800, 600, 16, 60, 2998c2ecf20Sopenharmony_ci /* Init_MISC */ 3008c2ecf20Sopenharmony_ci 0x2B, 3018c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 3028c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 3038c2ecf20Sopenharmony_ci }, 3048c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 3058c2ecf20Sopenharmony_ci 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 3068c2ecf20Sopenharmony_ci 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 3078c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 3088c2ecf20Sopenharmony_ci }, 3098c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 3108c2ecf20Sopenharmony_ci 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, 3118c2ecf20Sopenharmony_ci 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, 3128c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, 3138c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, 3148c2ecf20Sopenharmony_ci 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 3158c2ecf20Sopenharmony_ci 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, 3168c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 3178c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 3188c2ecf20Sopenharmony_ci 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, 3198c2ecf20Sopenharmony_ci }, 3208c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 3218c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, 3228c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, 3238c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 3248c2ecf20Sopenharmony_ci }, 3258c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 3268c2ecf20Sopenharmony_ci 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 3278c2ecf20Sopenharmony_ci 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, 3288c2ecf20Sopenharmony_ci }, 3298c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 3308c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 3318c2ecf20Sopenharmony_ci 0xFF, 3328c2ecf20Sopenharmony_ci }, 3338c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 3348c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 3358c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 3368c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 3378c2ecf20Sopenharmony_ci }, 3388c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 3398c2ecf20Sopenharmony_ci 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 3408c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 3418c2ecf20Sopenharmony_ci 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 3428c2ecf20Sopenharmony_ci 0xFF, 3438c2ecf20Sopenharmony_ci }, 3448c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 3458c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 3468c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 3478c2ecf20Sopenharmony_ci 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 3488c2ecf20Sopenharmony_ci 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, 3498c2ecf20Sopenharmony_ci }, 3508c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 3518c2ecf20Sopenharmony_ci 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 3528c2ecf20Sopenharmony_ci 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 3538c2ecf20Sopenharmony_ci 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, 3548c2ecf20Sopenharmony_ci }, 3558c2ecf20Sopenharmony_ci }, 3568c2ecf20Sopenharmony_ci { /* mode#3: 800 x 600 24Bpp 60Hz */ 3578c2ecf20Sopenharmony_ci 800, 600, 24, 60, 3588c2ecf20Sopenharmony_ci 0x2B, 3598c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 3608c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 3618c2ecf20Sopenharmony_ci }, 3628c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 3638c2ecf20Sopenharmony_ci 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 3648c2ecf20Sopenharmony_ci 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 3658c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 3668c2ecf20Sopenharmony_ci }, 3678c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 3688c2ecf20Sopenharmony_ci 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36, 3698c2ecf20Sopenharmony_ci 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF, 3708c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 3718c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36, 3728c2ecf20Sopenharmony_ci 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 3738c2ecf20Sopenharmony_ci 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36, 3748c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 3758c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 3768c2ecf20Sopenharmony_ci 0x02, 0x45, 0x30, 0x30, 0x40, 0x20, 3778c2ecf20Sopenharmony_ci }, 3788c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 3798c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36, 3808c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36, 3818c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 3828c2ecf20Sopenharmony_ci }, 3838c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 3848c2ecf20Sopenharmony_ci 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 3858c2ecf20Sopenharmony_ci 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, 3868c2ecf20Sopenharmony_ci }, 3878c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 3888c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 3898c2ecf20Sopenharmony_ci 0xFF, 3908c2ecf20Sopenharmony_ci }, 3918c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 3928c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 3938c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 3948c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 3958c2ecf20Sopenharmony_ci }, 3968c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 3978c2ecf20Sopenharmony_ci 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 3988c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 3998c2ecf20Sopenharmony_ci 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 4008c2ecf20Sopenharmony_ci 0xFF, 4018c2ecf20Sopenharmony_ci }, 4028c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 4038c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 4048c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 4058c2ecf20Sopenharmony_ci 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 4068c2ecf20Sopenharmony_ci 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, 4078c2ecf20Sopenharmony_ci }, 4088c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 4098c2ecf20Sopenharmony_ci 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 4108c2ecf20Sopenharmony_ci 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 4118c2ecf20Sopenharmony_ci 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, 4128c2ecf20Sopenharmony_ci }, 4138c2ecf20Sopenharmony_ci }, 4148c2ecf20Sopenharmony_ci { /* mode#7: 800 x 600 32Bpp 60Hz */ 4158c2ecf20Sopenharmony_ci 800, 600, 32, 60, 4168c2ecf20Sopenharmony_ci /* Init_MISC */ 4178c2ecf20Sopenharmony_ci 0x2B, 4188c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 4198c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 4208c2ecf20Sopenharmony_ci }, 4218c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 4228c2ecf20Sopenharmony_ci 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 4238c2ecf20Sopenharmony_ci 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 4248c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 4258c2ecf20Sopenharmony_ci }, 4268c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 4278c2ecf20Sopenharmony_ci 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, 4288c2ecf20Sopenharmony_ci 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, 4298c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, 4308c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, 4318c2ecf20Sopenharmony_ci 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 4328c2ecf20Sopenharmony_ci 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, 4338c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 4348c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 4358c2ecf20Sopenharmony_ci 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, 4368c2ecf20Sopenharmony_ci }, 4378c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 4388c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, 4398c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, 4408c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 4418c2ecf20Sopenharmony_ci }, 4428c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 4438c2ecf20Sopenharmony_ci 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 4448c2ecf20Sopenharmony_ci 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, 4458c2ecf20Sopenharmony_ci }, 4468c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 4478c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 4488c2ecf20Sopenharmony_ci 0xFF, 4498c2ecf20Sopenharmony_ci }, 4508c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 4518c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 4528c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 4538c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 4548c2ecf20Sopenharmony_ci }, 4558c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 4568c2ecf20Sopenharmony_ci 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 4578c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 4588c2ecf20Sopenharmony_ci 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 4598c2ecf20Sopenharmony_ci 0xFF, 4608c2ecf20Sopenharmony_ci }, 4618c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 4628c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 4638c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 4648c2ecf20Sopenharmony_ci 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 4658c2ecf20Sopenharmony_ci 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, 4668c2ecf20Sopenharmony_ci }, 4678c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 4688c2ecf20Sopenharmony_ci 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 4698c2ecf20Sopenharmony_ci 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 4708c2ecf20Sopenharmony_ci 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, 4718c2ecf20Sopenharmony_ci }, 4728c2ecf20Sopenharmony_ci }, 4738c2ecf20Sopenharmony_ci /* We use 1024x768 table to light 1024x600 panel for lemote */ 4748c2ecf20Sopenharmony_ci { /* mode#4: 1024 x 600 16Bpp 60Hz */ 4758c2ecf20Sopenharmony_ci 1024, 600, 16, 60, 4768c2ecf20Sopenharmony_ci /* Init_MISC */ 4778c2ecf20Sopenharmony_ci 0xEB, 4788c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 4798c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x00, 0x0E, 4808c2ecf20Sopenharmony_ci }, 4818c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 4828c2ecf20Sopenharmony_ci 0xC8, 0x40, 0x14, 0x60, 0x00, 0x0A, 0x17, 0x20, 4838c2ecf20Sopenharmony_ci 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 4848c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x00, 0x01, 4858c2ecf20Sopenharmony_ci }, 4868c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 4878c2ecf20Sopenharmony_ci 0x22, 0x03, 0x24, 0x09, 0xC0, 0x22, 0x22, 0x22, 4888c2ecf20Sopenharmony_ci 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x03, 0xFF, 4898c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 4908c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x22, 0x22, 0x22, 4918c2ecf20Sopenharmony_ci 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 4928c2ecf20Sopenharmony_ci 0x00, 0x60, 0x59, 0x22, 0x22, 0x00, 0x00, 0x22, 4938c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 4948c2ecf20Sopenharmony_ci 0x50, 0x03, 0x16, 0x02, 0x0D, 0x82, 0x09, 0x02, 4958c2ecf20Sopenharmony_ci 0x04, 0x45, 0x3F, 0x30, 0x40, 0x20, 4968c2ecf20Sopenharmony_ci }, 4978c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 4988c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 4998c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, 5008c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 5018c2ecf20Sopenharmony_ci }, 5028c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 5038c2ecf20Sopenharmony_ci 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, 5048c2ecf20Sopenharmony_ci 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, 5058c2ecf20Sopenharmony_ci }, 5068c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 5078c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 5088c2ecf20Sopenharmony_ci 0xFF, 5098c2ecf20Sopenharmony_ci }, 5108c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 5118c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 5128c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 5138c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 5148c2ecf20Sopenharmony_ci }, 5158c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 5168c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, 5178c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5188c2ecf20Sopenharmony_ci 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, 5198c2ecf20Sopenharmony_ci 0xFF, 5208c2ecf20Sopenharmony_ci }, 5218c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 5228c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 5238c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF, 5248c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x00, 0x82, 0x0b, 0x6f, 0x57, 0x00, 5258c2ecf20Sopenharmony_ci 0x5c, 0x0f, 0xE0, 0xe0, 0x7F, 0x57, 5268c2ecf20Sopenharmony_ci }, 5278c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 5288c2ecf20Sopenharmony_ci 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, 5298c2ecf20Sopenharmony_ci 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, 5308c2ecf20Sopenharmony_ci 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 5318c2ecf20Sopenharmony_ci }, 5328c2ecf20Sopenharmony_ci }, 5338c2ecf20Sopenharmony_ci { /* 1024 x 768 16Bpp 60Hz */ 5348c2ecf20Sopenharmony_ci 1024, 768, 16, 60, 5358c2ecf20Sopenharmony_ci /* Init_MISC */ 5368c2ecf20Sopenharmony_ci 0xEB, 5378c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 5388c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 5398c2ecf20Sopenharmony_ci }, 5408c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 5418c2ecf20Sopenharmony_ci 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C, 5428c2ecf20Sopenharmony_ci 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 5438c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 5448c2ecf20Sopenharmony_ci }, 5458c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 5468c2ecf20Sopenharmony_ci 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A, 5478c2ecf20Sopenharmony_ci 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF, 5488c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 5498c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A, 5508c2ecf20Sopenharmony_ci 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 5518c2ecf20Sopenharmony_ci 0x0F, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A, 5528c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 5538c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02, 5548c2ecf20Sopenharmony_ci 0x04, 0x45, 0x30, 0x30, 0x40, 0x20, 5558c2ecf20Sopenharmony_ci }, 5568c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 5578c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 5588c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, 5598c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 5608c2ecf20Sopenharmony_ci }, 5618c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 5628c2ecf20Sopenharmony_ci 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, 5638c2ecf20Sopenharmony_ci 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, 5648c2ecf20Sopenharmony_ci }, 5658c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 5668c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 5678c2ecf20Sopenharmony_ci 0xFF, 5688c2ecf20Sopenharmony_ci }, 5698c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 5708c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 5718c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 5728c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 5738c2ecf20Sopenharmony_ci }, 5748c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 5758c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, 5768c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 5778c2ecf20Sopenharmony_ci 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, 5788c2ecf20Sopenharmony_ci 0xFF, 5798c2ecf20Sopenharmony_ci }, 5808c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 5818c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 5828c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF, 5838c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00, 5848c2ecf20Sopenharmony_ci 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF, 5858c2ecf20Sopenharmony_ci }, 5868c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 5878c2ecf20Sopenharmony_ci 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, 5888c2ecf20Sopenharmony_ci 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, 5898c2ecf20Sopenharmony_ci 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 5908c2ecf20Sopenharmony_ci }, 5918c2ecf20Sopenharmony_ci }, 5928c2ecf20Sopenharmony_ci { /* mode#5: 1024 x 768 24Bpp 60Hz */ 5938c2ecf20Sopenharmony_ci 1024, 768, 24, 60, 5948c2ecf20Sopenharmony_ci /* Init_MISC */ 5958c2ecf20Sopenharmony_ci 0xEB, 5968c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 5978c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 5988c2ecf20Sopenharmony_ci }, 5998c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 6008c2ecf20Sopenharmony_ci 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C, 6018c2ecf20Sopenharmony_ci 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 6028c2ecf20Sopenharmony_ci 0xC4, 0x30, 0x02, 0x01, 0x01, 6038c2ecf20Sopenharmony_ci }, 6048c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 6058c2ecf20Sopenharmony_ci 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A, 6068c2ecf20Sopenharmony_ci 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF, 6078c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 6088c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A, 6098c2ecf20Sopenharmony_ci 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 6108c2ecf20Sopenharmony_ci 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A, 6118c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 6128c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02, 6138c2ecf20Sopenharmony_ci 0x04, 0x45, 0x30, 0x30, 0x40, 0x20, 6148c2ecf20Sopenharmony_ci }, 6158c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 6168c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 6178c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, 6188c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 6198c2ecf20Sopenharmony_ci }, 6208c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 6218c2ecf20Sopenharmony_ci 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, 6228c2ecf20Sopenharmony_ci 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, 6238c2ecf20Sopenharmony_ci }, 6248c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 6258c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 6268c2ecf20Sopenharmony_ci 0xFF, 6278c2ecf20Sopenharmony_ci }, 6288c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 6298c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 6308c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 6318c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 6328c2ecf20Sopenharmony_ci }, 6338c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 6348c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, 6358c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6368c2ecf20Sopenharmony_ci 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, 6378c2ecf20Sopenharmony_ci 0xFF, 6388c2ecf20Sopenharmony_ci }, 6398c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 6408c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 6418c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF, 6428c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00, 6438c2ecf20Sopenharmony_ci 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF, 6448c2ecf20Sopenharmony_ci }, 6458c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 6468c2ecf20Sopenharmony_ci 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, 6478c2ecf20Sopenharmony_ci 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, 6488c2ecf20Sopenharmony_ci 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 6498c2ecf20Sopenharmony_ci }, 6508c2ecf20Sopenharmony_ci }, 6518c2ecf20Sopenharmony_ci { /* mode#4: 1024 x 768 32Bpp 60Hz */ 6528c2ecf20Sopenharmony_ci 1024, 768, 32, 60, 6538c2ecf20Sopenharmony_ci /* Init_MISC */ 6548c2ecf20Sopenharmony_ci 0xEB, 6558c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 6568c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 6578c2ecf20Sopenharmony_ci }, 6588c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 6598c2ecf20Sopenharmony_ci 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C, 6608c2ecf20Sopenharmony_ci 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 6618c2ecf20Sopenharmony_ci 0xC4, 0x32, 0x02, 0x01, 0x01, 6628c2ecf20Sopenharmony_ci }, 6638c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 6648c2ecf20Sopenharmony_ci 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A, 6658c2ecf20Sopenharmony_ci 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF, 6668c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 6678c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A, 6688c2ecf20Sopenharmony_ci 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 6698c2ecf20Sopenharmony_ci 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A, 6708c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 6718c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02, 6728c2ecf20Sopenharmony_ci 0x04, 0x45, 0x30, 0x30, 0x40, 0x20, 6738c2ecf20Sopenharmony_ci }, 6748c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 6758c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 6768c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, 6778c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 6788c2ecf20Sopenharmony_ci }, 6798c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 6808c2ecf20Sopenharmony_ci 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, 6818c2ecf20Sopenharmony_ci 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, 6828c2ecf20Sopenharmony_ci }, 6838c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 6848c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 6858c2ecf20Sopenharmony_ci 0xFF, 6868c2ecf20Sopenharmony_ci }, 6878c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 6888c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 6898c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 6908c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 6918c2ecf20Sopenharmony_ci }, 6928c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 6938c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, 6948c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 6958c2ecf20Sopenharmony_ci 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, 6968c2ecf20Sopenharmony_ci 0xFF, 6978c2ecf20Sopenharmony_ci }, 6988c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 6998c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 7008c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF, 7018c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00, 7028c2ecf20Sopenharmony_ci 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF, 7038c2ecf20Sopenharmony_ci }, 7048c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 7058c2ecf20Sopenharmony_ci 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, 7068c2ecf20Sopenharmony_ci 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, 7078c2ecf20Sopenharmony_ci 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 7088c2ecf20Sopenharmony_ci }, 7098c2ecf20Sopenharmony_ci }, 7108c2ecf20Sopenharmony_ci { /* mode#6: 320 x 240 16Bpp 60Hz */ 7118c2ecf20Sopenharmony_ci 320, 240, 16, 60, 7128c2ecf20Sopenharmony_ci /* Init_MISC */ 7138c2ecf20Sopenharmony_ci 0xEB, 7148c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 7158c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 7168c2ecf20Sopenharmony_ci }, 7178c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 7188c2ecf20Sopenharmony_ci 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C, 7198c2ecf20Sopenharmony_ci 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 7208c2ecf20Sopenharmony_ci 0xC4, 0x32, 0x02, 0x01, 0x01, 7218c2ecf20Sopenharmony_ci }, 7228c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 7238c2ecf20Sopenharmony_ci 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A, 7248c2ecf20Sopenharmony_ci 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF, 7258c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 7268c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A, 7278c2ecf20Sopenharmony_ci 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 7288c2ecf20Sopenharmony_ci 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A, 7298c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 7308c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43, 7318c2ecf20Sopenharmony_ci 0x04, 0x45, 0x30, 0x30, 0x40, 0x20, 7328c2ecf20Sopenharmony_ci }, 7338c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 7348c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 7358c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, 7368c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 7378c2ecf20Sopenharmony_ci }, 7388c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 7398c2ecf20Sopenharmony_ci 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, 7408c2ecf20Sopenharmony_ci 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, 7418c2ecf20Sopenharmony_ci }, 7428c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 7438c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 7448c2ecf20Sopenharmony_ci 0xFF, 7458c2ecf20Sopenharmony_ci }, 7468c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 7478c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 7488c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 7498c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 7508c2ecf20Sopenharmony_ci }, 7518c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 7528c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, 7538c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 7548c2ecf20Sopenharmony_ci 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, 7558c2ecf20Sopenharmony_ci 0xFF, 7568c2ecf20Sopenharmony_ci }, 7578c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 7588c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 7598c2ecf20Sopenharmony_ci 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF, 7608c2ecf20Sopenharmony_ci 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00, 7618c2ecf20Sopenharmony_ci 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF, 7628c2ecf20Sopenharmony_ci }, 7638c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 7648c2ecf20Sopenharmony_ci 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, 7658c2ecf20Sopenharmony_ci 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, 7668c2ecf20Sopenharmony_ci 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 7678c2ecf20Sopenharmony_ci }, 7688c2ecf20Sopenharmony_ci }, 7698c2ecf20Sopenharmony_ci 7708c2ecf20Sopenharmony_ci { /* mode#8: 320 x 240 32Bpp 60Hz */ 7718c2ecf20Sopenharmony_ci 320, 240, 32, 60, 7728c2ecf20Sopenharmony_ci /* Init_MISC */ 7738c2ecf20Sopenharmony_ci 0xEB, 7748c2ecf20Sopenharmony_ci { /* Init_SR0_SR4 */ 7758c2ecf20Sopenharmony_ci 0x03, 0x01, 0x0F, 0x03, 0x0E, 7768c2ecf20Sopenharmony_ci }, 7778c2ecf20Sopenharmony_ci { /* Init_SR10_SR24 */ 7788c2ecf20Sopenharmony_ci 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C, 7798c2ecf20Sopenharmony_ci 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 7808c2ecf20Sopenharmony_ci 0xC4, 0x32, 0x02, 0x01, 0x01, 7818c2ecf20Sopenharmony_ci }, 7828c2ecf20Sopenharmony_ci { /* Init_SR30_SR75 */ 7838c2ecf20Sopenharmony_ci 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A, 7848c2ecf20Sopenharmony_ci 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF, 7858c2ecf20Sopenharmony_ci 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 7868c2ecf20Sopenharmony_ci 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A, 7878c2ecf20Sopenharmony_ci 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 7888c2ecf20Sopenharmony_ci 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A, 7898c2ecf20Sopenharmony_ci 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 7908c2ecf20Sopenharmony_ci 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43, 7918c2ecf20Sopenharmony_ci 0x04, 0x45, 0x30, 0x30, 0x40, 0x20, 7928c2ecf20Sopenharmony_ci }, 7938c2ecf20Sopenharmony_ci { /* Init_SR80_SR93 */ 7948c2ecf20Sopenharmony_ci 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A, 7958c2ecf20Sopenharmony_ci 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A, 7968c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 7978c2ecf20Sopenharmony_ci }, 7988c2ecf20Sopenharmony_ci { /* Init_SRA0_SRAF */ 7998c2ecf20Sopenharmony_ci 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED, 8008c2ecf20Sopenharmony_ci 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF, 8018c2ecf20Sopenharmony_ci }, 8028c2ecf20Sopenharmony_ci { /* Init_GR00_GR08 */ 8038c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 8048c2ecf20Sopenharmony_ci 0xFF, 8058c2ecf20Sopenharmony_ci }, 8068c2ecf20Sopenharmony_ci { /* Init_AR00_AR14 */ 8078c2ecf20Sopenharmony_ci 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 8088c2ecf20Sopenharmony_ci 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 8098c2ecf20Sopenharmony_ci 0x41, 0x00, 0x0F, 0x00, 0x00, 8108c2ecf20Sopenharmony_ci }, 8118c2ecf20Sopenharmony_ci { /* Init_CR00_CR18 */ 8128c2ecf20Sopenharmony_ci 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5, 8138c2ecf20Sopenharmony_ci 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 8148c2ecf20Sopenharmony_ci 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3, 8158c2ecf20Sopenharmony_ci 0xFF, 8168c2ecf20Sopenharmony_ci }, 8178c2ecf20Sopenharmony_ci { /* Init_CR30_CR4D */ 8188c2ecf20Sopenharmony_ci 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 8198c2ecf20Sopenharmony_ci 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF, 8208c2ecf20Sopenharmony_ci 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00, 8218c2ecf20Sopenharmony_ci 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF, 8228c2ecf20Sopenharmony_ci }, 8238c2ecf20Sopenharmony_ci { /* Init_CR90_CRA7 */ 8248c2ecf20Sopenharmony_ci 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26, 8258c2ecf20Sopenharmony_ci 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00, 8268c2ecf20Sopenharmony_ci 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 8278c2ecf20Sopenharmony_ci }, 8288c2ecf20Sopenharmony_ci }, 8298c2ecf20Sopenharmony_ci}; 8308c2ecf20Sopenharmony_ci 8318c2ecf20Sopenharmony_cistatic struct screen_info smtc_scr_info; 8328c2ecf20Sopenharmony_ci 8338c2ecf20Sopenharmony_cistatic char *mode_option; 8348c2ecf20Sopenharmony_ci 8358c2ecf20Sopenharmony_ci/* process command line options, get vga parameter */ 8368c2ecf20Sopenharmony_cistatic void __init sm7xx_vga_setup(char *options) 8378c2ecf20Sopenharmony_ci{ 8388c2ecf20Sopenharmony_ci int i; 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_ci if (!options || !*options) 8418c2ecf20Sopenharmony_ci return; 8428c2ecf20Sopenharmony_ci 8438c2ecf20Sopenharmony_ci smtc_scr_info.lfb_width = 0; 8448c2ecf20Sopenharmony_ci smtc_scr_info.lfb_height = 0; 8458c2ecf20Sopenharmony_ci smtc_scr_info.lfb_depth = 0; 8468c2ecf20Sopenharmony_ci 8478c2ecf20Sopenharmony_ci pr_debug("%s = %s\n", __func__, options); 8488c2ecf20Sopenharmony_ci 8498c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(vesa_mode_table); i++) { 8508c2ecf20Sopenharmony_ci if (strstr(options, vesa_mode_table[i].index)) { 8518c2ecf20Sopenharmony_ci smtc_scr_info.lfb_width = vesa_mode_table[i].lfb_width; 8528c2ecf20Sopenharmony_ci smtc_scr_info.lfb_height = 8538c2ecf20Sopenharmony_ci vesa_mode_table[i].lfb_height; 8548c2ecf20Sopenharmony_ci smtc_scr_info.lfb_depth = vesa_mode_table[i].lfb_depth; 8558c2ecf20Sopenharmony_ci return; 8568c2ecf20Sopenharmony_ci } 8578c2ecf20Sopenharmony_ci } 8588c2ecf20Sopenharmony_ci} 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_cistatic void sm712_setpalette(int regno, unsigned int red, unsigned int green, 8618c2ecf20Sopenharmony_ci unsigned int blue, struct fb_info *info) 8628c2ecf20Sopenharmony_ci{ 8638c2ecf20Sopenharmony_ci /* set bit 5:4 = 01 (write LCD RAM only) */ 8648c2ecf20Sopenharmony_ci smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x10); 8658c2ecf20Sopenharmony_ci 8668c2ecf20Sopenharmony_ci smtc_mmiowb(regno, dac_reg); 8678c2ecf20Sopenharmony_ci smtc_mmiowb(red >> 10, dac_val); 8688c2ecf20Sopenharmony_ci smtc_mmiowb(green >> 10, dac_val); 8698c2ecf20Sopenharmony_ci smtc_mmiowb(blue >> 10, dac_val); 8708c2ecf20Sopenharmony_ci} 8718c2ecf20Sopenharmony_ci 8728c2ecf20Sopenharmony_ci/* chan_to_field 8738c2ecf20Sopenharmony_ci * 8748c2ecf20Sopenharmony_ci * convert a colour value into a field position 8758c2ecf20Sopenharmony_ci * 8768c2ecf20Sopenharmony_ci * from pxafb.c 8778c2ecf20Sopenharmony_ci */ 8788c2ecf20Sopenharmony_ci 8798c2ecf20Sopenharmony_cistatic inline unsigned int chan_to_field(unsigned int chan, 8808c2ecf20Sopenharmony_ci struct fb_bitfield *bf) 8818c2ecf20Sopenharmony_ci{ 8828c2ecf20Sopenharmony_ci chan &= 0xffff; 8838c2ecf20Sopenharmony_ci chan >>= 16 - bf->length; 8848c2ecf20Sopenharmony_ci return chan << bf->offset; 8858c2ecf20Sopenharmony_ci} 8868c2ecf20Sopenharmony_ci 8878c2ecf20Sopenharmony_cistatic int smtc_blank(int blank_mode, struct fb_info *info) 8888c2ecf20Sopenharmony_ci{ 8898c2ecf20Sopenharmony_ci struct smtcfb_info *sfb = info->par; 8908c2ecf20Sopenharmony_ci 8918c2ecf20Sopenharmony_ci /* clear DPMS setting */ 8928c2ecf20Sopenharmony_ci switch (blank_mode) { 8938c2ecf20Sopenharmony_ci case FB_BLANK_UNBLANK: 8948c2ecf20Sopenharmony_ci /* Screen On: HSync: On, VSync : On */ 8958c2ecf20Sopenharmony_ci 8968c2ecf20Sopenharmony_ci switch (sfb->chip_id) { 8978c2ecf20Sopenharmony_ci case 0x710: 8988c2ecf20Sopenharmony_ci case 0x712: 8998c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x16); 9008c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 9018c2ecf20Sopenharmony_ci break; 9028c2ecf20Sopenharmony_ci case 0x720: 9038c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x0d); 9048c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 9058c2ecf20Sopenharmony_ci break; 9068c2ecf20Sopenharmony_ci } 9078c2ecf20Sopenharmony_ci 9088c2ecf20Sopenharmony_ci smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0))); 9098c2ecf20Sopenharmony_ci smtc_seqw(0x01, (smtc_seqr(0x01) & (~0x20))); 9108c2ecf20Sopenharmony_ci smtc_seqw(0x21, (smtc_seqr(0x21) & 0x77)); 9118c2ecf20Sopenharmony_ci smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30))); 9128c2ecf20Sopenharmony_ci smtc_seqw(0x31, (smtc_seqr(0x31) | 0x03)); 9138c2ecf20Sopenharmony_ci smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01)); 9148c2ecf20Sopenharmony_ci break; 9158c2ecf20Sopenharmony_ci case FB_BLANK_NORMAL: 9168c2ecf20Sopenharmony_ci /* Screen Off: HSync: On, VSync : On Soft blank */ 9178c2ecf20Sopenharmony_ci smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01)); 9188c2ecf20Sopenharmony_ci smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); 9198c2ecf20Sopenharmony_ci smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0))); 9208c2ecf20Sopenharmony_ci smtc_seqw(0x01, (smtc_seqr(0x01) & (~0x20))); 9218c2ecf20Sopenharmony_ci smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30))); 9228c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x16); 9238c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 9248c2ecf20Sopenharmony_ci break; 9258c2ecf20Sopenharmony_ci case FB_BLANK_VSYNC_SUSPEND: 9268c2ecf20Sopenharmony_ci /* Screen On: HSync: On, VSync : Off */ 9278c2ecf20Sopenharmony_ci smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); 9288c2ecf20Sopenharmony_ci smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); 9298c2ecf20Sopenharmony_ci smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0x20)); 9308c2ecf20Sopenharmony_ci smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20)); 9318c2ecf20Sopenharmony_ci smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88)); 9328c2ecf20Sopenharmony_ci smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); 9338c2ecf20Sopenharmony_ci smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x20)); 9348c2ecf20Sopenharmony_ci smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80)); 9358c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x0c); 9368c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 9378c2ecf20Sopenharmony_ci break; 9388c2ecf20Sopenharmony_ci case FB_BLANK_HSYNC_SUSPEND: 9398c2ecf20Sopenharmony_ci /* Screen On: HSync: Off, VSync : On */ 9408c2ecf20Sopenharmony_ci smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); 9418c2ecf20Sopenharmony_ci smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); 9428c2ecf20Sopenharmony_ci smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8)); 9438c2ecf20Sopenharmony_ci smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20)); 9448c2ecf20Sopenharmony_ci smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88)); 9458c2ecf20Sopenharmony_ci smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); 9468c2ecf20Sopenharmony_ci smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x10)); 9478c2ecf20Sopenharmony_ci smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80)); 9488c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x0c); 9498c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 9508c2ecf20Sopenharmony_ci break; 9518c2ecf20Sopenharmony_ci case FB_BLANK_POWERDOWN: 9528c2ecf20Sopenharmony_ci /* Screen On: HSync: Off, VSync : Off */ 9538c2ecf20Sopenharmony_ci smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01))); 9548c2ecf20Sopenharmony_ci smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00)); 9558c2ecf20Sopenharmony_ci smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8)); 9568c2ecf20Sopenharmony_ci smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20)); 9578c2ecf20Sopenharmony_ci smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88)); 9588c2ecf20Sopenharmony_ci smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0))); 9598c2ecf20Sopenharmony_ci smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x30)); 9608c2ecf20Sopenharmony_ci smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80)); 9618c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x0c); 9628c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 9638c2ecf20Sopenharmony_ci break; 9648c2ecf20Sopenharmony_ci default: 9658c2ecf20Sopenharmony_ci return -EINVAL; 9668c2ecf20Sopenharmony_ci } 9678c2ecf20Sopenharmony_ci 9688c2ecf20Sopenharmony_ci return 0; 9698c2ecf20Sopenharmony_ci} 9708c2ecf20Sopenharmony_ci 9718c2ecf20Sopenharmony_cistatic int smtc_setcolreg(unsigned int regno, unsigned int red, 9728c2ecf20Sopenharmony_ci unsigned int green, unsigned int blue, 9738c2ecf20Sopenharmony_ci unsigned int trans, struct fb_info *info) 9748c2ecf20Sopenharmony_ci{ 9758c2ecf20Sopenharmony_ci struct smtcfb_info *sfb; 9768c2ecf20Sopenharmony_ci u32 val; 9778c2ecf20Sopenharmony_ci 9788c2ecf20Sopenharmony_ci sfb = info->par; 9798c2ecf20Sopenharmony_ci 9808c2ecf20Sopenharmony_ci if (regno > 255) 9818c2ecf20Sopenharmony_ci return 1; 9828c2ecf20Sopenharmony_ci 9838c2ecf20Sopenharmony_ci switch (sfb->fb->fix.visual) { 9848c2ecf20Sopenharmony_ci case FB_VISUAL_DIRECTCOLOR: 9858c2ecf20Sopenharmony_ci case FB_VISUAL_TRUECOLOR: 9868c2ecf20Sopenharmony_ci /* 9878c2ecf20Sopenharmony_ci * 16/32 bit true-colour, use pseudo-palette for 16 base color 9888c2ecf20Sopenharmony_ci */ 9898c2ecf20Sopenharmony_ci if (regno >= 16) 9908c2ecf20Sopenharmony_ci break; 9918c2ecf20Sopenharmony_ci if (sfb->fb->var.bits_per_pixel == 16) { 9928c2ecf20Sopenharmony_ci u32 *pal = sfb->fb->pseudo_palette; 9938c2ecf20Sopenharmony_ci 9948c2ecf20Sopenharmony_ci val = chan_to_field(red, &sfb->fb->var.red); 9958c2ecf20Sopenharmony_ci val |= chan_to_field(green, &sfb->fb->var.green); 9968c2ecf20Sopenharmony_ci val |= chan_to_field(blue, &sfb->fb->var.blue); 9978c2ecf20Sopenharmony_ci pal[regno] = pal_rgb(red, green, blue, val); 9988c2ecf20Sopenharmony_ci } else { 9998c2ecf20Sopenharmony_ci u32 *pal = sfb->fb->pseudo_palette; 10008c2ecf20Sopenharmony_ci 10018c2ecf20Sopenharmony_ci val = chan_to_field(red, &sfb->fb->var.red); 10028c2ecf20Sopenharmony_ci val |= chan_to_field(green, &sfb->fb->var.green); 10038c2ecf20Sopenharmony_ci val |= chan_to_field(blue, &sfb->fb->var.blue); 10048c2ecf20Sopenharmony_ci pal[regno] = big_swap(val); 10058c2ecf20Sopenharmony_ci } 10068c2ecf20Sopenharmony_ci break; 10078c2ecf20Sopenharmony_ci 10088c2ecf20Sopenharmony_ci case FB_VISUAL_PSEUDOCOLOR: 10098c2ecf20Sopenharmony_ci /* color depth 8 bit */ 10108c2ecf20Sopenharmony_ci sm712_setpalette(regno, red, green, blue, info); 10118c2ecf20Sopenharmony_ci break; 10128c2ecf20Sopenharmony_ci 10138c2ecf20Sopenharmony_ci default: 10148c2ecf20Sopenharmony_ci return 1; /* unknown type */ 10158c2ecf20Sopenharmony_ci } 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ci return 0; 10188c2ecf20Sopenharmony_ci} 10198c2ecf20Sopenharmony_ci 10208c2ecf20Sopenharmony_cistatic ssize_t smtcfb_read(struct fb_info *info, char __user *buf, 10218c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 10228c2ecf20Sopenharmony_ci{ 10238c2ecf20Sopenharmony_ci unsigned long p = *ppos; 10248c2ecf20Sopenharmony_ci 10258c2ecf20Sopenharmony_ci u32 *buffer, *dst; 10268c2ecf20Sopenharmony_ci u32 __iomem *src; 10278c2ecf20Sopenharmony_ci int c, i, cnt = 0, err = 0; 10288c2ecf20Sopenharmony_ci unsigned long total_size; 10298c2ecf20Sopenharmony_ci 10308c2ecf20Sopenharmony_ci if (!info || !info->screen_base) 10318c2ecf20Sopenharmony_ci return -ENODEV; 10328c2ecf20Sopenharmony_ci 10338c2ecf20Sopenharmony_ci if (info->state != FBINFO_STATE_RUNNING) 10348c2ecf20Sopenharmony_ci return -EPERM; 10358c2ecf20Sopenharmony_ci 10368c2ecf20Sopenharmony_ci total_size = info->screen_size; 10378c2ecf20Sopenharmony_ci 10388c2ecf20Sopenharmony_ci if (total_size == 0) 10398c2ecf20Sopenharmony_ci total_size = info->fix.smem_len; 10408c2ecf20Sopenharmony_ci 10418c2ecf20Sopenharmony_ci if (p >= total_size) 10428c2ecf20Sopenharmony_ci return 0; 10438c2ecf20Sopenharmony_ci 10448c2ecf20Sopenharmony_ci if (count >= total_size) 10458c2ecf20Sopenharmony_ci count = total_size; 10468c2ecf20Sopenharmony_ci 10478c2ecf20Sopenharmony_ci if (count + p > total_size) 10488c2ecf20Sopenharmony_ci count = total_size - p; 10498c2ecf20Sopenharmony_ci 10508c2ecf20Sopenharmony_ci buffer = kmalloc(PAGE_SIZE, GFP_KERNEL); 10518c2ecf20Sopenharmony_ci if (!buffer) 10528c2ecf20Sopenharmony_ci return -ENOMEM; 10538c2ecf20Sopenharmony_ci 10548c2ecf20Sopenharmony_ci src = (u32 __iomem *)(info->screen_base + p); 10558c2ecf20Sopenharmony_ci 10568c2ecf20Sopenharmony_ci if (info->fbops->fb_sync) 10578c2ecf20Sopenharmony_ci info->fbops->fb_sync(info); 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ci while (count) { 10608c2ecf20Sopenharmony_ci c = (count > PAGE_SIZE) ? PAGE_SIZE : count; 10618c2ecf20Sopenharmony_ci dst = buffer; 10628c2ecf20Sopenharmony_ci for (i = (c + 3) >> 2; i--;) { 10638c2ecf20Sopenharmony_ci u32 val; 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ci val = fb_readl(src); 10668c2ecf20Sopenharmony_ci *dst = big_swap(val); 10678c2ecf20Sopenharmony_ci src++; 10688c2ecf20Sopenharmony_ci dst++; 10698c2ecf20Sopenharmony_ci } 10708c2ecf20Sopenharmony_ci 10718c2ecf20Sopenharmony_ci if (copy_to_user(buf, buffer, c)) { 10728c2ecf20Sopenharmony_ci err = -EFAULT; 10738c2ecf20Sopenharmony_ci break; 10748c2ecf20Sopenharmony_ci } 10758c2ecf20Sopenharmony_ci *ppos += c; 10768c2ecf20Sopenharmony_ci buf += c; 10778c2ecf20Sopenharmony_ci cnt += c; 10788c2ecf20Sopenharmony_ci count -= c; 10798c2ecf20Sopenharmony_ci } 10808c2ecf20Sopenharmony_ci 10818c2ecf20Sopenharmony_ci kfree(buffer); 10828c2ecf20Sopenharmony_ci 10838c2ecf20Sopenharmony_ci return (err) ? err : cnt; 10848c2ecf20Sopenharmony_ci} 10858c2ecf20Sopenharmony_ci 10868c2ecf20Sopenharmony_cistatic ssize_t smtcfb_write(struct fb_info *info, const char __user *buf, 10878c2ecf20Sopenharmony_ci size_t count, loff_t *ppos) 10888c2ecf20Sopenharmony_ci{ 10898c2ecf20Sopenharmony_ci unsigned long p = *ppos; 10908c2ecf20Sopenharmony_ci 10918c2ecf20Sopenharmony_ci u32 *buffer, *src; 10928c2ecf20Sopenharmony_ci u32 __iomem *dst; 10938c2ecf20Sopenharmony_ci int c, i, cnt = 0, err = 0; 10948c2ecf20Sopenharmony_ci unsigned long total_size; 10958c2ecf20Sopenharmony_ci 10968c2ecf20Sopenharmony_ci if (!info || !info->screen_base) 10978c2ecf20Sopenharmony_ci return -ENODEV; 10988c2ecf20Sopenharmony_ci 10998c2ecf20Sopenharmony_ci if (info->state != FBINFO_STATE_RUNNING) 11008c2ecf20Sopenharmony_ci return -EPERM; 11018c2ecf20Sopenharmony_ci 11028c2ecf20Sopenharmony_ci total_size = info->screen_size; 11038c2ecf20Sopenharmony_ci 11048c2ecf20Sopenharmony_ci if (total_size == 0) 11058c2ecf20Sopenharmony_ci total_size = info->fix.smem_len; 11068c2ecf20Sopenharmony_ci 11078c2ecf20Sopenharmony_ci if (p > total_size) 11088c2ecf20Sopenharmony_ci return -EFBIG; 11098c2ecf20Sopenharmony_ci 11108c2ecf20Sopenharmony_ci if (count > total_size) { 11118c2ecf20Sopenharmony_ci err = -EFBIG; 11128c2ecf20Sopenharmony_ci count = total_size; 11138c2ecf20Sopenharmony_ci } 11148c2ecf20Sopenharmony_ci 11158c2ecf20Sopenharmony_ci if (count + p > total_size) { 11168c2ecf20Sopenharmony_ci if (!err) 11178c2ecf20Sopenharmony_ci err = -ENOSPC; 11188c2ecf20Sopenharmony_ci 11198c2ecf20Sopenharmony_ci count = total_size - p; 11208c2ecf20Sopenharmony_ci } 11218c2ecf20Sopenharmony_ci 11228c2ecf20Sopenharmony_ci buffer = kmalloc(PAGE_SIZE, GFP_KERNEL); 11238c2ecf20Sopenharmony_ci if (!buffer) 11248c2ecf20Sopenharmony_ci return -ENOMEM; 11258c2ecf20Sopenharmony_ci 11268c2ecf20Sopenharmony_ci dst = (u32 __iomem *)(info->screen_base + p); 11278c2ecf20Sopenharmony_ci 11288c2ecf20Sopenharmony_ci if (info->fbops->fb_sync) 11298c2ecf20Sopenharmony_ci info->fbops->fb_sync(info); 11308c2ecf20Sopenharmony_ci 11318c2ecf20Sopenharmony_ci while (count) { 11328c2ecf20Sopenharmony_ci c = (count > PAGE_SIZE) ? PAGE_SIZE : count; 11338c2ecf20Sopenharmony_ci src = buffer; 11348c2ecf20Sopenharmony_ci 11358c2ecf20Sopenharmony_ci if (copy_from_user(src, buf, c)) { 11368c2ecf20Sopenharmony_ci err = -EFAULT; 11378c2ecf20Sopenharmony_ci break; 11388c2ecf20Sopenharmony_ci } 11398c2ecf20Sopenharmony_ci 11408c2ecf20Sopenharmony_ci for (i = (c + 3) >> 2; i--;) { 11418c2ecf20Sopenharmony_ci fb_writel(big_swap(*src), dst); 11428c2ecf20Sopenharmony_ci dst++; 11438c2ecf20Sopenharmony_ci src++; 11448c2ecf20Sopenharmony_ci } 11458c2ecf20Sopenharmony_ci 11468c2ecf20Sopenharmony_ci *ppos += c; 11478c2ecf20Sopenharmony_ci buf += c; 11488c2ecf20Sopenharmony_ci cnt += c; 11498c2ecf20Sopenharmony_ci count -= c; 11508c2ecf20Sopenharmony_ci } 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci kfree(buffer); 11538c2ecf20Sopenharmony_ci 11548c2ecf20Sopenharmony_ci return (cnt) ? cnt : err; 11558c2ecf20Sopenharmony_ci} 11568c2ecf20Sopenharmony_ci 11578c2ecf20Sopenharmony_cistatic void sm7xx_set_timing(struct smtcfb_info *sfb) 11588c2ecf20Sopenharmony_ci{ 11598c2ecf20Sopenharmony_ci int i = 0, j = 0; 11608c2ecf20Sopenharmony_ci u32 m_nscreenstride; 11618c2ecf20Sopenharmony_ci 11628c2ecf20Sopenharmony_ci dev_dbg(&sfb->pdev->dev, 11638c2ecf20Sopenharmony_ci "sfb->width=%d sfb->height=%d sfb->fb->var.bits_per_pixel=%d sfb->hz=%d\n", 11648c2ecf20Sopenharmony_ci sfb->width, sfb->height, sfb->fb->var.bits_per_pixel, sfb->hz); 11658c2ecf20Sopenharmony_ci 11668c2ecf20Sopenharmony_ci for (j = 0; j < ARRAY_SIZE(vgamode); j++) { 11678c2ecf20Sopenharmony_ci if (vgamode[j].mmsizex != sfb->width || 11688c2ecf20Sopenharmony_ci vgamode[j].mmsizey != sfb->height || 11698c2ecf20Sopenharmony_ci vgamode[j].bpp != sfb->fb->var.bits_per_pixel || 11708c2ecf20Sopenharmony_ci vgamode[j].hz != sfb->hz) 11718c2ecf20Sopenharmony_ci continue; 11728c2ecf20Sopenharmony_ci 11738c2ecf20Sopenharmony_ci dev_dbg(&sfb->pdev->dev, 11748c2ecf20Sopenharmony_ci "vgamode[j].mmsizex=%d vgamode[j].mmSizeY=%d vgamode[j].bpp=%d vgamode[j].hz=%d\n", 11758c2ecf20Sopenharmony_ci vgamode[j].mmsizex, vgamode[j].mmsizey, 11768c2ecf20Sopenharmony_ci vgamode[j].bpp, vgamode[j].hz); 11778c2ecf20Sopenharmony_ci 11788c2ecf20Sopenharmony_ci dev_dbg(&sfb->pdev->dev, "vgamode index=%d\n", j); 11798c2ecf20Sopenharmony_ci 11808c2ecf20Sopenharmony_ci smtc_mmiowb(0x0, 0x3c6); 11818c2ecf20Sopenharmony_ci 11828c2ecf20Sopenharmony_ci smtc_seqw(0, 0x1); 11838c2ecf20Sopenharmony_ci 11848c2ecf20Sopenharmony_ci smtc_mmiowb(vgamode[j].init_misc, 0x3c2); 11858c2ecf20Sopenharmony_ci 11868c2ecf20Sopenharmony_ci /* init SEQ register SR00 - SR04 */ 11878c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_SR00_SR04; i++) 11888c2ecf20Sopenharmony_ci smtc_seqw(i, vgamode[j].init_sr00_sr04[i]); 11898c2ecf20Sopenharmony_ci 11908c2ecf20Sopenharmony_ci /* init SEQ register SR10 - SR24 */ 11918c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_SR10_SR24; i++) 11928c2ecf20Sopenharmony_ci smtc_seqw(i + 0x10, vgamode[j].init_sr10_sr24[i]); 11938c2ecf20Sopenharmony_ci 11948c2ecf20Sopenharmony_ci /* init SEQ register SR30 - SR75 */ 11958c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_SR30_SR75; i++) 11968c2ecf20Sopenharmony_ci if ((i + 0x30) != 0x30 && (i + 0x30) != 0x62 && 11978c2ecf20Sopenharmony_ci (i + 0x30) != 0x6a && (i + 0x30) != 0x6b && 11988c2ecf20Sopenharmony_ci (i + 0x30) != 0x70 && (i + 0x30) != 0x71 && 11998c2ecf20Sopenharmony_ci (i + 0x30) != 0x74 && (i + 0x30) != 0x75) 12008c2ecf20Sopenharmony_ci smtc_seqw(i + 0x30, 12018c2ecf20Sopenharmony_ci vgamode[j].init_sr30_sr75[i]); 12028c2ecf20Sopenharmony_ci 12038c2ecf20Sopenharmony_ci /* init SEQ register SR80 - SR93 */ 12048c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_SR80_SR93; i++) 12058c2ecf20Sopenharmony_ci smtc_seqw(i + 0x80, vgamode[j].init_sr80_sr93[i]); 12068c2ecf20Sopenharmony_ci 12078c2ecf20Sopenharmony_ci /* init SEQ register SRA0 - SRAF */ 12088c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_SRA0_SRAF; i++) 12098c2ecf20Sopenharmony_ci smtc_seqw(i + 0xa0, vgamode[j].init_sra0_sraf[i]); 12108c2ecf20Sopenharmony_ci 12118c2ecf20Sopenharmony_ci /* init Graphic register GR00 - GR08 */ 12128c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_GR00_GR08; i++) 12138c2ecf20Sopenharmony_ci smtc_grphw(i, vgamode[j].init_gr00_gr08[i]); 12148c2ecf20Sopenharmony_ci 12158c2ecf20Sopenharmony_ci /* init Attribute register AR00 - AR14 */ 12168c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_AR00_AR14; i++) 12178c2ecf20Sopenharmony_ci smtc_attrw(i, vgamode[j].init_ar00_ar14[i]); 12188c2ecf20Sopenharmony_ci 12198c2ecf20Sopenharmony_ci /* init CRTC register CR00 - CR18 */ 12208c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_CR00_CR18; i++) 12218c2ecf20Sopenharmony_ci smtc_crtcw(i, vgamode[j].init_cr00_cr18[i]); 12228c2ecf20Sopenharmony_ci 12238c2ecf20Sopenharmony_ci /* init CRTC register CR30 - CR4D */ 12248c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_CR30_CR4D; i++) { 12258c2ecf20Sopenharmony_ci if ((i + 0x30) >= 0x3B && (i + 0x30) <= 0x3F) 12268c2ecf20Sopenharmony_ci /* side-effect, don't write to CR3B-CR3F */ 12278c2ecf20Sopenharmony_ci continue; 12288c2ecf20Sopenharmony_ci smtc_crtcw(i + 0x30, vgamode[j].init_cr30_cr4d[i]); 12298c2ecf20Sopenharmony_ci } 12308c2ecf20Sopenharmony_ci 12318c2ecf20Sopenharmony_ci /* init CRTC register CR90 - CRA7 */ 12328c2ecf20Sopenharmony_ci for (i = 0; i < SIZE_CR90_CRA7; i++) 12338c2ecf20Sopenharmony_ci smtc_crtcw(i + 0x90, vgamode[j].init_cr90_cra7[i]); 12348c2ecf20Sopenharmony_ci } 12358c2ecf20Sopenharmony_ci smtc_mmiowb(0x67, 0x3c2); 12368c2ecf20Sopenharmony_ci 12378c2ecf20Sopenharmony_ci /* set VPR registers */ 12388c2ecf20Sopenharmony_ci writel(0x0, sfb->vp_regs + 0x0C); 12398c2ecf20Sopenharmony_ci writel(0x0, sfb->vp_regs + 0x40); 12408c2ecf20Sopenharmony_ci 12418c2ecf20Sopenharmony_ci /* set data width */ 12428c2ecf20Sopenharmony_ci m_nscreenstride = (sfb->width * sfb->fb->var.bits_per_pixel) / 64; 12438c2ecf20Sopenharmony_ci switch (sfb->fb->var.bits_per_pixel) { 12448c2ecf20Sopenharmony_ci case 8: 12458c2ecf20Sopenharmony_ci writel(0x0, sfb->vp_regs + 0x0); 12468c2ecf20Sopenharmony_ci break; 12478c2ecf20Sopenharmony_ci case 16: 12488c2ecf20Sopenharmony_ci writel(0x00020000, sfb->vp_regs + 0x0); 12498c2ecf20Sopenharmony_ci break; 12508c2ecf20Sopenharmony_ci case 24: 12518c2ecf20Sopenharmony_ci writel(0x00040000, sfb->vp_regs + 0x0); 12528c2ecf20Sopenharmony_ci break; 12538c2ecf20Sopenharmony_ci case 32: 12548c2ecf20Sopenharmony_ci writel(0x00030000, sfb->vp_regs + 0x0); 12558c2ecf20Sopenharmony_ci break; 12568c2ecf20Sopenharmony_ci } 12578c2ecf20Sopenharmony_ci writel((u32)(((m_nscreenstride + 2) << 16) | m_nscreenstride), 12588c2ecf20Sopenharmony_ci sfb->vp_regs + 0x10); 12598c2ecf20Sopenharmony_ci} 12608c2ecf20Sopenharmony_ci 12618c2ecf20Sopenharmony_cistatic void smtc_set_timing(struct smtcfb_info *sfb) 12628c2ecf20Sopenharmony_ci{ 12638c2ecf20Sopenharmony_ci switch (sfb->chip_id) { 12648c2ecf20Sopenharmony_ci case 0x710: 12658c2ecf20Sopenharmony_ci case 0x712: 12668c2ecf20Sopenharmony_ci case 0x720: 12678c2ecf20Sopenharmony_ci sm7xx_set_timing(sfb); 12688c2ecf20Sopenharmony_ci break; 12698c2ecf20Sopenharmony_ci } 12708c2ecf20Sopenharmony_ci} 12718c2ecf20Sopenharmony_ci 12728c2ecf20Sopenharmony_cistatic void smtcfb_setmode(struct smtcfb_info *sfb) 12738c2ecf20Sopenharmony_ci{ 12748c2ecf20Sopenharmony_ci switch (sfb->fb->var.bits_per_pixel) { 12758c2ecf20Sopenharmony_ci case 32: 12768c2ecf20Sopenharmony_ci sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR; 12778c2ecf20Sopenharmony_ci sfb->fb->fix.line_length = sfb->fb->var.xres * 4; 12788c2ecf20Sopenharmony_ci sfb->fb->var.red.length = 8; 12798c2ecf20Sopenharmony_ci sfb->fb->var.green.length = 8; 12808c2ecf20Sopenharmony_ci sfb->fb->var.blue.length = 8; 12818c2ecf20Sopenharmony_ci sfb->fb->var.red.offset = 16; 12828c2ecf20Sopenharmony_ci sfb->fb->var.green.offset = 8; 12838c2ecf20Sopenharmony_ci sfb->fb->var.blue.offset = 0; 12848c2ecf20Sopenharmony_ci break; 12858c2ecf20Sopenharmony_ci case 24: 12868c2ecf20Sopenharmony_ci sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR; 12878c2ecf20Sopenharmony_ci sfb->fb->fix.line_length = sfb->fb->var.xres * 3; 12888c2ecf20Sopenharmony_ci sfb->fb->var.red.length = 8; 12898c2ecf20Sopenharmony_ci sfb->fb->var.green.length = 8; 12908c2ecf20Sopenharmony_ci sfb->fb->var.blue.length = 8; 12918c2ecf20Sopenharmony_ci sfb->fb->var.red.offset = 16; 12928c2ecf20Sopenharmony_ci sfb->fb->var.green.offset = 8; 12938c2ecf20Sopenharmony_ci sfb->fb->var.blue.offset = 0; 12948c2ecf20Sopenharmony_ci break; 12958c2ecf20Sopenharmony_ci case 8: 12968c2ecf20Sopenharmony_ci sfb->fb->fix.visual = FB_VISUAL_PSEUDOCOLOR; 12978c2ecf20Sopenharmony_ci sfb->fb->fix.line_length = sfb->fb->var.xres; 12988c2ecf20Sopenharmony_ci sfb->fb->var.red.length = 3; 12998c2ecf20Sopenharmony_ci sfb->fb->var.green.length = 3; 13008c2ecf20Sopenharmony_ci sfb->fb->var.blue.length = 2; 13018c2ecf20Sopenharmony_ci sfb->fb->var.red.offset = 5; 13028c2ecf20Sopenharmony_ci sfb->fb->var.green.offset = 2; 13038c2ecf20Sopenharmony_ci sfb->fb->var.blue.offset = 0; 13048c2ecf20Sopenharmony_ci break; 13058c2ecf20Sopenharmony_ci case 16: 13068c2ecf20Sopenharmony_ci default: 13078c2ecf20Sopenharmony_ci sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR; 13088c2ecf20Sopenharmony_ci sfb->fb->fix.line_length = sfb->fb->var.xres * 2; 13098c2ecf20Sopenharmony_ci sfb->fb->var.red.length = 5; 13108c2ecf20Sopenharmony_ci sfb->fb->var.green.length = 6; 13118c2ecf20Sopenharmony_ci sfb->fb->var.blue.length = 5; 13128c2ecf20Sopenharmony_ci sfb->fb->var.red.offset = 11; 13138c2ecf20Sopenharmony_ci sfb->fb->var.green.offset = 5; 13148c2ecf20Sopenharmony_ci sfb->fb->var.blue.offset = 0; 13158c2ecf20Sopenharmony_ci break; 13168c2ecf20Sopenharmony_ci } 13178c2ecf20Sopenharmony_ci 13188c2ecf20Sopenharmony_ci sfb->width = sfb->fb->var.xres; 13198c2ecf20Sopenharmony_ci sfb->height = sfb->fb->var.yres; 13208c2ecf20Sopenharmony_ci sfb->hz = 60; 13218c2ecf20Sopenharmony_ci smtc_set_timing(sfb); 13228c2ecf20Sopenharmony_ci} 13238c2ecf20Sopenharmony_ci 13248c2ecf20Sopenharmony_cistatic int smtc_check_var(struct fb_var_screeninfo *var, struct fb_info *info) 13258c2ecf20Sopenharmony_ci{ 13268c2ecf20Sopenharmony_ci /* sanity checks */ 13278c2ecf20Sopenharmony_ci if (var->xres_virtual < var->xres) 13288c2ecf20Sopenharmony_ci var->xres_virtual = var->xres; 13298c2ecf20Sopenharmony_ci 13308c2ecf20Sopenharmony_ci if (var->yres_virtual < var->yres) 13318c2ecf20Sopenharmony_ci var->yres_virtual = var->yres; 13328c2ecf20Sopenharmony_ci 13338c2ecf20Sopenharmony_ci /* set valid default bpp */ 13348c2ecf20Sopenharmony_ci if ((var->bits_per_pixel != 8) && (var->bits_per_pixel != 16) && 13358c2ecf20Sopenharmony_ci (var->bits_per_pixel != 24) && (var->bits_per_pixel != 32)) 13368c2ecf20Sopenharmony_ci var->bits_per_pixel = 16; 13378c2ecf20Sopenharmony_ci 13388c2ecf20Sopenharmony_ci return 0; 13398c2ecf20Sopenharmony_ci} 13408c2ecf20Sopenharmony_ci 13418c2ecf20Sopenharmony_cistatic int smtc_set_par(struct fb_info *info) 13428c2ecf20Sopenharmony_ci{ 13438c2ecf20Sopenharmony_ci smtcfb_setmode(info->par); 13448c2ecf20Sopenharmony_ci 13458c2ecf20Sopenharmony_ci return 0; 13468c2ecf20Sopenharmony_ci} 13478c2ecf20Sopenharmony_ci 13488c2ecf20Sopenharmony_cistatic const struct fb_ops smtcfb_ops = { 13498c2ecf20Sopenharmony_ci .owner = THIS_MODULE, 13508c2ecf20Sopenharmony_ci .fb_check_var = smtc_check_var, 13518c2ecf20Sopenharmony_ci .fb_set_par = smtc_set_par, 13528c2ecf20Sopenharmony_ci .fb_setcolreg = smtc_setcolreg, 13538c2ecf20Sopenharmony_ci .fb_blank = smtc_blank, 13548c2ecf20Sopenharmony_ci .fb_fillrect = cfb_fillrect, 13558c2ecf20Sopenharmony_ci .fb_imageblit = cfb_imageblit, 13568c2ecf20Sopenharmony_ci .fb_copyarea = cfb_copyarea, 13578c2ecf20Sopenharmony_ci .fb_read = smtcfb_read, 13588c2ecf20Sopenharmony_ci .fb_write = smtcfb_write, 13598c2ecf20Sopenharmony_ci}; 13608c2ecf20Sopenharmony_ci 13618c2ecf20Sopenharmony_ci/* 13628c2ecf20Sopenharmony_ci * Unmap in the memory mapped IO registers 13638c2ecf20Sopenharmony_ci */ 13648c2ecf20Sopenharmony_ci 13658c2ecf20Sopenharmony_cistatic void smtc_unmap_mmio(struct smtcfb_info *sfb) 13668c2ecf20Sopenharmony_ci{ 13678c2ecf20Sopenharmony_ci if (sfb && smtc_regbaseaddress) 13688c2ecf20Sopenharmony_ci smtc_regbaseaddress = NULL; 13698c2ecf20Sopenharmony_ci} 13708c2ecf20Sopenharmony_ci 13718c2ecf20Sopenharmony_ci/* 13728c2ecf20Sopenharmony_ci * Map in the screen memory 13738c2ecf20Sopenharmony_ci */ 13748c2ecf20Sopenharmony_ci 13758c2ecf20Sopenharmony_cistatic int smtc_map_smem(struct smtcfb_info *sfb, 13768c2ecf20Sopenharmony_ci struct pci_dev *pdev, u_long smem_len) 13778c2ecf20Sopenharmony_ci{ 13788c2ecf20Sopenharmony_ci sfb->fb->fix.smem_start = pci_resource_start(pdev, 0); 13798c2ecf20Sopenharmony_ci 13808c2ecf20Sopenharmony_ci if (sfb->chip_id == 0x720) 13818c2ecf20Sopenharmony_ci /* on SM720, the framebuffer starts at the 1 MB offset */ 13828c2ecf20Sopenharmony_ci sfb->fb->fix.smem_start += 0x00200000; 13838c2ecf20Sopenharmony_ci 13848c2ecf20Sopenharmony_ci /* XXX: is it safe for SM720 on Big-Endian? */ 13858c2ecf20Sopenharmony_ci if (sfb->fb->var.bits_per_pixel == 32) 13868c2ecf20Sopenharmony_ci sfb->fb->fix.smem_start += big_addr; 13878c2ecf20Sopenharmony_ci 13888c2ecf20Sopenharmony_ci sfb->fb->fix.smem_len = smem_len; 13898c2ecf20Sopenharmony_ci 13908c2ecf20Sopenharmony_ci sfb->fb->screen_base = sfb->lfb; 13918c2ecf20Sopenharmony_ci 13928c2ecf20Sopenharmony_ci if (!sfb->fb->screen_base) { 13938c2ecf20Sopenharmony_ci dev_err(&pdev->dev, 13948c2ecf20Sopenharmony_ci "%s: unable to map screen memory\n", sfb->fb->fix.id); 13958c2ecf20Sopenharmony_ci return -ENOMEM; 13968c2ecf20Sopenharmony_ci } 13978c2ecf20Sopenharmony_ci 13988c2ecf20Sopenharmony_ci return 0; 13998c2ecf20Sopenharmony_ci} 14008c2ecf20Sopenharmony_ci 14018c2ecf20Sopenharmony_ci/* 14028c2ecf20Sopenharmony_ci * Unmap in the screen memory 14038c2ecf20Sopenharmony_ci * 14048c2ecf20Sopenharmony_ci */ 14058c2ecf20Sopenharmony_cistatic void smtc_unmap_smem(struct smtcfb_info *sfb) 14068c2ecf20Sopenharmony_ci{ 14078c2ecf20Sopenharmony_ci if (sfb && sfb->fb->screen_base) { 14088c2ecf20Sopenharmony_ci if (sfb->chip_id == 0x720) 14098c2ecf20Sopenharmony_ci sfb->fb->screen_base -= 0x00200000; 14108c2ecf20Sopenharmony_ci iounmap(sfb->fb->screen_base); 14118c2ecf20Sopenharmony_ci sfb->fb->screen_base = NULL; 14128c2ecf20Sopenharmony_ci } 14138c2ecf20Sopenharmony_ci} 14148c2ecf20Sopenharmony_ci 14158c2ecf20Sopenharmony_ci/* 14168c2ecf20Sopenharmony_ci * We need to wake up the device and make sure its in linear memory mode. 14178c2ecf20Sopenharmony_ci */ 14188c2ecf20Sopenharmony_cistatic inline void sm7xx_init_hw(void) 14198c2ecf20Sopenharmony_ci{ 14208c2ecf20Sopenharmony_ci outb_p(0x18, 0x3c4); 14218c2ecf20Sopenharmony_ci outb_p(0x11, 0x3c5); 14228c2ecf20Sopenharmony_ci} 14238c2ecf20Sopenharmony_ci 14248c2ecf20Sopenharmony_cistatic u_long sm7xx_vram_probe(struct smtcfb_info *sfb) 14258c2ecf20Sopenharmony_ci{ 14268c2ecf20Sopenharmony_ci u8 vram; 14278c2ecf20Sopenharmony_ci 14288c2ecf20Sopenharmony_ci switch (sfb->chip_id) { 14298c2ecf20Sopenharmony_ci case 0x710: 14308c2ecf20Sopenharmony_ci case 0x712: 14318c2ecf20Sopenharmony_ci /* 14328c2ecf20Sopenharmony_ci * Assume SM712 graphics chip has 4MB VRAM. 14338c2ecf20Sopenharmony_ci * 14348c2ecf20Sopenharmony_ci * FIXME: SM712 can have 2MB VRAM, which is used on earlier 14358c2ecf20Sopenharmony_ci * laptops, such as IBM Thinkpad 240X. This driver would 14368c2ecf20Sopenharmony_ci * probably crash on those machines. If anyone gets one of 14378c2ecf20Sopenharmony_ci * those and is willing to help, run "git blame" and send me 14388c2ecf20Sopenharmony_ci * an E-mail. 14398c2ecf20Sopenharmony_ci */ 14408c2ecf20Sopenharmony_ci return 0x00400000; 14418c2ecf20Sopenharmony_ci case 0x720: 14428c2ecf20Sopenharmony_ci outb_p(0x76, 0x3c4); 14438c2ecf20Sopenharmony_ci vram = inb_p(0x3c5) >> 6; 14448c2ecf20Sopenharmony_ci 14458c2ecf20Sopenharmony_ci if (vram == 0x00) 14468c2ecf20Sopenharmony_ci return 0x00800000; /* 8 MB */ 14478c2ecf20Sopenharmony_ci else if (vram == 0x01) 14488c2ecf20Sopenharmony_ci return 0x01000000; /* 16 MB */ 14498c2ecf20Sopenharmony_ci else if (vram == 0x02) 14508c2ecf20Sopenharmony_ci return 0x00400000; /* illegal, fallback to 4 MB */ 14518c2ecf20Sopenharmony_ci else if (vram == 0x03) 14528c2ecf20Sopenharmony_ci return 0x00400000; /* 4 MB */ 14538c2ecf20Sopenharmony_ci } 14548c2ecf20Sopenharmony_ci return 0; /* unknown hardware */ 14558c2ecf20Sopenharmony_ci} 14568c2ecf20Sopenharmony_ci 14578c2ecf20Sopenharmony_cistatic void sm7xx_resolution_probe(struct smtcfb_info *sfb) 14588c2ecf20Sopenharmony_ci{ 14598c2ecf20Sopenharmony_ci /* get mode parameter from smtc_scr_info */ 14608c2ecf20Sopenharmony_ci if (smtc_scr_info.lfb_width != 0) { 14618c2ecf20Sopenharmony_ci sfb->fb->var.xres = smtc_scr_info.lfb_width; 14628c2ecf20Sopenharmony_ci sfb->fb->var.yres = smtc_scr_info.lfb_height; 14638c2ecf20Sopenharmony_ci sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth; 14648c2ecf20Sopenharmony_ci goto final; 14658c2ecf20Sopenharmony_ci } 14668c2ecf20Sopenharmony_ci 14678c2ecf20Sopenharmony_ci /* 14688c2ecf20Sopenharmony_ci * No parameter, default resolution is 1024x768-16. 14698c2ecf20Sopenharmony_ci * 14708c2ecf20Sopenharmony_ci * FIXME: earlier laptops, such as IBM Thinkpad 240X, has a 800x600 14718c2ecf20Sopenharmony_ci * panel, also see the comments about Thinkpad 240X above. 14728c2ecf20Sopenharmony_ci */ 14738c2ecf20Sopenharmony_ci sfb->fb->var.xres = SCREEN_X_RES; 14748c2ecf20Sopenharmony_ci sfb->fb->var.yres = SCREEN_Y_RES_PC; 14758c2ecf20Sopenharmony_ci sfb->fb->var.bits_per_pixel = SCREEN_BPP; 14768c2ecf20Sopenharmony_ci 14778c2ecf20Sopenharmony_ci#ifdef CONFIG_MIPS 14788c2ecf20Sopenharmony_ci /* 14798c2ecf20Sopenharmony_ci * Loongson MIPS netbooks use 1024x600 LCD panels, which is the original 14808c2ecf20Sopenharmony_ci * target platform of this driver, but nearly all old x86 laptops have 14818c2ecf20Sopenharmony_ci * 1024x768. Lighting 768 panels using 600's timings would partially 14828c2ecf20Sopenharmony_ci * garble the display, so we don't want that. But it's not possible to 14838c2ecf20Sopenharmony_ci * distinguish them reliably. 14848c2ecf20Sopenharmony_ci * 14858c2ecf20Sopenharmony_ci * So we change the default to 768, but keep 600 as-is on MIPS. 14868c2ecf20Sopenharmony_ci */ 14878c2ecf20Sopenharmony_ci sfb->fb->var.yres = SCREEN_Y_RES_NETBOOK; 14888c2ecf20Sopenharmony_ci#endif 14898c2ecf20Sopenharmony_ci 14908c2ecf20Sopenharmony_cifinal: 14918c2ecf20Sopenharmony_ci big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth); 14928c2ecf20Sopenharmony_ci} 14938c2ecf20Sopenharmony_ci 14948c2ecf20Sopenharmony_cistatic int smtcfb_pci_probe(struct pci_dev *pdev, 14958c2ecf20Sopenharmony_ci const struct pci_device_id *ent) 14968c2ecf20Sopenharmony_ci{ 14978c2ecf20Sopenharmony_ci struct smtcfb_info *sfb; 14988c2ecf20Sopenharmony_ci struct fb_info *info; 14998c2ecf20Sopenharmony_ci u_long smem_size; 15008c2ecf20Sopenharmony_ci int err; 15018c2ecf20Sopenharmony_ci unsigned long mmio_base; 15028c2ecf20Sopenharmony_ci 15038c2ecf20Sopenharmony_ci dev_info(&pdev->dev, "Silicon Motion display driver.\n"); 15048c2ecf20Sopenharmony_ci 15058c2ecf20Sopenharmony_ci err = pci_enable_device(pdev); /* enable SMTC chip */ 15068c2ecf20Sopenharmony_ci if (err) 15078c2ecf20Sopenharmony_ci return err; 15088c2ecf20Sopenharmony_ci 15098c2ecf20Sopenharmony_ci err = pci_request_region(pdev, 0, "sm7xxfb"); 15108c2ecf20Sopenharmony_ci if (err < 0) { 15118c2ecf20Sopenharmony_ci dev_err(&pdev->dev, "cannot reserve framebuffer region\n"); 15128c2ecf20Sopenharmony_ci goto failed_regions; 15138c2ecf20Sopenharmony_ci } 15148c2ecf20Sopenharmony_ci 15158c2ecf20Sopenharmony_ci sprintf(smtcfb_fix.id, "sm%Xfb", ent->device); 15168c2ecf20Sopenharmony_ci 15178c2ecf20Sopenharmony_ci info = framebuffer_alloc(sizeof(*sfb), &pdev->dev); 15188c2ecf20Sopenharmony_ci if (!info) { 15198c2ecf20Sopenharmony_ci err = -ENOMEM; 15208c2ecf20Sopenharmony_ci goto failed_free; 15218c2ecf20Sopenharmony_ci } 15228c2ecf20Sopenharmony_ci 15238c2ecf20Sopenharmony_ci sfb = info->par; 15248c2ecf20Sopenharmony_ci sfb->fb = info; 15258c2ecf20Sopenharmony_ci sfb->chip_id = ent->device; 15268c2ecf20Sopenharmony_ci sfb->pdev = pdev; 15278c2ecf20Sopenharmony_ci info->flags = FBINFO_FLAG_DEFAULT; 15288c2ecf20Sopenharmony_ci info->fbops = &smtcfb_ops; 15298c2ecf20Sopenharmony_ci info->fix = smtcfb_fix; 15308c2ecf20Sopenharmony_ci info->var = smtcfb_var; 15318c2ecf20Sopenharmony_ci info->pseudo_palette = sfb->colreg; 15328c2ecf20Sopenharmony_ci info->par = sfb; 15338c2ecf20Sopenharmony_ci 15348c2ecf20Sopenharmony_ci pci_set_drvdata(pdev, sfb); 15358c2ecf20Sopenharmony_ci 15368c2ecf20Sopenharmony_ci sm7xx_init_hw(); 15378c2ecf20Sopenharmony_ci 15388c2ecf20Sopenharmony_ci /* Map address and memory detection */ 15398c2ecf20Sopenharmony_ci mmio_base = pci_resource_start(pdev, 0); 15408c2ecf20Sopenharmony_ci pci_read_config_byte(pdev, PCI_REVISION_ID, &sfb->chip_rev_id); 15418c2ecf20Sopenharmony_ci 15428c2ecf20Sopenharmony_ci smem_size = sm7xx_vram_probe(sfb); 15438c2ecf20Sopenharmony_ci dev_info(&pdev->dev, "%lu MiB of VRAM detected.\n", 15448c2ecf20Sopenharmony_ci smem_size / 1048576); 15458c2ecf20Sopenharmony_ci 15468c2ecf20Sopenharmony_ci switch (sfb->chip_id) { 15478c2ecf20Sopenharmony_ci case 0x710: 15488c2ecf20Sopenharmony_ci case 0x712: 15498c2ecf20Sopenharmony_ci sfb->fb->fix.mmio_start = mmio_base + 0x00400000; 15508c2ecf20Sopenharmony_ci sfb->fb->fix.mmio_len = 0x00400000; 15518c2ecf20Sopenharmony_ci sfb->lfb = ioremap(mmio_base, mmio_addr); 15528c2ecf20Sopenharmony_ci if (!sfb->lfb) { 15538c2ecf20Sopenharmony_ci dev_err(&pdev->dev, 15548c2ecf20Sopenharmony_ci "%s: unable to map memory mapped IO!\n", 15558c2ecf20Sopenharmony_ci sfb->fb->fix.id); 15568c2ecf20Sopenharmony_ci err = -ENOMEM; 15578c2ecf20Sopenharmony_ci goto failed_fb; 15588c2ecf20Sopenharmony_ci } 15598c2ecf20Sopenharmony_ci 15608c2ecf20Sopenharmony_ci sfb->mmio = (smtc_regbaseaddress = 15618c2ecf20Sopenharmony_ci sfb->lfb + 0x00700000); 15628c2ecf20Sopenharmony_ci sfb->dp_regs = sfb->lfb + 0x00408000; 15638c2ecf20Sopenharmony_ci sfb->vp_regs = sfb->lfb + 0x0040c000; 15648c2ecf20Sopenharmony_ci if (sfb->fb->var.bits_per_pixel == 32) { 15658c2ecf20Sopenharmony_ci sfb->lfb += big_addr; 15668c2ecf20Sopenharmony_ci dev_info(&pdev->dev, "sfb->lfb=%p\n", sfb->lfb); 15678c2ecf20Sopenharmony_ci } 15688c2ecf20Sopenharmony_ci 15698c2ecf20Sopenharmony_ci /* set MCLK = 14.31818 * (0x16 / 0x2) */ 15708c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x16); 15718c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 15728c2ecf20Sopenharmony_ci smtc_seqw(0x62, 0x3e); 15738c2ecf20Sopenharmony_ci /* enable PCI burst */ 15748c2ecf20Sopenharmony_ci smtc_seqw(0x17, 0x20); 15758c2ecf20Sopenharmony_ci /* enable word swap */ 15768c2ecf20Sopenharmony_ci if (sfb->fb->var.bits_per_pixel == 32) 15778c2ecf20Sopenharmony_ci seqw17(); 15788c2ecf20Sopenharmony_ci break; 15798c2ecf20Sopenharmony_ci case 0x720: 15808c2ecf20Sopenharmony_ci sfb->fb->fix.mmio_start = mmio_base; 15818c2ecf20Sopenharmony_ci sfb->fb->fix.mmio_len = 0x00200000; 15828c2ecf20Sopenharmony_ci sfb->dp_regs = ioremap(mmio_base, 0x00200000 + smem_size); 15838c2ecf20Sopenharmony_ci if (!sfb->dp_regs) { 15848c2ecf20Sopenharmony_ci dev_err(&pdev->dev, 15858c2ecf20Sopenharmony_ci "%s: unable to map memory mapped IO!\n", 15868c2ecf20Sopenharmony_ci sfb->fb->fix.id); 15878c2ecf20Sopenharmony_ci err = -ENOMEM; 15888c2ecf20Sopenharmony_ci goto failed_fb; 15898c2ecf20Sopenharmony_ci } 15908c2ecf20Sopenharmony_ci 15918c2ecf20Sopenharmony_ci sfb->lfb = sfb->dp_regs + 0x00200000; 15928c2ecf20Sopenharmony_ci sfb->mmio = (smtc_regbaseaddress = 15938c2ecf20Sopenharmony_ci sfb->dp_regs + 0x000c0000); 15948c2ecf20Sopenharmony_ci sfb->vp_regs = sfb->dp_regs + 0x800; 15958c2ecf20Sopenharmony_ci 15968c2ecf20Sopenharmony_ci smtc_seqw(0x62, 0xff); 15978c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x0d); 15988c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 15998c2ecf20Sopenharmony_ci break; 16008c2ecf20Sopenharmony_ci default: 16018c2ecf20Sopenharmony_ci dev_err(&pdev->dev, 16028c2ecf20Sopenharmony_ci "No valid Silicon Motion display chip was detected!\n"); 16038c2ecf20Sopenharmony_ci err = -ENODEV; 16048c2ecf20Sopenharmony_ci goto failed_fb; 16058c2ecf20Sopenharmony_ci } 16068c2ecf20Sopenharmony_ci 16078c2ecf20Sopenharmony_ci /* probe and decide resolution */ 16088c2ecf20Sopenharmony_ci sm7xx_resolution_probe(sfb); 16098c2ecf20Sopenharmony_ci 16108c2ecf20Sopenharmony_ci /* can support 32 bpp */ 16118c2ecf20Sopenharmony_ci if (sfb->fb->var.bits_per_pixel == 15) 16128c2ecf20Sopenharmony_ci sfb->fb->var.bits_per_pixel = 16; 16138c2ecf20Sopenharmony_ci 16148c2ecf20Sopenharmony_ci sfb->fb->var.xres_virtual = sfb->fb->var.xres; 16158c2ecf20Sopenharmony_ci sfb->fb->var.yres_virtual = sfb->fb->var.yres; 16168c2ecf20Sopenharmony_ci err = smtc_map_smem(sfb, pdev, smem_size); 16178c2ecf20Sopenharmony_ci if (err) 16188c2ecf20Sopenharmony_ci goto failed; 16198c2ecf20Sopenharmony_ci 16208c2ecf20Sopenharmony_ci /* 16218c2ecf20Sopenharmony_ci * The screen would be temporarily garbled when sm712fb takes over 16228c2ecf20Sopenharmony_ci * vesafb or VGA text mode. Zero the framebuffer. 16238c2ecf20Sopenharmony_ci */ 16248c2ecf20Sopenharmony_ci memset_io(sfb->lfb, 0, sfb->fb->fix.smem_len); 16258c2ecf20Sopenharmony_ci 16268c2ecf20Sopenharmony_ci err = register_framebuffer(info); 16278c2ecf20Sopenharmony_ci if (err < 0) 16288c2ecf20Sopenharmony_ci goto failed; 16298c2ecf20Sopenharmony_ci 16308c2ecf20Sopenharmony_ci dev_info(&pdev->dev, 16318c2ecf20Sopenharmony_ci "Silicon Motion SM%X Rev%X primary display mode %dx%d-%d Init Complete.\n", 16328c2ecf20Sopenharmony_ci sfb->chip_id, sfb->chip_rev_id, sfb->fb->var.xres, 16338c2ecf20Sopenharmony_ci sfb->fb->var.yres, sfb->fb->var.bits_per_pixel); 16348c2ecf20Sopenharmony_ci 16358c2ecf20Sopenharmony_ci return 0; 16368c2ecf20Sopenharmony_ci 16378c2ecf20Sopenharmony_cifailed: 16388c2ecf20Sopenharmony_ci dev_err(&pdev->dev, "Silicon Motion, Inc. primary display init fail.\n"); 16398c2ecf20Sopenharmony_ci 16408c2ecf20Sopenharmony_ci smtc_unmap_smem(sfb); 16418c2ecf20Sopenharmony_ci smtc_unmap_mmio(sfb); 16428c2ecf20Sopenharmony_cifailed_fb: 16438c2ecf20Sopenharmony_ci framebuffer_release(info); 16448c2ecf20Sopenharmony_ci 16458c2ecf20Sopenharmony_cifailed_free: 16468c2ecf20Sopenharmony_ci pci_release_region(pdev, 0); 16478c2ecf20Sopenharmony_ci 16488c2ecf20Sopenharmony_cifailed_regions: 16498c2ecf20Sopenharmony_ci pci_disable_device(pdev); 16508c2ecf20Sopenharmony_ci 16518c2ecf20Sopenharmony_ci return err; 16528c2ecf20Sopenharmony_ci} 16538c2ecf20Sopenharmony_ci 16548c2ecf20Sopenharmony_ci/* 16558c2ecf20Sopenharmony_ci * 0x710 (LynxEM) 16568c2ecf20Sopenharmony_ci * 0x712 (LynxEM+) 16578c2ecf20Sopenharmony_ci * 0x720 (Lynx3DM, Lynx3DM+) 16588c2ecf20Sopenharmony_ci */ 16598c2ecf20Sopenharmony_cistatic const struct pci_device_id smtcfb_pci_table[] = { 16608c2ecf20Sopenharmony_ci { PCI_DEVICE(0x126f, 0x710), }, 16618c2ecf20Sopenharmony_ci { PCI_DEVICE(0x126f, 0x712), }, 16628c2ecf20Sopenharmony_ci { PCI_DEVICE(0x126f, 0x720), }, 16638c2ecf20Sopenharmony_ci {0,} 16648c2ecf20Sopenharmony_ci}; 16658c2ecf20Sopenharmony_ci 16668c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci, smtcfb_pci_table); 16678c2ecf20Sopenharmony_ci 16688c2ecf20Sopenharmony_cistatic void smtcfb_pci_remove(struct pci_dev *pdev) 16698c2ecf20Sopenharmony_ci{ 16708c2ecf20Sopenharmony_ci struct smtcfb_info *sfb; 16718c2ecf20Sopenharmony_ci 16728c2ecf20Sopenharmony_ci sfb = pci_get_drvdata(pdev); 16738c2ecf20Sopenharmony_ci smtc_unmap_smem(sfb); 16748c2ecf20Sopenharmony_ci smtc_unmap_mmio(sfb); 16758c2ecf20Sopenharmony_ci unregister_framebuffer(sfb->fb); 16768c2ecf20Sopenharmony_ci framebuffer_release(sfb->fb); 16778c2ecf20Sopenharmony_ci pci_release_region(pdev, 0); 16788c2ecf20Sopenharmony_ci pci_disable_device(pdev); 16798c2ecf20Sopenharmony_ci} 16808c2ecf20Sopenharmony_ci 16818c2ecf20Sopenharmony_cistatic int __maybe_unused smtcfb_pci_suspend(struct device *device) 16828c2ecf20Sopenharmony_ci{ 16838c2ecf20Sopenharmony_ci struct smtcfb_info *sfb = dev_get_drvdata(device); 16848c2ecf20Sopenharmony_ci 16858c2ecf20Sopenharmony_ci 16868c2ecf20Sopenharmony_ci /* set the hw in sleep mode use external clock and self memory refresh 16878c2ecf20Sopenharmony_ci * so that we can turn off internal PLLs later on 16888c2ecf20Sopenharmony_ci */ 16898c2ecf20Sopenharmony_ci smtc_seqw(0x20, (smtc_seqr(0x20) | 0xc0)); 16908c2ecf20Sopenharmony_ci smtc_seqw(0x69, (smtc_seqr(0x69) & 0xf7)); 16918c2ecf20Sopenharmony_ci 16928c2ecf20Sopenharmony_ci console_lock(); 16938c2ecf20Sopenharmony_ci fb_set_suspend(sfb->fb, 1); 16948c2ecf20Sopenharmony_ci console_unlock(); 16958c2ecf20Sopenharmony_ci 16968c2ecf20Sopenharmony_ci /* additionally turn off all function blocks including internal PLLs */ 16978c2ecf20Sopenharmony_ci smtc_seqw(0x21, 0xff); 16988c2ecf20Sopenharmony_ci 16998c2ecf20Sopenharmony_ci return 0; 17008c2ecf20Sopenharmony_ci} 17018c2ecf20Sopenharmony_ci 17028c2ecf20Sopenharmony_cistatic int __maybe_unused smtcfb_pci_resume(struct device *device) 17038c2ecf20Sopenharmony_ci{ 17048c2ecf20Sopenharmony_ci struct smtcfb_info *sfb = dev_get_drvdata(device); 17058c2ecf20Sopenharmony_ci 17068c2ecf20Sopenharmony_ci 17078c2ecf20Sopenharmony_ci /* reinit hardware */ 17088c2ecf20Sopenharmony_ci sm7xx_init_hw(); 17098c2ecf20Sopenharmony_ci switch (sfb->chip_id) { 17108c2ecf20Sopenharmony_ci case 0x710: 17118c2ecf20Sopenharmony_ci case 0x712: 17128c2ecf20Sopenharmony_ci /* set MCLK = 14.31818 * (0x16 / 0x2) */ 17138c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x16); 17148c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 17158c2ecf20Sopenharmony_ci smtc_seqw(0x62, 0x3e); 17168c2ecf20Sopenharmony_ci /* enable PCI burst */ 17178c2ecf20Sopenharmony_ci smtc_seqw(0x17, 0x20); 17188c2ecf20Sopenharmony_ci if (sfb->fb->var.bits_per_pixel == 32) 17198c2ecf20Sopenharmony_ci seqw17(); 17208c2ecf20Sopenharmony_ci break; 17218c2ecf20Sopenharmony_ci case 0x720: 17228c2ecf20Sopenharmony_ci smtc_seqw(0x62, 0xff); 17238c2ecf20Sopenharmony_ci smtc_seqw(0x6a, 0x0d); 17248c2ecf20Sopenharmony_ci smtc_seqw(0x6b, 0x02); 17258c2ecf20Sopenharmony_ci break; 17268c2ecf20Sopenharmony_ci } 17278c2ecf20Sopenharmony_ci 17288c2ecf20Sopenharmony_ci smtc_seqw(0x34, (smtc_seqr(0x34) | 0xc0)); 17298c2ecf20Sopenharmony_ci smtc_seqw(0x33, ((smtc_seqr(0x33) | 0x08) & 0xfb)); 17308c2ecf20Sopenharmony_ci 17318c2ecf20Sopenharmony_ci smtcfb_setmode(sfb); 17328c2ecf20Sopenharmony_ci 17338c2ecf20Sopenharmony_ci console_lock(); 17348c2ecf20Sopenharmony_ci fb_set_suspend(sfb->fb, 0); 17358c2ecf20Sopenharmony_ci console_unlock(); 17368c2ecf20Sopenharmony_ci 17378c2ecf20Sopenharmony_ci return 0; 17388c2ecf20Sopenharmony_ci} 17398c2ecf20Sopenharmony_ci 17408c2ecf20Sopenharmony_cistatic SIMPLE_DEV_PM_OPS(sm7xx_pm_ops, smtcfb_pci_suspend, smtcfb_pci_resume); 17418c2ecf20Sopenharmony_ci 17428c2ecf20Sopenharmony_cistatic struct pci_driver smtcfb_driver = { 17438c2ecf20Sopenharmony_ci .name = "smtcfb", 17448c2ecf20Sopenharmony_ci .id_table = smtcfb_pci_table, 17458c2ecf20Sopenharmony_ci .probe = smtcfb_pci_probe, 17468c2ecf20Sopenharmony_ci .remove = smtcfb_pci_remove, 17478c2ecf20Sopenharmony_ci .driver.pm = &sm7xx_pm_ops, 17488c2ecf20Sopenharmony_ci}; 17498c2ecf20Sopenharmony_ci 17508c2ecf20Sopenharmony_cistatic int __init sm712fb_init(void) 17518c2ecf20Sopenharmony_ci{ 17528c2ecf20Sopenharmony_ci char *option = NULL; 17538c2ecf20Sopenharmony_ci 17548c2ecf20Sopenharmony_ci if (fb_get_options("sm712fb", &option)) 17558c2ecf20Sopenharmony_ci return -ENODEV; 17568c2ecf20Sopenharmony_ci if (option && *option) 17578c2ecf20Sopenharmony_ci mode_option = option; 17588c2ecf20Sopenharmony_ci sm7xx_vga_setup(mode_option); 17598c2ecf20Sopenharmony_ci 17608c2ecf20Sopenharmony_ci return pci_register_driver(&smtcfb_driver); 17618c2ecf20Sopenharmony_ci} 17628c2ecf20Sopenharmony_ci 17638c2ecf20Sopenharmony_cimodule_init(sm712fb_init); 17648c2ecf20Sopenharmony_ci 17658c2ecf20Sopenharmony_cistatic void __exit sm712fb_exit(void) 17668c2ecf20Sopenharmony_ci{ 17678c2ecf20Sopenharmony_ci pci_unregister_driver(&smtcfb_driver); 17688c2ecf20Sopenharmony_ci} 17698c2ecf20Sopenharmony_ci 17708c2ecf20Sopenharmony_cimodule_exit(sm712fb_exit); 17718c2ecf20Sopenharmony_ci 17728c2ecf20Sopenharmony_ciMODULE_AUTHOR("Siliconmotion "); 17738c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Framebuffer driver for SMI Graphic Cards"); 17748c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL"); 1775