af87d30
diff --git a/configure.ac b/configure.ac
af87d30
index 5f18d2b..5216eff 100644
af87d30
--- a/configure.ac
af87d30
+++ b/configure.ac
af87d30
@@ -79,7 +79,7 @@ sdkdir=$(pkg-config --variable=sdkdir xorg-server)
af87d30
 # Checks for header files.
af87d30
 AC_HEADER_STDC
af87d30
 
af87d30
-if test "$DRI" != no; then
af87d30
+if test "x$DRI" = xauto; then
af87d30
 	AC_CHECK_FILE([${sdkdir}/dri.h],
af87d30
                       [have_dri_h="yes"], [have_dri_h="no"])
af87d30
 	AC_CHECK_FILE([${sdkdir}/sarea.h],
af87d30
diff --git a/man/radeon.man b/man/radeon.man
af87d30
index 35dd701..9168254 100644
af87d30
--- a/man/radeon.man
af87d30
+++ b/man/radeon.man
af87d30
@@ -383,6 +383,14 @@ case.  This is only useful for LVDS panels (laptop internal panels).
af87d30
 The default is
af87d30
 .B on.
af87d30
 .TP
af87d30
+.BI "Option \*qLVDSBiosNativeMode\*q \*q" boolean \*q
af87d30
+On some laptops, the LVDS mode from the timing tables in the bios does 
af87d30
+not work properly.  In those cases, a CVT mode seems to work better.  
af87d30
+If you get a blank screen or have LVDS display problems, disable this 
af87d30
+option to use a CVT mode.  
af87d30
+The default is
af87d30
+.B on.
af87d30
+.TP
af87d30
 .BI "Option \*qDRI\*q \*q" boolean \*q
af87d30
 Enable DRI support.  This option allows you to enable to disable the DRI.  
af87d30
 The default is
af87d30
diff --git a/src/Makefile.am b/src/Makefile.am
af87d30
index 1eea432..ff1e225 100644
af87d30
--- a/src/Makefile.am
af87d30
+++ b/src/Makefile.am
af87d30
@@ -66,6 +66,17 @@ atimisc_drv_la_SOURCES = \
af87d30
 	atiload.c atimisc.c atimach64probe.c $(ATIMISC_CPIO_SOURCES) \
af87d30
 	$(ATIMISC_DGA_SOURCES) $(ATIMISC_DRI_SRCS) $(ATIMISC_EXA_SOURCES)
af87d30
 
af87d30
+if XSERVER_LIBPCIACCESS
af87d30
+# r128 has not been ported yet
af87d30
+else
af87d30
+r128_drv_la_LTLIBRARIES = r128_drv.la
af87d30
+r128_drv_la_LDFLAGS = -module -avoid-version
af87d30
+r128_drv_ladir = @moduledir@/drivers
af87d30
+r128_drv_la_SOURCES = \
af87d30
+	r128_accel.c r128_cursor.c r128_dga.c r128_driver.c \
af87d30
+	r128_video.c r128_misc.c r128_probe.c $(R128_DRI_SRCS)
af87d30
+endif
af87d30
+
af87d30
 radeon_drv_la_LTLIBRARIES = radeon_drv.la
af87d30
 radeon_drv_la_LDFLAGS = -module -avoid-version
af87d30
 radeon_drv_ladir = @moduledir@/drivers
af87d30
@@ -76,16 +87,6 @@ radeon_drv_la_SOURCES = \
af87d30
 	radeon_crtc.c radeon_output.c radeon_modes.c radeon_tv.c \
af87d30
 	$(RADEON_DRI_SRCS) $(RADEON_EXA_SOURCES)
af87d30
 
af87d30
-if XSERVER_LIBPCIACCESS
af87d30
-# r128 and theatre have not been ported yet
af87d30
-else
af87d30
-r128_drv_la_LTLIBRARIES = r128_drv.la
af87d30
-r128_drv_la_LDFLAGS = -module -avoid-version
af87d30
-r128_drv_ladir = @moduledir@/drivers
af87d30
-r128_drv_la_SOURCES = \
af87d30
-	r128_accel.c r128_cursor.c r128_dga.c r128_driver.c \
af87d30
-	r128_video.c r128_misc.c r128_probe.c $(R128_DRI_SRCS)
af87d30
-
af87d30
 theatre_detect_drv_la_LTLIBRARIES = theatre_detect_drv.la
af87d30
 theatre_detect_drv_la_LDFLAGS = -module -avoid-version
af87d30
 theatre_detect_drv_ladir = @moduledir@/multimedia
af87d30
@@ -106,7 +107,6 @@ theatre200_drv_la_CFLAGS = \
af87d30
 	$(AM_CFLAGS) -DMICROC_DIR=\"$(theatre200_drv_ladir)\"
af87d30
 theatre200_drv_la_SOURCES = \
af87d30
 	theatre200.c theatre200_module.c
af87d30
-endif
af87d30
 
af87d30
 EXTRA_DIST = \
af87d30
 	atimach64render.c \
af87d30
diff --git a/src/atiprint.c b/src/atiprint.c
af87d30
index 60d9c21..3a1debb 100644
af87d30
--- a/src/atiprint.c
af87d30
+++ b/src/atiprint.c
af87d30
@@ -26,6 +26,7 @@
af87d30
 
af87d30
 #include <string.h>
af87d30
 #include <ctype.h>
af87d30
+#include <stdint.h>
af87d30
 
af87d30
 #include "ati.h"
af87d30
 #include "atichip.h"
af87d30
diff --git a/src/atiprobe.c b/src/atiprobe.c
af87d30
index 78b3edd..38ce90d 100644
af87d30
--- a/src/atiprobe.c
af87d30
+++ b/src/atiprobe.c
af87d30
@@ -26,6 +26,7 @@
af87d30
 
af87d30
 #include <string.h>
af87d30
 #include <stdio.h>
af87d30
+#include <stdint.h>
af87d30
 
af87d30
 #include "ati.h"
af87d30
 #include "atibus.h"
af87d30
diff --git a/src/radeon.h b/src/radeon.h
af87d30
index ad94cc5..6ee43b2 100644
af87d30
--- a/src/radeon.h
af87d30
+++ b/src/radeon.h
af87d30
@@ -157,7 +157,8 @@ typedef enum {
af87d30
 #if defined(__powerpc__)
af87d30
     OPTION_MAC_MODEL,
af87d30
 #endif
af87d30
-    OPTION_DEFAULT_TMDS_PLL
af87d30
+    OPTION_DEFAULT_TMDS_PLL,
af87d30
+    OPTION_LVDS_BIOS_NATIVE_MODE
af87d30
 } RADEONOpts;
af87d30
 
af87d30
 
af87d30
@@ -816,6 +817,8 @@ typedef struct {
af87d30
     RADEONMacModel    MacModel;
af87d30
 #endif
af87d30
 
af87d30
+    Bool              LVDSBiosNativeMode;
af87d30
+
af87d30
     Rotation rotation;
af87d30
     void (*PointerMoved)(int, int, int);
af87d30
     CreateScreenResourcesProcPtr CreateScreenResources;
af87d30
@@ -910,6 +913,8 @@ extern void        RADEONRestoreFP2Registers(ScrnInfoPtr pScrn,
af87d30
 					     RADEONSavePtr restore);
af87d30
 extern void        RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn,
af87d30
 					      RADEONSavePtr restore);
af87d30
+extern void        RADEONRestoreBIOSRegisters(ScrnInfoPtr pScrn,
af87d30
+					      RADEONSavePtr restore);
af87d30
 extern void        RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn,
af87d30
 					     RADEONSavePtr restore);
