diff options
Diffstat (limited to 'drivers/staging/xgifb/XGI_main_26.c')
-rw-r--r-- | drivers/staging/xgifb/XGI_main_26.c | 1259 |
1 files changed, 594 insertions, 665 deletions
diff --git a/drivers/staging/xgifb/XGI_main_26.c b/drivers/staging/xgifb/XGI_main_26.c index 721bd25fe542..cadec2ad0d32 100644 --- a/drivers/staging/xgifb/XGI_main_26.c +++ b/drivers/staging/xgifb/XGI_main_26.c @@ -33,7 +33,7 @@ #define XGIFB_PAN #endif -#include <asm/io.h> +#include <linux/io.h> #ifdef CONFIG_MTRR #include <asm/mtrr.h> #endif @@ -41,7 +41,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 +52,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 +70,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 +349,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 +378,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 +429,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 +516,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 +534,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 +583,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 +596,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 +673,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 +692,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 +706,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 +731,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 +744,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 +781,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 +834,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 +868,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 +925,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 +1249,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 +1277,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 +1292,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 +1328,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 +1346,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 +1396,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 +1455,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 +1482,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 +1562,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 +1606,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 +1649,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 +1717,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 +1759,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 +1836,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 +1859,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 +1896,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 +1912,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 +1931,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 +1969,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 +1991,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 +2010,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 +2069,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 +2087,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 +2096,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 +2107,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 +2142,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 +2158,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 +2195,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 +2210,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 +2244,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 +2254,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 +2263,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 +2271,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 +2308,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 +2337,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 +2374,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 +2388,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 +2426,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 +2458,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 +2483,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 +2499,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); } |