Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64db29f5 authored by Aaro Koskinen's avatar Aaro Koskinen Committed by Greg Kroah-Hartman
Browse files

staging: xgifb: refactor XGI_SetXG21LVDSPara() and XGI_SetXG27LVDSPara()



The code is almost the same for XG21 and XG27, a single routine can
cover both.

Signed-off-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 105d8d0d
Loading
Loading
Loading
Loading
+31 −211
Original line number Original line Diff line number Diff line
@@ -6387,7 +6387,8 @@ void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)


}
}


static void XGI_SetXG21LVDSPara(unsigned short ModeNo,
static void xgifb_set_lvds(int chip_id,
			   unsigned short ModeNo,
			   unsigned short ModeIdIndex,
			   unsigned short ModeIdIndex,
			   struct vb_device_info *pVBInfo)
			   struct vb_device_info *pVBInfo)
{
{
@@ -6398,7 +6399,6 @@ static void XGI_SetXG21LVDSPara(unsigned short ModeNo,
	unsigned short value;
	unsigned short value;


	lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
	lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);

	temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
	temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
					LVDS_Capability &
					LVDS_Capability &
				(LCDPolarity << 8)) >> 8);
				(LCDPolarity << 8)) >> 8);
@@ -6414,201 +6414,11 @@ static void XGI_SetXG21LVDSPara(unsigned short ModeNo,
	/* SR30[5] FP HSync polarity */
	/* SR30[5] FP HSync polarity */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
	xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);


	if (chip_id == XG27)
		XGI_SetXG27FPBits(pVBInfo);
	else
		XGI_SetXG21FPBits(pVBInfo);
		XGI_SetXG21FPBits(pVBInfo);
	resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
	if (ModeNo <= 0x13) {
		xres = pVBInfo->StResInfo[resindex].HTotal;
		yres = pVBInfo->StResInfo[resindex].VTotal;
		/* si+St_ResInfo */
		modeflag = pVBInfo->SModeIDTable[ModeIdIndex].St_ModeFlag;
	} else {
		xres = pVBInfo->ModeResInfo[resindex].HTotal; /* xres->ax */
		yres = pVBInfo->ModeResInfo[resindex].VTotal; /* yres->bx */
		/* si+St_ModeFlag */
		modeflag = pVBInfo->EModeIDTable[ModeIdIndex].Ext_ModeFlag;
	}

	if (!(modeflag & Charx8Dot))
		xres = xres * 8 / 9;

	LVDSHT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHT;

	LVDSHBS = xres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE
			- xres) / 2;
	if ((ModeNo <= 0x13) && (modeflag & HalfDCLK))
		LVDSHBS -= xres / 4;


	if (LVDSHBS > LVDSHT)
		LVDSHBS -= LVDSHT;

	LVDSHRS = LVDSHBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHFP;
	if (LVDSHRS > LVDSHT)
		LVDSHRS -= LVDSHT;

	LVDSHRE = LVDSHRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHSYNC;
	if (LVDSHRE > LVDSHT)
		LVDSHRE -= LVDSHT;

	LVDSHBE = LVDSHBS + LVDSHT
			- pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSHDE;

	LVDSVT = pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVT;

	LVDSVBS = yres + (pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE
			- yres) / 2;
	if ((ModeNo > 0x13) && (modeflag & DoubleScanMode))
		LVDSVBS += yres / 2;

	if (LVDSVBS > LVDSVT)
		LVDSVBS -= LVDSVT;

	LVDSVRS = LVDSVBS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVFP;
	if (LVDSVRS > LVDSVT)
		LVDSVRS -= LVDSVT;

	LVDSVRE = LVDSVRS + pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVSYNC;
	if (LVDSVRE > LVDSVT)
		LVDSVRE -= LVDSVT;

	LVDSVBE = LVDSVBS + LVDSVT
			- pVBInfo->XG21_LVDSCapList[lvdstableindex].LVDSVDE;

	temp = (unsigned char) xgifb_reg_get(pVBInfo->P3d4, 0x11);
	xgifb_reg_set(pVBInfo->P3d4, 0x11, temp & 0x7f); /* Unlock CRTC */

	if (!(modeflag & Charx8Dot))
		xgifb_reg_or(pVBInfo->P3c4, 0x1, 0x1);

	/* HT SR0B[1:0] CR00 */
	value = (LVDSHT >> 3) - 5;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x03, (value & 0x300) >> 8);
	xgifb_reg_set(pVBInfo->P3d4, 0x0, (value & 0xFF));

	/* HBS SR0B[5:4] CR02 */
	value = (LVDSHBS >> 3) - 1;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0x30, (value & 0x300) >> 4);
	xgifb_reg_set(pVBInfo->P3d4, 0x2, (value & 0xFF));

	/* HBE SR0C[1:0] CR05[7] CR03[4:0] */
	value = (LVDSHBE >> 3) - 1;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x03, (value & 0xC0) >> 6);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x80, (value & 0x20) << 2);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x03, ~0x1F, value & 0x1F);

	/* HRS SR0B[7:6] CR04 */
	value = (LVDSHRS >> 3) + 2;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0B, ~0xC0, (value & 0x300) >> 2);
	xgifb_reg_set(pVBInfo->P3d4, 0x4, (value & 0xFF));

	/* Panel HRS SR2F[1:0] SR2E[7:0]  */
	value--;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0x03, (value & 0x300) >> 8);
	xgifb_reg_set(pVBInfo->P3c4, 0x2E, (value & 0xFF));

	/* HRE SR0C[2] CR05[4:0] */
	value = (LVDSHRE >> 3) + 2;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0C, ~0x04, (value & 0x20) >> 3);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x05, ~0x1F, value & 0x1F);

	/* Panel HRE SR2F[7:2]  */
	value--;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x2F, ~0xFC, value << 2);

	/* VT SR0A[0] CR07[5][0] CR06 */
	value = LVDSVT - 2;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x01, (value & 0x400) >> 10);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x20, (value & 0x200) >> 4);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x01, (value & 0x100) >> 8);
	xgifb_reg_set(pVBInfo->P3d4, 0x06, (value & 0xFF));

	/* VBS SR0A[2] CR09[5] CR07[3] CR15 */
	value = LVDSVBS - 1;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x04, (value & 0x400) >> 8);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x09, ~0x20, (value & 0x200) >> 4);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x08, (value & 0x100) >> 5);
	xgifb_reg_set(pVBInfo->P3d4, 0x15, (value & 0xFF));

	/* VBE SR0A[4] CR16 */
	value = LVDSVBE - 1;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x10, (value & 0x100) >> 4);
	xgifb_reg_set(pVBInfo->P3d4, 0x16, (value & 0xFF));

	/* VRS SR0A[3] CR7[7][2] CR10 */
	value = LVDSVRS - 1;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x08, (value & 0x400) >> 7);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x80, (value & 0x200) >> 2);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
	xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));

	/* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03, (value & 0x600) >> 9);
	xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);

	/* VRE SR0A[5] CR11[3:0] */
	value = LVDSVRE - 1;
	xgifb_reg_and_or(pVBInfo->P3c4, 0x0A, ~0x20, (value & 0x10) << 1);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);

	/* Panel VRE SR3F[7:2] *//* SR3F[7] has to be 0, h/w bug */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0x7C);

	for (temp = 0, value = 0; temp < 3; temp++) {

		xgifb_reg_and_or(pVBInfo->P3c4, 0x31, ~0x30, value);
		xgifb_reg_set(pVBInfo->P3c4,
			      0x2B,
			      pVBInfo->XG21_LVDSCapList[lvdstableindex].
						VCLKData1);
		xgifb_reg_set(pVBInfo->P3c4,
			      0x2C,
			      pVBInfo->XG21_LVDSCapList[lvdstableindex].
						VCLKData2);
		value += 0x10;
	}

	if (!(modeflag & Charx8Dot)) {
		inb(pVBInfo->P3da); /* reset 3da */
		outb(0x13, pVBInfo->P3c0); /* set index */
		/* set data, panning = 0, shift left 1 dot*/
		outb(0x00, pVBInfo->P3c0);

		inb(pVBInfo->P3da); /* Enable Attribute */
		outb(0x20, pVBInfo->P3c0);

		inb(pVBInfo->P3da); /* reset 3da */
	}

}

