Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[pandora-kernel.git] / drivers / staging / xgifb / XGI_main_26.c
index 721bd25..4403e5f 100644 (file)
@@ -5,7 +5,6 @@
  */
 
 /* #include <linux/config.h> */
-#include <linux/version.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
@@ -33,7 +32,7 @@
 #define XGIFB_PAN
 #endif
 
-#include <asm/io.h>
+#include <linux/io.h>
 #ifdef CONFIG_MTRR
 #include <asm/mtrr.h>
 #endif
@@ -41,7 +40,9 @@
 #include "XGIfb.h"
 #include "vgatypes.h"
 #include "XGI_main.h"
+#include "vb_init.h"
 #include "vb_util.h"
+#include "vb_setmode.h"
 
 #define Index_CR_GPIO_Reg1 0x48
 #define Index_CR_GPIO_Reg2 0x49
@@ -50,7 +51,6 @@
 #define GPIOG_EN    (1<<6)
 #define GPIOG_WRITE (1<<6)
 #define GPIOG_READ  (1<<1)
-int XGIfb_GetXG21DefaultLVDSModeIdx(void);
 
 #define XGIFB_ROM_SIZE 65536
 
@@ -69,69 +69,69 @@ static void dumpVGAReg(void)
 {
        u8 i, reg;
 
-       outXGIIDXREG(XGISR, 0x05, 0x86);
+       xgifb_reg_set(XGISR, 0x05, 0x86);
        /*
-       outXGIIDXREG(XGISR, 0x08, 0x4f);
-       outXGIIDXREG(XGISR, 0x0f, 0x20);
-       outXGIIDXREG(XGISR, 0x11, 0x4f);
-       outXGIIDXREG(XGISR, 0x13, 0x45);
-       outXGIIDXREG(XGISR, 0x14, 0x51);
-       outXGIIDXREG(XGISR, 0x1e, 0x41);
-       outXGIIDXREG(XGISR, 0x1f, 0x0);
-       outXGIIDXREG(XGISR, 0x20, 0xa1);
-       outXGIIDXREG(XGISR, 0x22, 0xfb);
-       outXGIIDXREG(XGISR, 0x26, 0x22);
-       outXGIIDXREG(XGISR, 0x3e, 0x07);
+       xgifb_reg_set(XGISR, 0x08, 0x4f);
+       xgifb_reg_set(XGISR, 0x0f, 0x20);
+       xgifb_reg_set(XGISR, 0x11, 0x4f);
+       xgifb_reg_set(XGISR, 0x13, 0x45);
+       xgifb_reg_set(XGISR, 0x14, 0x51);
+       xgifb_reg_set(XGISR, 0x1e, 0x41);
+       xgifb_reg_set(XGISR, 0x1f, 0x0);
+       xgifb_reg_set(XGISR, 0x20, 0xa1);
+       xgifb_reg_set(XGISR, 0x22, 0xfb);
+       xgifb_reg_set(XGISR, 0x26, 0x22);
+       xgifb_reg_set(XGISR, 0x3e, 0x07);
        */
 
-       /* outXGIIDXREG(XGICR, 0x19, 0x00); */
-       /* outXGIIDXREG(XGICR, 0x1a, 0x3C); */
-       /* outXGIIDXREG(XGICR, 0x22, 0xff); */
-       /* outXGIIDXREG(XGICR, 0x3D, 0x10); */
+       /* xgifb_reg_set(XGICR, 0x19, 0x00); */
+       /* xgifb_reg_set(XGICR, 0x1a, 0x3C); */
+       /* xgifb_reg_set(XGICR, 0x22, 0xff); */
+       /* xgifb_reg_set(XGICR, 0x3D, 0x10); */
 
-       /* outXGIIDXREG(XGICR, 0x4a, 0xf3); */
+       /* xgifb_reg_set(XGICR, 0x4a, 0xf3); */
 
-       /* outXGIIDXREG(XGICR, 0x57, 0x0); */
-       /* outXGIIDXREG(XGICR, 0x7a, 0x2c); */
+       /* xgifb_reg_set(XGICR, 0x57, 0x0); */
+       /* xgifb_reg_set(XGICR, 0x7a, 0x2c); */
 
-       /* outXGIIDXREG(XGICR, 0x82, 0xcc); */
-       /* outXGIIDXREG(XGICR, 0x8c, 0x0); */
+       /* xgifb_reg_set(XGICR, 0x82, 0xcc); */
+       /* xgifb_reg_set(XGICR, 0x8c, 0x0); */
        /*
-       outXGIIDXREG(XGICR, 0x99, 0x1);
-       outXGIIDXREG(XGICR, 0x41, 0x40);
+       xgifb_reg_set(XGICR, 0x99, 0x1);
+       xgifb_reg_set(XGICR, 0x41, 0x40);
        */
 
        for (i = 0; i < 0x4f; i++) {
-               inXGIIDXREG(XGISR, i, reg);
+               reg = xgifb_reg_get(XGISR, i);
                printk("\no 3c4 %x", i);
                printk("\ni 3c5 => %x", reg);
        }
 
        for (i = 0; i < 0xF0; i++) {
-               inXGIIDXREG(XGICR, i, reg);
+               reg = xgifb_reg_get(XGICR, i);
                printk("\no 3d4 %x", i);
                printk("\ni 3d5 => %x", reg);
        }
        /*
-       outXGIIDXREG(XGIPART1,0x2F,1);
+       xgifb_reg_set(XGIPART1,0x2F,1);
        for (i=1; i < 0x50; i++) {
-               inXGIIDXREG(XGIPART1, i, reg);
+               reg = xgifb_reg_get(XGIPART1, i);
                printk("\no d004 %x", i);
                printk("\ni d005 => %x", reg);
        }
 
        for (i=0; i < 0x50; i++) {
-                inXGIIDXREG(XGIPART2, i, reg);
+                reg = xgifb_reg_get(XGIPART2, i);
                 printk("\no d010 %x", i);
                 printk("\ni d011 => %x", reg);
        }
        for (i=0; i < 0x50; i++) {
-               inXGIIDXREG(XGIPART3, i, reg);
+               reg = xgifb_reg_get(XGIPART3, i);
                printk("\no d012 %x",i);
                printk("\ni d013 => %x",reg);
        }
        for (i=0; i < 0x50; i++) {
-               inXGIIDXREG(XGIPART4, i, reg);
+               reg = xgifb_reg_get(XGIPART4, i);
                printk("\no d014 %x",i);
                printk("\ni d015 => %x",reg);
        }
@@ -348,10 +348,10 @@ static int XGIfb_mode_rate_to_ddata(struct vb_device_info *XGI_Pr,
        else {
                j = 0;
                while (XGI_Pr->EModeIDTable[j].Ext_ModeID != 0xff) {
-                       if (XGI_Pr->EModeIDTable[j].Ext_ModeID
-                                       == XGI_Pr->RefIndex[RefreshRateTableIndex].ModeID) {
-                               if (XGI_Pr->EModeIDTable[j].Ext_ModeFlag
-                                               & DoubleScanMode) {
+                       if (XGI_Pr->EModeIDTable[j].Ext_ModeID ==
+                           XGI_Pr->RefIndex[RefreshRateTableIndex].ModeID) {
+                               if (XGI_Pr->EModeIDTable[j].Ext_ModeFlag &
+                                   DoubleScanMode) {
                                        *vmode = FB_VMODE_DOUBLE;
                                }
                                break;
@@ -377,30 +377,22 @@ static void XGIRegInit(struct vb_device_info *XGI_Pr, unsigned long BaseAddr)
        XGI_Pr->P3c8 = BaseAddr + 0x18;
        XGI_Pr->P3c9 = BaseAddr + 0x19;
        XGI_Pr->P3da = BaseAddr + 0x2A;
-       XGI_Pr->Part1Port = BaseAddr + XGI_CRT2_PORT_04; /* Digital video interface registers (LCD) */
-       XGI_Pr->Part2Port = BaseAddr + XGI_CRT2_PORT_10; /* 301 TV Encoder registers */
-       XGI_Pr->Part3Port = BaseAddr + XGI_CRT2_PORT_12; /* 301 Macrovision registers */
-       XGI_Pr->Part4Port = BaseAddr + XGI_CRT2_PORT_14; /* 301 VGA2 (and LCD) registers */
-       XGI_Pr->Part5Port = BaseAddr + XGI_CRT2_PORT_14 + 2; /* 301 palette address port registers */
+       /* Digital video interface registers (LCD) */
+       XGI_Pr->Part1Port = BaseAddr + XGI_CRT2_PORT_04;
+       /* 301 TV Encoder registers */
+       XGI_Pr->Part2Port = BaseAddr + XGI_CRT2_PORT_10;
+       /* 301 Macrovision registers */
+       XGI_Pr->Part3Port = BaseAddr + XGI_CRT2_PORT_12;
+       /* 301 VGA2 (and LCD) registers */
+       XGI_Pr->Part4Port = BaseAddr + XGI_CRT2_PORT_14;
+       /* 301 palette address port registers */
+       XGI_Pr->Part5Port = BaseAddr + XGI_CRT2_PORT_14 + 2;
 
 }
 
-void XGIfb_set_reg4(u16 port, unsigned long data)
-{
-       outl((u32)(data & 0xffffffff), port);
-}
-
-u32 XGIfb_get_reg3(u16 port)
-{
-       u32 data;
-
-       data = inl(port);
-       return data;
-}
-
 /* ------------ Interface for init & mode switching code ------------- */
 
