summaryrefslogtreecommitdiffstats
path: root/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch')
-rw-r--r--target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch1266
1 files changed, 0 insertions, 1266 deletions
diff --git a/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch b/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch
deleted file mode 100644
index 7eb27ee686..0000000000
--- a/target/linux/coldfire/patches/079-m547x_8x_pci_video_sm712.patch
+++ /dev/null
@@ -1,1266 +0,0 @@
-From a4c49cdc530046ded7a9fbfe9e13eab10d3973c7 Mon Sep 17 00:00:00 2001
-From: Kurt Mahan <kmahan@freescale.com>
-Date: Thu, 10 Jul 2008 19:19:29 -0600
-Subject: [PATCH] Add PCI Video SM712.
-
-LTIBName: m547x-8x-pci-video-sm712
-Signed-off-by: Kurt Mahan <kmahan@freescale.com>
-Signed-off-by: Shrek Wu <b16972@freescale.com>
----
- drivers/video/Kconfig | 10 +
- drivers/video/Makefile | 1 +
- drivers/video/cfbimgblt.c | 8 +-
- drivers/video/console/bitblit.c | 12 +
- drivers/video/console/fbcon.c | 7 +-
- drivers/video/smifb.c | 949 +++++++++++++++++++++++++++++++++++++++
- drivers/video/smifb.h | 149 ++++++
- include/linux/fb.h | 13 +-
- 8 files changed, 1142 insertions(+), 7 deletions(-)
- create mode 100644 drivers/video/smifb.c
- create mode 100644 drivers/video/smifb.h
-
---- a/drivers/video/Kconfig
-+++ b/drivers/video/Kconfig
-@@ -201,6 +201,16 @@ config FB_TILEBLITTING
- comment "Frame buffer hardware drivers"
- depends on FB
-
-+config FB_SMI
-+ tristate "SiliconMotion Lynx support"
-+ depends on FB && PCI
-+ select FB_CFB_FILLRECT
-+ select FB_CFB_COPYAREA
-+ select FB_CFB_IMAGEBLIT
-+ ---help---
-+ This enables support for the Silicon Motion Lynx family of graphic
-+ chips. It has been tested on ColdFire.
-+
- config FB_CIRRUS
- tristate "Cirrus Logic support"
- depends on FB && (ZORRO || PCI)
---- a/drivers/video/Makefile
-+++ b/drivers/video/Makefile
-@@ -28,6 +28,7 @@ obj-$(CONFIG_FB_DDC) += fb_ddc
- obj-$(CONFIG_FB_DEFERRED_IO) += fb_defio.o
-
- # Hardware specific drivers go first
-+obj-$(CONFIG_FB_SMI) += smifb.o
- obj-$(CONFIG_FB_AMIGA) += amifb.o c2p.o
- obj-$(CONFIG_FB_ARC) += arcfb.o
- obj-$(CONFIG_FB_CLPS711X) += clps711xfb.o
---- a/drivers/video/cfbimgblt.c
-+++ b/drivers/video/cfbimgblt.c
-@@ -44,12 +44,12 @@
- #endif
-
- static const u32 cfb_tab8[] = {
--#if defined(__BIG_ENDIAN)
-+#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
- 0x00000000,0x000000ff,0x0000ff00,0x0000ffff,
- 0x00ff0000,0x00ff00ff,0x00ffff00,0x00ffffff,
- 0xff000000,0xff0000ff,0xff00ff00,0xff00ffff,
- 0xffff0000,0xffff00ff,0xffffff00,0xffffffff
--#elif defined(__LITTLE_ENDIAN)
-+#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE)
- 0x00000000,0xff000000,0x00ff0000,0xffff0000,
- 0x0000ff00,0xff00ff00,0x00ffff00,0xffffff00,
- 0x000000ff,0xff0000ff,0x00ff00ff,0xffff00ff,
-@@ -60,9 +60,9 @@ static const u32 cfb_tab8[] = {
- };
-
- static const u32 cfb_tab16[] = {
--#if defined(__BIG_ENDIAN)
-+#if defined(__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
- 0x00000000, 0x0000ffff, 0xffff0000, 0xffffffff
--#elif defined(__LITTLE_ENDIAN)
-+#elif defined(__LITTLE_ENDIAN) || defined(CONFIG_COLDFIRE)
- 0x00000000, 0xffff0000, 0x0000ffff, 0xffffffff
- #else
- #error FIXME: No endianness??
---- a/drivers/video/console/bitblit.c
-+++ b/drivers/video/console/bitblit.c
-@@ -78,7 +78,11 @@ static inline void bit_putcs_aligned(str
- u32 d_pitch, u32 s_pitch, u32 cellsize,
- struct fb_image *image, u8 *buf, u8 *dst)
- {
-+#ifndef CONFIG_COLDFIRE
- u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#else
-+ u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#endif
- u32 idx = vc->vc_font.width >> 3;
- u8 *src;
-
-@@ -111,7 +115,11 @@ static inline void bit_putcs_unaligned(s
- struct fb_image *image, u8 *buf,
- u8 *dst)
- {
-+#ifndef CONFIG_COLDFIRE
- u16 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#else
-+ u32 charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#endif
- u32 shift_low = 0, mod = vc->vc_font.width % 8;
- u32 shift_high = 8;
- u32 idx = vc->vc_font.width >> 3;
-@@ -238,7 +246,11 @@ static void bit_cursor(struct vc_data *v
- {
- struct fb_cursor cursor;
- struct fbcon_ops *ops = info->fbcon_par;
-+#ifndef CONFIG_COLDFIRE
- unsigned short charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#else
-+ unsigned long charmask = vc->vc_hi_font_mask ? 0x1ff : 0xff;
-+#endif
- int w = (vc->vc_font.width + 7) >> 3, c;
- int y = real_y(ops->p, vc->vc_y);
- int attribute, use_sw = (vc->vc_cursor_type & 0x10);
---- a/drivers/video/console/fbcon.c
-+++ b/drivers/video/console/fbcon.c
-@@ -2679,8 +2679,11 @@ static int fbcon_set_palette(struct vc_d
- {
- struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
- int i, j, k, depth;
-- u8 val;
--
-+#ifndef CONFIG_COLDFIRE
-+ u8 val;
-+#else
-+ u32 val;
-+#endif
- if (fbcon_is_inactive(vc, info))
- return -EINVAL;
-
---- /dev/null
-+++ b/drivers/video/smifb.c
-@@ -0,0 +1,949 @@
-+/***************************************************************************
-+ smifb.c - Silicon Motion, Inc. LynxEM+ frame buffer device
-+ -------------------
-+ begin : Thu Aug 9 2001
-+ copyright : (C) 2001 by Szu-Tao Huang
-+ email : johuang@siliconmotion.com
-+ ***************************************************************************/
-+
-+/***************************************************************************
-+ * *
-+ * This program is free software; you can redistribute it and/or modify *
-+ * it under the terms of the GNU General Public License as published by *
-+ * the Free Software Foundation; either version 2 of the License, or *
-+ * (at your option) any later version. *
-+ * *
-+ ***************************************************************************/
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/tty.h>
-+#include <linux/slab.h>
-+#include <linux/delay.h>
-+#include <linux/fb.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+
-+#include "console/fbcon.h"
-+
-+/*
-+#include <video/fbcon.h>
-+#include <video/fbcon-cfb8.h>
-+#include <video/fbcon-cfb16.h>
-+#include <video/fbcon-cfb24.h>
-+*/
-+
-+#include <linux/fb.h>
-+
-+static char *SMIRegs; // point to virtual Memory Map IO starting address
-+static char *SMILFB; // point to virtual video memory starting address
-+static struct par_info hw; // used to record hardware information
-+
-+#include "smifb.h"
-+
-+struct ModeInit VGAMode[numVGAModes] =
-+{
-+ {
-+ /* mode#0: 640 x 480 8Bpp 60Hz */
-+ 640, 480, 8, 60,
-+ /* Init_MISC */
-+ 0xE3,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+ },
-+ },
-+ {
-+ /* mode#1: 640 x 480 16Bpp 60Hz */
-+ 640, 480, 16, 60,
-+ /* Init_MISC */
-+ 0xE3,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+ },
-+ },
-+ {
-+ /* mode#2: 640 x 480 24Bpp 60Hz */
-+ 640, 480, 24, 60,
-+ /* Init_MISC */
-+ 0xE3,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x00, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEF, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x32, 0x03, 0xA0, 0x09, 0xC0, 0x32, 0x32, 0x32,
-+ 0x32, 0x32, 0x32, 0x32, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x32, 0x32, 0x32,
-+ 0x04, 0x24, 0x63, 0x4F, 0x52, 0x0B, 0xDF, 0xEA,
-+ 0x04, 0x50, 0x19, 0x32, 0x32, 0x00, 0x00, 0x32,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x07, 0x82, 0x07, 0x04,
-+ 0x00, 0x45, 0x30, 0x30, 0x40, 0x30,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x32,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x32, 0x32,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xFF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x5F, 0x4F, 0x4F, 0x00, 0x53, 0x1F, 0x0B, 0x3E,
-+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xEA, 0x0C, 0xDF, 0x50, 0x40, 0xDF, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xFF, 0xFD,
-+ 0x5F, 0x4F, 0x00, 0x54, 0x00, 0x0B, 0xDF, 0x00,
-+ 0xEA, 0x0C, 0x2E, 0x00, 0x4F, 0xDF,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0xDD, 0x5E, 0xEA, 0x87, 0x44, 0x8F, 0x55,
-+ 0x0A, 0x8F, 0x55, 0x0A, 0x00, 0x00, 0x18, 0x00,
-+ 0x11, 0x10, 0x0B, 0x0A, 0x0A, 0x0A, 0x0A, 0x00,
-+ },
-+ },
-+ {/* mode#3: 800 x 600 8Bpp 60Hz */
-+ 800,600,8,60,
-+ 0x2B, /* Init_MISC */
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
-+ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
-+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
-+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x87, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
-+ 0x90, 0x01, 0x2C, 0x01, 0xFF, 0x00, 0x24, 0x24,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+ },
-+ },
-+ {/* mode#4: 800 x 600 16Bpp 60Hz */
-+ 800, 600, 16, 60,
-+ /* Init_MISC */
-+ 0x2B,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x24, 0x03, 0x20, 0x09, 0xC0, 0x24, 0x24, 0x24,
-+ 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x38, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x24, 0x24, 0x24,
-+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+ 0x04, 0x55, 0x59, 0x24, 0x24, 0x00, 0x00, 0x24,
-+ 0x01, 0x80, 0x7A, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+ 0x02, 0x45, 0x30, 0x35, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0x00, 0x00, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x24,
-+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x24, 0x24,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+ },
-+ },
-+ {/* mode#5: 800 x 600 24Bpp 60Hz */
-+ 800,600,24,60,
-+ 0x2B,
-+ { /* Init_SR0_SR4 */
-+ 0x03, 0x01, 0x0F, 0x03, 0x0E,
-+ },
-+ { /* Init_SR10_SR24 */
-+ 0xFF, 0xBE, 0xEE, 0xFF, 0x00, 0x0E, 0x17, 0x2C,
-+ 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0xC4, 0x30, 0x02, 0x01, 0x01,
-+ },
-+ { /* Init_SR30_SR75 */
-+ 0x36, 0x03, 0x20, 0x09, 0xC0, 0x36, 0x36, 0x36,
-+ 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x03, 0xFF,
-+ 0x00, 0xFC, 0x00, 0x00, 0x20, 0x18, 0x00, 0xFC,
-+ 0x20, 0x0C, 0x44, 0x20, 0x00, 0x36, 0x36, 0x36,
-+ 0x04, 0x48, 0x83, 0x63, 0x68, 0x72, 0x57, 0x58,
-+ 0x04, 0x55, 0x59, 0x36, 0x36, 0x00, 0x00, 0x36,
-+ 0x01, 0x80, 0x7E, 0x1A, 0x1A, 0x00, 0x00, 0x00,
-+ 0x50, 0x03, 0x74, 0x14, 0x1C, 0x85, 0x35, 0x13,
-+ 0x02, 0x45, 0x30, 0x30, 0x40, 0x20,
-+ },
-+ { /* Init_SR80_SR93 */
-+ 0xFF, 0x07, 0x00, 0x6F, 0x7F, 0x7F, 0xFF, 0x36,
-+ 0xF7, 0x00, 0x00, 0x00, 0xEF, 0xFF, 0x36, 0x36,
-+ 0x00, 0x00, 0x00, 0x00,
-+ },
-+ { /* Init_SRA0_SRAF */
-+ 0x00, 0xFF, 0xBF, 0xFF, 0xFF, 0xED, 0xED, 0xED,
-+ 0x7B, 0xFF, 0xFF, 0xFF, 0xBF, 0xEF, 0xBF, 0xDF,
-+ },
-+ { /* Init_GR00_GR08 */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, 0x0F,
-+ 0xFF,
-+ },
-+ { /* Init_AR00_AR14 */
-+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-+ 0x41, 0x00, 0x0F, 0x00, 0x00,
-+ },
-+ { /* Init_CR00_CR18 */
-+ 0x7F, 0x63, 0x63, 0x00, 0x68, 0x18, 0x72, 0xF0,
-+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-+ 0x58, 0x0C, 0x57, 0x64, 0x40, 0x57, 0x00, 0xE3,
-+ 0xFF,
-+ },
-+ { /* Init_CR30_CR4D */
-+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x03, 0x20,
-+ 0x00, 0x00, 0x00, 0x40, 0x00, 0xE7, 0xBF, 0xFD,
-+ 0x7F, 0x63, 0x00, 0x69, 0x18, 0x72, 0x57, 0x00,
-+ 0x58, 0x0C, 0xE0, 0x20, 0x63, 0x57,
-+ },
-+ { /* Init_CR90_CRA7 */
-+ 0x56, 0x4B, 0x5E, 0x55, 0x86, 0x9D, 0x8E, 0xAA,
-+ 0xDB, 0x2A, 0xDF, 0x33, 0x00, 0x00, 0x18, 0x00,
-+ 0x20, 0x1F, 0x1A, 0x19, 0x0F, 0x0F, 0x0F, 0x00,
-+ },
-+ },
-+};
-+
-+static void smi_set_timing(struct smifb_info *sfb,struct par_info *hw)
-+{
-+ int i=0,j=0;
-+ u32 m_nScreenStride;
-+
-+
-+ for (j=0;j < numVGAModes;j++) {
-+ if (VGAMode[j].mmSizeX == hw->width &&
-+ VGAMode[j].mmSizeY == hw->height &&
-+ VGAMode[j].bpp == sfb->fb.var.bits_per_pixel &&
-+ VGAMode[j].hz == hw->hz)
-+ {
-+
-+ smi_mmiowb(0x0,0x3c6);
-+
-+ smi_seqw(0,0x1);
-+
-+ smi_mmiowb(VGAMode[j].Init_MISC,0x3c2);
-+
-+ for (i=0;i<SIZE_SR00_SR04;i++) // init SEQ register SR00 - SR04
-+ {
-+ smi_seqw(i,VGAMode[j].Init_SR00_SR04[i]);
-+ }
-+
-+ for (i=0;i<SIZE_SR10_SR24;i++) // init SEQ register SR10 - SR24
-+ {
-+ smi_seqw(i+0x10,VGAMode[j].Init_SR10_SR24[i]);
-+ }
-+
-+ for (i=0;i<SIZE_SR30_SR75;i++) // init SEQ register SR30 - SR75
-+ {
-+ if (((i+0x30) != 0x62) && ((i+0x30) != 0x6a) && ((i+0x30) != 0x6b))
-+ smi_seqw(i+0x30,VGAMode[j].Init_SR30_SR75[i]);
-+ }
-+ for (i=0;i<SIZE_SR80_SR93;i++) // init SEQ register SR80 - SR93
-+ {
-+ smi_seqw(i+0x80,VGAMode[j].Init_SR80_SR93[i]);
-+ }
-+ for (i=0;i<SIZE_SRA0_SRAF;i++) // init SEQ register SRA0 - SRAF
-+ {
-+ smi_seqw(i+0xa0,VGAMode[j].Init_SRA0_SRAF[i]);
-+ }
-+
-+ for (i=0;i<SIZE_GR00_GR08;i++) // init Graphic register GR00 - GR08
-+ {
-+ smi_grphw(i,VGAMode[j].Init_GR00_GR08[i]);
-+ }
-+
-+ for (i=0;i<SIZE_AR00_AR14;i++) // init Attribute register AR00 - AR14
-+ {
-+
-+ smi_attrw(i,VGAMode[j].Init_AR00_AR14[i]);
-+ }
-+
-+ for (i=0;i<SIZE_CR00_CR18;i++) // init CRTC register CR00 - CR18
-+ {
-+ smi_crtcw(i,VGAMode[j].Init_CR00_CR18[i]);
-+ }
-+
-+ for (i=0;i<SIZE_CR30_CR4D;i++) // init CRTC register CR30 - CR4D
-+ {
-+ smi_crtcw(i+0x30,VGAMode[j].Init_CR30_CR4D[i]);
-+ }
-+
-+ for (i=0;i<SIZE_CR90_CRA7;i++) // init CRTC register CR90 - CRA7
-+ {
-+ smi_crtcw(i+0x90,VGAMode[j].Init_CR90_CRA7[i]);
-+ }
-+ }
-+ }
-+ smi_mmiowb(0x67,0x3c2);
-+ // set VPR registers
-+ writel(0x0,hw->m_pVPR+0x0C);
-+ writel(0x0,hw->m_pVPR+0x40);
-+ // set data width
-+ m_nScreenStride = (hw->width * sfb->fb.var.bits_per_pixel) / 64;
-+ switch (sfb->fb.var.bits_per_pixel)
-+ {
-+ case 8:
-+ writel(0x0,hw->m_pVPR+0x0);
-+ break;
-+ case 16:
-+ writel(0x00020000,hw->m_pVPR+0x0);
-+ break;
-+ case 24:
-+ writel(0x00040000,hw->m_pVPR+0x0);
-+ break;
-+ }
-+ writel((u32)(((m_nScreenStride + 2) << 16) | m_nScreenStride),hw->m_pVPR+0x10);
-+}
-+
-+/*
-+ * Set the color palette
-+ */
-+static int
-+smifb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
-+ u_int trans, struct fb_info *info)
-+{
-+
-+ struct smifb_info *sfb = (struct smifbinfo *)info;
-+ u32 *pal;
-+
-+ switch (sfb->fb.fix.visual) {
-+ case FB_VISUAL_TRUECOLOR: /* RGB 5:6:5 True Colour */
-+ pal = sfb->fb.pseudo_palette; // System has 16 default color
-+ if (regno >= 16)
-+ return 1;
-+
-+ pal[regno] = (red & 0xf800) |
-+ ((green & 0xfc00) >> 5) | ((blue & 0xf800) >> 11);
-+ break;
-+ }
-+
-+ return 0;
-+}
-+
-+/*
-+ * smifb_decode_var():
-+ * Get the video params out of 'var'. If a value doesn't fit, round it up,
-+ * if it's too big, return -EINVAL.
-+ *
-+ * Suggestion: Round up in the following order: bits_per_pixel, xres,
-+ * yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale,
-+ * bitfields, horizontal timing, vertical timing.
-+ */
-+static int smifb_decode_var(struct fb_var_screeninfo *var, struct smifb_info *sfb, struct par_info *hw)
-+{
-+ hw->width = var->xres;
-+ hw->height = var->yres;
-+ hw->hz = 60;
-+
-+ return 0;
-+}
-+
-+static int smifb_set_par (struct fb_info *info)
-+{
-+ struct smifb_info *sfb = (struct smifb_info *)info;
-+ int err, chgvar = 0;
-+ struct fb_var_screeninfo *var = &info->var;
-+ struct fb_cmap *cmap;
-+
-+
-+ /*
-+ * Decode var contents into a par structure, adjusting any
-+ * out of range values.
-+ */
-+ err = smifb_decode_var(var, sfb, &hw);
-+ if (err) {
-+ return err;
-+ }
-+
-+ if (hw.width != var->xres)
-+ chgvar = 1;
-+ if (hw.height != var->yres)
-+ chgvar = 1;
-+
-+ var->activate &= ~FB_ACTIVATE_ALL;
-+
-+ smi_set_timing(sfb, &hw);
-+
-+ sfb->palette_size = var->bits_per_pixel == 8 ? 256 : 16;
-+ cmap = fb_default_cmap(sfb->palette_size);
-+ fb_set_cmap(cmap, &sfb->fb);
-+
-+ return 0;
-+}
-+
-+static int smifb_check_var (struct fb_var_screeninfo *var, struct fb_info *info)
-+{
-+ var->bits_per_pixel += 7;
-+ var->bits_per_pixel &= ~7;
-+
-+ var->xres_virtual =
-+ var->xres_virtual < var->xres ? var->xres : var->xres_virtual;
-+ var->yres_virtual =
-+ var->yres_virtual < var->yres ? var->yres : var->yres_virtual;
-+
-+ switch (var->bits_per_pixel) {
-+ case 8:
-+ case 16: /* RGB 565 */
-+ case 24:
-+ break;
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ switch (var->bits_per_pixel) {
-+ case 16:
-+ var->red.offset = 11;
-+ var->red.length = 5;
-+ var->green.offset = 5;
-+ var->green.length = 6;
-+ var->blue.offset = 0;
-+ var->blue.length = 5;
-+
-+ info->fix.visual = FB_VISUAL_TRUECOLOR;
-+ info->fix.line_length= var->xres * 2;
-+
-+ break;
-+ default:
-+ return -EINVAL; /* We don't support anything other than 16bpp for now. --NL */
-+ break;
-+ }
-+ return 0;
-+
-+// smifb_set_color_bitfields(var);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Formal definition of the VESA spec:
-+ * On
-+ * This refers to the state of the display when it is in full operation
-+ * Stand-By
-+ * This defines an optional operating state of minimal power reduction with
-+ * the shortest recovery time
-+ * Suspend
-+ * This refers to a level of power management in which substantial power
-+ * reduction is achieved by the display. The display can have a longer
-+ * recovery time from this state than from the Stand-by state
-+ * Off
-+ * This indicates that the display is consuming the lowest level of power
-+ * and is non-operational. Recovery from this state may optionally require
-+ * the user to manually power on the monitor
-+ *
-+ * Now, the fbdev driver adds an additional state, (blank), where they
-+ * turn off the video (maybe by colormap tricks), but don't mess with the
-+ * video itself: think of it semantically between on and Stand-By.
-+ *
-+ * So here's what we should do in our fbdev blank routine:
-+ *
-+ * VESA_NO_BLANKING (mode 0) Video on, front/back light on
-+ * VESA_VSYNC_SUSPEND (mode 1) Video on, front/back light off
-+ * VESA_HSYNC_SUSPEND (mode 2) Video on, front/back light off
-+ * VESA_POWERDOWN (mode 3) Video off, front/back light off
-+ *
-+ * This will match the matrox implementation.
-+ */
-+/*
-+ * smifb_blank():
-+ * Blank the display by setting all palette values to zero. Note, the
-+ * 12 and 16 bpp modes don't really use the palette, so this will not
-+ * blank the display in all modes.
-+ */
-+static int smifb_blank(int blank, struct fb_info *info)
-+{
-+// struct smifb_info *sfb = (struct smifb_info *)info;
-+#if 0
-+ switch (blank) {
-+ case VESA_POWERDOWN:
-+ case VESA_VSYNC_SUSPEND:
-+ case VESA_HSYNC_SUSPEND:
-+ case VESA_NO_BLANKING:
-+ }
-+#endif
-+ return 1;
-+}
-+
-+static struct fb_ops smifb_ops = {
-+ .owner = THIS_MODULE,
-+ .fb_check_var = smifb_check_var,
-+ .fb_set_par = smifb_set_par,
-+ .fb_setcolreg = smifb_setcolreg,
-+ .fb_blank = smifb_blank,
-+
-+ /* Accelerated functions, using softversions, per se */
-+ .fb_fillrect = cfb_fillrect,
-+ .fb_copyarea = cfb_copyarea,
-+ .fb_imageblit = cfb_imageblit,
-+ .fb_cursor = soft_cursor,
-+};
-+
-+/*
-+ * Alloc struct smifb_info and assign the default value
-+ */
-+static struct smifb_info * __devinit
-+smi_alloc_fb_info(struct pci_dev *dev, char *name)
-+{
-+ struct smifb_info *sfb;
-+
-+ sfb = kmalloc(sizeof(struct smifb_info) + sizeof(u32) * 16, GFP_KERNEL);
-+
-+ if (!sfb)
-+ return NULL;
-+
-+ memset(sfb, 0, sizeof(struct smifb_info));
-+
-+ sfb->currcon = -1;
-+ sfb->dev = dev;
-+
-+ strcpy(sfb->fb.fix.id, name);
-+
-+ sfb->fb.fix.type = FB_TYPE_PACKED_PIXELS;
-+ sfb->fb.fix.type_aux = 0;
-+ sfb->fb.fix.xpanstep = 0;
-+ sfb->fb.fix.ypanstep = 0;
-+ sfb->fb.fix.ywrapstep = 0;
-+ sfb->fb.fix.accel = FB_ACCEL_NONE;
-+
-+ sfb->fb.var.nonstd = 0;
-+ sfb->fb.var.activate = FB_ACTIVATE_NOW;
-+ sfb->fb.var.height = -1;
-+ sfb->fb.var.width = -1;
-+ sfb->fb.var.accel_flags = 0;
-+ sfb->fb.var.vmode = FB_VMODE_NONINTERLACED;
-+
-+ sfb->fb.fbops = &smifb_ops;
-+ sfb->fb.flags = FBINFO_FLAG_DEFAULT;
-+ sfb->fb.node = -1;
-+ sfb->fb.pseudo_palette = (void *)(&sfb->palette_size + 1);
-+
-+ return sfb;
-+}
-+
-+/*
-+ * Unmap in the memory mapped IO registers
-+ *
-+ */
-+
-+static void __devinit
-+smi_unmap_mmio(struct smifb_info *sfb)
-+{
-+ if (sfb && SMILFB)
-+ {
-+ iounmap(SMILFB);
-+ SMIRegs = NULL;
-+ }
-+}
-+
-+/*
-+ * Map in the screen memory
-+ *
-+ */
-+static int __devinit
-+smi_map_smem(struct smifb_info *sfb, struct pci_dev *dev, u_long smem_len)
-+{
-+
-+ sfb->fb.fix.smem_start = pci_resource_start(dev, 0);
-+ sfb->fb.fix.smem_len = smem_len;
-+ printk("%s:smem %x,len %x\n",sfb->fb.fix.smem_start,sfb->fb.fix.smem_len);
-+ sfb->fb.screen_base = SMILFB;
-+
-+ if (!sfb->fb.screen_base)
-+ {
-+ printk("%s: unable to map screen memory\n",sfb->fb.fix.id);
-+ return -ENOMEM;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+/*
-+ * Unmap in the screen memory
-+ *
-+ */
-+static void __devinit
-+smi_unmap_smem(struct smifb_info *sfb)
-+{
-+ if (sfb && sfb->fb.screen_base)
-+ {
-+ iounmap(sfb->fb.screen_base);
-+ sfb->fb.screen_base = NULL;
-+ }
-+}
-+
-+/*
-+ * We need to wake up the LynxEM+, and make sure its in linear memory mode.
-+ */
-+static inline void __devinit
-+smi_init_hw(void)
-+{
-+ /* The delays prevent the ColdFire PCI host from locking up. :/ --NL */
-+ udelay(1000);
-+ outb(0x18, 0x3c4);
-+ udelay(1000);
-+ outb(0x11, 0x3c5);
-+ udelay(1000);
-+ printk("%s: 0x3c4 =%x 0x3c5 %x\n",__FUNCTION__,inw(0x3c4),inw(0x3c5));
-+}
-+
-+static void __devinit
-+smi_free_fb_info(struct smifb_info *sfb)
-+{
-+ if (sfb) {
-+ fb_alloc_cmap(&sfb->fb.cmap, 0, 0);
-+ kfree(sfb);
-+ }
-+}
-+
-+
-+u16 SMI_ChipIDs[numChipIDs] = {0x710, 0x712, 0x720};
-+
-+int __init smifb_init(struct pci_dev *pdev, const struct pci_device_id *ent)
-+{
-+ struct smifb_info *sfb;
-+ u_long smem_size;
-+ char name[16];
-+ int err;
-+ char *m_pLAW;
-+ ulong m_pLAWPhysical;
-+
-+ printk("%s start\n",__FUNCTION__);
-+ sprintf(name, "smifb");
-+
-+ hw.chipID = pdev->device;
-+
-+ err = -ENOMEM;
-+ sfb = smi_alloc_fb_info(pdev, name);
-+ if (!sfb) {
-+ goto failed;
-+ }
-+
-+ smi_init_hw();
-+
-+ // Map address and memory detection
-+ m_pLAWPhysical = pci_resource_start(pdev,0);
-+ printk("%s:m_pLAWPhysical %x,hw.chipID %x\n",__FUNCTION__,m_pLAWPhysical,hw.chipID);
-+ switch (hw.chipID) {
-+ case 0x710:
-+ case 0x712:
-+ sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x00700000;
-+ sfb->fb.fix.mmio_len = 0x00100000;
-+
-+ hw.m_pLFB = SMILFB = ioremap(m_pLAWPhysical, 0x00800000);
-+ printk("%s:SMILFB%x\n",__FUNCTION__,SMILFB);
-+ hw.m_pMMIO = SMIRegs = SMILFB + 0x00700000;
-+ hw.m_pDPR = hw.m_pLFB + 0x00408000;
-+ hw.m_pVPR = hw.m_pLFB + 0x0040c000;
-+
-+ if (!SMIRegs)
-+ {
-+ printk("%s: unable to map memory mapped IO\n",sfb->fb.fix.id);
-+ return -ENOMEM;
-+ }
-+
-+ smi_seqw(0x62,0x7A);
-+ smi_seqw(0x6a,0x0c);
-+ smi_seqw(0x6b,0x02);
-+ smem_size = 0x00400000;
-+
-+ //LynxEM+ memory dection
-+ *(u32 *)(SMILFB + 4) = 0xAA551133;
-+ if (*(u32 *)(SMILFB + 4) != 0xAA551133)
-+ {
-+ smem_size = 0x00200000;
-+ // Program the MCLK to 130 MHz
-+ smi_seqw(0x6a,0x12);
-+ smi_seqw(0x6b,0x02);
-+ smi_seqw(0x62,0x3e);
-+ }
-+ break;
-+ case 0x720:
-+ sfb->fb.fix.mmio_start = m_pLAWPhysical + 0x000c0000;
-+ sfb->fb.fix.mmio_len = 0x00040000;
-+
-+ m_pLAW = ioremap(m_pLAWPhysical, 0x00a00000);
-+ hw.m_pLFB = SMILFB = m_pLAW + 0x00200000;
-+ hw.m_pMMIO = SMIRegs = m_pLAW + 0x000c0000;
-+ hw.m_pDPR = m_pLAW;
-+ hw.m_pVPR = m_pLAW + 0x800;
-+
-+ smi_seqw(0x62,0xff);
-+ smi_seqw(0x6a,0x0d);
-+ smi_seqw(0x6b,0x02);
-+ smem_size = 0x00400000;
-+
-+ break;
-+ }
-+
-+ sfb->fb.var.xres = 640;
-+ sfb->fb.var.yres = 480;
-+ sfb->fb.var.bits_per_pixel = 16;
-+
-+ sfb->fb.var.xres_virtual = sfb->fb.var.xres;
-+
-+ sfb->fb.var.yres_virtual = sfb->fb.var.yres;
-+
-+ sfb->fb.flags = FBINFO_FLAG_DEFAULT;
-+
-+ printk("%s:smem_size %x\n",__FUNCTION__,smem_size);
-+ err = smi_map_smem(sfb, pdev, smem_size);
-+ printk("%s:smi_map_smem error %x\n",__FUNCTION__,err);
-+ if (err) {
-+ goto failed;
-+ }
-+
-+
-+
-+ fb_set_var(&sfb->fb, &sfb->fb.var);
-+ smifb_check_var(&sfb->fb.var, &sfb->fb);
-+ smifb_set_par(sfb);
-+ printk("%s:register_framebuffer \n",__FUNCTION__);
-+ err = register_framebuffer(&sfb->fb);
-+ if (err < 0) {
-+ goto failed;
-+ }
-+
-+ printk("Silicon Motion, Inc. LynxEM+ Init complete.\n");
-+
-+ return 0;
-+
-+failed:
-+ smi_unmap_smem(sfb);
-+ smi_unmap_mmio(sfb);
-+ smi_free_fb_info(sfb);
-+ printk("Silicon Motion, Inc. LynxEM+ Init FAILED.n");
-+
-+ return err;
-+}
-+
-+struct pci_device_id smifb_pci_tbl[] = {
-+ { 0x126f, 0x710, PCI_ANY_ID, PCI_ANY_ID },
-+ { 0x126f, 0x712, PCI_ANY_ID, PCI_ANY_ID },
-+ { 0x126f, 0x720, PCI_ANY_ID, PCI_ANY_ID },
-+ { 0 }
-+};
-+
-+MODULE_DEVICE_TABLE(pci, smifb_pci_tbl);
-+
-+struct pci_driver smifb_driver = {
-+ .name = "smifb",
-+ .id_table = smifb_pci_tbl,
-+ .probe = smifb_init,
-+};
-+
-+int __init smi_init(void)
-+{
-+ /*return pci_module_init(&smifb_driver);*/
-+ return pci_register_driver(&smifb_driver);
-+}
-+
-+module_init(smi_init);
-+MODULE_LICENSE("GPL");
-+
-+
-+
---- /dev/null
-+++ b/drivers/video/smifb.h
-@@ -0,0 +1,149 @@
-+/***************************************************************************
-+ smifb.h - SiliconMotion LynxEM+ frame buffer device
-+ -------------------
-+ begin : Thu Aug 9 2001
-+ copyright : (C) 2001 by Szu-Tao Huang
-+ email : johuang@siliconmotion.com
-+ ***************************************************************************/
-+
-+/***************************************************************************
-+ * *
-+ * This program is free software; you can redistribute it and/or modify *
-+ * it under the terms of the GNU General Public License as published by *
-+ * the Free Software Foundation; either version 2 of the License, or *
-+ * (at your option) any later version. *
-+ * *
-+ ***************************************************************************/
-+
-+#define smi_mmiowb(dat,reg) writeb(dat, SMIRegs + reg)
-+#define smi_mmioww(dat,reg) writew(dat, SMIRegs + reg)
-+#define smi_mmiowl(dat,reg) writel(dat, SMIRegs + reg)
-+
-+#define smi_mmiorb(reg) readb(SMIRegs + reg)
-+#define smi_mmiorw(reg) readw(SMIRegs + reg)
-+#define smi_mmiorl(reg) readl(SMIRegs + reg)
-+
-+#define SIZE_SR00_SR04 (0x04 - 0x00 + 1)
-+#define SIZE_SR10_SR24 (0x24 - 0x10 + 1)
-+#define SIZE_SR30_SR75 (0x75 - 0x30 + 1)
-+#define SIZE_SR80_SR93 (0x93 - 0x80 + 1)
-+#define SIZE_SRA0_SRAF (0xAF - 0xA0 + 1)
-+#define SIZE_GR00_GR08 (0x08 - 0x00 + 1)
-+#define SIZE_AR00_AR14 (0x14 - 0x00 + 1)
-+#define SIZE_CR00_CR18 (0x18 - 0x00 + 1)
-+#define SIZE_CR30_CR4D (0x4D - 0x30 + 1)
-+#define SIZE_CR90_CRA7 (0xA7 - 0x90 + 1)
-+#define SIZE_VPR (0x6C + 1)
-+#define SIZE_DPR (0x44 + 1)
-+
-+#define numVGAModes 6
-+#define numChipIDs 3
-+
-+#define NR_PALETTE 256
-+#define NR_RGB 2
-+
-+/*
-+ * Minimum X and Y resolutions
-+ */
-+#define MIN_XRES 640
-+#define MIN_YRES 480
-+
-+static inline void smi_crtcw(int reg, int val)
-+{
-+ smi_mmiowb(reg, 0x3d4);
-+ smi_mmiowb(val, 0x3d5);
-+}
-+
-+static inline unsigned int smi_crtcr(int reg)
-+{
-+ smi_mmiowb(reg, 0x3d4);
-+ return smi_mmiorb(0x3d5);
-+}
-+
-+static inline void smi_grphw(int reg, int val)
-+{
-+ smi_mmiowb(reg, 0x3ce);
-+ smi_mmiowb(val, 0x3cf);
-+}
-+
-+static inline unsigned int smi_grphr(int reg)
-+{
-+ smi_mmiowb(reg, 0x3ce);
-+ return smi_mmiorb(0x3cf);
-+}
-+
-+static inline void smi_attrw(int reg, int val)
-+{
-+ smi_mmiorb(0x3da);
-+ smi_mmiowb(reg, 0x3c0);
-+ smi_mmiorb(0x3c1);
-+ smi_mmiowb(val, 0x3c0);
-+}
-+
-+static inline void smi_seqw(int reg, int val)
-+{
-+ smi_mmiowb(reg, 0x3c4);
-+ smi_mmiowb(val, 0x3c5);
-+}
-+
-+static inline unsigned int smi_seqr(int reg)
-+{
-+ smi_mmiowb(reg, 0x3c4);
-+ return smi_mmiorb(0x3c5);
-+}
-+/*
-+* Private structure
-+*/
-+struct smifb_info {
-+ /*
-+ * The following is a pointer to be passed into the
-+ * functions below. The modules outside the main
-+ * smifb.c driver have no knowledge as to what
-+ * is within this structure.
-+ */
-+ struct fb_info fb;
-+ struct display_switch *dispsw;
-+ struct pci_dev *dev;
-+ signed int currcon;
-+
-+ struct {
-+ u8 red, green, blue;
-+ } palette[NR_RGB];
-+
-+ u_int palette_size;
-+};
-+
-+struct par_info {
-+ /*
-+ * Hardware
-+ */
-+ u16 chipID;
-+ char *m_pLFB;
-+ char *m_pMMIO;
-+ char *m_pDPR;
-+ char *m_pVPR;
-+
-+ u_int width;
-+ u_int height;
-+ u_int hz;
-+};
-+
-+// The next structure holds all information relevant for a specific video mode.
-+struct ModeInit
-+{
-+ int mmSizeX;
-+ int mmSizeY;
-+ int bpp;
-+ int hz;
-+ unsigned char Init_MISC;
-+ unsigned char Init_SR00_SR04[SIZE_SR00_SR04];
-+ unsigned char Init_SR10_SR24[SIZE_SR10_SR24];
-+ unsigned char Init_SR30_SR75[SIZE_SR30_SR75];
-+ unsigned char Init_SR80_SR93[SIZE_SR80_SR93];
-+ unsigned char Init_SRA0_SRAF[SIZE_SRA0_SRAF];
-+ unsigned char Init_GR00_GR08[SIZE_GR00_GR08];
-+ unsigned char Init_AR00_AR14[SIZE_AR00_AR14];
-+ unsigned char Init_CR00_CR18[SIZE_CR00_CR18];
-+ unsigned char Init_CR30_CR4D[SIZE_CR30_CR4D];
-+ unsigned char Init_CR90_CRA7[SIZE_CR90_CRA7];
-+};
---- a/include/linux/fb.h
-+++ b/include/linux/fb.h
-@@ -873,6 +873,17 @@ struct fb_info {
- #define fb_writeq sbus_writeq
- #define fb_memset sbus_memset_io
-
-+#elif defined(CONFIG_COLDFIRE)
-+#define fb_readb readb
-+#define fb_readw readw
-+#define fb_readl readl
-+#define fb_readq readq
-+#define fb_writeb writeb
-+#define fb_writew writew
-+#define fb_writel writel
-+#define fb_writeq writeq
-+#define fb_memset memset_io
-+
- #elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) || defined(__hppa__) || (defined(__sh__) && !defined(__SH5__)) || defined(__powerpc__) || defined(__avr32__)
-
- #define fb_readb __raw_readb
-@@ -899,7 +910,7 @@ struct fb_info {
-
- #endif
-
--#if defined (__BIG_ENDIAN)
-+#if defined (__BIG_ENDIAN) && !defined(CONFIG_COLDFIRE)
- #define FB_LEFT_POS(bpp) (32 - bpp)
- #define FB_SHIFT_HIGH(val, bits) ((val) >> (bits))
- #define FB_SHIFT_LOW(val, bits) ((val) << (bits))