af87d30
 extern void        RADEONRestorePLLRegisters(ScrnInfoPtr pScrn,
af87d30
diff --git a/src/radeon_bios.c b/src/radeon_bios.c
af87d30
index 65c2bb0..1b46746 100644
af87d30
--- a/src/radeon_bios.c
af87d30
+++ b/src/radeon_bios.c
af87d30
@@ -176,6 +176,9 @@ static Bool RADEONGetATOMConnectorInfoFromBIOS (ScrnInfoPtr pScrn)
af87d30
 		case RADEON_LCD_GPIO_MASK:
af87d30
 		    info->BiosConnector[i].DDCType = DDC_LCD;
af87d30
 		    break;
af87d30
+		case RADEON_MDGPIO_EN_REG:
af87d30
+		    info->BiosConnector[i].DDCType = DDC_GPIO;
af87d30
+		    break;
af87d30
 		default:
af87d30
 		    info->BiosConnector[i].DDCType = DDC_NONE_DETECTED;
af87d30
 		    break;
af87d30
@@ -254,6 +257,23 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn)
af87d30
 		info->BiosConnector[i].DDCType = DDC_MONID;
af87d30
 	    }
af87d30
 
af87d30
+	    /* XPRESS desktop chips seem to have a proprietary connector listed for
af87d30
+	     * DVI-D, try and do the right thing here.
af87d30
+	    */
af87d30
+	    if ((!info->IsMobility) &&
af87d30
+		(info->BiosConnector[i].ConnectorType == CONNECTOR_PROPRIETARY)) {
af87d30
+		xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
af87d30
+			   "Proprietary connector found, assuming DVI-D\n");
af87d30
+		info->BiosConnector[i].DACType = DAC_NONE;
af87d30
+		info->BiosConnector[i].TMDSType = TMDS_EXT;
af87d30
+		info->BiosConnector[i].ConnectorType = CONNECTOR_DVI_D;
af87d30
+	    }
af87d30
+
af87d30
+	    if (info->BiosConnector[i].ConnectorType >= CONNECTOR_UNSUPPORTED) {
af87d30
+		xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown connector type: %d!\n",
af87d30
+			   info->BiosConnector[i].ConnectorType);
af87d30
+		info->BiosConnector[i].valid = FALSE;
af87d30
+	    }
af87d30
 
af87d30
 	}
af87d30
     } else {
af87d30
@@ -277,7 +297,7 @@ static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn)
af87d30
 		    tmp1 = RADEON_BIOS8(tmp0+2) & 0x07;
af87d30
 		    if (tmp1) {	    
af87d30
 			info->BiosConnector[4].DDCType	= tmp1;      
af87d30
-			if (info->BiosConnector[4].DDCType > DDC_LCD) {
af87d30
+			if (info->BiosConnector[4].DDCType > DDC_GPIO) {
af87d30
 			    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
af87d30
 				       "Unknown DDCType %d found\n",
af87d30
 				       info->BiosConnector[4].DDCType);
af87d30
diff --git a/src/radeon_crtc.c b/src/radeon_crtc.c
af87d30
index 47e46f3..eeb1c6c 100644
af87d30
--- a/src/radeon_crtc.c
af87d30
+++ b/src/radeon_crtc.c
af87d30
@@ -311,7 +311,7 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save,
af87d30
 	return FALSE;
af87d30
     }
af87d30
 
af87d30
-    save->bios_4_scratch = info->SavedReg.bios_4_scratch;
af87d30
+    /*save->bios_4_scratch = info->SavedReg.bios_4_scratch;*/
af87d30
     save->crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN
af87d30
 			   | RADEON_CRTC_EN
af87d30
 			   | (format << 8)
af87d30
@@ -348,11 +348,10 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save,
af87d30
 
af87d30
     hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8;
af87d30
     if (!hsync_wid)       hsync_wid = 1;
af87d30
-    if (hsync_wid > 0x3f) hsync_wid = 0x3f;
af87d30
     hsync_start = mode->CrtcHSyncStart - 8;
af87d30
 
af87d30
     save->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
af87d30
-				  | (hsync_wid << 16)
af87d30
+				  | ((hsync_wid & 0x3f) << 16)
af87d30
 				  | ((mode->Flags & V_NHSYNC)
af87d30
 				     ? RADEON_CRTC_H_SYNC_POL
af87d30
 				     : 0));
