xf86-video-intel: src/i2c_vid.h src/i830_dvo.c src/i830.h src/ivch/ivch.c

Eric Anholt anholt at kemper.freedesktop.org
Fri Jun 22 16:38:33 PDT 2007


 src/i2c_vid.h   |    6 ----
 src/i830.h      |    2 +
 src/i830_dvo.c  |   83 +++++++++++++++++++++++++++++++++++++++++++++-----------
 src/ivch/ivch.c |   78 ++--------------------------------------------------
 4 files changed, 73 insertions(+), 96 deletions(-)

New commits:
diff-tree f8d7cbc6e1322acad3351591336cefcfba7d9aaf (from ec236c76b93aea5f2ee1e8b8509cde4625974fcb)
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Jun 22 16:29:21 2007 -0700

    Move the ivch's fixed panel mode support to i830_dvo.c for other LVDS drivers.
    
    This also results in removal of the setup hook, which was being called
    unconditionally and breaking non-ivch dvo drivers.

diff --git a/src/i2c_vid.h b/src/i2c_vid.h
index 1a21fca..6c4e95d 100644
--- a/src/i2c_vid.h
+++ b/src/i2c_vid.h
@@ -30,12 +30,6 @@ typedef struct _I830I2CVidOutputRec {
      * Returns NULL if the device does not exist.
      */
     void *(*init)(I2CBusPtr b, I2CSlaveAddr addr);
-    
-    /**
-     * Setup the device for use, after the relevant output has been created
-     */
-    Bool
-    (*setup) (I2CDevPtr d, xf86OutputPtr output);
 
     /**
      * Called to allow the output a chance to create properties after the
diff --git a/src/i830.h b/src/i830.h
index 8947524..9dda33a 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -209,6 +209,8 @@ struct _I830DVODriver {
    I830I2CVidOutputRec *vid_rec;
    void *dev_priv;
    pointer modhandle;
+   DisplayModePtr panel_fixed_mode;
+   Bool panel_wants_dither;
 };
 
 extern const char *i830_output_type_names[];
diff --git a/src/i830_dvo.c b/src/i830_dvo.c
index dfd39ff..5666d26 100644
--- a/src/i830_dvo.c
+++ b/src/i830_dvo.c
@@ -60,20 +60,30 @@ static const char *ch7017_symbols[] = {
 /* driver list */
 struct _I830DVODriver i830_dvo_drivers[] =
 {
-    {I830_OUTPUT_DVO_TMDS, "sil164", "SIL164VidOutput", DVOC,
-     (SIL164_ADDR_1<<1), SIL164Symbols, NULL , NULL, NULL},
-    {I830_OUTPUT_DVO_TMDS | I830_OUTPUT_DVO_TVOUT, "ch7xxx", "CH7xxxVidOutput", DVOC,
-     (CH7xxx_ADDR_1<<1), CH7xxxSymbols, NULL , NULL, NULL},
-    {I830_OUTPUT_DVO_LVDS, "ivch", "ivch_methods", DVOA,
-     0x04, ivch_symbols, NULL, NULL, NULL},
-    /*
-    {I830_OUTPUT_DVO_LVDS, "ivch", "ivch_methods",
-     0x44, ivch_symbols, NULL, NULL, NULL},
-    {I830_OUTPUT_DVO_LVDS, "ivch", "ivch_methods",
-     0x84, ivch_symbols, NULL, NULL, NULL},
-    {I830_OUTPUT_DVO_LVDS, "ivch", "ivch_methods",
-     0xc4, ivch_symbols, NULL, NULL, NULL},
-    */
+    {
+	.type = I830_OUTPUT_DVO_TMDS,
+	.modulename = "sil164",
+	.fntablename = "SIL164VidOutput",
+	.dvo_reg = DVOC,
+	.address = (SIL164_ADDR_1<<1),
+	.symbols = SIL164Symbols
+    },
+    {
+	.type = I830_OUTPUT_DVO_TMDS,
+	.modulename = "ch7xxx",
+	.fntablename = "CH7xxxVidOutput",
+	.dvo_reg = DVOC,
+	.address = (CH7xxx_ADDR_1<<1),
+	.symbols = CH7xxxSymbols
+    },
+    {
+	.type = I830_OUTPUT_DVO_LVDS,
+	.modulename = "ivch",
+	.fntablename = "ivch_methods",
+	.dvo_reg = DVOA,
+	.address = 0x04, /* Might also be 0x44, 0x84, 0xc4 */
+	.symbols = ivch_symbols
+    },
     /*
     { I830_OUTPUT_DVO_LVDS, "ch7017", "ch7017_methods",
       0xea, ch7017_symbols, NULL, NULL, NULL }
@@ -140,6 +150,7 @@ static int
 i830_dvo_mode_valid(xf86OutputPtr output, DisplayModePtr pMode)
 {
     I830OutputPrivatePtr    intel_output = output->driver_private;
+    struct _I830DVODriver   *drv = intel_output->i2c_drv;
     void		    *dev_priv = intel_output->i2c_drv->dev_priv;
 
     if (pMode->Flags & V_DBLSCAN)
@@ -147,6 +158,13 @@ i830_dvo_mode_valid(xf86OutputPtr output
 
     /* XXX: Validate clock range */
 
+    if (drv->panel_fixed_mode) {
+	if (pMode->HDisplay > drv->panel_fixed_mode->HDisplay)
+	    return MODE_PANEL;
+	if (pMode->VDisplay > drv->panel_fixed_mode->VDisplay)
+	    return MODE_PANEL;
+    }
+
     return intel_output->i2c_drv->vid_rec->mode_valid(dev_priv, pMode);
 }
 
@@ -155,6 +173,25 @@ i830_dvo_mode_fixup(xf86OutputPtr output
 		    DisplayModePtr adjusted_mode)
 {
     I830OutputPrivatePtr    intel_output = output->driver_private;
+    struct _I830DVODriver   *drv = intel_output->i2c_drv;
+
+    /* If we have timings from the BIOS for the panel, put them in
+     * to the adjusted mode.  The CRTC will be set up for this mode,
+     * with the panel scaling set up to source from the H/VDisplay
+     * of the original mode.
+     */
+    if (drv->panel_fixed_mode != NULL) {
+	adjusted_mode->HDisplay = drv->panel_fixed_mode->HDisplay;
+	adjusted_mode->HSyncStart = drv->panel_fixed_mode->HSyncStart;
+	adjusted_mode->HSyncEnd = drv->panel_fixed_mode->HSyncEnd;
+	adjusted_mode->HTotal = drv->panel_fixed_mode->HTotal;
+	adjusted_mode->VDisplay = drv->panel_fixed_mode->VDisplay;
+	adjusted_mode->VSyncStart = drv->panel_fixed_mode->VSyncStart;
+	adjusted_mode->VSyncEnd = drv->panel_fixed_mode->VSyncEnd;
+	adjusted_mode->VTotal = drv->panel_fixed_mode->VTotal;
+	adjusted_mode->Clock = drv->panel_fixed_mode->Clock;
+	xf86SetModeCrtc(adjusted_mode, INTERLACE_HALVE_V);
+    }
 
     if (intel_output->i2c_drv->vid_rec->mode_fixup)
 	return intel_output->i2c_drv->vid_rec->mode_fixup (intel_output->i2c_drv->dev_priv,
@@ -235,6 +272,7 @@ static DisplayModePtr
 i830_dvo_get_modes(xf86OutputPtr output)
 {
     I830OutputPrivatePtr    intel_output = output->driver_private;
+    struct _I830DVODriver   *drv = intel_output->i2c_drv;
     DisplayModePtr	    modes;
 
     /* We should probably have an i2c driver get_modes function for those
@@ -253,6 +291,9 @@ i830_dvo_get_modes(xf86OutputPtr output)
 	    return modes;
     }
 
+    if (drv->panel_fixed_mode != NULL)
+	return xf86DuplicateMode(drv->panel_fixed_mode);
+
     return NULL;
 }
 
@@ -436,7 +477,19 @@ i830_dvo_init(ScrnInfoPtr pScrn)
 	    drv->dev_priv = ret_ptr;
 	    intel_output->i2c_drv = drv;
 	    intel_output->pI2CBus = pI2CBus;
-	    drv->vid_rec->setup (drv->dev_priv, output);
+
+	    if (intel_output->type == I830_OUTPUT_DVO_LVDS) {
+		/* For our LVDS chipsets, we should hopefully be able to
+		 * dig the fixed panel mode out of the BIOS data.  However,
+		 * it's in a different format from the BIOS data on chipsets
+		 * with integrated LVDS (stored in AIM headers, liekly),
+		 * so for now, just get the current mode being output through
+		 * DVO.
+		 */
+		drv->panel_fixed_mode = i830_dvo_get_current_mode(output);
+		drv->panel_wants_dither = TRUE;
+	    }
+
 	    return;
 	}
 	xf86UnloadSubModule(drv->modhandle);
diff --git a/src/ivch/ivch.c b/src/ivch/ivch.c
index eac878e..bd11dd4 100644
--- a/src/ivch/ivch.c
+++ b/src/ivch/ivch.c
@@ -49,9 +49,6 @@ struct ivch_priv {
 
     xf86OutputPtr   output;
 
-    DisplayModePtr  panel_fixed_mode;
-    Bool	    panel_wants_dither;
-
     CARD16    	    width;
     CARD16    	    height;
 
@@ -189,6 +186,9 @@ ivch_init(I2CBusPtr b, I2CSlaveAddr addr
 	goto out;
     }
 
+    ivch_read(priv, VR20, &priv->width);
+    ivch_read(priv, VR21, &priv->height);
+
     return priv;
 
 out:
@@ -196,60 +196,18 @@ out:
     return NULL;
 }
 
-/** Gets the panel mode */
-static Bool
-ivch_setup (I2CDevPtr d, xf86OutputPtr output)
-{
-    struct ivch_priv	*priv = d->DriverPrivate.ptr;
-
-    priv->output = output;
-    ivch_read (priv, VR20, &priv->width);
-    ivch_read (priv, VR21, &priv->height);
-    
-    priv->panel_fixed_mode = i830_bios_get_panel_mode (output->scrn, &priv->panel_wants_dither);
-    if (!priv->panel_fixed_mode)
-    {
-	priv->panel_fixed_mode = i830_dvo_get_current_mode (output);
-	priv->panel_wants_dither = TRUE;
-    }
-
-    return TRUE;
-}
-
 static xf86OutputStatus
 ivch_detect(I2CDevPtr d)
 {
     return XF86OutputStatusConnected;
 }
 
-static DisplayModePtr
-ivch_get_modes (I2CDevPtr d)
-{
-    struct ivch_priv	*priv = d->DriverPrivate.ptr;
-
-    if (priv->panel_fixed_mode)
-	return xf86DuplicateMode (priv->panel_fixed_mode);
-
-    return NULL;
-}
-
 static ModeStatus
 ivch_mode_valid(I2CDevPtr d, DisplayModePtr mode)
 {
-    struct ivch_priv	*priv = d->DriverPrivate.ptr;
-    DisplayModePtr	panel_fixed_mode = priv->panel_fixed_mode;
-    
     if (mode->Clock > 112000)
 	return MODE_CLOCK_HIGH;
 
-    if (panel_fixed_mode)
-    {
-	if (mode->HDisplay > panel_fixed_mode->HDisplay)
-	    return MODE_PANEL;
-	if (mode->VDisplay > panel_fixed_mode->VDisplay)
-	    return MODE_PANEL;
-    }
-    
     return MODE_OK;
 }
 
@@ -291,33 +249,6 @@ ivch_dpms(I2CDevPtr d, int mode)
     usleep (16 * 1000);
 }
 
-static Bool
-ivch_mode_fixup(I2CDevPtr d, DisplayModePtr mode, DisplayModePtr adjusted_mode)
-{
-    struct ivch_priv	*priv = d->DriverPrivate.ptr;
-    DisplayModePtr	panel_fixed_mode = priv->panel_fixed_mode;
-    
-    /* If we have timings from the BIOS for the panel, put them in
-     * to the adjusted mode.  The CRTC will be set up for this mode,
-     * with the panel scaling set up to source from the H/VDisplay
-     * of the original mode.
-     */
-    if (panel_fixed_mode != NULL) {
-	adjusted_mode->HDisplay = panel_fixed_mode->HDisplay;
-	adjusted_mode->HSyncStart = panel_fixed_mode->HSyncStart;
-	adjusted_mode->HSyncEnd = panel_fixed_mode->HSyncEnd;
-	adjusted_mode->HTotal = panel_fixed_mode->HTotal;
-	adjusted_mode->VDisplay = panel_fixed_mode->VDisplay;
-	adjusted_mode->VSyncStart = panel_fixed_mode->VSyncStart;
-	adjusted_mode->VSyncEnd = panel_fixed_mode->VSyncEnd;
-	adjusted_mode->VTotal = panel_fixed_mode->VTotal;
-	adjusted_mode->Clock = panel_fixed_mode->Clock;
-	xf86SetModeCrtc(adjusted_mode, INTERLACE_HALVE_V);
-    }
-
-    return TRUE;
-}
-    
 static void
 ivch_mode_set(I2CDevPtr d, DisplayModePtr mode, DisplayModePtr adjusted_mode)
 {
@@ -420,14 +351,11 @@ ivch_restore(I2CDevPtr d)
 
 I830I2CVidOutputRec ivch_methods = {
     .init = ivch_init,
-    .setup = ivch_setup,
     .dpms = ivch_dpms,
     .save = ivch_save,
     .restore = ivch_restore,
     .mode_valid = ivch_mode_valid,
-    .mode_fixup = ivch_mode_fixup,
     .mode_set = ivch_mode_set,
     .detect = ivch_detect,
-    .get_modes = ivch_get_modes,
     .dump_regs = ivch_dump_regs,
 };


More information about the xorg-commit mailing list