/* no shadow case */
static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
				unsigned short ModeIdIndex,
				struct vb_device_info *pVBInfo)
{
	unsigned char temp, Miscdata;
	unsigned short xres, yres, modeflag, resindex, lvdstableindex;
	unsigned short LVDSHT, LVDSHBS, LVDSHRS, LVDSHRE, LVDSHBE;
	unsigned short LVDSVT, LVDSVBS, LVDSVRS, LVDSVRE, LVDSVBE;
	unsigned short value;

	lvdstableindex = XGI_GetLVDSOEMTableIndex(pVBInfo);
	temp = (unsigned char) ((pVBInfo->XG21_LVDSCapList[lvdstableindex].
					LVDS_Capability &
				(LCDPolarity << 8)) >> 8);
	temp &= LCDPolarity;
	Miscdata = (unsigned char) inb(pVBInfo->P3cc);

	outb((Miscdata & 0x3F) | temp, pVBInfo->P3c2);

	temp = (unsigned char) (pVBInfo->XG21_LVDSCapList[lvdstableindex].
					LVDS_Capability & LCDPolarity);
	/* SR35[7] FP VSync polarity */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x80, temp & 0x80);
	/* SR30[5] FP HSync polarity */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);

	XGI_SetXG27FPBits(pVBInfo);
	resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
	resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
	if (ModeNo <= 0x13) {
	if (ModeNo <= 0x13) {
		xres = pVBInfo->StResInfo[resindex].HTotal;
		xres = pVBInfo->StResInfo[resindex].HTotal;
@@ -6735,9 +6545,18 @@ static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x07, ~0x04, (value & 0x100) >> 6);
	xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
	xgifb_reg_set(pVBInfo->P3d4, 0x10, (value & 0xFF));


	if (chip_id == XG27) {
		/* Panel VRS SR35[2:0] SR34[7:0] */
		/* Panel VRS SR35[2:0] SR34[7:0] */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, (value & 0x700) >> 8);
		xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
					(value & 0x700) >> 8);
		xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
		xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
	} else {
		/* Panel VRS SR3F[1:0] SR34[7:0] SR33[0] */
		xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0x03,
					(value & 0x600) >> 9);
		xgifb_reg_set(pVBInfo->P3c4, 0x34, (value >> 1) & 0xFF);
		xgifb_reg_and_or(pVBInfo->P3d4, 0x33, ~0x01, value & 0x01);
	}


	/* VRE SR0A[5] CR11[3:0] */
	/* VRE SR0A[5] CR11[3:0] */
	value = LVDSVRE - 1;
	value = LVDSVRE - 1;