af87d30
@@ -363,10 +362,9 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save,
af87d30
 
af87d30
     vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart;
af87d30
     if (!vsync_wid)       vsync_wid = 1;
af87d30
-    if (vsync_wid > 0x1f) vsync_wid = 0x1f;
af87d30
 
af87d30
     save->crtc_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff)
af87d30
-				  | (vsync_wid << 16)
af87d30
+				  | ((vsync_wid & 0x1f) << 16)
af87d30
 				  | ((mode->Flags & V_NVSYNC)
af87d30
 				     ? RADEON_CRTC_V_SYNC_POL
af87d30
 				     : 0));
af87d30
@@ -545,11 +543,10 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save,
af87d30
 
af87d30
     hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8;
af87d30
     if (!hsync_wid)       hsync_wid = 1;
af87d30
-    if (hsync_wid > 0x3f) hsync_wid = 0x3f;
af87d30
     hsync_start = mode->CrtcHSyncStart - 8;
af87d30
 
af87d30
     save->crtc2_h_sync_strt_wid = ((hsync_start & 0x1fff)
af87d30
-				   | (hsync_wid << 16)
af87d30
+				   | ((hsync_wid & 0x3f) << 16)
af87d30
 				   | ((mode->Flags & V_NHSYNC)
af87d30
 				      ? RADEON_CRTC_H_SYNC_POL
af87d30
 				      : 0));
af87d30
@@ -560,10 +557,9 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save,
af87d30
 
af87d30
     vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart;
af87d30
     if (!vsync_wid)       vsync_wid = 1;
af87d30
-    if (vsync_wid > 0x1f) vsync_wid = 0x1f;
af87d30
 
af87d30
     save->crtc2_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff)
af87d30
-				   | (vsync_wid << 16)
af87d30
+				   | ((vsync_wid & 0x1f) << 16)
af87d30
 				   | ((mode->Flags & V_NVSYNC)
af87d30
 				      ? RADEON_CRTC2_V_SYNC_POL
af87d30
 				      : 0));
af87d30
@@ -768,6 +764,18 @@ RADEONInitPLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save,
af87d30
 }
af87d30
 
af87d30
 static void
af87d30
+RADEONInitBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
af87d30
+{
af87d30
+    RADEONInfoPtr  info      = RADEONPTR(pScrn);
af87d30
+
af87d30
+    /* tell the bios not to muck with the hardware on events */
af87d30
+    save->bios_4_scratch = 0;
af87d30
+    save->bios_5_scratch = 0xff00;
af87d30
+    save->bios_6_scratch = info->SavedReg.bios_6_scratch | 0x40000000;
af87d30
+
af87d30
+}
af87d30
+
af87d30
+static void
af87d30
 radeon_update_tv_routing(ScrnInfoPtr pScrn, RADEONSavePtr restore)
af87d30
 {
af87d30
     /* pixclks_cntl controls tv clock routing */
af87d30
@@ -813,6 +821,9 @@ radeon_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
af87d30
 	}
af87d30
     }
af87d30
 
af87d30
+    if (info->IsMobility)
af87d30
+	RADEONInitBIOSRegisters(pScrn, &info->ModeReg);
af87d30
+
af87d30
     ErrorF("init memmap\n");
af87d30
     RADEONInitMemMapRegisters(pScrn, &info->ModeReg, info);
af87d30
     ErrorF("init common\n");
af87d30
@@ -868,6 +879,9 @@ radeon_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode,
af87d30
 	}
af87d30
     }
af87d30
 
af87d30
+    if (info->IsMobility)
af87d30
+	RADEONRestoreBIOSRegisters(pScrn, &info->ModeReg);
af87d30
+
af87d30
     ErrorF("restore memmap\n");
af87d30
     RADEONRestoreMemMapRegisters(pScrn, &info->ModeReg);
af87d30
     ErrorF("restore common\n");
af87d30
diff --git a/src/radeon_driver.c b/src/radeon_driver.c
af87d30
index 03f531e..40e1d98 100644
af87d30
--- a/src/radeon_driver.c
af87d30
+++ b/src/radeon_driver.c
af87d30
@@ -190,6 +190,7 @@ static const OptionInfoRec RADEONOptions[] = {
af87d30
 #if defined(__powerpc__)
af87d30
     { OPTION_MAC_MODEL,      "MacModel",         OPTV_STRING,  {0}, FALSE },
af87d30
 #endif
af87d30
+    { OPTION_LVDS_BIOS_NATIVE_MODE, "LVDSBiosNativeMode", OPTV_BOOLEAN, {0}, TRUE },
af87d30
     { -1,                    NULL,               OPTV_NONE,    {0}, FALSE }
af87d30
 };
af87d30
 
af87d30
@@ -4235,14 +4236,27 @@ void RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore)
af87d30
 
af87d30
     if (info->IsMobility) {
af87d30
 	OUTREG(RADEON_LVDS_GEN_CNTL,  restore->lvds_gen_cntl);
af87d30
-	OUTREG(RADEON_LVDS_PLL_CNTL,  restore->lvds_pll_cntl);  
af87d30
-	/*OUTREG(RADEON_BIOS_4_SCRATCH, restore->bios_4_scratch);
af87d30
-	OUTREG(RADEON_BIOS_5_SCRATCH, restore->bios_5_scratch);
af87d30
-	OUTREG(RADEON_BIOS_6_SCRATCH, restore->bios_6_scratch);*/
af87d30
+	OUTREG(RADEON_LVDS_PLL_CNTL,  restore->lvds_pll_cntl);
af87d30
     }
af87d30
 
af87d30
 }
af87d30
 
