/* * Silicon Motion SM7XX frame buffer device * * Copyright (C) 2006 Silicon Motion Technology Corp. * Authors: Ge Wang, gewang@siliconmotion.com * Boyod boyod.yang@siliconmotion.com.cn * * Copyright (C) 2009 Lemote, Inc. * Author: Wu Zhangjin, wuzhangjin@gmail.com * * Copyright (C) 2011 Igalia, S.L. * Author: Javier M. Mellid <jmunhoz@igalia.com> * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive for * more details. * * Framebuffer driver for Silicon Motion SM710, SM712, SM721 and SM722 chips */ #include <linux/aperture.h>#include <linux/io.h>#include <linux/fb.h>#include <linux/pci.h>#include <linux/init.h>#include <linux/slab.h>#include <linux/uaccess.h>#include <linux/module.h>#include <linux/console.h> #include <linux/pm.h> #include "sm712.h" struct smtcfb_screen_info { u16 lfb_width; u16 lfb_height; u16 lfb_depth;}; /* * Private structure */struct smtcfb_info { struct pci_dev *pdev; struct fb_info *fb; u16 chip_id; u8 chip_rev_id; void __iomem *lfb; /* linear frame buffer */ void __iomem *dp_regs; /* drawing processor control regs */ void __iomem *vp_regs; /* video processor control regs */ void __iomem *cp_regs; /* capture processor control regs */ void __iomem *mmio; /* memory map IO port */ u_int width; u_int height; u_int hz; u32 colreg[17];}; void __iomem *smtc_regbaseaddress; /* Memory Map IO starting address */ static const struct fb_var_screeninfo smtcfb_var = { .xres = 1024, .yres = 600, .xres_virtual = 1024, .yres_virtual = 600, .bits_per_pixel = 16, .red = {16, 8, 0}, .green = {8, 8, 0}, .blue = {0, 8, 0}, .activate = FB_ACTIVATE_NOW, .height = -1, .width = -1, .vmode = FB_VMODE_NONINTERLACED, .nonstd = 0, .accel_flags = FB_ACCELF_TEXT,}; static struct fb_fix_screeninfo smtcfb_fix = { .id = "smXXXfb", .type = FB_TYPE_PACKED_PIXELS, .visual = FB_VISUAL_TRUECOLOR, .line_length = 800 * 3, .accel = FB_ACCEL_SMI_LYNX, .type_aux = 0, .xpanstep = 0, .ypanstep = 0, .ywrapstep = 0,}; struct vesa_mode { char index[6]; u16 lfb_width; u16 lfb_height; u16 lfb_depth;}; static const struct vesa_mode vesa_mode_table[] = { {"0x301", 640, 480, 8}, {"0x303", 800, 600, 8}, {"0x305", 1024, 768, 8}, {"0x307", 1280, 1024, 8}, {"0x311", 640, 480, 16}, {"0x314", 800, 600, 16}, {"0x317", 1024, 768, 16}, {"0x31A", 1280, 1024, 16}, {"0x312", 640, 480, 24}, {"0x315", 800, 600, 24}, {"0x318", 1024, 768, 24}, {"0x31B", 1280, 1024, 24},}; /********************************************************************** SM712 Mode table. **********************************************************************/static const struct modeinit vgamode[] = { { /* mode#0: 640 x 480 16Bpp 60Hz */ 640, 480, 16, 60, /* Init_MISC */ 0xE3, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, }, { /* Init_CR90_CRA7 */ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, }, }, { /* mode#1: 640 x 480 24Bpp 60Hz */ 640, 480, 24, 60, /* Init_MISC */ 0xE3, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, }, { /* Init_CR90_CRA7 */ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, }, }, { /* mode#0: 640 x 480 32Bpp 60Hz */ 640, 480, 32, 60, /* Init_MISC */ 0xE3, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, }, { /* Init_CR90_CRA7 */ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, }, }, { /* mode#2: 800 x 600 16Bpp 60Hz */ 800, 600, 16, 60, /* Init_MISC */ 0x2B, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x03, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, }, { /* Init_SR80_SR93 */ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, }, { /* Init_CR90_CRA7 */ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, }, }, { /* mode#3: 800 x 600 24Bpp 60Hz */ 800, 600, 24, 60, 0x2B, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x03, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36, 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 0x02, 0x45, 0x30, 0x30, 0x40, 0x20, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, }, { /* Init_CR90_CRA7 */ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, }, }, { /* mode#7: 800 x 600 32Bpp 60Hz */ 800, 600, 32, 60, /* Init_MISC */ 0x2B, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x03, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, }, { /* Init_SR80_SR93 */ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, }, { /* Init_CR90_CRA7 */ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, }, }, /* We use 1024x768 table to light 1024x600 panel for lemote */ { /* mode#4: 1024 x 600 16Bpp 60Hz */ 1024, 600, 16, 60, /* Init_MISC */ 0xEB, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xC8, 0x40, 0x14, 0x60, 0x00, 0x0A, 0x17, 0x20, 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x00, 0x01, }, { /* Init_SR30_SR75 */ 0x22, 0x03, 0x24, 0x09, 0xC0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x22, 0x22, 0x22, 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 0x00, 0x60, 0x59, 0x22, 0x22, 0x00, 0x00, 0x22, 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x16, 0x02, 0x0D, 0x82, 0x09, 0x02,Lines 1–500 of 1779. Load more
/* * Silicon Motion SM7XX frame buffer device * * Copyright (C) 2006 Silicon Motion Technology Corp. * Authors: Ge Wang, gewang@siliconmotion.com * Boyod boyod.yang@siliconmotion.com.cn * * Copyright (C) 2009 Lemote, Inc. * Author: Wu Zhangjin, wuzhangjin@gmail.com * * Copyright (C) 2011 Igalia, S.L. * Author: Javier M. Mellid <jmunhoz@igalia.com> * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive for * more details. * * Framebuffer driver for Silicon Motion SM710, SM712, SM721 and SM722 chips */ #include <linux/aperture.h> #include <linux/io.h> #include <linux/fb.h> #include <linux/pci.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/uaccess.h> #include <linux/module.h> #include <linux/console.h> #include <linux/pm.h> #include "sm712.h" struct smtcfb_screen_info { u16 lfb_width; u16 lfb_height; u16 lfb_depth; }; /* * Private structure */ struct smtcfb_info { struct pci_dev *pdev; struct fb_info *fb; u16 chip_id; u8 chip_rev_id; void __iomem *lfb; /* linear frame buffer */ void __iomem *dp_regs; /* drawing processor control regs */ void __iomem *vp_regs; /* video processor control regs */ void __iomem *cp_regs; /* capture processor control regs */ void __iomem *mmio; /* memory map IO port */ u_int width; u_int height; u_int hz; u32 colreg[17]; }; void __iomem *smtc_regbaseaddress; /* Memory Map IO starting address */ static const struct fb_var_screeninfo smtcfb_var = { .xres = 1024, .yres = 600, .xres_virtual = 1024, .yres_virtual = 600, .bits_per_pixel = 16, .red = {16, 8, 0}, .green = {8, 8, 0}, .blue = {0, 8, 0}, .activate = FB_ACTIVATE_NOW, .height = -1, .width = -1, .vmode = FB_VMODE_NONINTERLACED, .nonstd = 0, .accel_flags = FB_ACCELF_TEXT, }; static struct fb_fix_screeninfo smtcfb_fix = { .id = "smXXXfb", .type = FB_TYPE_PACKED_PIXELS, .visual = FB_VISUAL_TRUECOLOR, .line_length = 800 * 3, .accel = FB_ACCEL_SMI_LYNX, .type_aux = 0, .xpanstep = 0, .ypanstep = 0, .ywrapstep = 0, }; struct vesa_mode { char index[6]; u16 lfb_width; u16 lfb_height; u16 lfb_depth; }; static const struct vesa_mode vesa_mode_table[] = { {"0x301", 640, 480, 8}, {"0x303", 800, 600, 8}, {"0x305", 1024, 768, 8}, {"0x307", 1280, 1024, 8}, {"0x311", 640, 480, 16}, {"0x314", 800, 600, 16}, {"0x317", 1024, 768, 16}, {"0x31A", 1280, 1024, 16}, {"0x312", 640, 480, 24}, {"0x315", 800, 600, 24}, {"0x318", 1024, 768, 24}, {"0x31B", 1280, 1024, 24}, }; /********************************************************************** SM712 Mode table. **********************************************************************/ static const struct modeinit vgamode[] = { { /* mode#0: 640 x 480 16Bpp 60Hz */ 640, 480, 16, 60, /* Init_MISC */ 0xE3, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, }, { /* Init_CR90_CRA7 */ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, }, }, { /* mode#1: 640 x 480 24Bpp 60Hz */ 640, 480, 24, 60, /* Init_MISC */ 0xE3, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, }, { /* Init_CR90_CRA7 */ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, }, }, { /* mode#0: 640 x 480 32Bpp 60Hz */ 640, 480, 32, 60, /* Init_MISC */ 0xE3, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32, 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA, 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04, 0x00, 0x45, 0x30, 0x30, 0x40, 0x30, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD, 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00, 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF, }, { /* Init_CR90_CRA7 */ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55, 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00, 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, }, }, { /* mode#2: 800 x 600 16Bpp 60Hz */ 800, 600, 16, 60, /* Init_MISC */ 0x2B, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x03, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, }, { /* Init_SR80_SR93 */ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, }, { /* Init_CR90_CRA7 */ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, }, }, { /* mode#3: 800 x 600 24Bpp 60Hz */ 800, 600, 24, 60, 0x2B, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x03, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36, 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36, 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 0x02, 0x45, 0x30, 0x30, 0x40, 0x20, }, { /* Init_SR80_SR93 */ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36, 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, }, { /* Init_CR90_CRA7 */ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, }, }, { /* mode#7: 800 x 600 32Bpp 60Hz */ 800, 600, 32, 60, /* Init_MISC */ 0x2B, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x03, 0x0E, }, { /* Init_SR10_SR24 */ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C, 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x01, 0x01, }, { /* Init_SR30_SR75 */ 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24, 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58, 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24, 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13, 0x02, 0x45, 0x30, 0x35, 0x40, 0x20, }, { /* Init_SR80_SR93 */ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, }, { /* Init_SRA0_SRAF */ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED, 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF, }, { /* Init_GR00_GR08 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F, 0xFF, }, { /* Init_AR00_AR14 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x41, 0x00, 0x0F, 0x00, 0x00, }, { /* Init_CR00_CR18 */ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3, 0xFF, }, { /* Init_CR30_CR4D */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD, 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00, 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57, }, { /* Init_CR90_CRA7 */ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA, 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00, 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00, }, }, /* We use 1024x768 table to light 1024x600 panel for lemote */ { /* mode#4: 1024 x 600 16Bpp 60Hz */ 1024, 600, 16, 60, /* Init_MISC */ 0xEB, { /* Init_SR0_SR4 */ 0x03, 0x01, 0x0F, 0x00, 0x0E, }, { /* Init_SR10_SR24 */ 0xC8, 0x40, 0x14, 0x60, 0x00, 0x0A, 0x17, 0x20, 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x30, 0x02, 0x00, 0x01, }, { /* Init_SR30_SR75 */ 0x22, 0x03, 0x24, 0x09, 0xC0, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x03, 0xFF, 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC, 0x20, 0x0C, 0x44, 0x20, 0x00, 0x22, 0x22, 0x22, 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03, 0x00, 0x60, 0x59, 0x22, 0x22, 0x00, 0x00, 0x22, 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00, 0x50, 0x03, 0x16, 0x02, 0x0D, 0x82, 0x09, 0x02,