@@ -6745,7 +6564,13 @@ static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
	xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
	xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);


	/* Panel VRE SR3F[7:2] */
	/* Panel VRE SR3F[7:2] */
	xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC, (value << 2) & 0xFC);
	if (chip_id == XG27)
		xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
					(value << 2) & 0xFC);
	else
		/* SR3F[7] has to be 0, h/w bug */
		xgifb_reg_and_or(pVBInfo->P3c4, 0x3F, ~0xFC,
					(value << 2) & 0x7C);


	for (temp = 0, value = 0; temp < 3; temp++) {
	for (temp = 0, value = 0; temp < 3; temp++) {


@@ -8237,14 +8062,9 @@ static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
			xgifb_set_lcd(HwDeviceExtension->jChipType,
			xgifb_set_lcd(HwDeviceExtension->jChipType,
					pVBInfo, RefreshRateTableIndex, ModeNo);
					pVBInfo, RefreshRateTableIndex, ModeNo);


			if (pVBInfo->IF_DEF_LVDS == 1) {
			if (pVBInfo->IF_DEF_LVDS == 1)
				if (HwDeviceExtension->jChipType == XG27)
				xgifb_set_lvds(HwDeviceExtension->jChipType,
					XGI_SetXG27LVDSPara(ModeNo,
						ModeNo, ModeIdIndex, pVBInfo);
							ModeIdIndex, pVBInfo);
				else
					XGI_SetXG21LVDSPara(ModeNo,
							ModeIdIndex, pVBInfo);
			}
			/* P. ON */
			/* P. ON */
			/* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
			/* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
		}
		}