-unsigned char XGIfb_query_VGA_config_space(
+static unsigned char XGIfb_query_VGA_config_space(
                struct xgi_hw_device_info *pXGIhw_ext, unsigned long offset,
                unsigned long set, unsigned long *value)
 {
@@ -436,62 +428,34 @@ unsigned char XGIfb_query_VGA_config_space(
        return 1;
 }
 
-/*
-unsigned char XGIfb_query_north_bridge_space(struct xgi_hw_device_info *pXGIhw_ext,
-       unsigned long offset, unsigned long set, unsigned long *value)
+/* ------------------ Internal helper routines ----------------- */
+
+static int XGIfb_GetXG21DefaultLVDSModeIdx(void)
 {
-       static struct pci_dev *pdev = NULL;
-       static unsigned char init = 0, valid_pdev = 0;
-       u16 nbridge_id = 0;
 
-       if (!init) {
-               init = 1;
-               switch (xgi_video_info.chip) {
-               case XGI_540:
-                       nbridge_id = PCI_DEVICE_ID_XG_540;
-                       break;
-               case XGI_630:
-                       nbridge_id = PCI_DEVICE_ID_XG_630;
-                       break;
-               case XGI_730:
-                       nbridge_id = PCI_DEVICE_ID_XG_730;
-                       break;
-               case XGI_550:
-                       nbridge_id = PCI_DEVICE_ID_XG_550;
-                       break;
-               case XGI_650:
-                       nbridge_id = PCI_DEVICE_ID_XG_650;
-                       break;
-               case XGI_740:
-                       nbridge_id = PCI_DEVICE_ID_XG_740;
-                       break;
-               default:
-                       nbridge_id = 0;
-                       break;
-               }
+       int found_mode = 0;
+       int XGIfb_mode_idx = 0;
 
-               pdev = pci_get_device(PCI_VENDOR_ID_SI, nbridge_id, pdev);
-               if (pdev) {
-                       valid_pdev = 1;
-                       pci_dev_put(pdev);
+       found_mode = 0;
+       while ((XGIbios_mode[XGIfb_mode_idx].mode_no != 0)
+                       && (XGIbios_mode[XGIfb_mode_idx].xres
+                                       <= XGI21_LCDCapList[0].LVDSHDE)) {
+               if ((XGIbios_mode[XGIfb_mode_idx].xres
+                               == XGI21_LCDCapList[0].LVDSHDE)
+                               && (XGIbios_mode[XGIfb_mode_idx].yres
+                                               == XGI21_LCDCapList[0].LVDSVDE)
+                               && (XGIbios_mode[XGIfb_mode_idx].bpp == 8)) {
+                       XGIfb_mode_no = XGIbios_mode[XGIfb_mode_idx].mode_no;
+                       found_mode = 1;
+                       break;
                }
+               XGIfb_mode_idx++;
        }
+       if (!found_mode)
+               XGIfb_mode_idx = 0;
 
-       if (!valid_pdev) {
-               printk(KERN_DEBUG "XGIfb: Can't find XGI %d North Bridge device.\n",
-                       nbridge_id);
-               return 0;
-       }
-
-       if (set == 0)
-               pci_read_config_dword(pdev, offset, (u32 *)value);
-       else
-               pci_write_config_dword(pdev, offset, (u32)(*value));
-
-       return 1;
+       return XGIfb_mode_idx;
 }
-*/
-/* ------------------ Internal helper routines ----------------- */
 
 static void XGIfb_search_mode(const char *name)
 {
@@ -551,8 +515,8 @@ static void XGIfb_search_vesamode(unsigned int vesamode)
        vesamode &= 0x1dff; /* Clean VESA mode number from other flags */
 
        while (XGIbios_mode[i].mode_no != 0) {
-               if ((XGIbios_mode[i].vesa_mode_no_1 == vesamode)
-                               || (XGIbios_mode[i].vesa_mode_no_2 == vesamode)) {
+               if ((XGIbios_mode[i].vesa_mode_no_1 == vesamode) ||
+                   (XGIbios_mode[i].vesa_mode_no_2 == vesamode)) {
                        xgifb_mode_idx = i;
                        j = 1;
                        break;
@@ -569,11 +533,13 @@ static int XGIfb_GetXG21LVDSData(void)
        unsigned char *pData;
        int i, j, k;
 
-       inXGIIDXREG(XGISR, 0x1e, tmp);
-       outXGIIDXREG(XGISR, 0x1e, tmp | 4);
+       tmp = xgifb_reg_get(XGISR, 0x1e);
+       xgifb_reg_set(XGISR, 0x1e, tmp | 4);
 
        pData = xgi_video_info.mmio_vbase + 0x20000;
-       if ((pData[0x0] == 0x55) && (pData[0x1] == 0xAA) && (pData[0x65] & 0x1)) {
+       if ((pData[0x0] == 0x55) &&
+           (pData[0x1] == 0xAA) &&
+           (pData[0x65] & 0x1)) {
                i = pData[0x316] | (pData[0x317] << 8);
                j = pData[i - 1];
                if (j == 0xff)
@@ -616,33 +582,6 @@ static int XGIfb_GetXG21LVDSData(void)
        return 0;
 }
 
-int XGIfb_GetXG21DefaultLVDSModeIdx(void)
-{
-
-       int found_mode = 0;
-       int XGIfb_mode_idx = 0;
-
-       found_mode = 0;
-       while ((XGIbios_mode[XGIfb_mode_idx].mode_no != 0)
-                       && (XGIbios_mode[XGIfb_mode_idx].xres
-                                       <= XGI21_LCDCapList[0].LVDSHDE)) {
-               if ((XGIbios_mode[XGIfb_mode_idx].xres
-                               == XGI21_LCDCapList[0].LVDSHDE)
-                               && (XGIbios_mode[XGIfb_mode_idx].yres
-                                               == XGI21_LCDCapList[0].LVDSVDE)
-                               && (XGIbios_mode[XGIfb_mode_idx].bpp == 8)) {
-                       XGIfb_mode_no = XGIbios_mode[XGIfb_mode_idx].mode_no;
-                       found_mode = 1;
-                       break;
-               }
-               XGIfb_mode_idx++;
-       }
-       if (!found_mode)
-               XGIfb_mode_idx = 0;
-
-       return XGIfb_mode_idx;
-}
-
 static int XGIfb_validate_mode(int myindex)
 {
        u16 xres, yres;
@@ -656,8 +595,8 @@ static int XGIfb_validate_mode(int myindex)
                                return -1;
                        if (XGIbios_mode[myindex].yres > yres)
                                return -1;
-                       if ((XGIbios_mode[myindex].xres < xres)
-                                       && (XGIbios_mode[myindex].yres < yres)) {
+                       if ((XGIbios_mode[myindex].xres < xres) &&
+                           (XGIbios_mode[myindex].yres < yres)) {
                                if (XGIbios_mode[myindex].bpp > 8)
                                        return -1;
                        }
@@ -733,7 +672,7 @@ static int XGIfb_validate_mode(int myindex)
                if (XGIbios_mode[myindex].yres > yres)
                        return -1;
                if ((XGIhw_ext.ulExternalChip == 0x01) || /* LVDS */
-                               (XGIhw_ext.ulExternalChip == 0x05)) { /* LVDS+Chrontel */
+                   (XGIhw_ext.ulExternalChip == 0x05)) { /* LVDS+Chrontel */
                        switch (XGIbios_mode[myindex].xres) {
                        case 512:
                                if (XGIbios_mode[myindex].yres != 512)
@@ -752,13 +691,11 @@ static int XGIfb_validate_mode(int myindex)
                                        return -1;
                                break;
                        case 1024:
-                               if ((XGIbios_mode[myindex].yres != 600)
-                                               && (XGIbios_mode[myindex].yres
-                                                               != 768))
+                               if ((XGIbios_mode[myindex].yres != 600) &&
+                                   (XGIbios_mode[myindex].yres != 768))
                                        return -1;
-                               if ((XGIbios_mode[myindex].yres == 600)
-                                               && (XGIhw_ext.ulCRT2LCDType
-                                                               != LCD_1024x600))
+                               if ((XGIbios_mode[myindex].yres == 600) &&
+                                   (XGIhw_ext.ulCRT2LCDType != LCD_1024x600))
                                        return -1;
                                break;
                        case 1152:
@@ -768,13 +705,11 @@ static int XGIfb_validate_mode(int myindex)
                                        return -1;
                                break;
                        case 1280:
-                               if ((XGIbios_mode[myindex].yres != 768)
-                                               && (XGIbios_mode[myindex].yres
-                                                               != 1024))
+                               if ((XGIbios_mode[myindex].yres != 768) &&
+                                   (XGIbios_mode[myindex].yres != 1024))
                                        return -1;
-                               if ((XGIbios_mode[myindex].yres == 768)
-                                               && (XGIhw_ext.ulCRT2LCDType
-                                                               != LCD_1280x768))
+                               if ((XGIbios_mode[myindex].yres == 768) &&
+                                   (XGIhw_ext.ulCRT2LCDType != LCD_1280x768))
                                        return -1;
                                break;
                        case 1400:
@@ -795,9 +730,8 @@ static int XGIfb_validate_mode(int myindex)
                                        return -1;
                                break;
                        case 640:
-                               if ((XGIbios_mode[myindex].yres != 400)
-                                               && (XGIbios_mode[myindex].yres
-                                                               != 480))
+                               if ((XGIbios_mode[myindex].yres != 400) &&
+                                   (XGIbios_mode[myindex].yres != 480))
                                        return -1;
                                break;
                        case 800:
@@ -809,13 +743,12 @@ static int XGIfb_validate_mode(int myindex)
                                        return -1;
                                break;
                        case 1280:
-                               if ((XGIbios_mode[myindex].yres != 960)
-                                               && (XGIbios_mode[myindex].yres
-                                                               != 1024))
+                               if ((XGIbios_mode[myindex].yres != 960) &&
+                                   (XGIbios_mode[myindex].yres != 1024))
                                        return -1;
                                if (XGIbios_mode[myindex].yres == 960) {
-                                       if (XGIhw_ext.ulCRT2LCDType
-                                                       == LCD_1400x1050)
+                                       if (XGIhw_ext.ulCRT2LCDType ==
+                                           LCD_1400x1050)
                                                return -1;
                                }
                                break;
@@ -847,8 +780,8 @@ static int XGIfb_validate_mode(int myindex)
                                        return -1;
                        }
                        /*  TW: LVDS/CHRONTEL does not support 720 */
-                       if (xgi_video_info.hasVB == HASVB_LVDS_CHRONTEL
-                                       || xgi_video_info.hasVB == HASVB_CHRONTEL) {
+                       if (xgi_video_info.hasVB == HASVB_LVDS_CHRONTEL ||
+                           xgi_video_info.hasVB == HASVB_CHRONTEL) {
                                return -1;
                        }
                        break;
@@ -900,31 +833,31 @@ static u8 XGIfb_search_refresh_rate(unsigned int rate)
 
        XGIfb_rate_idx = 0;
        while ((XGIfb_vrate[i].idx != 0) && (XGIfb_vrate[i].xres <= xres)) {
-               if ((XGIfb_vrate[i].xres == xres) && (XGIfb_vrate[i].yres
-                               == yres)) {
+               if ((XGIfb_vrate[i].xres == xres) &&
+                   (XGIfb_vrate[i].yres == yres)) {
                        if (XGIfb_vrate[i].refresh == rate) {
                                XGIfb_rate_idx = XGIfb_vrate[i].idx;
                                break;
                        } else if (XGIfb_vrate[i].refresh > rate) {
                                if ((XGIfb_vrate[i].refresh - rate) <= 3) {
                                        DPRINTK("XGIfb: Adjusting rate from %d up to %d\n",
-                                                       rate, XGIfb_vrate[i].refresh);
+                                               rate, XGIfb_vrate[i].refresh);
                                        XGIfb_rate_idx = XGIfb_vrate[i].idx;
-                                       xgi_video_info.refresh_rate
-                                                       = XGIfb_vrate[i].refresh;
+                                       xgi_video_info.refresh_rate =
+                                               XGIfb_vrate[i].refresh;
                                } else if (((rate - XGIfb_vrate[i - 1].refresh)
                                                <= 2) && (XGIfb_vrate[i].idx
                                                != 1)) {
                                        DPRINTK("XGIfb: Adjusting rate from %d down to %d\n",
-                                                       rate, XGIfb_vrate[i-1].refresh);
+                                               rate, XGIfb_vrate[i-1].refresh);
                                        XGIfb_rate_idx = XGIfb_vrate[i - 1].idx;
-                                       xgi_video_info.refresh_rate
-                                                       = XGIfb_vrate[i - 1].refresh;
+                                       xgi_video_info.refresh_rate =
+                                               XGIfb_vrate[i - 1].refresh;
                                }
                                break;
                        } else if ((rate - XGIfb_vrate[i].refresh) <= 2) {
                                DPRINTK("XGIfb: Adjusting rate from %d down to %d\n",
-                                               rate, XGIfb_vrate[i].refresh);
+                                       rate, XGIfb_vrate[i].refresh);
                                XGIfb_rate_idx = XGIfb_vrate[i].idx;
                                break;
                        }
@@ -934,8 +867,8 @@ static u8 XGIfb_search_refresh_rate(unsigned int rate)
        if (XGIfb_rate_idx > 0) {
                return XGIfb_rate_idx;
        } else {
-               printk(KERN_INFO
-                               "XGIfb: Unsupported rate %d for %dx%d\n", rate, xres, yres);
+               printk(KERN_INFO "XGIfb: Unsupported rate %d for %dx%d\n",
+                      rate, xres, yres);
                return 0;
        }
 }
@@ -991,6 +924,282 @@ static void XGIfb_bpp_to_var(struct fb_var_screeninfo *var)
        }
 }
 
+/* --------------------- SetMode routines ------------------------- */
+
+static void XGIfb_pre_setmode(void)
+{
+       u8 cr30 = 0, cr31 = 0;
+
+       cr31 = xgifb_reg_get(XGICR, 0x31);
+       cr31 &= ~0x60;
+
+       switch (xgi_video_info.disp_state & DISPTYPE_DISP2) {
+       case DISPTYPE_CRT2:
+               cr30 = (XGI_VB_OUTPUT_CRT2 | XGI_SIMULTANEOUS_VIEW_ENABLE);
+               cr31 |= XGI_DRIVER_MODE;
+               break;
+       case DISPTYPE_LCD:
+               cr30 = (XGI_VB_OUTPUT_LCD | XGI_SIMULTANEOUS_VIEW_ENABLE);
+               cr31 |= XGI_DRIVER_MODE;
+               break;
+       case DISPTYPE_TV:
+               if (xgi_video_info.TV_type == TVMODE_HIVISION)
+                       cr30 = (XGI_VB_OUTPUT_HIVISION
+                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
+               else if (xgi_video_info.TV_plug == TVPLUG_SVIDEO)
+                       cr30 = (XGI_VB_OUTPUT_SVIDEO
+                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
+               else if (xgi_video_info.TV_plug == TVPLUG_COMPOSITE)
+                       cr30 = (XGI_VB_OUTPUT_COMPOSITE
+                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
+               else if (xgi_video_info.TV_plug == TVPLUG_SCART)
+                       cr30 = (XGI_VB_OUTPUT_SCART
+                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
+               cr31 |= XGI_DRIVER_MODE;
+
+               if (XGIfb_tvmode == 1 || xgi_video_info.TV_type == TVMODE_PAL)
+                       cr31 |= 0x01;
+               else
+                       cr31 &= ~0x01;
+               break;
+       default: /* disable CRT2 */
+               cr30 = 0x00;
+               cr31 |= (XGI_DRIVER_MODE | XGI_VB_OUTPUT_DISABLE);
+       }
+
+       xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR30, cr30);
+       xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR31, cr31);
+       xgifb_reg_set(XGICR, IND_XGI_SCRATCH_REG_CR33, (XGIfb_rate_idx & 0x0F));
+}
+
+static void XGIfb_post_setmode(void)
+{
+       u8 reg;
+       unsigned char doit = 1;
+       /*
+       xgifb_reg_set(XGISR,IND_XGI_PASSWORD,XGI_PASSWORD);
+       xgifb_reg_set(XGICR, 0x13, 0x00);
+       xgifb_reg_and_or(XGISR,0x0E, 0xF0, 0x01);
+       *test*
+       */
+       if (xgi_video_info.video_bpp == 8) {
+               /* TW: We can't switch off CRT1 on LVDS/Chrontel
+                * in 8bpp Modes */
+               if ((xgi_video_info.hasVB == HASVB_LVDS) ||
+                   (xgi_video_info.hasVB == HASVB_LVDS_CHRONTEL)) {
+                       doit = 0;
+               }
+               /* TW: We can't switch off CRT1 on 301B-DH
+                * in 8bpp Modes if using LCD */
+               if (xgi_video_info.disp_state & DISPTYPE_LCD)
+                       doit = 0;
+       }
+
+       /* TW: We can't switch off CRT1 if bridge is in slave mode */
+       if (xgi_video_info.hasVB != HASVB_NONE) {
+               reg = xgifb_reg_get(XGIPART1, 0x00);
+
+               if ((reg & 0x50) == 0x10)
+                       doit = 0;
+
+       } else {
+               XGIfb_crt1off = 0;
+       }
+
+       reg = xgifb_reg_get(XGICR, 0x17);
+       if ((XGIfb_crt1off) && (doit))
+               reg &= ~0x80;
+       else
+               reg |= 0x80;
+       xgifb_reg_set(XGICR, 0x17, reg);
+
+       xgifb_reg_and(XGISR, IND_XGI_RAMDAC_CONTROL, ~0x04);
+
+       if ((xgi_video_info.disp_state & DISPTYPE_TV) && (xgi_video_info.hasVB
+                       == HASVB_301)) {
+
+               reg = xgifb_reg_get(XGIPART4, 0x01);
+
+               if (reg < 0xB0) { /* Set filter for XGI301 */
+                       switch (xgi_video_info.video_width) {
+                       case 320:
+                               filter_tb = (xgi_video_info.TV_type ==
+                                            TVMODE_NTSC) ? 4 : 12;
+                               break;
+                       case 640:
+                               filter_tb = (xgi_video_info.TV_type ==
+                                            TVMODE_NTSC) ? 5 : 13;
+                               break;
+                       case 720:
+                               filter_tb = (xgi_video_info.TV_type ==
+                                            TVMODE_NTSC) ? 6 : 14;
+                               break;
+                       case 800:
+                               filter_tb = (xgi_video_info.TV_type ==
+                                            TVMODE_NTSC) ? 7 : 15;
+                               break;
+                       default:
+                               filter = -1;
+                               break;
+                       }
+                       xgifb_reg_or(XGIPART1, XGIfb_CRT2_write_enable, 0x01);
+
+                       if (xgi_video_info.TV_type == TVMODE_NTSC) {
+
+                               xgifb_reg_and(XGIPART2, 0x3a, 0x1f);
+
+                               if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
+
+                                       xgifb_reg_and(XGIPART2, 0x30, 0xdf);
+
+                               } else if (xgi_video_info.TV_plug
+                                               == TVPLUG_COMPOSITE) {
+
+                                       xgifb_reg_or(XGIPART2, 0x30, 0x20);
+
+                                       switch (xgi_video_info.video_width) {
+                                       case 640:
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x35,
+                                                             0xEB);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x36,
+                                                             0x04);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x37,
+                                                             0x25);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x38,
+                                                             0x18);
+                                               break;
+                                       case 720:
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x35,
+                                                             0xEE);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x36,
+                                                             0x0C);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x37,
+                                                             0x22);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x38,
+                                                             0x08);
+                                               break;
+                                       case 800:
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x35,
+                                                             0xEB);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x36,
+                                                             0x15);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x37,
+                                                             0x25);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x38,
+                                                             0xF6);
+                                               break;
+                                       }
+                               }
+
+                       } else if (xgi_video_info.TV_type == TVMODE_PAL) {
+
+                               xgifb_reg_and(XGIPART2, 0x3A, 0x1F);
+
+                               if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
+
+                                       xgifb_reg_and(XGIPART2, 0x30, 0xDF);
+
+                               } else if (xgi_video_info.TV_plug
+                                               == TVPLUG_COMPOSITE) {
+
+                                       xgifb_reg_or(XGIPART2, 0x30, 0x20);
+
+                                       switch (xgi_video_info.video_width) {
+                                       case 640:
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x35,
+                                                             0xF1);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x36,
+                                                             0xF7);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x37,
+                                                             0x1F);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x38,
+                                                             0x32);
+                                               break;
+                                       case 720:
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x35,
+                                                             0xF3);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x36,
+                                                             0x00);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x37,
+                                                             0x1D);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x38,
+                                                             0x20);
+                                               break;
+                                       case 800:
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x35,
+                                                             0xFC);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x36,
+                                                             0xFB);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x37,
+                                                             0x14);
+                                               xgifb_reg_set(XGIPART2,
+                                                             0x38,
+                                                             0x2A);
+                                               break;
+                                       }
+                               }
+                       }
+
+                       if ((filter >= 0) && (filter <= 7)) {
+                               DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n",
+                                       filter_tb, filter,
+                                       XGI_TV_filter[filter_tb].
+                                               filter[filter][0],
+                                       XGI_TV_filter[filter_tb].
+                                               filter[filter][1],
+                                       XGI_TV_filter[filter_tb].
+                                               filter[filter][2],
+                                       XGI_TV_filter[filter_tb].
+                                               filter[filter][3]
+                               );
+                               xgifb_reg_set(
+                                       XGIPART2,
+                                       0x35,
+                                       (XGI_TV_filter[filter_tb].
+                                               filter[filter][0]));
+                               xgifb_reg_set(
+                                       XGIPART2,
+                                       0x36,
+                                       (XGI_TV_filter[filter_tb].
+                                               filter[filter][1]));
+                               xgifb_reg_set(
+                                       XGIPART2,
+                                       0x37,
+                                       (XGI_TV_filter[filter_tb].
+                                               filter[filter][2]));
+                               xgifb_reg_set(
+                                       XGIPART2,
+                                       0x38,
+                                       (XGI_TV_filter[filter_tb].
+                                               filter[filter][3]));
+                       }
+               }
+       }
+}
+
 static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
                struct fb_info *info)
 {
@@ -1039,7 +1248,10 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
        }
 
        printk(KERN_DEBUG "XGIfb: Change mode to %dx%dx%d-%dHz\n",
-                       var->xres, var->yres, var->bits_per_pixel, xgi_video_info.refresh_rate);
+              var->xres,
+              var->yres,
+              var->bits_per_pixel,
+              xgi_video_info.refresh_rate);
 
        old_mode = xgifb_mode_idx;
        xgifb_mode_idx = 0;