af87d30
+void RADEONRestoreBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore)
af87d30
+{
af87d30
+    RADEONInfoPtr  info       = RADEONPTR(pScrn);
af87d30
+    unsigned char *RADEONMMIO = info->MMIO;
af87d30
+    CARD32 bios_6_scratch = INREG(RADEON_BIOS_6_SCRATCH);
af87d30
+
af87d30
+    OUTREG(RADEON_BIOS_4_SCRATCH, restore->bios_4_scratch);
af87d30
+    OUTREG(RADEON_BIOS_5_SCRATCH, restore->bios_5_scratch);
af87d30
+    if (restore->bios_6_scratch & 0x40000000)
af87d30
+	bios_6_scratch |= 0x40000000;
af87d30
+    else
af87d30
+	bios_6_scratch &= ~0x40000000;
af87d30
+    OUTREG(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
af87d30
+
af87d30
+}
af87d30
+
af87d30
 /* Write to TV FIFO RAM */
af87d30
 static void RADEONWriteTVFIFO(ScrnInfoPtr pScrn, CARD16 addr,
af87d30
 			      CARD32 value)
af87d30
@@ -5082,6 +5096,16 @@ static void RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
af87d30
 
af87d30
 }
af87d30
 
af87d30
+static void RADEONSaveBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
af87d30
+{
af87d30
+    RADEONInfoPtr  info       = RADEONPTR(pScrn);
af87d30
+    unsigned char *RADEONMMIO = info->MMIO;
af87d30
+
af87d30
+    save->bios_4_scratch       = INREG(RADEON_BIOS_4_SCRATCH);
af87d30
+    save->bios_5_scratch       = INREG(RADEON_BIOS_5_SCRATCH);
af87d30
+    save->bios_6_scratch       = INREG(RADEON_BIOS_6_SCRATCH);
af87d30
+}
af87d30
+
af87d30
 /* Read flat panel registers */
af87d30
 static void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
af87d30
 {
af87d30
@@ -5096,9 +5120,6 @@ static void RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save)
af87d30
     save->lvds_pll_cntl        = INREG(RADEON_LVDS_PLL_CNTL);
af87d30
     save->tmds_pll_cntl        = INREG(RADEON_TMDS_PLL_CNTL);
af87d30
     save->tmds_transmitter_cntl= INREG(RADEON_TMDS_TRANSMITTER_CNTL);
af87d30
-    save->bios_4_scratch       = INREG(RADEON_BIOS_4_SCRATCH);
af87d30
-    save->bios_5_scratch       = INREG(RADEON_BIOS_5_SCRATCH);
af87d30
-    save->bios_6_scratch       = INREG(RADEON_BIOS_6_SCRATCH);
af87d30
 
af87d30
     if (info->ChipFamily == CHIP_FAMILY_RV280) {
af87d30
 	/* bit 22 of TMDS_PLL_CNTL is read-back inverted */
af87d30
@@ -5325,7 +5346,7 @@ static void RADEONSave(ScrnInfoPtr pScrn)
af87d30
 	vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE); /* Save mode only */
af87d30
 # else
af87d30
 	/* Save mode * & fonts & cmap */
af87d30
-	vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS);
af87d30
+	vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL);
af87d30
 # endif
af87d30
 	vgaHWLock(hwp);
af87d30
     }
af87d30
@@ -5340,6 +5361,7 @@ static void RADEONSave(ScrnInfoPtr pScrn)
af87d30
     RADEONSavePLLRegisters(pScrn, save);
af87d30
     RADEONSaveCrtcRegisters(pScrn, save);
af87d30
     RADEONSaveFPRegisters(pScrn, save);
af87d30
+    RADEONSaveBIOSRegisters(pScrn, save);
af87d30
     RADEONSaveDACRegisters(pScrn, save);
af87d30
     if (pRADEONEnt->HasCRTC2) {
af87d30
 	RADEONSaveCrtc2Registers(pScrn, save);
af87d30
@@ -5386,6 +5408,7 @@ void RADEONRestore(ScrnInfoPtr pScrn)
af87d30
 	RADEONRestorePLL2Registers(pScrn, restore);
af87d30
     }
af87d30
 
af87d30
+    RADEONRestoreBIOSRegisters(pScrn, restore);
af87d30
     RADEONRestoreCrtcRegisters(pScrn, restore);
af87d30
     RADEONRestorePLLRegisters(pScrn, restore);
af87d30
     RADEONRestoreRMXRegisters(pScrn, restore);
af87d30
@@ -5417,7 +5440,7 @@ void RADEONRestore(ScrnInfoPtr pScrn)
af87d30
 	*/
af87d30
        vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE );
af87d30
 # else
af87d30
-       vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE | VGA_SR_FONTS );
af87d30
+       vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_ALL );
af87d30
 # endif
af87d30
        vgaHWLock(hwp);
af87d30
     }
af87d30
diff --git a/src/radeon_modes.c b/src/radeon_modes.c
af87d30
index ea2c229..e01c1e1 100644
af87d30
--- a/src/radeon_modes.c
af87d30
+++ b/src/radeon_modes.c
af87d30
@@ -95,20 +95,45 @@ static DisplayModePtr RADEONTVModes(xf86OutputPtr output)
af87d30
 static DisplayModePtr RADEONFPNativeMode(xf86OutputPtr output)
