aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/xgifb
diff options
context:
space:
mode:
authorAaro Koskinen <aaro.koskinen@iki.fi>2011-12-06 00:10:41 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2011-12-08 12:26:06 -0800
commitd1805b38700c8251139763386e806cdb51662661 (patch)
tree3d616f2d0a2cb9cd5bf0f731f85d0238ad6e3e10 /drivers/staging/xgifb
parentstaging: xgifb: ReadVBIOSTablData(): check the BIOS size (diff)
downloadlinux-dev-d1805b38700c8251139763386e806cdb51662661.tar.xz
linux-dev-d1805b38700c8251139763386e806cdb51662661.zip
staging: xgifb: ReadVBIOSTablData(): copy only a single LVDS entry
Only a single LVDS table entry is needed by the driver. Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/xgifb')
-rw-r--r--drivers/staging/xgifb/vb_init.c53
-rw-r--r--drivers/staging/xgifb/vb_setmode.c6
2 files changed, 27 insertions, 32 deletions
diff --git a/drivers/staging/xgifb/vb_init.c b/drivers/staging/xgifb/vb_init.c
index 96e2334af2a1..4f56978391ad 100644
--- a/drivers/staging/xgifb/vb_init.c
+++ b/drivers/staging/xgifb/vb_init.c
@@ -1120,9 +1120,10 @@ static void ReadVBIOSTablData(struct pci_dev *pdev,
struct xgifb_video_info *xgifb_info = pci_get_drvdata(pdev);
u8 *vbios;
unsigned long i;
- unsigned char j, k;
+ unsigned char j;
struct XGI21_LVDSCapStruct *lvds;
size_t vbios_size;
+ int entry;
if (xgifb_info->chip != XG21)
return;
@@ -1148,32 +1149,32 @@ static void ReadVBIOSTablData(struct pci_dev *pdev,
goto error;
if (j == 0xff)
j = 1;
- k = 0;
+ /*
+ * Read the LVDS table index scratch register set by the BIOS.
+ */
+ entry = xgifb_reg_get(xgifb_info->dev_info.P3d4, 0x36);
+ if (entry >= j)
+ entry = 0;
+ i += entry * 25;
lvds = &pVBInfo->XG21_LVDSCapList[0];
- do {
- if (vbios_size <= i + 24)
- goto error;
- lvds->LVDS_Capability = vbios[i] | (vbios[i + 1] << 8);
- lvds->LVDSHT = vbios[i + 2] | (vbios[i + 3] << 8);
- lvds->LVDSVT = vbios[i + 4] | (vbios[i + 5] << 8);
- lvds->LVDSHDE = vbios[i + 6] | (vbios[i + 7] << 8);
- lvds->LVDSVDE = vbios[i + 8] | (vbios[i + 9] << 8);
- lvds->LVDSHFP = vbios[i + 10] | (vbios[i + 11] << 8);
- lvds->LVDSVFP = vbios[i + 12] | (vbios[i + 13] << 8);
- lvds->LVDSHSYNC = vbios[i + 14] | (vbios[i + 15] << 8);
- lvds->LVDSVSYNC = vbios[i + 16] | (vbios[i + 17] << 8);
- lvds->VCLKData1 = vbios[i + 18];
- lvds->VCLKData2 = vbios[i + 19];
- lvds->PSC_S1 = vbios[i + 20];
- lvds->PSC_S2 = vbios[i + 21];
- lvds->PSC_S3 = vbios[i + 22];
- lvds->PSC_S4 = vbios[i + 23];
- lvds->PSC_S5 = vbios[i + 24];
- i += 25;
- j--;
- k++;
- lvds++;
- } while (j > 0 && k < ARRAY_SIZE(XGI21_LCDCapList));
+ if (vbios_size <= i + 24)
+ goto error;
+ lvds->LVDS_Capability = vbios[i] | (vbios[i + 1] << 8);
+ lvds->LVDSHT = vbios[i + 2] | (vbios[i + 3] << 8);
+ lvds->LVDSVT = vbios[i + 4] | (vbios[i + 5] << 8);
+ lvds->LVDSHDE = vbios[i + 6] | (vbios[i + 7] << 8);
+ lvds->LVDSVDE = vbios[i + 8] | (vbios[i + 9] << 8);
+ lvds->LVDSHFP = vbios[i + 10] | (vbios[i + 11] << 8);
+ lvds->LVDSVFP = vbios[i + 12] | (vbios[i + 13] << 8);
+ lvds->LVDSHSYNC = vbios[i + 14] | (vbios[i + 15] << 8);
+ lvds->LVDSVSYNC = vbios[i + 16] | (vbios[i + 17] << 8);
+ lvds->VCLKData1 = vbios[i + 18];
+ lvds->VCLKData2 = vbios[i + 19];
+ lvds->PSC_S1 = vbios[i + 20];
+ lvds->PSC_S2 = vbios[i + 21];
+ lvds->PSC_S3 = vbios[i + 22];
+ lvds->PSC_S4 = vbios[i + 23];
+ lvds->PSC_S5 = vbios[i + 24];
vfree(vbios);
pVBInfo->IF_DEF_LVDS = 1;
return;
diff --git a/drivers/staging/xgifb/vb_setmode.c b/drivers/staging/xgifb/vb_setmode.c
index 31c892736ba8..6b9b72081a86 100644
--- a/drivers/staging/xgifb/vb_setmode.c
+++ b/drivers/staging/xgifb/vb_setmode.c
@@ -3650,12 +3650,6 @@ static void XGI_XG27BLSignalVDD(unsigned short tempbh, unsigned short tempbl,
static unsigned short XGI_GetLVDSOEMTableIndex(struct vb_device_info *pVBInfo)
{
- unsigned short index;
-
- index = xgifb_reg_get(pVBInfo->P3d4, 0x36);
- if (index < sizeof(XGI21_LCDCapList)
- / sizeof(struct XGI21_LVDSCapStruct))
- return index;
return 0;
}