@@ -1064,8 +1276,8 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
                xgifb_mode_idx = -1;
 
        if (xgifb_mode_idx < 0) {
-               printk(KERN_ERR "XGIfb: Mode %dx%dx%d not supported\n", var->xres,
-                               var->yres, var->bits_per_pixel);
+               printk(KERN_ERR "XGIfb: Mode %dx%dx%d not supported\n",
+                      var->xres, var->yres, var->bits_per_pixel);
                xgifb_mode_idx = old_mode;
                return -EINVAL;
        }
@@ -1079,16 +1291,19 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
 
                XGIfb_pre_setmode();
                if (XGISetModeNew(&XGIhw_ext, XGIfb_mode_no) == 0) {
-                       printk(KERN_ERR "XGIfb: Setting mode[0x%x] failed\n", XGIfb_mode_no);
+                       printk(KERN_ERR "XGIfb: Setting mode[0x%x] failed\n",
+                              XGIfb_mode_no);
                        return -EINVAL;
                }
                info->fix.line_length = ((info->var.xres_virtual
                                * info->var.bits_per_pixel) >> 6);
 
-               outXGIIDXREG(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
+               xgifb_reg_set(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
 
-               outXGIIDXREG(XGICR, 0x13, (info->fix.line_length & 0x00ff));
-               outXGIIDXREG(XGISR, 0x0E, (info->fix.line_length & 0xff00) >> 8);
+               xgifb_reg_set(XGICR, 0x13, (info->fix.line_length & 0x00ff));
+               xgifb_reg_set(XGISR,
+                             0x0E,
+                             (info->fix.line_length & 0xff00) >> 8);
 
                XGIfb_post_setmode();
 
@@ -1112,16 +1327,16 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
                        xgi_video_info.XGI310_AccelDepth = 0x00000000;
                        xgi_video_info.video_cmap_len = 256;
 #if defined(__powerpc__)
-                       inXGIIDXREG(XGICR, 0x4D, cr_data);
-                       outXGIIDXREG(XGICR, 0x4D, (cr_data & 0xE0));
+                       cr_data = xgifb_reg_get(XGICR, 0x4D);
+                       xgifb_reg_set(XGICR, 0x4D, (cr_data & 0xE0));
 #endif
                        break;
                case 16:
                        xgi_video_info.DstColor = 0x8000;
                        xgi_video_info.XGI310_AccelDepth = 0x00010000;
 #if defined(__powerpc__)
-                       inXGIIDXREG(XGICR, 0x4D, cr_data);
-                       outXGIIDXREG(XGICR, 0x4D, ((cr_data & 0xE0) | 0x0B));
+                       cr_data = xgifb_reg_get(XGICR, 0x4D);
+                       xgifb_reg_set(XGICR, 0x4D, ((cr_data & 0xE0) | 0x0B));
 #endif
                        xgi_video_info.video_cmap_len = 16;
                        break;
@@ -1130,13 +1345,14 @@ static int XGIfb_do_set_var(struct fb_var_screeninfo *var, int isactive,
                        xgi_video_info.XGI310_AccelDepth = 0x00020000;
                        xgi_video_info.video_cmap_len = 16;
 #if defined(__powerpc__)
-                       inXGIIDXREG(XGICR, 0x4D, cr_data);
-                       outXGIIDXREG(XGICR, 0x4D, ((cr_data & 0xE0) | 0x15));
+                       cr_data = xgifb_reg_get(XGICR, 0x4D);
+                       xgifb_reg_set(XGICR, 0x4D, ((cr_data & 0xE0) | 0x15));
 #endif
                        break;
                default:
                        xgi_video_info.video_cmap_len = 16;
-                       printk(KERN_ERR "XGIfb: Unsupported depth %d", xgi_video_info.video_bpp);
+                       printk(KERN_ERR "XGIfb: Unsupported depth %d",
+                              xgi_video_info.video_bpp);
                        break;
                }
        }
@@ -1179,20 +1395,23 @@ static int XGIfb_pan_var(struct fb_var_screeninfo *var)
                break;
        }
 