af87d30
 {
af87d30
     ScrnInfoPtr pScrn = output->scrn;
af87d30
+    RADEONInfoPtr info = RADEONPTR(pScrn);
af87d30
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
af87d30
     DisplayModePtr  new   = NULL;
af87d30
+    char            stmp[32];
af87d30
 
af87d30
     if (radeon_output->PanelXRes != 0 &&
af87d30
 	radeon_output->PanelYRes != 0 &&
af87d30
 	radeon_output->DotClock != 0) {
af87d30
 
af87d30
-	/* Add native panel size */
af87d30
-	new = xf86CVTMode(radeon_output->PanelXRes, radeon_output->PanelYRes, 60.0, TRUE, FALSE);
af87d30
+	if (info->LVDSBiosNativeMode) {
af87d30
+	    new             = xnfcalloc(1, sizeof (DisplayModeRec));
af87d30
+	    sprintf(stmp, "%dx%d", radeon_output->PanelXRes, radeon_output->PanelYRes);
af87d30
+	    new->name       = xnfalloc(strlen(stmp) + 1);
af87d30
+	    strcpy(new->name, stmp);
af87d30
+	    new->HDisplay   = radeon_output->PanelXRes;
af87d30
+	    new->VDisplay   = radeon_output->PanelYRes;
af87d30
 
af87d30
-	new->type       = M_T_DRIVER | M_T_PREFERRED;
af87d30
+	    new->HTotal     = new->HDisplay + radeon_output->HBlank;
af87d30
+	    new->HSyncStart = new->HDisplay + radeon_output->HOverPlus;
af87d30
+	    new->HSyncEnd   = new->HSyncStart + radeon_output->HSyncWidth;
af87d30
+	    new->VTotal     = new->VDisplay + radeon_output->VBlank;
af87d30
+	    new->VSyncStart = new->VDisplay + radeon_output->VOverPlus;
af87d30
+	    new->VSyncEnd   = new->VSyncStart + radeon_output->VSyncWidth;
af87d30
 
af87d30
-	new->next       = NULL;
af87d30
-	new->prev       = NULL;
af87d30
+	    new->Clock      = radeon_output->DotClock;
af87d30
+	    new->Flags      = 0;
af87d30
+
af87d30
+	} else {
af87d30
+	    /* Add native panel size */
af87d30
+	    new = xf86CVTMode(radeon_output->PanelXRes, radeon_output->PanelYRes, 60.0, FALSE, FALSE);
af87d30
+
af87d30
+	}
af87d30
+
af87d30
+	if (new) {
af87d30
+	    new->type       = M_T_DRIVER | M_T_PREFERRED;
af87d30
+
af87d30
+	    new->next       = NULL;
af87d30
+	    new->prev       = NULL;
af87d30
+	}
af87d30
 
af87d30
 	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode: %dx%d\n",
af87d30
 		   radeon_output->PanelXRes, radeon_output->PanelYRes);
af87d30
@@ -159,7 +184,7 @@ static void RADEONAddScreenModes(xf86OutputPtr output, DisplayModePtr *modeList)
af87d30
 	    }
af87d30
 	}
af87d30
 
af87d30
-	new = xf86CVTMode(width, height, 60.0, TRUE, FALSE);
af87d30
+	new = xf86CVTMode(width, height, 60.0, FALSE, FALSE);
af87d30
 
af87d30
 	new->type      |= M_T_USERDEF;
af87d30
 
af87d30
@@ -199,11 +224,13 @@ RADEONProbeOutputModes(xf86OutputPtr output)
af87d30
 
