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>
diff --git a/drivers/staging/xgifb/vb_init.c b/drivers/staging/xgifb/vb_init.c
index 96e2334..4f56978 100644
--- a/drivers/staging/xgifb/vb_init.c
+++ b/drivers/staging/xgifb/vb_init.c
@@ -1120,9 +1120,10 @@
 	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 @@
 		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;