-       outXGIIDXREG(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
+       xgifb_reg_set(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
 
-       outXGIIDXREG(XGICR, 0x0D, base & 0xFF);
-       outXGIIDXREG(XGICR, 0x0C, (base >> 8) & 0xFF);
-       outXGIIDXREG(XGISR, 0x0D, (base >> 16) & 0xFF);
-       outXGIIDXREG(XGISR, 0x37, (base >> 24) & 0x03);
-       setXGIIDXREG(XGISR, 0x37, 0xDF, (base >> 21) & 0x04);
+       xgifb_reg_set(XGICR, 0x0D, base & 0xFF);
+       xgifb_reg_set(XGICR, 0x0C, (base >> 8) & 0xFF);
+       xgifb_reg_set(XGISR, 0x0D, (base >> 16) & 0xFF);
+       xgifb_reg_set(XGISR, 0x37, (base >> 24) & 0x03);
+       xgifb_reg_and_or(XGISR, 0x37, 0xDF, (base >> 21) & 0x04);
 
        if (xgi_video_info.disp_state & DISPTYPE_DISP2) {
-               orXGIIDXREG(XGIPART1, XGIfb_CRT2_write_enable, 0x01);
-               outXGIIDXREG(XGIPART1, 0x06, (base & 0xFF));
-               outXGIIDXREG(XGIPART1, 0x05, ((base >> 8) & 0xFF));
-               outXGIIDXREG(XGIPART1, 0x04, ((base >> 16) & 0xFF));
-               setXGIIDXREG(XGIPART1, 0x02, 0x7F, ((base >> 24) & 0x01) << 7);
+               xgifb_reg_or(XGIPART1, XGIfb_CRT2_write_enable, 0x01);
+               xgifb_reg_set(XGIPART1, 0x06, (base & 0xFF));
+               xgifb_reg_set(XGIPART1, 0x05, ((base >> 8) & 0xFF));
+               xgifb_reg_set(XGIPART1, 0x04, ((base >> 16) & 0xFF));
+               xgifb_reg_and_or(XGIPART1,
+                                0x02,
+                                0x7F,
+                                ((base >> 24) & 0x01) << 7);
        }
        /* printk("End of pan_var"); */
        return 0;
@@ -1235,15 +1454,15 @@ static int XGIfb_setcolreg(unsigned regno, unsigned red, unsigned green,
 
        switch (info->var.bits_per_pixel) {
        case 8:
-               outXGIREG(XGIDACA, regno);
-               outXGIREG(XGIDACD, (red >> 10));
-               outXGIREG(XGIDACD, (green >> 10));
-               outXGIREG(XGIDACD, (blue >> 10));
+               outb(regno, XGIDACA);
+               outb((red >> 10), XGIDACD);
+               outb((green >> 10), XGIDACD);
+               outb((blue >> 10), XGIDACD);
                if (xgi_video_info.disp_state & DISPTYPE_DISP2) {
-                       outXGIREG(XGIDAC2A, regno);
-                       outXGIREG(XGIDAC2D, (red >> 8));
-                       outXGIREG(XGIDAC2D, (green >> 8));
-                       outXGIREG(XGIDAC2D, (blue >> 8));
+                       outb(regno, XGIDAC2A);
+                       outb((red >> 8), XGIDAC2D);
+                       outb((green >> 8), XGIDAC2D);
+                       outb((blue >> 8), XGIDAC2D);
                }
                break;
        case 16:
@@ -1262,6 +1481,41 @@ static int XGIfb_setcolreg(unsigned regno, unsigned red, unsigned green,
        return 0;
 }
 
+/* ----------- FBDev related routines for all series ---------- */
+
+static int XGIfb_get_fix(struct fb_fix_screeninfo *fix, int con,
+               struct fb_info *info)
+{
+       DEBUGPRN("inside get_fix");
+       memset(fix, 0, sizeof(struct fb_fix_screeninfo));
+
+       strcpy(fix->id, myid);
+
+       fix->smem_start = xgi_video_info.video_base;
+
+       fix->smem_len = xgi_video_info.video_size;
+
+       fix->type = video_type;
+       fix->type_aux = 0;
+       if (xgi_video_info.video_bpp == 8)
+               fix->visual = FB_VISUAL_PSEUDOCOLOR;
+       else
+               fix->visual = FB_VISUAL_DIRECTCOLOR;
+       fix->xpanstep = 0;
+#ifdef XGIFB_PAN
+       if (XGIfb_ypan)
+               fix->ypanstep = 1;
+#endif
+       fix->ywrapstep = 0;
+       fix->line_length = xgi_video_info.video_linelength;
+       fix->mmio_start = xgi_video_info.mmio_base;
+       fix->mmio_len = xgi_video_info.mmio_size;
+       fix->accel = FB_ACCEL_XGI_XABRE;
+
+       DEBUGPRN("end of get_fix");
+       return 0;
+}
+
 static int XGIfb_set_par(struct fb_info *info)
 {
        int err;
@@ -1307,7 +1561,8 @@ static int XGIfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        if (var->pixclock && htotal && vtotal) {
                drate = 1000000000 / var->pixclock;
                hrate = (drate * 1000) / htotal;
-               xgi_video_info.refresh_rate = (unsigned int) (hrate * 2 / vtotal);
+               xgi_video_info.refresh_rate =
+                       (unsigned int) (hrate * 2 / vtotal);
                printk(KERN_DEBUG
                        "%s: pixclock = %d ,htotal=%d, vtotal=%d\n"
                        "%s: drate=%d, hrate=%d, refresh_rate=%d\n",
@@ -1350,10 +1605,10 @@ static int XGIfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
                        var->xres, var->yres, var->bits_per_pixel);
                search_idx = 0;
                while (XGIbios_mode[search_idx].mode_no != 0) {
-
                        if ((var->xres <= XGIbios_mode[search_idx].xres) &&
-                               (var->yres <= XGIbios_mode[search_idx].yres) &&
-                               (var->bits_per_pixel == XGIbios_mode[search_idx].bpp)) {
+                           (var->yres <= XGIbios_mode[search_idx].yres) &&
+                           (var->bits_per_pixel ==
+                            XGIbios_mode[search_idx].bpp)) {
                                if (XGIfb_validate_mode(search_idx) > 0) {
                                        found_mode = 1;
                                        break;
@@ -1393,7 +1648,8 @@ static int XGIfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        } /* else { */
                /* TW: Now patch yres_virtual if we use panning */
                /* May I do this? */
-               /* var->yres_virtual = xgi_video_info.heapstart / (var->xres * (var->bits_per_pixel >> 3)); */
+               /* var->yres_virtual = xgi_video_info.heapstart /
+                       (var->xres * (var->bits_per_pixel >> 3)); */
                /* if (var->yres_virtual <= var->yres) { */
                /* TW: Paranoia check */
                /* var->yres_virtual = var->yres; */
@@ -1460,51 +1716,16 @@ static int XGIfb_blank(int blank, struct fb_info *info)
 {
        u8 reg;
 
-       inXGIIDXREG(XGICR, 0x17, reg);
+       reg = xgifb_reg_get(XGICR, 0x17);
 
        if (blank > 0)
                reg &= 0x7f;
        else
                reg |= 0x80;
 
-       outXGIIDXREG(XGICR, 0x17, reg);
-       outXGIIDXREG(XGISR, 0x00, 0x01); /* Synchronous Reset */
-       outXGIIDXREG(XGISR, 0x00, 0x03); /* End Reset */
-       return 0;
-}
-
-/* ----------- FBDev related routines for all series ---------- */
-
-static int XGIfb_get_fix(struct fb_fix_screeninfo *fix, int con,
-               struct fb_info *info)
-{
-       DEBUGPRN("inside get_fix");
-       memset(fix, 0, sizeof(struct fb_fix_screeninfo));
-
-       strcpy(fix->id, myid);
-
-       fix->smem_start = xgi_video_info.video_base;
-
-       fix->smem_len = xgi_video_info.video_size;
-
-       fix->type = video_type;
-       fix->type_aux = 0;
-       if (xgi_video_info.video_bpp == 8)
-               fix->visual = FB_VISUAL_PSEUDOCOLOR;
-       else
-               fix->visual = FB_VISUAL_DIRECTCOLOR;
-       fix->xpanstep = 0;
-#ifdef XGIFB_PAN
-       if (XGIfb_ypan)
-               fix->ypanstep = 1;
-#endif
-       fix->ywrapstep = 0;
-       fix->line_length = xgi_video_info.video_linelength;
-       fix->mmio_start = xgi_video_info.mmio_base;
-       fix->mmio_len = xgi_video_info.mmio_size;
-       fix->accel = FB_ACCEL_XGI_XABRE;
-
-       DEBUGPRN("end of get_fix");
+       xgifb_reg_set(XGICR, 0x17, reg);
+       xgifb_reg_set(XGISR, 0x00, 0x01); /* Synchronous Reset */
+       xgifb_reg_set(XGISR, 0x00, 0x03); /* End Reset */
        return 0;
 }
 
@@ -1537,9 +1758,9 @@ static int XGIfb_get_dram_size(void)
 
        /* xorg driver sets 32MB * 1 channel */
        if (xgi_video_info.chip == XG27)
-               outXGIIDXREG(XGISR, IND_XGI_DRAM_SIZE, 0x51);
+               xgifb_reg_set(XGISR, IND_XGI_DRAM_SIZE, 0x51);
 
-       inXGIIDXREG(XGISR, IND_XGI_DRAM_SIZE, reg);
+       reg = xgifb_reg_get(XGISR, IND_XGI_DRAM_SIZE);
        switch ((reg & XGI_DRAM_SIZE_MASK) >> 4) {
        case XGI_DRAM_SIZE_1MB:
                xgi_video_info.video_size = 0x100000;
@@ -1614,8 +1835,9 @@ static int XGIfb_get_dram_size(void)
        /* xgi_video_info.video_size = 0x200000; */ /* 1024x768x16 */
        /* xgi_video_info.video_size = 0x1000000; */ /* benchmark */
 
-       printk("XGIfb: SR14=%x DramSzie %x ChannelNum %x\n", reg,
-                       xgi_video_info.video_size, ChannelNum);
+       printk("XGIfb: SR14=%x DramSzie %x ChannelNum %x\n",
+              reg,
+              xgi_video_info.video_size, ChannelNum);
        return 0;
 
 }
@@ -1636,7 +1858,7 @@ static void XGIfb_detect_VB(void)
                break;
        }
 
-       inXGIIDXREG(XGICR, IND_XGI_SCRATCH_REG_CR32, cr32);
+       cr32 = xgifb_reg_get(XGICR, IND_XGI_SCRATCH_REG_CR32);
 
        if ((cr32 & XGI_CRT1) && !XGIfb_crt1off)
                XGIfb_crt1off = 0;
@@ -1673,7 +1895,7 @@ static void XGIfb_detect_VB(void)
                xgi_video_info.TV_plug = TVPLUG_SCART;
 
        if (xgi_video_info.TV_type == 0) {
-               inXGIIDXREG(XGICR, 0x38, temp);
+               temp = xgifb_reg_get(XGICR, 0x38);
                if (temp & 0x10)
                        xgi_video_info.TV_type = TVMODE_PAL;
                else
@@ -1689,30 +1911,11 @@ static void XGIfb_detect_VB(void)
        }
 }
 
-static void XGIfb_get_VB_type(void)
-{
-       u8 reg;
-
-       if (!XGIfb_has_VB()) {
-               inXGIIDXREG(XGICR, IND_XGI_SCRATCH_REG_CR37, reg);
-               switch ((reg & XGI_EXTERNAL_CHIP_MASK) >> 1) {
-               case XGI310_EXTERNAL_CHIP_LVDS:
-                       xgi_video_info.hasVB = HASVB_LVDS;
-                       break;
-               case XGI310_EXTERNAL_CHIP_LVDS_CHRONTEL:
-                       xgi_video_info.hasVB = HASVB_LVDS_CHRONTEL;
-                       break;
-               default:
-                       break;
-               }
-       }
-}
-
 static int XGIfb_has_VB(void)
 {
        u8 vb_chipid;
 
-       inXGIIDXREG(XGIPART4, 0x00, vb_chipid);
+       vb_chipid = xgifb_reg_get(XGIPART4, 0x00);
        switch (vb_chipid) {
        case 0x01:
                xgi_video_info.hasVB = HASVB_301;
@@ -1727,344 +1930,23 @@ static int XGIfb_has_VB(void)
        return 1;
 }
 
-/* ------------------ Sensing routines ------------------ */
-
-/* TW: Determine and detect attached devices on XGI30x */
-int XGIDoSense(int tempbl, int tempbh, int tempcl, int tempch)
-{
-       int temp, i;
-
-       outXGIIDXREG(XGIPART4, 0x11, tempbl);
-       temp = tempbh | tempcl;
-       setXGIIDXREG(XGIPART4, 0x10, 0xe0, temp);
-       for (i = 0; i < 10; i++)
-               XGI_LongWait(&XGI_Pr);
-       tempch &= 0x7f;
-       inXGIIDXREG(XGIPART4, 0x03, temp);
-       temp ^= 0x0e;
-       temp &= tempch;
-       return temp;
-}
-
-void XGI_Sense30x(void)
-{
-       u8 backupP4_0d;
-       u8 testsvhs_tempbl, testsvhs_tempbh;
-       u8 testsvhs_tempcl, testsvhs_tempch;
-       u8 testcvbs_tempbl, testcvbs_tempbh;
-       u8 testcvbs_tempcl, testcvbs_tempch;
-       u8 testvga2_tempbl, testvga2_tempbh;
-       u8 testvga2_tempcl, testvga2_tempch;
-       int myflag, result;
-
-       inXGIIDXREG(XGIPART4, 0x0d, backupP4_0d);
-       outXGIIDXREG(XGIPART4, 0x0d, (backupP4_0d | 0x04));
-
-       testvga2_tempbh = 0x00;
-       testvga2_tempbl = 0xd1;
-       testsvhs_tempbh = 0x00;
-       testsvhs_tempbl = 0xb9;
-       testcvbs_tempbh = 0x00;
-       testcvbs_tempbl = 0xb3;
-       if ((XGIhw_ext.ujVBChipID != VB_CHIP_301) && (XGIhw_ext.ujVBChipID
-                       != VB_CHIP_302)) {
-               testvga2_tempbh = 0x01;
-               testvga2_tempbl = 0x90;
-               testsvhs_tempbh = 0x01;
-               testsvhs_tempbl = 0x6b;
-               testcvbs_tempbh = 0x01;
-               testcvbs_tempbl = 0x74;
-               if (XGIhw_ext.ujVBChipID == VB_CHIP_301LV
-                               || XGIhw_ext.ujVBChipID == VB_CHIP_302LV) {
-                       testvga2_tempbh = 0x00;
-                       testvga2_tempbl = 0x00;
-                       testsvhs_tempbh = 0x02;
-                       testsvhs_tempbl = 0x00;
-                       testcvbs_tempbh = 0x01;
-                       testcvbs_tempbl = 0x00;
-               }
-       }
-       if (XGIhw_ext.ujVBChipID != VB_CHIP_301LV && XGIhw_ext.ujVBChipID
-                       != VB_CHIP_302LV) {
-               inXGIIDXREG(XGIPART4, 0x01, myflag);
-               if (myflag & 0x04) {
-                       testvga2_tempbh = 0x00;
-                       testvga2_tempbl = 0xfd;
-                       testsvhs_tempbh = 0x00;
-                       testsvhs_tempbl = 0xdd;
-                       testcvbs_tempbh = 0x00;
-                       testcvbs_tempbl = 0xee;
-               }
-       }
-       if ((XGIhw_ext.ujVBChipID == VB_CHIP_301LV) || (XGIhw_ext.ujVBChipID
-                       == VB_CHIP_302LV)) {
-               testvga2_tempbh = 0x00;
-               testvga2_tempbl = 0x00;
-               testvga2_tempch = 0x00;
-               testvga2_tempcl = 0x00;
-               testsvhs_tempch = 0x04;
-               testsvhs_tempcl = 0x08;
-               testcvbs_tempch = 0x08;
-               testcvbs_tempcl = 0x08;
-       } else {
-               testvga2_tempch = 0x0e;
-               testvga2_tempcl = 0x08;
-               testsvhs_tempch = 0x06;
-               testsvhs_tempcl = 0x04;
-               testcvbs_tempch = 0x08;
-               testcvbs_tempcl = 0x04;
-       }
-
-       if (testvga2_tempch || testvga2_tempcl || testvga2_tempbh
-                       || testvga2_tempbl) {
-               result = XGIDoSense(testvga2_tempbl, testvga2_tempbh,
-                               testvga2_tempcl, testvga2_tempch);
-               if (result) {
-                       printk(KERN_INFO "XGIfb: Detected secondary VGA connection\n");
-                       orXGIIDXREG(XGICR, 0x32, 0x10);
-               }
-       }
-
-       result = XGIDoSense(testsvhs_tempbl, testsvhs_tempbh, testsvhs_tempcl,
-                       testsvhs_tempch);
-       if (result) {
-               printk(KERN_INFO "XGIfb: Detected TV connected to SVHS output\n");
-               /* TW: So we can be sure that there IS a SVHS output */
-               xgi_video_info.TV_plug = TVPLUG_SVIDEO;
-               orXGIIDXREG(XGICR, 0x32, 0x02);
-       }
-
-       if (!result) {
-               result = XGIDoSense(testcvbs_tempbl, testcvbs_tempbh,
-                               testcvbs_tempcl, testcvbs_tempch);
-               if (result) {
-                       printk(KERN_INFO "XGIfb: Detected TV connected to CVBS output\n");
-                       /* TW: So we can be sure that there IS a CVBS output */
-                       xgi_video_info.TV_plug = TVPLUG_COMPOSITE;
-                       orXGIIDXREG(XGICR, 0x32, 0x01);
-               }
-       }
-       XGIDoSense(0, 0, 0, 0);
-
-       outXGIIDXREG(XGIPART4, 0x0d, backupP4_0d);
-}
-
-/* --------------------- SetMode routines ------------------------- */
-
-static void XGIfb_pre_setmode(void)
-{
-       u8 cr30 = 0, cr31 = 0;
-
-       inXGIIDXREG(XGICR, 0x31, cr31);
-       cr31 &= ~0x60;
-
-       switch (xgi_video_info.disp_state & DISPTYPE_DISP2) {
-       case DISPTYPE_CRT2:
-               cr30 = (XGI_VB_OUTPUT_CRT2 | XGI_SIMULTANEOUS_VIEW_ENABLE);
-               cr31 |= XGI_DRIVER_MODE;
-               break;
-       case DISPTYPE_LCD:
-               cr30 = (XGI_VB_OUTPUT_LCD | XGI_SIMULTANEOUS_VIEW_ENABLE);
-               cr31 |= XGI_DRIVER_MODE;
-               break;
-       case DISPTYPE_TV:
-               if (xgi_video_info.TV_type == TVMODE_HIVISION)
-                       cr30 = (XGI_VB_OUTPUT_HIVISION
-                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
-               else if (xgi_video_info.TV_plug == TVPLUG_SVIDEO)
-                       cr30 = (XGI_VB_OUTPUT_SVIDEO
-                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
-               else if (xgi_video_info.TV_plug == TVPLUG_COMPOSITE)
-                       cr30 = (XGI_VB_OUTPUT_COMPOSITE
-                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
-               else if (xgi_video_info.TV_plug == TVPLUG_SCART)
-                       cr30 = (XGI_VB_OUTPUT_SCART
-                                       | XGI_SIMULTANEOUS_VIEW_ENABLE);
-               cr31 |= XGI_DRIVER_MODE;
-
-               if (XGIfb_tvmode == 1 || xgi_video_info.TV_type == TVMODE_PAL)
-                       cr31 |= 0x01;
-               else
-                       cr31 &= ~0x01;
-               break;
-       default: /* disable CRT2 */
-               cr30 = 0x00;
-               cr31 |= (XGI_DRIVER_MODE | XGI_VB_OUTPUT_DISABLE);
-       }
-
-       outXGIIDXREG(XGICR, IND_XGI_SCRATCH_REG_CR30, cr30);
-       outXGIIDXREG(XGICR, IND_XGI_SCRATCH_REG_CR31, cr31);
-       outXGIIDXREG(XGICR, IND_XGI_SCRATCH_REG_CR33, (XGIfb_rate_idx & 0x0F));
-}
-
-static void XGIfb_post_setmode(void)
+static void XGIfb_get_VB_type(void)
 {
        u8 reg;
-       unsigned char doit = 1;
-       /*
-       outXGIIDXREG(XGISR,IND_XGI_PASSWORD,XGI_PASSWORD);
-       outXGIIDXREG(XGICR, 0x13, 0x00);
-       setXGIIDXREG(XGISR,0x0E, 0xF0, 0x01);
-       *test*
-       */
-       if (xgi_video_info.video_bpp == 8) {
-               /* TW: We can't switch off CRT1 on LVDS/Chrontel in 8bpp Modes */
-               if ((xgi_video_info.hasVB == HASVB_LVDS)
-                               || (xgi_video_info.hasVB == HASVB_LVDS_CHRONTEL)) {
-                       doit = 0;
-               }
-               /* TW: We can't switch off CRT1 on 301B-DH in 8bpp Modes if using LCD */
-               if (xgi_video_info.disp_state & DISPTYPE_LCD)
-                       doit = 0;
-       }
-
-       /* TW: We can't switch off CRT1 if bridge is in slave mode */
-       if (xgi_video_info.hasVB != HASVB_NONE) {
-               inXGIIDXREG(XGIPART1, 0x00, reg);
-
-               if ((reg & 0x50) == 0x10)
-                       doit = 0;
-
-       } else {
-               XGIfb_crt1off = 0;
-       }
-
-       inXGIIDXREG(XGICR, 0x17, reg);
-       if ((XGIfb_crt1off) && (doit))
-               reg &= ~0x80;
-       else
-               reg |= 0x80;
-       outXGIIDXREG(XGICR, 0x17, reg);
-
-       andXGIIDXREG(XGISR, IND_XGI_RAMDAC_CONTROL, ~0x04);
-
-       if ((xgi_video_info.disp_state & DISPTYPE_TV) && (xgi_video_info.hasVB
-                       == HASVB_301)) {
-
-               inXGIIDXREG(XGIPART4, 0x01, reg);
-
-               if (reg < 0xB0) { /* Set filter for XGI301 */
-
-                       switch (xgi_video_info.video_width) {
-                       case 320:
-                               filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 4 : 12;
-                               break;
-                       case 640:
-                               filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 5 : 13;
-                               break;
-                       case 720:
-                               filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 6 : 14;
-                               break;
-                       case 800:
-                               filter_tb = (xgi_video_info.TV_type == TVMODE_NTSC) ? 7 : 15;
-                               break;
-                       default:
-                               filter = -1;
-                               break;
-                       }
-
-                       orXGIIDXREG(XGIPART1, XGIfb_CRT2_write_enable, 0x01);
-
-                       if (xgi_video_info.TV_type == TVMODE_NTSC) {
-
-                               andXGIIDXREG(XGIPART2, 0x3a, 0x1f);
-
-                               if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
-
-                                       andXGIIDXREG(XGIPART2, 0x30, 0xdf);
-
-                               } else if (xgi_video_info.TV_plug
-                                               == TVPLUG_COMPOSITE) {
-
-                                       orXGIIDXREG(XGIPART2, 0x30, 0x20);
-
-                                       switch (xgi_video_info.video_width) {
-                                       case 640:
-                                               outXGIIDXREG(XGIPART2, 0x35, 0xEB);
-                                               outXGIIDXREG(XGIPART2, 0x36, 0x04);
-                                               outXGIIDXREG(XGIPART2, 0x37, 0x25);
-                                               outXGIIDXREG(XGIPART2, 0x38, 0x18);
-                                               break;
-                                       case 720:
-                                               outXGIIDXREG(XGIPART2, 0x35, 0xEE);
-                                               outXGIIDXREG(XGIPART2, 0x36, 0x0C);
-                                               outXGIIDXREG(XGIPART2, 0x37, 0x22);
-                                               outXGIIDXREG(XGIPART2, 0x38, 0x08);
-                                               break;
-                                       case 800:
-                                               outXGIIDXREG(XGIPART2, 0x35, 0xEB);
-                                               outXGIIDXREG(XGIPART2, 0x36, 0x15);
-                                               outXGIIDXREG(XGIPART2, 0x37, 0x25);
-                                               outXGIIDXREG(XGIPART2, 0x38, 0xF6);
-                                               break;
-                                       }
-                               }
-
-                       } else if (xgi_video_info.TV_type == TVMODE_PAL) {
-
-                               andXGIIDXREG(XGIPART2, 0x3A, 0x1F);
-
-                               if (xgi_video_info.TV_plug == TVPLUG_SVIDEO) {
-
-                                       andXGIIDXREG(XGIPART2, 0x30, 0xDF);
-
-                               } else if (xgi_video_info.TV_plug
-                                               == TVPLUG_COMPOSITE) {
-
-                                       orXGIIDXREG(XGIPART2, 0x30, 0x20);
-
-                                       switch (xgi_video_info.video_width) {
-                                       case 640:
-                                               outXGIIDXREG(XGIPART2, 0x35, 0xF1);
-                                               outXGIIDXREG(XGIPART2, 0x36, 0xF7);
-                                               outXGIIDXREG(XGIPART2, 0x37, 0x1F);
-                                               outXGIIDXREG(XGIPART2, 0x38, 0x32);
-                                               break;
-                                       case 720:
-                                               outXGIIDXREG(XGIPART2, 0x35, 0xF3);
-                                               outXGIIDXREG(XGIPART2, 0x36, 0x00);
-                                               outXGIIDXREG(XGIPART2, 0x37, 0x1D);
-                                               outXGIIDXREG(XGIPART2, 0x38, 0x20);
-                                               break;
-                                       case 800:
-                                               outXGIIDXREG(XGIPART2, 0x35, 0xFC);
-                                               outXGIIDXREG(XGIPART2, 0x36, 0xFB);
-                                               outXGIIDXREG(XGIPART2, 0x37, 0x14);
-                                               outXGIIDXREG(XGIPART2, 0x38, 0x2A);
-                                               break;
-                                       }
-                               }
-                       }
-
-                       if ((filter >= 0) && (filter <= 7)) {
-                               DPRINTK("FilterTable[%d]-%d: %02x %02x %02x %02x\n", filter_tb, filter,
-                                               XGI_TV_filter[filter_tb].filter[filter][0],
-                                               XGI_TV_filter[filter_tb].filter[filter][1],
-                                               XGI_TV_filter[filter_tb].filter[filter][2],
-                                               XGI_TV_filter[filter_tb].filter[filter][3]
-                               );
-                               outXGIIDXREG(
-                                               XGIPART2,
-                                               0x35,
-                                               (XGI_TV_filter[filter_tb].filter[filter][0]));
-                               outXGIIDXREG(
-                                               XGIPART2,
-                                               0x36,
-                                               (XGI_TV_filter[filter_tb].filter[filter][1]));
-                               outXGIIDXREG(
-                                               XGIPART2,
-                                               0x37,
-                                               (XGI_TV_filter[filter_tb].filter[filter][2]));
-                               outXGIIDXREG(
-                                               XGIPART2,
-                                               0x38,
-                                               (XGI_TV_filter[filter_tb].filter[filter][3]));
-                       }
 
+       if (!XGIfb_has_VB()) {
+               reg = xgifb_reg_get(XGICR, IND_XGI_SCRATCH_REG_CR37);
+               switch ((reg & XGI_EXTERNAL_CHIP_MASK) >> 1) {
+               case XGI310_EXTERNAL_CHIP_LVDS:
+                       xgi_video_info.hasVB = HASVB_LVDS;
+                       break;
+               case XGI310_EXTERNAL_CHIP_LVDS_CHRONTEL:
+                       xgi_video_info.hasVB = HASVB_LVDS_CHRONTEL;
+                       break;
+               default:
+                       break;
                }
-
        }
-
 }
 
 XGIINITSTATIC int __init XGIfb_setup(char *options)
@@ -2086,15 +1968,19 @@ XGIINITSTATIC int __init XGIfb_setup(char *options)
                if (!strncmp(this_opt, "mode:", 5)) {
                        XGIfb_search_mode(this_opt + 5);
                } else if (!strncmp(this_opt, "vesa:", 5)) {
-                       XGIfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0));
+                       XGIfb_search_vesamode(simple_strtoul(
+                                               this_opt + 5, NULL, 0));
                } else if (!strncmp(this_opt, "mode:", 5)) {
                        XGIfb_search_mode(this_opt + 5);
                } else if (!strncmp(this_opt, "vesa:", 5)) {
-                       XGIfb_search_vesamode(simple_strtoul(this_opt + 5, NULL, 0));
+                       XGIfb_search_vesamode(simple_strtoul(
+                                               this_opt + 5, NULL, 0));
                } else if (!strncmp(this_opt, "vrate:", 6)) {
-                       xgi_video_info.refresh_rate = simple_strtoul(this_opt + 6, NULL, 0);
+                       xgi_video_info.refresh_rate = simple_strtoul(
+                                               this_opt + 6, NULL, 0);
                } else if (!strncmp(this_opt, "rate:", 5)) {
-                       xgi_video_info.refresh_rate = simple_strtoul(this_opt + 5, NULL, 0);
+                       xgi_video_info.refresh_rate = simple_strtoul(
+                                               this_opt + 5, NULL, 0);
                } else if (!strncmp(this_opt, "off", 3)) {
                        XGIfb_off = 1;
                } else if (!strncmp(this_opt, "crt1off", 7)) {
@@ -2104,7 +1990,8 @@ XGIINITSTATIC int __init XGIfb_setup(char *options)
                } else if (!strncmp(this_opt, "forcecrt2type:", 14)) {
                        XGIfb_search_crt2type(this_opt + 14);
                } else if (!strncmp(this_opt, "forcecrt1:", 10)) {
-                       XGIfb_forcecrt1 = (int)simple_strtoul(this_opt + 10, NULL, 0);
+                       XGIfb_forcecrt1 = (int)simple_strtoul(
+                                               this_opt + 10, NULL, 0);
                } else if (!strncmp(this_opt, "tvmode:", 7)) {
                        XGIfb_search_tvstd(this_opt + 7);
                } else if (!strncmp(this_opt, "tvstandard:", 11)) {
@@ -2122,12 +2009,15 @@ XGIINITSTATIC int __init XGIfb_setup(char *options)
                } else if (!strncmp(this_opt, "noypan", 6)) {
                        XGIfb_ypan = 0;
                } else if (!strncmp(this_opt, "userom:", 7)) {
-                       XGIfb_userom = (int)simple_strtoul(this_opt + 7, NULL, 0);
+                       XGIfb_userom = (int)simple_strtoul(
+                                               this_opt + 7, NULL, 0);
                        /* } else if (!strncmp(this_opt, "useoem:", 7)) { */
-                       /* XGIfb_useoem = (int)simple_strtoul(this_opt + 7, NULL, 0); */
+                       /* XGIfb_useoem = (int)simple_strtoul(
+                                               this_opt + 7, NULL, 0); */
                } else {
                        XGIfb_search_mode(this_opt);
-                       /* printk(KERN_INFO "XGIfb: Invalid option %s\n", this_opt); */
+                       /* printk(KERN_INFO "XGIfb: Invalid option %s\n",
+                                 this_opt); */
                }
 
                /* TW: Panning only with acceleration */
@@ -2178,7 +2068,9 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                return -ENOMEM;
 
        xgi_video_info.chip_id = pdev->device;
-       pci_read_config_byte(pdev, PCI_REVISION_ID, &xgi_video_info.revision_id);
+       pci_read_config_byte(pdev,
+                            PCI_REVISION_ID,
+                            &xgi_video_info.revision_id);
        XGIhw_ext.jChipRevision = xgi_video_info.revision_id;
 
        xgi_video_info.pcibus = pdev->bus->number;
@@ -2194,7 +2086,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
        XGIhw_ext.pjIOAddress = (unsigned char *)xgi_video_info.vga_base;
        /* XGI_Pr.RelIO  = ioremap(pci_resource_start(pdev, 2), 128) + 0x30; */
        printk("XGIfb: Relocate IO address: %lx [%08lx]\n",
-                       (unsigned long)pci_resource_start(pdev, 2), XGI_Pr.RelIO);
+              (unsigned long)pci_resource_start(pdev, 2), XGI_Pr.RelIO);
 
        if (pci_enable_device(pdev)) {
                ret = -EIO;
@@ -2203,8 +2095,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
        XGIRegInit(&XGI_Pr, (unsigned long)XGIhw_ext.pjIOAddress);
 
-       outXGIIDXREG(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
-       inXGIIDXREG(XGISR, IND_XGI_PASSWORD, reg1);
+       xgifb_reg_set(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
+       reg1 = xgifb_reg_get(XGISR, IND_XGI_PASSWORD);
 
        if (reg1 != 0xa1) { /*I/O error */
                printk("\nXGIfb: I/O error!!!");
@@ -2214,8 +2106,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
        switch (xgi_video_info.chip_id) {
        case PCI_DEVICE_ID_XG_20:
-               orXGIIDXREG(XGICR, Index_CR_GPIO_Reg3, GPIOG_EN);
-               inXGIIDXREG(XGICR, Index_CR_GPIO_Reg1, CR48);
+               xgifb_reg_or(XGICR, Index_CR_GPIO_Reg3, GPIOG_EN);
+               CR48 = xgifb_reg_get(XGICR, Index_CR_GPIO_Reg1);
                if (CR48&GPIOG_READ)
                        xgi_video_info.chip = XG21;
                else
@@ -2249,7 +2141,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
        if ((xgi_video_info.chip == XG21) || (XGIfb_userom)) {
                XGIhw_ext.pjVirtualRomBase = xgifb_copy_rom(pdev);
                if (XGIhw_ext.pjVirtualRomBase)
-                       printk(KERN_INFO "XGIfb: Video ROM found and mapped to %p\n", XGIhw_ext.pjVirtualRomBase);
+                       printk(KERN_INFO "XGIfb: Video ROM found and mapped to %p\n",
+                              XGIhw_ext.pjVirtualRomBase);
                else
                        printk(KERN_INFO "XGIfb: Video ROM not found\n");
        } else {
@@ -2264,17 +2157,23 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                goto error;
        }
 
-       if ((xgifb_mode_idx < 0) || ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) {
+       if ((xgifb_mode_idx < 0) ||
+           ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) {
                /* Enable PCI_LINEAR_ADDRESSING and MMIO_ENABLE  */
-               orXGIIDXREG(XGISR, IND_XGI_PCI_ADDRESS_SET, (XGI_PCI_ADDR_ENABLE | XGI_MEM_MAP_IO_ENABLE));
+               xgifb_reg_or(XGISR,
+                            IND_XGI_PCI_ADDRESS_SET,
+                            (XGI_PCI_ADDR_ENABLE | XGI_MEM_MAP_IO_ENABLE));
                /* Enable 2D accelerator engine */
-               orXGIIDXREG(XGISR, IND_XGI_MODULE_ENABLE, XGI_ENABLE_2D);
+               xgifb_reg_or(XGISR, IND_XGI_MODULE_ENABLE, XGI_ENABLE_2D);
        }
 
        XGIhw_ext.ulVideoMemorySize = xgi_video_info.video_size;
 
-       if (!request_mem_region(xgi_video_info.video_base, xgi_video_info.video_size, "XGIfb FB")) {
-               printk("unable request memory size %x", xgi_video_info.video_size);
+       if (!request_mem_region(xgi_video_info.video_base,
+                               xgi_video_info.video_size,
+                               "XGIfb FB")) {
+               printk("unable request memory size %x",
+                      xgi_video_info.video_size);
                printk(KERN_ERR "XGIfb: Fatal error: Unable to reserve frame buffer memory\n");
                printk(KERN_ERR "XGIfb: Is there another framebuffer driver active?\n");
                ret = -ENODEV;
@@ -2295,7 +2194,9 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                                            xgi_video_info.mmio_size);
 
        printk(KERN_INFO "XGIfb: Framebuffer at 0x%lx, mapped to 0x%p, size %dk\n",
-                       xgi_video_info.video_base, xgi_video_info.video_vbase, xgi_video_info.video_size / 1024);
+              xgi_video_info.video_base,
+              xgi_video_info.video_vbase,
+              xgi_video_info.video_size / 1024);
 
        printk(KERN_INFO "XGIfb: MMIO at 0x%lx, mapped to 0x%p, size %ldk\n",
               xgi_video_info.mmio_base, xgi_video_info.mmio_vbase,
@@ -2308,19 +2209,21 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
        xgi_video_info.mtrr = (unsigned int) 0;
 
-       if ((xgifb_mode_idx < 0) || ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) {
+       if ((xgifb_mode_idx < 0) ||
+           ((XGIbios_mode[xgifb_mode_idx].mode_no) != 0xFF)) {
                xgi_video_info.hasVB = HASVB_NONE;
-               if ((xgi_video_info.chip == XG20) || (xgi_video_info.chip == XG27)) {
+               if ((xgi_video_info.chip == XG20) ||
+                   (xgi_video_info.chip == XG27)) {
                        xgi_video_info.hasVB = HASVB_NONE;
                } else if (xgi_video_info.chip == XG21) {
-                       inXGIIDXREG(XGICR, 0x38, CR38);
+                       CR38 = xgifb_reg_get(XGICR, 0x38);
                        if ((CR38&0xE0) == 0xC0) {
                                xgi_video_info.disp_state = DISPTYPE_LCD;
                                if (!XGIfb_GetXG21LVDSData()) {
                                        int m;
                                        for (m = 0; m < sizeof(XGI21_LCDCapList)/sizeof(struct XGI21_LVDSCapStruct); m++) {
                                                if ((XGI21_LCDCapList[m].LVDSHDE == XGIbios_mode[xgifb_mode_idx].xres) &&
-                                                               (XGI21_LCDCapList[m].LVDSVDE == XGIbios_mode[xgifb_mode_idx].yres)) {
+                                                   (XGI21_LCDCapList[m].LVDSVDE == XGIbios_mode[xgifb_mode_idx].yres)) {
                                                        xgifb_reg_set(XGI_Pr.P3d4, 0x36, m);
                                                }
                                        }
@@ -2340,7 +2243,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
                switch (xgi_video_info.hasVB) {
                case HASVB_301:
-                       inXGIIDXREG(XGIPART4, 0x01, reg);
+                       reg = xgifb_reg_get(XGIPART4, 0x01);
                        if (reg >= 0xE0) {
                                XGIhw_ext.ujVBChipID = VB_CHIP_302LV;
                                printk(KERN_INFO "XGIfb: XGI302LV bridge detected (revision 0x%02x)\n", reg);
@@ -2350,7 +2253,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                        }
                        /* else if (reg >= 0xB0) {
                                XGIhw_ext.ujVBChipID = VB_CHIP_301B;
-                               inXGIIDXREG(XGIPART4, 0x23, reg1);
+                               reg1 = xgifb_reg_get(XGIPART4, 0x23);
                                printk("XGIfb: XGI301B bridge detected\n");
                        } */
                        else {
@@ -2359,7 +2262,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                        }
                        break;
                case HASVB_302:
-                       inXGIIDXREG(XGIPART4, 0x01, reg);
+                       reg = xgifb_reg_get(XGIPART4, 0x01);
                        if (reg >= 0xE0) {
                                XGIhw_ext.ujVBChipID = VB_CHIP_302LV;
                                printk(KERN_INFO "XGIfb: XGI302LV bridge detected (revision 0x%02x)\n", reg);
@@ -2367,7 +2270,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                                XGIhw_ext.ujVBChipID = VB_CHIP_301LV;
                                printk(KERN_INFO "XGIfb: XGI302LV bridge detected (revision 0x%02x)\n", reg);
                        } else if (reg >= 0xB0) {
-                               inXGIIDXREG(XGIPART4, 0x23, reg1);
+                               reg1 = xgifb_reg_get(XGIPART4, 0x23);
 
                                XGIhw_ext.ujVBChipID = VB_CHIP_302B;
 
@@ -2404,14 +2307,16 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                        if (XGIfb_crt1off)
                                xgi_video_info.disp_state |= DISPMODE_SINGLE;
                        else
-                               xgi_video_info.disp_state |= (DISPMODE_MIRROR | DISPTYPE_CRT1);
+                               xgi_video_info.disp_state |= (DISPMODE_MIRROR |
+                                                             DISPTYPE_CRT1);
                } else {
-                       xgi_video_info.disp_state = DISPMODE_SINGLE | DISPTYPE_CRT1;
+                       xgi_video_info.disp_state = DISPMODE_SINGLE |
+                                                   DISPTYPE_CRT1;
                }
 
                if (xgi_video_info.disp_state & DISPTYPE_LCD) {
                        if (!enable_dstn) {
-                               inXGIIDXREG(XGICR, IND_XGI_LCD_PANEL, reg);
+                               reg = xgifb_reg_get(XGICR, IND_XGI_LCD_PANEL);
                                reg &= 0x0f;
                                XGIhw_ext.ulCRT2LCDType = XGI310paneltype[reg];
 
@@ -2431,21 +2336,25 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                                (XGIhw_ext.ujVBChipID == VB_CHIP_301LV) ||
                                (XGIhw_ext.ujVBChipID == VB_CHIP_302LV)) {
                        int tmp;
-                       inXGIIDXREG(XGICR, 0x34, tmp);
+                       tmp = xgifb_reg_get(XGICR, 0x34);
                        if (tmp <= 0x13) {
-                               /* Currently on LCDA? (Some BIOSes leave CR38) */
-                               inXGIIDXREG(XGICR, 0x38, tmp);
+                               /* Currently on LCDA?
+                                *(Some BIOSes leave CR38) */
+                               tmp = xgifb_reg_get(XGICR, 0x38);
                                if ((tmp & 0x03) == 0x03) {
                                        /* XGI_Pr.XGI_UseLCDA = 1; */
                                } else {
-                                       /* Currently on LCDA? (Some newer BIOSes set D0 in CR35) */
-                                       inXGIIDXREG(XGICR, 0x35, tmp);
+                                       /* Currently on LCDA?
+                                        *(Some newer BIOSes set D0 in CR35) */
+                                       tmp = xgifb_reg_get(XGICR, 0x35);
                                        if (tmp & 0x01) {
                                                /* XGI_Pr.XGI_UseLCDA = 1; */
                                        } else {
-                                               inXGIIDXREG(XGICR, 0x30, tmp);
+                                               tmp = xgifb_reg_get(XGICR,
+                                                                   0x30);
                                                if (tmp & 0x20) {
-                                                       inXGIIDXREG(XGIPART1, 0x13, tmp);
+                                                       tmp = xgifb_reg_get(
+                                                               XGIPART1, 0x13);
                                                        if (tmp & 0x04) {
                                                                /* XGI_Pr.XGI_UseLCDA = 1; */
                                                        }
@@ -2464,7 +2373,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                        case DISPTYPE_LCD:
                                xgifb_mode_idx = DEFAULT_LCDMODE;
                                if (xgi_video_info.chip == XG21)
-                                       xgifb_mode_idx = XGIfb_GetXG21DefaultLVDSModeIdx();
+                                       xgifb_mode_idx =
+                                           XGIfb_GetXG21DefaultLVDSModeIdx();
                                break;
                        case DISPTYPE_TV:
                                xgifb_mode_idx = DEFAULT_TVMODE;
@@ -2477,18 +2387,26 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
                XGIfb_mode_no = XGIbios_mode[xgifb_mode_idx].mode_no;
 
+               /* yilin set default refresh rate */
                if (xgi_video_info.refresh_rate == 0)
-                       xgi_video_info.refresh_rate = 60; /* yilin set default refresh rate */
-               if (XGIfb_search_refresh_rate(xgi_video_info.refresh_rate) == 0) {
+                       xgi_video_info.refresh_rate = 60;
+               if (XGIfb_search_refresh_rate(
+                               xgi_video_info.refresh_rate) == 0) {
                        XGIfb_rate_idx = XGIbios_mode[xgifb_mode_idx].rate_idx;
                        xgi_video_info.refresh_rate = 60;
                }
 
                xgi_video_info.video_bpp = XGIbios_mode[xgifb_mode_idx].bpp;
-               xgi_video_info.video_vwidth = xgi_video_info.video_width = XGIbios_mode[xgifb_mode_idx].xres;
-               xgi_video_info.video_vheight = xgi_video_info.video_height = XGIbios_mode[xgifb_mode_idx].yres;
+               xgi_video_info.video_vwidth =
+                       xgi_video_info.video_width =
+                               XGIbios_mode[xgifb_mode_idx].xres;
+               xgi_video_info.video_vheight =
+                       xgi_video_info.video_height =
+                               XGIbios_mode[xgifb_mode_idx].yres;
                xgi_video_info.org_x = xgi_video_info.org_y = 0;
-               xgi_video_info.video_linelength = xgi_video_info.video_width * (xgi_video_info.video_bpp >> 3);
+               xgi_video_info.video_linelength =
+                       xgi_video_info.video_width *
+                       (xgi_video_info.video_bpp >> 3);
                switch (xgi_video_info.video_bpp) {
                case 8:
                        xgi_video_info.DstColor = 0x0000;
@@ -2507,16 +2425,23 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                        break;
                default:
                        xgi_video_info.video_cmap_len = 16;
-                       printk(KERN_INFO "XGIfb: Unsupported depth %d", xgi_video_info.video_bpp);
+                       printk(KERN_INFO "XGIfb: Unsupported depth %d",
+                              xgi_video_info.video_bpp);
                        break;
                }
 
                printk(KERN_INFO "XGIfb: Default mode is %dx%dx%d (%dHz)\n",
-                               xgi_video_info.video_width, xgi_video_info.video_height, xgi_video_info.video_bpp,
-                               xgi_video_info.refresh_rate);
-
-               default_var.xres = default_var.xres_virtual = xgi_video_info.video_width;
-               default_var.yres = default_var.yres_virtual = xgi_video_info.video_height;
+                      xgi_video_info.video_width,
+                      xgi_video_info.video_height,
+                      xgi_video_info.video_bpp,
+                      xgi_video_info.refresh_rate);
+
+               default_var.xres =
+                       default_var.xres_virtual =
+                               xgi_video_info.video_width;
+               default_var.yres =
+                       default_var.yres_virtual =
+                               xgi_video_info.video_height;
                default_var.bits_per_pixel = xgi_video_info.video_bpp;
 
                XGIfb_bpp_to_var(&default_var);
@@ -2532,10 +2457,12 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                        &default_var.hsync_len, &default_var.vsync_len,
                        &default_var.sync, &default_var.vmode)) {
 
-                       if ((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_INTERLACED) {
+                       if ((default_var.vmode & FB_VMODE_MASK) ==
+                           FB_VMODE_INTERLACED) {
                                default_var.yres <<= 1;
                                default_var.yres_virtual <<= 1;
-                       } else if ((default_var.vmode & FB_VMODE_MASK) == FB_VMODE_DOUBLE) {
+                       } else if ((default_var.vmode & FB_VMODE_MASK) ==
+                                  FB_VMODE_DOUBLE) {
                                default_var.pixclock >>= 1;
                                default_var.yres >>= 1;
                                default_var.yres_virtual >>= 1;
@@ -2555,9 +2482,10 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                fb_alloc_cmap(&fb_info->cmap, 256 , 0);
 
 #ifdef CONFIG_MTRR
-               xgi_video_info.mtrr = mtrr_add((unsigned int) xgi_video_info.video_base,
-                               (unsigned int) xgi_video_info.video_size,
-                               MTRR_TYPE_WRCOMB, 1);
+               xgi_video_info.mtrr = mtrr_add(
+                       (unsigned int) xgi_video_info.video_base,
+                       (unsigned int) xgi_video_info.video_size,
+                       MTRR_TYPE_WRCOMB, 1);
                if (xgi_video_info.mtrr)
                        printk(KERN_INFO "XGIfb: Added MTRRs\n");
 #endif
@@ -2570,7 +2498,7 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                XGIfb_registered = 1;
 
                printk(KERN_INFO "fb%d: %s frame buffer device, Version %d.%d.%02d\n",
-                               fb_info->node, myid, VER_MAJOR, VER_MINOR, VER_LEVEL);
+                      fb_info->node, myid, VER_MAJOR, VER_MINOR, VER_LEVEL);
 
        }