af87d30
     if (output->status == XF86OutputStatusConnected) {
af87d30
 	if (radeon_output->type == OUTPUT_DVI || radeon_output->type == OUTPUT_VGA) {
af87d30
-	    edid_mon = xf86OutputGetEDID (output, radeon_output->pI2CBus);
af87d30
-	    xf86OutputSetEDID (output, edid_mon);
af87d30
+	    if (output->MonInfo) {
af87d30
+		edid_mon = xf86OutputGetEDID (output, radeon_output->pI2CBus);
af87d30
+		xf86OutputSetEDID (output, edid_mon);
af87d30
 
af87d30
-	    modes = xf86OutputGetEDIDModes (output);
af87d30
-	    return modes;
af87d30
+		modes = xf86OutputGetEDIDModes (output);
af87d30
+		return modes;
af87d30
+	    }
af87d30
 	}
af87d30
 	if (radeon_output->type == OUTPUT_STV || radeon_output->type == OUTPUT_CTV) {
af87d30
 	    modes = RADEONTVModes(output);
af87d30
diff --git a/src/radeon_output.c b/src/radeon_output.c
af87d30
index a6da78e..e2f26e7 100644
af87d30
--- a/src/radeon_output.c
af87d30
+++ b/src/radeon_output.c
af87d30
@@ -75,13 +75,14 @@ const char *TMDSTypeName[4] = {
af87d30
   "None"
af87d30
 };
af87d30
 
af87d30
-const char *DDCTypeName[6] = {
af87d30
+const char *DDCTypeName[7] = {
af87d30
   "None",
af87d30
   "MONID",
af87d30
   "DVI_DDC",
af87d30
   "VGA_DDC",
af87d30
   "CRT2_DDC",
af87d30
-  "LCD_DDC"
af87d30
+  "LCD_DDC",
af87d30
+  "GPIO_DDC"
af87d30
 };
af87d30
 
af87d30
 const char *DACTypeName[4] = {
af87d30
@@ -277,7 +278,7 @@ RADEONDisplayDDCConnected(ScrnInfoPtr pScrn, xf86OutputPtr output)
af87d30
     DDCReg = radeon_output->DDCReg;
af87d30
 
af87d30
     /* Read and output monitor info using DDC2 over I2C bus */
af87d30
-    if (radeon_output->pI2CBus && info->ddc2 && (DDCReg != RADEON_LCD_GPIO_MASK)) {
af87d30
+    if (radeon_output->pI2CBus && info->ddc2 && (DDCReg != RADEON_LCD_GPIO_MASK) && (DDCReg != RADEON_MDGPIO_EN_REG)) {
af87d30
 	OUTREG(DDCReg, INREG(DDCReg) &
af87d30
 	       (CARD32)~(RADEON_GPIO_A_0 | RADEON_GPIO_A_1));
af87d30
 
af87d30
@@ -331,7 +332,7 @@ RADEONDisplayDDCConnected(ScrnInfoPtr pScrn, xf86OutputPtr output)
af87d30
 	    usleep(15000);
af87d30
 	    if(*MonInfo)  break;
af87d30
 	}
af87d30
-    } else if (radeon_output->pI2CBus && info->ddc2 && DDCReg == RADEON_LCD_GPIO_MASK) {
af87d30
+    } else if (radeon_output->pI2CBus && info->ddc2 && ((DDCReg == RADEON_LCD_GPIO_MASK) || (DDCReg == RADEON_MDGPIO_EN_REG))) {
af87d30
          *MonInfo = xf86DoEDID_DDC2(pScrn->scrnIndex, radeon_output->pI2CBus);
af87d30
     } else {
af87d30
 	xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DDC2/I2C is not properly initialized\n");
af87d30
@@ -669,9 +670,19 @@ static RADEONMonitorType RADEONPortCheckNonDDC(ScrnInfoPtr pScrn, xf86OutputPtr
af87d30
     RADEONOutputPrivatePtr radeon_output = output->driver_private;
af87d30
     RADEONMonitorType MonType = MT_NONE;
af87d30
 
af87d30
-
af87d30
     if (radeon_output->type == OUTPUT_LVDS) {
af87d30
-	    MonType =  MT_LCD;
af87d30
+#if defined(__powerpc__)
af87d30
+	/* not sure on ppc, OF? */
af87d30
+#else
af87d30
+	if (!info->IsAtomBios) {
af87d30
+	    /* see if the lid is closed -- only works at boot */
af87d30
+	    if (INREG(RADEON_BIOS_6_SCRATCH) & 0x10)
af87d30
+		MonType = MT_NONE;
af87d30
+	    else
af87d30
+		MonType = MT_LCD;
af87d30
+	} else
af87d30
+#endif
af87d30
+	    MonType = MT_LCD;
af87d30
     } else if (radeon_output->type == OUTPUT_DVI) {
af87d30
 	if (radeon_output->TMDSType == TMDS_INT) {
af87d30
 	    if (INREG(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE)
af87d30
@@ -765,10 +776,14 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
af87d30
 	}
af87d30
     }
af87d30
 
af87d30
-    /* update clock for LVDS always and DFP if RMX is active */
af87d30
-    if ((radeon_output->MonType == MT_LCD) ||
af87d30
-	((radeon_output->MonType == MT_DFP) &&
af87d30
-	 (radeon_output->Flags & RADEON_USE_RMX))) {
af87d30
+    /* update timing for LVDS and DFP if RMX is active */
af87d30
+    if (radeon_output->Flags & RADEON_USE_RMX) {
af87d30
+	adjusted_mode->CrtcHTotal     = mode->CrtcHDisplay + radeon_output->HBlank;
af87d30
+	adjusted_mode->CrtcHSyncStart = mode->CrtcHDisplay + radeon_output->HOverPlus;
af87d30
+	adjusted_mode->CrtcHSyncEnd   = mode->CrtcHSyncStart + radeon_output->HSyncWidth;
af87d30
+	adjusted_mode->CrtcVTotal     = mode->CrtcVDisplay + radeon_output->VBlank;
af87d30
+	adjusted_mode->CrtcVSyncStart = mode->CrtcVDisplay + radeon_output->VOverPlus;
af87d30
+	adjusted_mode->CrtcVSyncEnd   = mode->CrtcVSyncStart + radeon_output->VSyncWidth;
af87d30
 	adjusted_mode->Clock          = radeon_output->DotClock;
af87d30
 	adjusted_mode->Flags          = radeon_output->Flags;
af87d30
     }
af87d30
@@ -1636,6 +1651,16 @@ radeon_detect(xf86OutputPtr output)
af87d30
 	  break;
af87d30
       }
af87d30
 
af87d30
+      if (!connected) {
af87d30
+	  /* default to unknown for flaky chips/connectors
af87d30
+	   * so we can get something on the screen
af87d30
+	   */
af87d30
+	  if (((radeon_output->type == OUTPUT_VGA || radeon_output->type == OUTPUT_DVI) &&
af87d30
+	       radeon_output->DACType == DAC_TVDAC) ||
af87d30
+	      (info->IsIGP && radeon_output->type == OUTPUT_DVI))
af87d30
+	      return XF86OutputStatusUnknown;
af87d30
+      }
af87d30
+
af87d30
       if (connected)
af87d30
 	  return XF86OutputStatusConnected;
af87d30
       else
af87d30
@@ -1911,7 +1936,7 @@ radeon_create_resources(xf86OutputPtr output)
af87d30
 	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
af87d30
 		       "RRConfigureOutputProperty error, %d\n", err);
af87d30
 	}
af87d30
-	/* Set the current value of the backlight property */
af87d30
+	/* Set the current value of the property */
af87d30
 	switch (radeon_output->default_tvStd) {
af87d30
 	case TV_STD_PAL:
af87d30
 	    s = "pal";
af87d30
@@ -2081,47 +2106,23 @@ radeon_set_property(xf86OutputPtr output, Atom property,
af87d30
 	    return FALSE;
af87d30
 	s = (char*)value->data;
af87d30
 	if (value->size == strlen("ntsc") && !strncmp("ntsc", s, strlen("ntsc"))) {
af87d30
-	    if (radeon_output->SupportedTVStds & TV_STD_NTSC) {
af87d30
-		radeon_output->tvStd = TV_STD_NTSC;
af87d30
-		return TRUE;
af87d30
-	    } else {
af87d30
-		return FALSE;
af87d30
-	    }
af87d30
+	    radeon_output->tvStd = TV_STD_NTSC;
af87d30
+	    return TRUE;
af87d30
 	} else if (value->size == strlen("pal") && !strncmp("pal", s, strlen("pal"))) {
af87d30
-	    if (radeon_output->SupportedTVStds & TV_STD_PAL) {
af87d30
-		radeon_output->tvStd = TV_STD_PAL;
af87d30
-		return TRUE;
af87d30
-	    } else {
af87d30
-		return FALSE;
af87d30
-	    }
af87d30
+	    radeon_output->tvStd = TV_STD_PAL;
af87d30
+	    return TRUE;
af87d30
 	} else if (value->size == strlen("pal-m") && !strncmp("pal-m", s, strlen("pal-m"))) {
af87d30
-	    if (radeon_output->SupportedTVStds & TV_STD_PAL_M) {
af87d30
-		radeon_output->tvStd = TV_STD_PAL_M;
af87d30
-		return TRUE;
af87d30
-	    } else {
af87d30
-		return FALSE;
af87d30
-	    }
af87d30
+	    radeon_output->tvStd = TV_STD_PAL_M;
af87d30
+	    return TRUE;
af87d30
 	} else if (value->size == strlen("pal-60") && !strncmp("pal-60", s, strlen("pal-60"))) {
af87d30
-	    if (radeon_output->SupportedTVStds & TV_STD_PAL_60) {
af87d30
-		radeon_output->tvStd = TV_STD_PAL_60;
af87d30
-		return TRUE;
af87d30
-	    } else {
af87d30
-		return FALSE;
af87d30
-	    }
af87d30
+	    radeon_output->tvStd = TV_STD_PAL_60;
af87d30
+	    return TRUE;
af87d30
 	} else if (value->size == strlen("ntsc-j") && !strncmp("ntsc-j", s, strlen("ntsc-j"))) {
af87d30
-	    if (radeon_output->SupportedTVStds & TV_STD_NTSC_J) {
af87d30
-		radeon_output->tvStd = TV_STD_NTSC_J;
af87d30
-		return TRUE;
af87d30
-	    } else {
af87d30
-		return FALSE;
af87d30
-	    }
af87d30
+	    radeon_output->tvStd = TV_STD_NTSC_J;
af87d30
+	    return TRUE;
af87d30
 	} else if (value->size == strlen("scart-pal") && !strncmp("scart-pal", s, strlen("scart-pal"))) {
af87d30
-	    if (radeon_output->SupportedTVStds & TV_STD_SCART_PAL) {
af87d30
-		radeon_output->tvStd = TV_STD_SCART_PAL;
af87d30
-		return TRUE;
af87d30
-	    } else {
af87d30
-		return FALSE;
af87d30
-	    }
af87d30
+	    radeon_output->tvStd = TV_STD_SCART_PAL;
af87d30
+	    return TRUE;
af87d30
 	}
af87d30
 	return FALSE;
af87d30
     }
af87d30
@@ -2206,6 +2207,10 @@ static void RADEONI2CGetBits(I2CBusPtr b, int *Clock, int *data)
af87d30
         val = INREG(b->DriverPrivate.uval+4);
af87d30
         *Clock = (val & (1<<13)) != 0;
af87d30
         *data  = (val & (1<<12)) != 0;
af87d30
+    } else if (b->DriverPrivate.uval == RADEON_MDGPIO_EN_REG) {
af87d30
+        val = INREG(b->DriverPrivate.uval+4);
af87d30
+        *Clock = (val & (1<<19)) != 0;
af87d30
+        *data  = (val & (1<<18)) != 0;
af87d30
     } else {
af87d30
         val = INREG(b->DriverPrivate.uval);
af87d30
         *Clock = (val & RADEON_GPIO_Y_1) != 0;
af87d30
@@ -2225,6 +2230,11 @@ static void RADEONI2CPutBits(I2CBusPtr b, int Clock, int data)
af87d30
         val |= (Clock ? 0:(1<<13));
af87d30
         val |= (data ? 0:(1<<12));
af87d30
         OUTREG(b->DriverPrivate.uval, val);
af87d30
+    } else if (b->DriverPrivate.uval == RADEON_MDGPIO_EN_REG) {
af87d30
+        val = INREG(b->DriverPrivate.uval) & (CARD32)~((1<<18) | (1<<19));
af87d30
+        val |= (Clock ? 0:(1<<19));
af87d30
+        val |= (data ? 0:(1<<18));
af87d30
+        OUTREG(b->DriverPrivate.uval, val);
af87d30
     } else {
af87d30
         val = INREG(b->DriverPrivate.uval) & (CARD32)~(RADEON_GPIO_EN_0 | RADEON_GPIO_EN_1);
af87d30
         val |= (Clock ? 0:RADEON_GPIO_EN_1);
af87d30
@@ -2430,6 +2440,15 @@ RADEONGetLVDSInfo (xf86OutputPtr output)
af87d30
 	}
af87d30
     }
af87d30
 
af87d30
+    info->LVDSBiosNativeMode = TRUE;
af87d30
+    if (!xf86ReturnOptValBool(info->Options, OPTION_LVDS_BIOS_NATIVE_MODE, TRUE)) {
af87d30
+	info->LVDSBiosNativeMode = FALSE;
af87d30
+	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using CVT mode for LVDS\n");
af87d30
+    } else {
af87d30
+	xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using LVDS Native Mode\n");
af87d30
+    }
af87d30
+
af87d30
+
af87d30
     /* The panel size we collected from BIOS may not be the
af87d30
      * maximum size supported by the panel.  If not, we update
af87d30
      * it now.  These will be used if no matching mode can be
af87d30
@@ -2547,6 +2566,7 @@ void RADEONInitConnector(xf86OutputPtr output)
af87d30
     case DDC_VGA  : DDCReg = RADEON_GPIO_VGA_DDC; break;
af87d30
     case DDC_CRT2 : DDCReg = RADEON_GPIO_CRT2_DDC; break;
af87d30
     case DDC_LCD  : DDCReg = RADEON_LCD_GPIO_MASK; break;
af87d30
+    case DDC_GPIO : DDCReg = RADEON_MDGPIO_EN_REG; break;
af87d30
     default: break;
af87d30
     }
af87d30
 
af87d30
@@ -2791,6 +2811,78 @@ static void RADEONSetupGenericConnectors(ScrnInfoPtr pScrn)
af87d30
 
af87d30
 }
af87d30
 
af87d30
+#if defined(__powerpc__)
af87d30
+
af87d30
+/*
af87d30
+ * Returns RADEONMacModel or 0 based on lines 'detected as' and 'machine'
af87d30
+ * in /proc/cpuinfo (on Linux) */
af87d30
+static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn)
af87d30
+{
af87d30
+    RADEONMacModel ret = 0;
af87d30
+#ifdef __linux__
af87d30
+    char cpuline[50];  /* 50 should be sufficient for our purposes */
af87d30
+    FILE *f = fopen ("/proc/cpuinfo", "r");
af87d30
+
af87d30
+    if (f != NULL) {
af87d30
+	while (fgets(cpuline, sizeof cpuline, f)) {
af87d30
+	    if (!strncmp(cpuline, "machine", strlen ("machine"))) {
af87d30
+		if (strstr(cpuline, "PowerBook5,6") ||
af87d30
+		    strstr(cpuline, "PowerBook5,7") ||
af87d30
+		    strstr(cpuline, "PowerBook5,8") ||
af87d30
+		    strstr(cpuline, "PowerBook5,9")) {
af87d30
+		    ret = RADEON_MAC_POWERBOOK_DL;
af87d30
+		    break;
af87d30
+		}
af87d30
+
af87d30
+		if (strstr(cpuline, "PowerMac10,1") ||
af87d30
+		    strstr(cpuline, "PowerMac10,2")) {
af87d30
+		    ret = RADEON_MAC_MINI;
af87d30
+		    break;
af87d30
+		}
af87d30
+	    } else if (!strncmp(cpuline, "detected as", strlen("detected as"))) {
af87d30
+                if (strstr(cpuline, "iBook")) {
af87d30
+                    ret = RADEON_MAC_IBOOK;
af87d30
+		    break;
af87d30
+		} else if (strstr(cpuline, "PowerBook")) {
af87d30
+		    ret = RADEON_MAC_POWERBOOK_DL;
af87d30
+		    break;
af87d30
+                }
af87d30
+
af87d30
+                /* No known PowerMac model detected */
af87d30
+                break;
af87d30
+            }
af87d30
+        }
af87d30
+
af87d30
+	fclose (f);
af87d30
+    } else
af87d30
+	xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
af87d30
+		   "Cannot detect PowerMac model because /proc/cpuinfo not "
af87d30
+		   "readable.\n");
af87d30
+
af87d30
+#endif /* __linux */
af87d30
+
af87d30
+    if (ret) {
af87d30
+	xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Detected %s.\n",
af87d30
+		   ret == RADEON_MAC_POWERBOOK_DL ? "PowerBook with dual link DVI" :
af87d30
+		   ret == RADEON_MAC_POWERBOOK ? "PowerBook with single link DVI" :
af87d30
+		   ret == RADEON_MAC_IBOOK ? "iBook" :
af87d30
+		   "Mac Mini");
af87d30
+	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
af87d30
+		   "If this is not correct, try Option \"MacModel\" and "
af87d30
+		   "consider reporting to the\n");
af87d30
+	xf86DrvMsg(pScrn->scrnIndex, X_INFO,
af87d30
+		   "xorg-driver-ati@lists.x.org mailing list"
af87d30
+#ifdef __linux__
af87d30
+		   " with the contents of /proc/cpuinfo"
af87d30
+#endif
af87d30
+		   ".\n");
af87d30
+    }
af87d30
+
af87d30
+    return ret;
af87d30
+}
af87d30
+
af87d30
+#endif /* __powerpc__ */
af87d30
+
af87d30
 /*
af87d30
  * initialise the static data sos we don't have to re-do at randr change */
