staging: xgifb: refactor XGI_SetXG21LVDSPara() and XGI_SetXG27LVDSPara()
authorAaro Koskinen <aaro.koskinen@iki.fi>
Wed, 31 Aug 2011 18:46:01 +0000 (21:46 +0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 6 Sep 2011 18:42:09 +0000 (11:42 -0700)
The code is almost the same for XG21 and XG27, a single routine can
cover both.

Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/xgifb/vb_setmode.c

index 9b2871e..cbba662 100644 (file)
@@ -6387,204 +6387,10 @@ void XGI_SetXG27FPBits(struct vb_device_info *pVBInfo)
 
 }
 
-static void XGI_SetXG21LVDSPara(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_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)
+static void xgifb_set_lvds(int chip_id,
+                          unsigned short ModeNo,
+                          unsigned short ModeIdIndex,
+                          struct vb_device_info *pVBInfo)
 {
        unsigned char temp, Miscdata;
        unsigned short xres, yres, modeflag, resindex, lvdstableindex;
@@ -6608,7 +6414,11 @@ static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
        /* SR30[5] FP HSync polarity */
        xgifb_reg_and_or(pVBInfo->P3c4, 0x30, ~0x20, (temp & 0x40) >> 1);
 
-       XGI_SetXG27FPBits(pVBInfo);
+       if (chip_id == XG27)
+               XGI_SetXG27FPBits(pVBInfo);
+       else
+               XGI_SetXG21FPBits(pVBInfo);
+
        resindex = XGI_GetResInfo(ModeNo, ModeIdIndex, pVBInfo);
        if (ModeNo <= 0x13) {
                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_set(pVBInfo->P3d4, 0x10, (value & 0xFF));
 
-       /* Panel VRS SR35[2:0] SR34[7:0] */
-       xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07, (value & 0x700) >> 8);
-       xgifb_reg_set(pVBInfo->P3c4, 0x34, value & 0xFF);
+       if (chip_id == XG27) {
+               /* Panel VRS SR35[2:0] SR34[7:0] */
+               xgifb_reg_and_or(pVBInfo->P3c4, 0x35, ~0x07,
+                                       (value & 0x700) >> 8);
+               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] */
        value = LVDSVRE - 1;
@@ -6745,7 +6564,13 @@ static void XGI_SetXG27LVDSPara(unsigned short ModeNo,
        xgifb_reg_and_or(pVBInfo->P3d4, 0x11, ~0x0F, value & 0x0F);
 
        /* 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++) {
 
@@ -8237,14 +8062,9 @@ static void XGI_SetCRT1Group(struct xgi_hw_device_info *HwDeviceExtension,
                        xgifb_set_lcd(HwDeviceExtension->jChipType,
                                        pVBInfo, RefreshRateTableIndex, ModeNo);
 
-                       if (pVBInfo->IF_DEF_LVDS == 1) {
-                               if (HwDeviceExtension->jChipType == XG27)
-                                       XGI_SetXG27LVDSPara(ModeNo,
-                                                       ModeIdIndex, pVBInfo);
-                               else
-                                       XGI_SetXG21LVDSPara(ModeNo,
-                                                       ModeIdIndex, pVBInfo);
-                       }
+                       if (pVBInfo->IF_DEF_LVDS == 1)
+                               xgifb_set_lvds(HwDeviceExtension->jChipType,
+                                               ModeNo, ModeIdIndex, pVBInfo);
                        /* P. ON */
                        /* xgifb_reg_or(pVBInfo->P3d4, 0x48, 0x20); */
                }