^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Silicon Motion SM7XX frame buffer device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2006 Silicon Motion Technology Corp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Authors: Ge Wang, gewang@siliconmotion.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Boyod boyod.yang@siliconmotion.com.cn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2009 Lemote, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Author: Wu Zhangjin, wuzhangjin@gmail.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Copyright (C) 2011 Igalia, S.L.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Author: Javier M. Mellid <jmunhoz@igalia.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * License. See the file COPYING in the main directory of this archive for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Framebuffer driver for Silicon Motion SM710, SM712, SM721 and SM722 chips
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/fb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/pci.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/console.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <linux/screen_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <linux/pm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "sm712.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * Private structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct smtcfb_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) struct pci_dev *pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) struct fb_info *fb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u16 chip_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u8 chip_rev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) void __iomem *lfb; /* linear frame buffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) void __iomem *dp_regs; /* drawing processor control regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) void __iomem *vp_regs; /* video processor control regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) void __iomem *cp_regs; /* capture processor control regs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) void __iomem *mmio; /* memory map IO port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) u_int width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u_int height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u_int hz;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u32 colreg[17];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) void __iomem *smtc_regbaseaddress; /* Memory Map IO starting address */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) static const struct fb_var_screeninfo smtcfb_var = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .xres = 1024,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .yres = 600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .xres_virtual = 1024,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .yres_virtual = 600,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .bits_per_pixel = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .red = {16, 8, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .green = {8, 8, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) .blue = {0, 8, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .activate = FB_ACTIVATE_NOW,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .height = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .width = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .vmode = FB_VMODE_NONINTERLACED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .nonstd = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .accel_flags = FB_ACCELF_TEXT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static struct fb_fix_screeninfo smtcfb_fix = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .id = "smXXXfb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) .type = FB_TYPE_PACKED_PIXELS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) .visual = FB_VISUAL_TRUECOLOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) .line_length = 800 * 3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .accel = FB_ACCEL_SMI_LYNX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .type_aux = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .xpanstep = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .ypanstep = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) .ywrapstep = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) struct vesa_mode {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) char index[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u16 lfb_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) u16 lfb_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) u16 lfb_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) static const struct vesa_mode vesa_mode_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) {"0x301", 640, 480, 8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) {"0x303", 800, 600, 8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) {"0x305", 1024, 768, 8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {"0x307", 1280, 1024, 8},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {"0x311", 640, 480, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {"0x314", 800, 600, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {"0x317", 1024, 768, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {"0x31A", 1280, 1024, 16},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) {"0x312", 640, 480, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) {"0x315", 800, 600, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {"0x318", 1024, 768, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) {"0x31B", 1280, 1024, 24},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /**********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) SM712 Mode table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) **********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) static const struct modeinit vgamode[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* mode#0: 640 x 480 16Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 640, 480, 16, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 0x03, 0x01, 0x0F, 0x00, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /* mode#1: 640 x 480 24Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 640, 480, 24, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 0x03, 0x01, 0x0F, 0x00, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /* mode#0: 640 x 480 32Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 640, 480, 32, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 0x03, 0x01, 0x0F, 0x00, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) { /* mode#2: 800 x 600 16Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 800, 600, 16, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 0x2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) { /* mode#3: 800 x 600 24Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 800, 600, 24, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 0x2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 0x02, 0x45, 0x30, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) { /* mode#7: 800 x 600 32Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 800, 600, 32, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 0x2B,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 0x34, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) /* We use 1024x768 table to light 1024x600 panel for lemote */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) { /* mode#4: 1024 x 600 16Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 1024, 600, 16, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 0xEB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 0x03, 0x01, 0x0F, 0x00, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 0xC8, 0x40, 0x14, 0x60, 0x00, 0x0A, 0x17, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 0x51, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 0xC4, 0x30, 0x02, 0x00, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 0x22, 0x03, 0x24, 0x09, 0xC0, 0x22, 0x22, 0x22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x22, 0x22, 0x22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 0x00, 0x60, 0x59, 0x22, 0x22, 0x00, 0x00, 0x22,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 0x50, 0x03, 0x16, 0x02, 0x0D, 0x82, 0x09, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 0x04, 0x45, 0x3F, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 0xA3, 0x7F, 0x00, 0x82, 0x0b, 0x6f, 0x57, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 0x5c, 0x0f, 0xE0, 0xe0, 0x7F, 0x57,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) { /* 1024 x 768 16Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 1024, 768, 16, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 0xEB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 0x0F, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) { /* mode#5: 1024 x 768 24Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 1024, 768, 24, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 0xEB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 0xC4, 0x30, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) { /* mode#4: 1024 x 768 32Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 1024, 768, 32, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 0xEB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 0xC4, 0x32, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 0x50, 0x03, 0x74, 0x14, 0x3B, 0x0D, 0x09, 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 0x00, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 0xA3, 0x7F, 0x00, 0x86, 0x15, 0x24, 0xFF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 0x01, 0x07, 0xE5, 0x20, 0x7F, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) { /* mode#6: 320 x 240 16Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 320, 240, 16, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 0xEB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 0xC4, 0x32, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) { /* mode#8: 320 x 240 32Bpp 60Hz */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) 320, 240, 32, 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) /* Init_MISC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) 0xEB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) { /* Init_SR0_SR4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) 0x03, 0x01, 0x0F, 0x03, 0x0E,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) { /* Init_SR10_SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) 0xF3, 0xB6, 0xC0, 0xDD, 0x00, 0x0E, 0x17, 0x2C,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) 0x99, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) 0xC4, 0x32, 0x02, 0x01, 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) { /* Init_SR30_SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) 0x38, 0x03, 0x20, 0x09, 0xC0, 0x3A, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) 0x3A, 0x3A, 0x3A, 0x3A, 0x00, 0x00, 0x03, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) 0x20, 0x0C, 0x44, 0x20, 0x00, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) 0x06, 0x68, 0xA7, 0x7F, 0x83, 0x24, 0xFF, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) 0x00, 0x60, 0x59, 0x3A, 0x3A, 0x00, 0x00, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) 0x50, 0x03, 0x74, 0x14, 0x08, 0x43, 0x08, 0x43,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) 0x04, 0x45, 0x30, 0x30, 0x40, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) { /* Init_SR80_SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) 0xFF, 0x07, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) 0xF7, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x3A, 0x3A,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) { /* Init_SRA0_SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) 0x00, 0xFB, 0x9F, 0x01, 0x00, 0xED, 0xED, 0xED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) 0x7B, 0xFB, 0xFF, 0xFF, 0x97, 0xEF, 0xBF, 0xDF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) { /* Init_GR00_GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) { /* Init_AR00_AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) 0x41, 0x00, 0x0F, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) { /* Init_CR00_CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) 0xA3, 0x7F, 0x7F, 0x00, 0x85, 0x16, 0x24, 0xF5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) 0x03, 0x09, 0xFF, 0x80, 0x40, 0xFF, 0x00, 0xE3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) { /* Init_CR30_CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) 0x00, 0x00, 0x30, 0x40, 0x00, 0xFF, 0xBF, 0xFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) 0x2E, 0x27, 0x00, 0x2b, 0x0c, 0x0F, 0xEF, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) 0xFe, 0x0f, 0x01, 0xC0, 0x27, 0xEF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) { /* Init_CR90_CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) 0x55, 0xD9, 0x5D, 0xE1, 0x86, 0x1B, 0x8E, 0x26,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) 0xDA, 0x8D, 0xDE, 0x94, 0x00, 0x00, 0x18, 0x00,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) static struct screen_info smtc_scr_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) static char *mode_option;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) /* process command line options, get vga parameter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) static void __init sm7xx_vga_setup(char *options)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) if (!options || !*options)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) smtc_scr_info.lfb_width = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) smtc_scr_info.lfb_height = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) smtc_scr_info.lfb_depth = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) pr_debug("%s = %s\n", __func__, options);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) for (i = 0; i < ARRAY_SIZE(vesa_mode_table); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) if (strstr(options, vesa_mode_table[i].index)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) smtc_scr_info.lfb_width = vesa_mode_table[i].lfb_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) smtc_scr_info.lfb_height =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) vesa_mode_table[i].lfb_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) smtc_scr_info.lfb_depth = vesa_mode_table[i].lfb_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) static void sm712_setpalette(int regno, unsigned int red, unsigned int green,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) unsigned int blue, struct fb_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) /* set bit 5:4 = 01 (write LCD RAM only) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) smtc_seqw(0x66, (smtc_seqr(0x66) & 0xC3) | 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) smtc_mmiowb(regno, dac_reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) smtc_mmiowb(red >> 10, dac_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) smtc_mmiowb(green >> 10, dac_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) smtc_mmiowb(blue >> 10, dac_val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) /* chan_to_field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * convert a colour value into a field position
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) * from pxafb.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) static inline unsigned int chan_to_field(unsigned int chan,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct fb_bitfield *bf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) chan &= 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) chan >>= 16 - bf->length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) return chan << bf->offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) static int smtc_blank(int blank_mode, struct fb_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) struct smtcfb_info *sfb = info->par;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) /* clear DPMS setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) switch (blank_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) case FB_BLANK_UNBLANK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) /* Screen On: HSync: On, VSync : On */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) switch (sfb->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) case 0x710:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) case 0x712:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) smtc_seqw(0x6a, 0x16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) case 0x720:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) smtc_seqw(0x6a, 0x0d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) smtc_seqw(0x01, (smtc_seqr(0x01) & (~0x20)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) smtc_seqw(0x21, (smtc_seqr(0x21) & 0x77));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) smtc_seqw(0x31, (smtc_seqr(0x31) | 0x03));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) case FB_BLANK_NORMAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) /* Screen Off: HSync: On, VSync : On Soft blank */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) smtc_seqw(0x24, (smtc_seqr(0x24) | 0x01));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) smtc_seqw(0x23, (smtc_seqr(0x23) & (~0xc0)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) smtc_seqw(0x01, (smtc_seqr(0x01) & (~0x20)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) smtc_seqw(0x22, (smtc_seqr(0x22) & (~0x30)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) smtc_seqw(0x6a, 0x16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) case FB_BLANK_VSYNC_SUSPEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) /* Screen On: HSync: On, VSync : Off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) smtc_seqw(0x6a, 0x0c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) case FB_BLANK_HSYNC_SUSPEND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) /* Screen On: HSync: Off, VSync : On */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x10));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) smtc_seqw(0x6a, 0x0c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) case FB_BLANK_POWERDOWN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) /* Screen On: HSync: Off, VSync : Off */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) smtc_seqw(0x24, (smtc_seqr(0x24) & (~0x01)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) smtc_seqw(0x31, ((smtc_seqr(0x31) & (~0x07)) | 0x00));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) smtc_seqw(0x23, ((smtc_seqr(0x23) & (~0xc0)) | 0xD8));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) smtc_seqw(0x01, (smtc_seqr(0x01) | 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) smtc_seqw(0x21, (smtc_seqr(0x21) | 0x88));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) smtc_seqw(0x20, (smtc_seqr(0x20) & (~0xB0)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) smtc_seqw(0x22, ((smtc_seqr(0x22) & (~0x30)) | 0x30));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) smtc_seqw(0x34, (smtc_seqr(0x34) | 0x80));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) smtc_seqw(0x6a, 0x0c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) static int smtc_setcolreg(unsigned int regno, unsigned int red,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) unsigned int green, unsigned int blue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) unsigned int trans, struct fb_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) struct smtcfb_info *sfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) sfb = info->par;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) if (regno > 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) switch (sfb->fb->fix.visual) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) case FB_VISUAL_DIRECTCOLOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) case FB_VISUAL_TRUECOLOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) * 16/32 bit true-colour, use pseudo-palette for 16 base color
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) if (regno >= 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) if (sfb->fb->var.bits_per_pixel == 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) u32 *pal = sfb->fb->pseudo_palette;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) val = chan_to_field(red, &sfb->fb->var.red);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) val |= chan_to_field(green, &sfb->fb->var.green);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) val |= chan_to_field(blue, &sfb->fb->var.blue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) pal[regno] = pal_rgb(red, green, blue, val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) u32 *pal = sfb->fb->pseudo_palette;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) val = chan_to_field(red, &sfb->fb->var.red);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) val |= chan_to_field(green, &sfb->fb->var.green);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) val |= chan_to_field(blue, &sfb->fb->var.blue);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) pal[regno] = big_swap(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) case FB_VISUAL_PSEUDOCOLOR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) /* color depth 8 bit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) sm712_setpalette(regno, red, green, blue, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) return 1; /* unknown type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) static ssize_t smtcfb_read(struct fb_info *info, char __user *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) unsigned long p = *ppos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) u32 *buffer, *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) u32 __iomem *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) int c, i, cnt = 0, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) unsigned long total_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) if (!info || !info->screen_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) if (info->state != FBINFO_STATE_RUNNING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) total_size = info->screen_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) if (total_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) total_size = info->fix.smem_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (p >= total_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (count >= total_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) count = total_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (count + p > total_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) count = total_size - p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) src = (u32 __iomem *)(info->screen_base + p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) if (info->fbops->fb_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) info->fbops->fb_sync(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) dst = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) for (i = (c + 3) >> 2; i--;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) u32 val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) val = fb_readl(src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) *dst = big_swap(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) src++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) dst++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (copy_to_user(buf, buffer, c)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) *ppos += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) buf += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) cnt += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) count -= c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) return (err) ? err : cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) static ssize_t smtcfb_write(struct fb_info *info, const char __user *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) unsigned long p = *ppos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) u32 *buffer, *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) u32 __iomem *dst;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) int c, i, cnt = 0, err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) unsigned long total_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) if (!info || !info->screen_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) if (info->state != FBINFO_STATE_RUNNING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) total_size = info->screen_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) if (total_size == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) total_size = info->fix.smem_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) if (p > total_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) return -EFBIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) if (count > total_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) err = -EFBIG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) count = total_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) if (count + p > total_size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) err = -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) count = total_size - p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) if (!buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) dst = (u32 __iomem *)(info->screen_base + p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) if (info->fbops->fb_sync)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) info->fbops->fb_sync(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) src = buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) if (copy_from_user(src, buf, c)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) for (i = (c + 3) >> 2; i--;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) fb_writel(big_swap(*src), dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) dst++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) src++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) *ppos += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) buf += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) cnt += c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) count -= c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) kfree(buffer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) return (cnt) ? cnt : err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) static void sm7xx_set_timing(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) int i = 0, j = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) u32 m_nscreenstride;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) dev_dbg(&sfb->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) "sfb->width=%d sfb->height=%d sfb->fb->var.bits_per_pixel=%d sfb->hz=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) sfb->width, sfb->height, sfb->fb->var.bits_per_pixel, sfb->hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) for (j = 0; j < ARRAY_SIZE(vgamode); j++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) if (vgamode[j].mmsizex != sfb->width ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) vgamode[j].mmsizey != sfb->height ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) vgamode[j].bpp != sfb->fb->var.bits_per_pixel ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) vgamode[j].hz != sfb->hz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) dev_dbg(&sfb->pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) "vgamode[j].mmsizex=%d vgamode[j].mmSizeY=%d vgamode[j].bpp=%d vgamode[j].hz=%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) vgamode[j].mmsizex, vgamode[j].mmsizey,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) vgamode[j].bpp, vgamode[j].hz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) dev_dbg(&sfb->pdev->dev, "vgamode index=%d\n", j);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) smtc_mmiowb(0x0, 0x3c6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) smtc_seqw(0, 0x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) smtc_mmiowb(vgamode[j].init_misc, 0x3c2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) /* init SEQ register SR00 - SR04 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) for (i = 0; i < SIZE_SR00_SR04; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) smtc_seqw(i, vgamode[j].init_sr00_sr04[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) /* init SEQ register SR10 - SR24 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) for (i = 0; i < SIZE_SR10_SR24; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) smtc_seqw(i + 0x10, vgamode[j].init_sr10_sr24[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) /* init SEQ register SR30 - SR75 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) for (i = 0; i < SIZE_SR30_SR75; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) if ((i + 0x30) != 0x30 && (i + 0x30) != 0x62 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) (i + 0x30) != 0x6a && (i + 0x30) != 0x6b &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) (i + 0x30) != 0x70 && (i + 0x30) != 0x71 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) (i + 0x30) != 0x74 && (i + 0x30) != 0x75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) smtc_seqw(i + 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) vgamode[j].init_sr30_sr75[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) /* init SEQ register SR80 - SR93 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) for (i = 0; i < SIZE_SR80_SR93; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) smtc_seqw(i + 0x80, vgamode[j].init_sr80_sr93[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) /* init SEQ register SRA0 - SRAF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) for (i = 0; i < SIZE_SRA0_SRAF; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) smtc_seqw(i + 0xa0, vgamode[j].init_sra0_sraf[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) /* init Graphic register GR00 - GR08 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) for (i = 0; i < SIZE_GR00_GR08; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) smtc_grphw(i, vgamode[j].init_gr00_gr08[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) /* init Attribute register AR00 - AR14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) for (i = 0; i < SIZE_AR00_AR14; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) smtc_attrw(i, vgamode[j].init_ar00_ar14[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) /* init CRTC register CR00 - CR18 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) for (i = 0; i < SIZE_CR00_CR18; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) smtc_crtcw(i, vgamode[j].init_cr00_cr18[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) /* init CRTC register CR30 - CR4D */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) for (i = 0; i < SIZE_CR30_CR4D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) if ((i + 0x30) >= 0x3B && (i + 0x30) <= 0x3F)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) /* side-effect, don't write to CR3B-CR3F */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) smtc_crtcw(i + 0x30, vgamode[j].init_cr30_cr4d[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) /* init CRTC register CR90 - CRA7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) for (i = 0; i < SIZE_CR90_CRA7; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) smtc_crtcw(i + 0x90, vgamode[j].init_cr90_cra7[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) smtc_mmiowb(0x67, 0x3c2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) /* set VPR registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) writel(0x0, sfb->vp_regs + 0x0C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) writel(0x0, sfb->vp_regs + 0x40);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) /* set data width */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) m_nscreenstride = (sfb->width * sfb->fb->var.bits_per_pixel) / 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) switch (sfb->fb->var.bits_per_pixel) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) writel(0x0, sfb->vp_regs + 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) writel(0x00020000, sfb->vp_regs + 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) writel(0x00040000, sfb->vp_regs + 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) writel(0x00030000, sfb->vp_regs + 0x0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) writel((u32)(((m_nscreenstride + 2) << 16) | m_nscreenstride),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) sfb->vp_regs + 0x10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) static void smtc_set_timing(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) switch (sfb->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) case 0x710:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) case 0x712:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) case 0x720:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) sm7xx_set_timing(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) static void smtcfb_setmode(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) switch (sfb->fb->var.bits_per_pixel) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) case 32:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) sfb->fb->fix.line_length = sfb->fb->var.xres * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) sfb->fb->var.red.length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) sfb->fb->var.green.length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) sfb->fb->var.blue.length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) sfb->fb->var.red.offset = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) sfb->fb->var.green.offset = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) sfb->fb->var.blue.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) case 24:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) sfb->fb->fix.line_length = sfb->fb->var.xres * 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) sfb->fb->var.red.length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) sfb->fb->var.green.length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) sfb->fb->var.blue.length = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) sfb->fb->var.red.offset = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) sfb->fb->var.green.offset = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) sfb->fb->var.blue.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) case 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) sfb->fb->fix.visual = FB_VISUAL_PSEUDOCOLOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) sfb->fb->fix.line_length = sfb->fb->var.xres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) sfb->fb->var.red.length = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) sfb->fb->var.green.length = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) sfb->fb->var.blue.length = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) sfb->fb->var.red.offset = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) sfb->fb->var.green.offset = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) sfb->fb->var.blue.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) case 16:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) sfb->fb->fix.visual = FB_VISUAL_TRUECOLOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) sfb->fb->fix.line_length = sfb->fb->var.xres * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) sfb->fb->var.red.length = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) sfb->fb->var.green.length = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) sfb->fb->var.blue.length = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) sfb->fb->var.red.offset = 11;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) sfb->fb->var.green.offset = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) sfb->fb->var.blue.offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) sfb->width = sfb->fb->var.xres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) sfb->height = sfb->fb->var.yres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) sfb->hz = 60;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) smtc_set_timing(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) static int smtc_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) /* sanity checks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) if (var->xres_virtual < var->xres)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) var->xres_virtual = var->xres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) if (var->yres_virtual < var->yres)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) var->yres_virtual = var->yres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) /* set valid default bpp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) if ((var->bits_per_pixel != 8) && (var->bits_per_pixel != 16) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) (var->bits_per_pixel != 24) && (var->bits_per_pixel != 32))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) var->bits_per_pixel = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) static int smtc_set_par(struct fb_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) smtcfb_setmode(info->par);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) static const struct fb_ops smtcfb_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) .fb_check_var = smtc_check_var,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) .fb_set_par = smtc_set_par,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) .fb_setcolreg = smtc_setcolreg,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) .fb_blank = smtc_blank,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) .fb_fillrect = cfb_fillrect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) .fb_imageblit = cfb_imageblit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) .fb_copyarea = cfb_copyarea,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) .fb_read = smtcfb_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) .fb_write = smtcfb_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) * Unmap in the memory mapped IO registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) static void smtc_unmap_mmio(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) if (sfb && smtc_regbaseaddress)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) smtc_regbaseaddress = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) * Map in the screen memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) static int smtc_map_smem(struct smtcfb_info *sfb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) struct pci_dev *pdev, u_long smem_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) sfb->fb->fix.smem_start = pci_resource_start(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) if (sfb->chip_id == 0x720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) /* on SM720, the framebuffer starts at the 1 MB offset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) sfb->fb->fix.smem_start += 0x00200000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) /* XXX: is it safe for SM720 on Big-Endian? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) if (sfb->fb->var.bits_per_pixel == 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) sfb->fb->fix.smem_start += big_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) sfb->fb->fix.smem_len = smem_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) sfb->fb->screen_base = sfb->lfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) if (!sfb->fb->screen_base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) dev_err(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) "%s: unable to map screen memory\n", sfb->fb->fix.id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) * Unmap in the screen memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) static void smtc_unmap_smem(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) if (sfb && sfb->fb->screen_base) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) if (sfb->chip_id == 0x720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) sfb->fb->screen_base -= 0x00200000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) iounmap(sfb->fb->screen_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) sfb->fb->screen_base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) * We need to wake up the device and make sure its in linear memory mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) static inline void sm7xx_init_hw(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) outb_p(0x18, 0x3c4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) outb_p(0x11, 0x3c5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) static u_long sm7xx_vram_probe(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) u8 vram;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) switch (sfb->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) case 0x710:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) case 0x712:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) * Assume SM712 graphics chip has 4MB VRAM.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) * FIXME: SM712 can have 2MB VRAM, which is used on earlier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) * laptops, such as IBM Thinkpad 240X. This driver would
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) * probably crash on those machines. If anyone gets one of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) * those and is willing to help, run "git blame" and send me
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) * an E-mail.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) return 0x00400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) case 0x720:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) outb_p(0x76, 0x3c4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) vram = inb_p(0x3c5) >> 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) if (vram == 0x00)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) return 0x00800000; /* 8 MB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) else if (vram == 0x01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) return 0x01000000; /* 16 MB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) else if (vram == 0x02)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) return 0x00400000; /* illegal, fallback to 4 MB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) else if (vram == 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) return 0x00400000; /* 4 MB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) return 0; /* unknown hardware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) static void sm7xx_resolution_probe(struct smtcfb_info *sfb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) /* get mode parameter from smtc_scr_info */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) if (smtc_scr_info.lfb_width != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) sfb->fb->var.xres = smtc_scr_info.lfb_width;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) sfb->fb->var.yres = smtc_scr_info.lfb_height;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) sfb->fb->var.bits_per_pixel = smtc_scr_info.lfb_depth;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) goto final;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) * No parameter, default resolution is 1024x768-16.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) * FIXME: earlier laptops, such as IBM Thinkpad 240X, has a 800x600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) * panel, also see the comments about Thinkpad 240X above.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) sfb->fb->var.xres = SCREEN_X_RES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) sfb->fb->var.yres = SCREEN_Y_RES_PC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) sfb->fb->var.bits_per_pixel = SCREEN_BPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) #ifdef CONFIG_MIPS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) * Loongson MIPS netbooks use 1024x600 LCD panels, which is the original
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) * target platform of this driver, but nearly all old x86 laptops have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) * 1024x768. Lighting 768 panels using 600's timings would partially
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) * garble the display, so we don't want that. But it's not possible to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) * distinguish them reliably.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) * So we change the default to 768, but keep 600 as-is on MIPS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) sfb->fb->var.yres = SCREEN_Y_RES_NETBOOK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) final:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) big_pixel_depth(sfb->fb->var.bits_per_pixel, smtc_scr_info.lfb_depth);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) static int smtcfb_pci_probe(struct pci_dev *pdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) const struct pci_device_id *ent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) struct smtcfb_info *sfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) struct fb_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) u_long smem_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) unsigned long mmio_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) dev_info(&pdev->dev, "Silicon Motion display driver.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) err = pci_enable_device(pdev); /* enable SMTC chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) err = pci_request_region(pdev, 0, "sm7xxfb");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) dev_err(&pdev->dev, "cannot reserve framebuffer region\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) goto failed_regions;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) sprintf(smtcfb_fix.id, "sm%Xfb", ent->device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) info = framebuffer_alloc(sizeof(*sfb), &pdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) if (!info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) goto failed_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) sfb = info->par;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) sfb->fb = info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) sfb->chip_id = ent->device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) sfb->pdev = pdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) info->flags = FBINFO_FLAG_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) info->fbops = &smtcfb_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) info->fix = smtcfb_fix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) info->var = smtcfb_var;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) info->pseudo_palette = sfb->colreg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) info->par = sfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) pci_set_drvdata(pdev, sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) sm7xx_init_hw();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) /* Map address and memory detection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) mmio_base = pci_resource_start(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) pci_read_config_byte(pdev, PCI_REVISION_ID, &sfb->chip_rev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) smem_size = sm7xx_vram_probe(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) dev_info(&pdev->dev, "%lu MiB of VRAM detected.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) smem_size / 1048576);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) switch (sfb->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) case 0x710:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) case 0x712:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) sfb->fb->fix.mmio_start = mmio_base + 0x00400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) sfb->fb->fix.mmio_len = 0x00400000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) sfb->lfb = ioremap(mmio_base, mmio_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) if (!sfb->lfb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) dev_err(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) "%s: unable to map memory mapped IO!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) sfb->fb->fix.id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) goto failed_fb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) sfb->mmio = (smtc_regbaseaddress =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) sfb->lfb + 0x00700000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) sfb->dp_regs = sfb->lfb + 0x00408000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) sfb->vp_regs = sfb->lfb + 0x0040c000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) if (sfb->fb->var.bits_per_pixel == 32) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) sfb->lfb += big_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) dev_info(&pdev->dev, "sfb->lfb=%p\n", sfb->lfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) /* set MCLK = 14.31818 * (0x16 / 0x2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) smtc_seqw(0x6a, 0x16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) smtc_seqw(0x62, 0x3e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) /* enable PCI burst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) smtc_seqw(0x17, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) /* enable word swap */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) if (sfb->fb->var.bits_per_pixel == 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) seqw17();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) case 0x720:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) sfb->fb->fix.mmio_start = mmio_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) sfb->fb->fix.mmio_len = 0x00200000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) sfb->dp_regs = ioremap(mmio_base, 0x00200000 + smem_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) if (!sfb->dp_regs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) dev_err(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) "%s: unable to map memory mapped IO!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) sfb->fb->fix.id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) goto failed_fb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) sfb->lfb = sfb->dp_regs + 0x00200000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) sfb->mmio = (smtc_regbaseaddress =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) sfb->dp_regs + 0x000c0000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) sfb->vp_regs = sfb->dp_regs + 0x800;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) smtc_seqw(0x62, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) smtc_seqw(0x6a, 0x0d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) dev_err(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) "No valid Silicon Motion display chip was detected!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) err = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) goto failed_fb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) /* probe and decide resolution */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) sm7xx_resolution_probe(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) /* can support 32 bpp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) if (sfb->fb->var.bits_per_pixel == 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) sfb->fb->var.bits_per_pixel = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) sfb->fb->var.xres_virtual = sfb->fb->var.xres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) sfb->fb->var.yres_virtual = sfb->fb->var.yres;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) err = smtc_map_smem(sfb, pdev, smem_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) * The screen would be temporarily garbled when sm712fb takes over
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) * vesafb or VGA text mode. Zero the framebuffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) memset_io(sfb->lfb, 0, sfb->fb->fix.smem_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) err = register_framebuffer(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) dev_info(&pdev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) "Silicon Motion SM%X Rev%X primary display mode %dx%d-%d Init Complete.\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) sfb->chip_id, sfb->chip_rev_id, sfb->fb->var.xres,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) sfb->fb->var.yres, sfb->fb->var.bits_per_pixel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) dev_err(&pdev->dev, "Silicon Motion, Inc. primary display init fail.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) smtc_unmap_smem(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) smtc_unmap_mmio(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) failed_fb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) framebuffer_release(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) failed_free:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) pci_release_region(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) failed_regions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) * 0x710 (LynxEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) * 0x712 (LynxEM+)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) * 0x720 (Lynx3DM, Lynx3DM+)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) static const struct pci_device_id smtcfb_pci_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) { PCI_DEVICE(0x126f, 0x710), },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) { PCI_DEVICE(0x126f, 0x712), },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) { PCI_DEVICE(0x126f, 0x720), },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) {0,}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) MODULE_DEVICE_TABLE(pci, smtcfb_pci_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) static void smtcfb_pci_remove(struct pci_dev *pdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) struct smtcfb_info *sfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) sfb = pci_get_drvdata(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) smtc_unmap_smem(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) smtc_unmap_mmio(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) unregister_framebuffer(sfb->fb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) framebuffer_release(sfb->fb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) pci_release_region(pdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) pci_disable_device(pdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) static int __maybe_unused smtcfb_pci_suspend(struct device *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) struct smtcfb_info *sfb = dev_get_drvdata(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) /* set the hw in sleep mode use external clock and self memory refresh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) * so that we can turn off internal PLLs later on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) smtc_seqw(0x20, (smtc_seqr(0x20) | 0xc0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) smtc_seqw(0x69, (smtc_seqr(0x69) & 0xf7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) console_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) fb_set_suspend(sfb->fb, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) console_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) /* additionally turn off all function blocks including internal PLLs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) smtc_seqw(0x21, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) static int __maybe_unused smtcfb_pci_resume(struct device *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) struct smtcfb_info *sfb = dev_get_drvdata(device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) /* reinit hardware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) sm7xx_init_hw();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) switch (sfb->chip_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) case 0x710:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) case 0x712:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) /* set MCLK = 14.31818 * (0x16 / 0x2) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) smtc_seqw(0x6a, 0x16);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) smtc_seqw(0x62, 0x3e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) /* enable PCI burst */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) smtc_seqw(0x17, 0x20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) if (sfb->fb->var.bits_per_pixel == 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) seqw17();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) case 0x720:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) smtc_seqw(0x62, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) smtc_seqw(0x6a, 0x0d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) smtc_seqw(0x6b, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) smtc_seqw(0x34, (smtc_seqr(0x34) | 0xc0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) smtc_seqw(0x33, ((smtc_seqr(0x33) | 0x08) & 0xfb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) smtcfb_setmode(sfb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) console_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) fb_set_suspend(sfb->fb, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) console_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) static SIMPLE_DEV_PM_OPS(sm7xx_pm_ops, smtcfb_pci_suspend, smtcfb_pci_resume);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) static struct pci_driver smtcfb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) .name = "smtcfb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) .id_table = smtcfb_pci_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) .probe = smtcfb_pci_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) .remove = smtcfb_pci_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) .driver.pm = &sm7xx_pm_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) static int __init sm712fb_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) char *option = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) if (fb_get_options("sm712fb", &option))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) if (option && *option)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) mode_option = option;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) sm7xx_vga_setup(mode_option);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) return pci_register_driver(&smtcfb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) module_init(sm712fb_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) static void __exit sm712fb_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) pci_unregister_driver(&smtcfb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) module_exit(sm712fb_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) MODULE_AUTHOR("Siliconmotion ");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) MODULE_DESCRIPTION("Framebuffer driver for SMI Graphic Cards");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) MODULE_LICENSE("GPL");