af87d30
 Bool RADEONSetupConnectors(ScrnInfoPtr pScrn)
af87d30
@@ -2816,9 +2908,8 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn)
af87d30
     }
af87d30
 
af87d30
 #if defined(__powerpc__)
af87d30
-    optstr = (char *)xf86GetOptValString(info->Options, OPTION_MAC_MODEL);
af87d30
-
af87d30
     info->MacModel = 0;
af87d30
+    optstr = (char *)xf86GetOptValString(info->Options, OPTION_MAC_MODEL);
af87d30
     if (optstr) {
af87d30
 	if (!strncmp("ibook", optstr, strlen("ibook")))
af87d30
 	    info->MacModel = RADEON_MAC_IBOOK;
af87d30
@@ -2830,12 +2921,16 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn)
af87d30
 	    info->MacModel = RADEON_MAC_MINI;
af87d30
 	else {
af87d30
 	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid Mac Model: %s\n", optstr);
af87d30
-	    return FALSE;
af87d30
 	}
af87d30
+    }
af87d30
+
af87d30
+    if (!info->MacModel) {
af87d30
+	info->MacModel = RADEONDetectMacModel(pScrn);
af87d30
+    }
af87d30
 
af87d30
+    if (info->MacModel){
af87d30
 	if (!RADEONSetupAppleConnectors(pScrn))
af87d30
 	    RADEONSetupGenericConnectors(pScrn);
af87d30
-
af87d30
     } else
af87d30
 #endif
af87d30
     if (xf86ReturnOptValBool(info->Options, OPTION_DEFAULT_CONNECTOR_TABLE, FALSE)) {
af87d30
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
af87d30
index dbd50d7..66ece94 100644
af87d30
--- a/src/radeon_probe.h
af87d30
+++ b/src/radeon_probe.h
af87d30
@@ -60,6 +60,7 @@ typedef enum
af87d30
     DDC_VGA,
af87d30
     DDC_CRT2,
af87d30
     DDC_LCD,
af87d30
+    DDC_GPIO,
af87d30
 } RADEONDDCType;
af87d30
 
af87d30
 typedef enum