OSDN Git Service

staging: xgifb: enable forcecrt2type on XG21
authorAaro Koskinen <aaro.koskinen@iki.fi>
Mon, 5 Dec 2011 22:10:48 +0000 (00:10 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 8 Dec 2011 20:26:08 +0000 (12:26 -0800)
Make "forcecrt2type" to apply also for XG21. The patch enables user to
switch LVDS LCD ON/OFF without the need to update the video BIOS.

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

index 5c76ee7..b07c477 100644 (file)
@@ -1744,17 +1744,16 @@ static void XGIfb_detect_VB(struct xgifb_video_info *xgifb_info)
                        XGIfb_crt1off = 0;
        }
 
-       if (XGIfb_crt2type != -1)
-               /* TW: Override with option */
-               xgifb_info->display2 = XGIfb_crt2type;
-       else if (cr32 & XGI_VB_TV)
-               xgifb_info->display2 = XGIFB_DISP_TV;
-       else if (cr32 & XGI_VB_LCD)
-               xgifb_info->display2 = XGIFB_DISP_LCD;
-       else if (cr32 & XGI_VB_CRT2)
-               xgifb_info->display2 = XGIFB_DISP_CRT;
-       else
-               xgifb_info->display2 = XGIFB_DISP_NONE;
+       if (!xgifb_info->display2_force) {
+               if (cr32 & XGI_VB_TV)
+                       xgifb_info->display2 = XGIFB_DISP_TV;
+               else if (cr32 & XGI_VB_LCD)
+                       xgifb_info->display2 = XGIFB_DISP_LCD;
+               else if (cr32 & XGI_VB_CRT2)
+                       xgifb_info->display2 = XGIFB_DISP_CRT;
+               else
+                       xgifb_info->display2 = XGIFB_DISP_NONE;
+       }
 
        if (XGIfb_tvplug != -1)
                /* PR/TW: Override with option */
@@ -1926,6 +1925,11 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
                goto error;
        }
 
+       if (XGIfb_crt2type != -1) {
+               xgifb_info->display2 = XGIfb_crt2type;
+               xgifb_info->display2_force = true;
+       }
+
        XGIRegInit(&xgifb_info->dev_info, (unsigned long)hw_info->pjIOAddress);
 
        xgifb_reg_set(XGISR, IND_XGI_PASSWORD, XGI_PASSWORD);
@@ -2104,6 +2108,8 @@ static int __devinit xgifb_probe(struct pci_dev *pdev,
 
        if (xgifb_info->hasVB != HASVB_NONE)
                XGIfb_detect_VB(xgifb_info);
+       else if (xgifb_info->chip != XG21)
+               xgifb_info->display2 = XGIFB_DISP_NONE;
 
        if (xgifb_info->display2 == XGIFB_DISP_LCD) {
                if (!enable_dstn) {
index 67a21a8..2c866bb 100644 (file)
@@ -86,6 +86,7 @@ struct xgifb_video_info {
        unsigned int refresh_rate;
 
        enum xgifb_display_type display2; /* the second display output type */
+       bool display2_force;
        unsigned char hasVB;
        unsigned char TV_type;
        unsigned char TV_plug;
index a2fa10c..4ccd988 100644 (file)
@@ -1136,7 +1136,13 @@ static void xgifb_read_vbios(struct pci_dev *pdev,
        }
        if (vbios_size <= 0x65)
                goto error;
-       if (!(vbios[0x65] & 0x1)) {
+       /*
+        * The user can ignore the LVDS bit in the BIOS and force the display
+        * type.
+        */
+       if (!(vbios[0x65] & 0x1) &&
+           (!xgifb_info->display2_force ||
+            xgifb_info->display2 != XGIFB_DISP_LCD)) {
                vfree(vbios);
                return;
        }