diff options
Diffstat (limited to 'drivers/staging/xgifb/vb_init.c')
-rw-r--r-- | drivers/staging/xgifb/vb_init.c | 92 |
1 files changed, 32 insertions, 60 deletions
diff --git a/drivers/staging/xgifb/vb_init.c b/drivers/staging/xgifb/vb_init.c index 19ce5a978cae..5f1c41ed778b 100644 --- a/drivers/staging/xgifb/vb_init.c +++ b/drivers/staging/xgifb/vb_init.c @@ -54,14 +54,12 @@ XGINew_GetXG20DRAMType(struct xgi_hw_device_info *HwDeviceExtension, udelay(800); xgifb_reg_or(pVBInfo->P3d4, 0x4A, 0x80); /* Enable GPIOH read */ /* GPIOF 0:DVI 1:DVO */ - temp = xgifb_reg_get(pVBInfo->P3d4, 0x48); + data = xgifb_reg_get(pVBInfo->P3d4, 0x48); /* HOTPLUG_SUPPORT */ /* for current XG20 & XG21, GPIOH is floating, driver will * fix DDR temporarily */ - if (temp & 0x01) /* DVI read GPIOH */ - data = 1; /* DDRII */ - else - data = 0; /* DDR */ + /* DVI read GPIOH */ + data &= 0x01; /* 1=DDRII, 0=DDR */ /* ~HOTPLUG_SUPPORT */ xgifb_reg_or(pVBInfo->P3d4, 0xB4, 0x02); return data; @@ -1079,44 +1077,23 @@ static unsigned short XGINew_SenseLCD(struct xgi_hw_device_info *HwDeviceExtension, struct vb_device_info *pVBInfo) { - unsigned short temp; - - /* add lcd sense */ - if (HwDeviceExtension->ulCRT2LCDType == LCD_UNKNOWN) { + unsigned short temp = HwDeviceExtension->ulCRT2LCDType; + + switch (HwDeviceExtension->ulCRT2LCDType) { + case LCD_640x480: + case LCD_1024x600: + case LCD_1152x864: + case LCD_1280x960: + case LCD_1152x768: + case LCD_1920x1440: + case LCD_2048x1536: + temp = 0; /* overwrite used ulCRT2LCDType */ + break; + case LCD_UNKNOWN: /* unknown lcd, do nothing */ return 0; - } else { - temp = (unsigned short) HwDeviceExtension->ulCRT2LCDType; - switch (HwDeviceExtension->ulCRT2LCDType) { - case LCD_INVALID: - case LCD_800x600: - case LCD_1024x768: - case LCD_1280x1024: - break; - - case LCD_640x480: - case LCD_1024x600: - case LCD_1152x864: - case LCD_1280x960: - case LCD_1152x768: - temp = 0; - break; - - case LCD_1400x1050: - case LCD_1280x768: - case LCD_1600x1200: - break; - - case LCD_1920x1440: - case LCD_2048x1536: - temp = 0; - break; - - default: - break; - } - xgifb_reg_and_or(pVBInfo->P3d4, 0x36, 0xF0, temp); - return 1; } + xgifb_reg_and_or(pVBInfo->P3d4, 0x36, 0xF0, temp); + return 1; } static void XGINew_GetXG21Sense(struct pci_dev *pdev, @@ -1138,17 +1115,11 @@ static void XGINew_GetXG21Sense(struct pci_dev *pdev, xgifb_reg_or(pVBInfo->P3d4, 0x32, LCDSense); /* Enable read GPIOF */ xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x20, 0x20); - Temp = xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x04; - if (!Temp) - xgifb_reg_and_or(pVBInfo->P3d4, - 0x38, - ~0xE0, - 0x80); /* TMDS on chip */ + if (xgifb_reg_get(pVBInfo->P3d4, 0x48) & 0x04) + Temp = 0xA0; /* Only DVO on chip */ else - xgifb_reg_and_or(pVBInfo->P3d4, - 0x38, - ~0xE0, - 0xA0); /* Only DVO on chip */ + Temp = 0x80; /* TMDS on chip */ + xgifb_reg_and_or(pVBInfo->P3d4, 0x38, ~0xE0, Temp); /* Disable read GPIOF */ xgifb_reg_and(pVBInfo->P3d4, 0x4A, ~0x20); } @@ -1206,9 +1177,7 @@ static unsigned char GetXG27FPBits(struct vb_device_info *pVBInfo) /* enable GPIOA/B/C read */ xgifb_reg_and_or(pVBInfo->P3d4, 0x4A, ~0x03, 0x03); temp = xgifb_reg_get(pVBInfo->P3d4, 0x48); - if (temp <= 2) - temp &= 0x03; - else + if (temp > 2) temp = ((temp & 0x04) >> 1) | ((~temp) & 0x01); xgifb_reg_set(pVBInfo->P3d4, 0x4A, CR4A); @@ -1216,6 +1185,14 @@ static unsigned char GetXG27FPBits(struct vb_device_info *pVBInfo) return temp; } +static bool xgifb_bridge_is_on(struct vb_device_info *vb_info) +{ + u8 flag; + + flag = xgifb_reg_get(vb_info->Part4Port, 0x00); + return flag == 1 || flag == 2; +} + unsigned char XGIInitNew(struct pci_dev *pdev) { struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev); @@ -1235,10 +1212,6 @@ unsigned char XGIInitNew(struct pci_dev *pdev) outb(0x67, pVBInfo->P3c2); - if (HwDeviceExtension->jChipType < XG20) - /* Run XGI_GetVBType before InitTo330Pointer */ - XGI_GetVBType(pVBInfo); - InitTo330Pointer(HwDeviceExtension->jChipType, pVBInfo); /* Openkey */ @@ -1327,7 +1300,6 @@ unsigned char XGIInitNew(struct pci_dev *pdev) xgifb_reg_set(pVBInfo->Part1Port, 0x00, 0x00); /* chk if BCLK>=100MHz */ temp1 = xgifb_reg_get(pVBInfo->P3d4, 0x7B); - temp = (unsigned char) ((temp1 >> 4) & 0x0F); xgifb_reg_set(pVBInfo->Part1Port, 0x02, XGI330_CRT2Data_1_2); @@ -1353,7 +1325,7 @@ unsigned char XGIInitNew(struct pci_dev *pdev) xgifb_reg_set(pVBInfo->P3c4, 0x33, XGI330_SR33); if (HwDeviceExtension->jChipType < XG20) { - if (XGI_BridgeIsOn(pVBInfo) == 1) { + if (xgifb_bridge_is_on(pVBInfo)) { xgifb_reg_set(pVBInfo->Part2Port, 0x00, 0x1C); xgifb_reg_set(pVBInfo->Part4Port, 0x0D, XGI330_CRT2Data_4_D); |