xf86-video-intel: Branch 'modesetting' - 3 commits - src/ch7xxx/ch7xxx.c src/ch7xxx/Makefile.am src/i2c_vid.h src/i830_dvo.c src/i830_xf86Crtc.c src/sil164/Makefile.am src/sil164/sil164.c
Eric Anholt
anholt at kemper.freedesktop.org
Tue Dec 19 02:12:34 EET 2006
src/ch7xxx/Makefile.am | 2 -
src/ch7xxx/ch7xxx.c | 38 +++++++++++++++------------
src/i2c_vid.h | 16 +++++------
src/i830_dvo.c | 24 ++++++++++-------
src/i830_xf86Crtc.c | 24 ++++++++++-------
src/sil164/Makefile.am | 2 -
src/sil164/sil164.c | 68 ++++++++++++++++++++++++++++---------------------
7 files changed, 100 insertions(+), 74 deletions(-)
New commits:
diff-tree eedef7adc53dd8337d27c02551c5778fb43bae05 (from 8983845f91cacf8110c70121e0f5f293fe443e6d)
Author: Eric Anholt <eric at anholt.net>
Date: Mon Dec 18 15:57:44 2006 -0800
Add a detect() function for DVO chips, and implement it on sil164.
diff --git a/src/ch7xxx/Makefile.am b/src/ch7xxx/Makefile.am
index 645ac69..d63c7fc 100644
--- a/src/ch7xxx/Makefile.am
+++ b/src/ch7xxx/Makefile.am
@@ -3,7 +3,7 @@
# -avoid-version prevents gratuitous .0.0.0 version numbers on the end
# _ladir passes a dummy rpath to libtool so the thing will actually link
# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@
+AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -I../
ch7xxx_la_LTLIBRARIES = ch7xxx.la
ch7xxx_la_LDFLAGS = -module -avoid-version
diff --git a/src/ch7xxx/ch7xxx.c b/src/ch7xxx/ch7xxx.c
index b1e8cbd..5bfb7c5 100644
--- a/src/ch7xxx/ch7xxx.c
+++ b/src/ch7xxx/ch7xxx.c
@@ -25,6 +25,11 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include <string.h>
#include "xf86.h"
#include "xf86_OSproc.h"
@@ -32,6 +37,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
#include "compiler.h"
#include "miscstruct.h"
#include "xf86i2c.h"
+#include "i830_xf86Crtc.h"
#define DPMS_SERVER
#include <X11/extensions/dpms.h>
@@ -173,6 +179,12 @@ out:
return NULL;
}
+static xf86OutputStatus
+ch7xxx_detect(I2CDevPtr d)
+{
+ return XF86OutputStatusUnknown;
+}
+
static ModeStatus
ch7xxx_mode_valid(I2CDevPtr d, DisplayModePtr mode)
{
@@ -275,6 +287,7 @@ ch7xxx_restore(I2CDevPtr d)
I830I2CVidOutputRec CH7xxxVidOutput = {
.init = ch7xxx_init,
+ .detect = ch7xxx_detect,
.mode_valid = ch7xxx_mode_valid,
.mode_set = ch7xxx_mode_set,
.dpms = ch7xxx_dpms,
diff --git a/src/i2c_vid.h b/src/i2c_vid.h
index 877122f..3be394d 100644
--- a/src/i2c_vid.h
+++ b/src/i2c_vid.h
@@ -4,6 +4,7 @@
typedef struct _I830I2CVidOutputRec {
void *(*init)(I2CBusPtr b, I2CSlaveAddr addr);
+ xf86OutputStatus (*detect)(I2CDevPtr d);
ModeStatus (*mode_valid)(I2CDevPtr d, DisplayModePtr mode);
void (*mode_set)(I2CDevPtr d, DisplayModePtr mode);
void (*dpms)(I2CDevPtr d, int mode);
diff --git a/src/i830_dvo.c b/src/i830_dvo.c
index c3ad4c0..97453de 100644
--- a/src/i830_dvo.c
+++ b/src/i830_dvo.c
@@ -177,7 +177,10 @@ i830_dvo_mode_set(xf86OutputPtr output,
static xf86OutputStatus
i830_dvo_detect(xf86OutputPtr output)
{
- return XF86OutputStatusUnknown;
+ I830OutputPrivatePtr intel_output = output->driver_private;
+ void *dev_priv = intel_output->i2c_drv->dev_priv;
+
+ return intel_output->i2c_drv->vid_rec->detect(dev_priv);
}
static Bool
diff --git a/src/sil164/Makefile.am b/src/sil164/Makefile.am
index bb84d03..d4c0cbd 100644
--- a/src/sil164/Makefile.am
+++ b/src/sil164/Makefile.am
@@ -3,7 +3,7 @@
# -avoid-version prevents gratuitous .0.0.0 version numbers on the end
# _ladir passes a dummy rpath to libtool so the thing will actually link
# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
-AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@
+AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ -I../
sil164_la_LTLIBRARIES = sil164.la
sil164_la_LDFLAGS = -module -avoid-version
diff --git a/src/sil164/sil164.c b/src/sil164/sil164.c
index 497336c..453ed04 100644
--- a/src/sil164/sil164.c
+++ b/src/sil164/sil164.c
@@ -26,12 +26,18 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include "xf86.h"
#include "xf86_OSproc.h"
#include "xf86Resources.h"
#include "compiler.h"
#include "miscstruct.h"
#include "xf86i2c.h"
+#include "i830_xf86Crtc.h"
#define DPMS_SERVER
#include <X11/extensions/dpms.h>
@@ -117,6 +123,20 @@ out:
return NULL;
}
+static xf86OutputStatus
+sil164_detect(I2CDevPtr d)
+{
+ SIL164Ptr sil = SILPTR(d);
+ CARD8 reg9;
+
+ sil164ReadByte(sil, SIL164_REG9, ®9);
+
+ if (reg9 & SIL164_9_HTPLG)
+ return XF86OutputStatusConnected;
+ else
+ return XF86OutputStatusDisconnected;
+}
+
static ModeStatus
sil164_mode_valid(I2CDevPtr d, DisplayModePtr mode)
{
@@ -215,6 +235,7 @@ sil164_restore(I2CDevPtr d)
I830I2CVidOutputRec SIL164VidOutput = {
.init = sil164_init,
+ .detect = sil164_detect,
.mode_valid = sil164_mode_valid,
.mode_set = sil164_mode_set,
.dpms = sil164_dpms,
diff-tree 8983845f91cacf8110c70121e0f5f293fe443e6d (from fa4642048b183134544fc5ee47558446d27f6194)
Author: Eric Anholt <eric at anholt.net>
Date: Mon Dec 18 15:57:08 2006 -0800
Fix crash in xf86SetScrnInfoModes when pScrn->modes ends up empty.
diff --git a/src/i830_xf86Crtc.c b/src/i830_xf86Crtc.c
index 51e6f1c..bb6c869 100644
--- a/src/i830_xf86Crtc.c
+++ b/src/i830_xf86Crtc.c
@@ -555,16 +555,20 @@ xf86SetScrnInfoModes (ScrnInfoPtr pScrn)
for (mode = pScrn->modes; mode; mode = mode->next)
if (xf86ModesEqual (mode, &crtc->desiredMode))
break;
-
- /* For some reason, pScrn->modes is circular, unlike the other mode lists.
- * How great is that?
- */
- for (last = pScrn->modes; last && last->next; last = last->next);
- last->next = pScrn->modes;
- pScrn->modes->prev = last;
- if (mode)
- while (pScrn->modes != mode)
- pScrn->modes = pScrn->modes->next;
+
+ if (pScrn->modes != NULL) {
+ /* For some reason, pScrn->modes is circular, unlike the other mode
+ * lists. How great is that?
+ */
+ for (last = pScrn->modes; last && last->next; last = last->next)
+ ;
+ last->next = pScrn->modes;
+ pScrn->modes->prev = last;
+ if (mode) {
+ while (pScrn->modes != mode)
+ pScrn->modes = pScrn->modes->next;
+ }
+ }
pScrn->currentMode = pScrn->modes;
}
diff-tree fa4642048b183134544fc5ee47558446d27f6194 (from dcb069a1da6b3300b0772843dd9b67efdf319637)
Author: Eric Anholt <eric at anholt.net>
Date: Mon Dec 18 15:32:35 2006 -0800
Clean up i2c_vid interface, including de-StudlyCapsing and removing dead code.
The old Init() function is removed and the previous Detect() function is now
init(). This leaves us room in the namespace for a detect() like other
outputs have ("is the monitor connected?"). Also, Power() became dpms(),
taking a DPMSMode*. In general, the mode setting path now matches the intel
internal path, except for the lack of mode_fixup().
diff --git a/src/ch7xxx/ch7xxx.c b/src/ch7xxx/ch7xxx.c
index 61ab20d..b1e8cbd 100644
--- a/src/ch7xxx/ch7xxx.c
+++ b/src/ch7xxx/ch7xxx.c
@@ -32,6 +32,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
#include "compiler.h"
#include "miscstruct.h"
#include "xf86i2c.h"
+#define DPMS_SERVER
+#include <X11/extensions/dpms.h>
#include "../i2c_vid.h"
#include "ch7xxx.h"
@@ -112,7 +114,7 @@ ch7xxx_write(struct ch7xxx_priv *dev_pri
}
static void *
-ch7xxx_probe(I2CBusPtr b, I2CSlaveAddr addr)
+ch7xxx_init(I2CBusPtr b, I2CSlaveAddr addr)
{
/* this will detect the CH7xxx chip on the specified i2c bus */
struct ch7xxx_priv *dev_priv;
@@ -171,14 +173,6 @@ out:
return NULL;
}
-
-static Bool
-ch7xxx_init(I2CDevPtr d)
-{
- /* not much to do */
- return TRUE;
-}
-
static ModeStatus
ch7xxx_mode_valid(I2CDevPtr d, DisplayModePtr mode)
{
@@ -228,11 +222,11 @@ ch7xxx_mode_set(I2CDevPtr d, DisplayMode
/* set the CH7xxx power state */
static void
-ch7xxx_power(I2CDevPtr d, Bool on)
+ch7xxx_dpms(I2CDevPtr d, int mode)
{
struct ch7xxx_priv *dev_priv = d->DriverPrivate.ptr;
- if (on)
+ if (mode == DPMSModeOn)
ch7xxx_write(dev_priv, CH7xxx_PM, CH7xxx_PM_DVIL | CH7xxx_PM_DVIP);
else
ch7xxx_write(dev_priv, CH7xxx_PM, CH7xxx_PM_FPD);
@@ -280,12 +274,11 @@ ch7xxx_restore(I2CDevPtr d)
}
I830I2CVidOutputRec CH7xxxVidOutput = {
- ch7xxx_probe,
- ch7xxx_init,
- ch7xxx_mode_valid,
- ch7xxx_mode_set,
- ch7xxx_power,
- ch7xxx_dump_regs,
- ch7xxx_save,
- ch7xxx_restore,
+ .init = ch7xxx_init,
+ .mode_valid = ch7xxx_mode_valid,
+ .mode_set = ch7xxx_mode_set,
+ .dpms = ch7xxx_dpms,
+ .dump_regs = ch7xxx_dump_regs,
+ .save = ch7xxx_save,
+ .restore = ch7xxx_restore,
};
diff --git a/src/i2c_vid.h b/src/i2c_vid.h
index 5a743d2..877122f 100644
--- a/src/i2c_vid.h
+++ b/src/i2c_vid.h
@@ -3,14 +3,13 @@
#define I2C_VID_H
typedef struct _I830I2CVidOutputRec {
- void *(*Detect)(I2CBusPtr b, I2CSlaveAddr addr);
- Bool (*Init)(I2CDevPtr d);
- ModeStatus (*ModeValid)(I2CDevPtr d, DisplayModePtr mode);
- void (*Mode)(I2CDevPtr d, DisplayModePtr mode);
- void (*Power)(I2CDevPtr d, Bool On);
- void (*PrintRegs)(I2CDevPtr d);
- void (*SaveRegs)(I2CDevPtr d);
- void (*RestoreRegs)(I2CDevPtr d);
+ void *(*init)(I2CBusPtr b, I2CSlaveAddr addr);
+ ModeStatus (*mode_valid)(I2CDevPtr d, DisplayModePtr mode);
+ void (*mode_set)(I2CDevPtr d, DisplayModePtr mode);
+ void (*dpms)(I2CDevPtr d, int mode);
+ void (*dump_regs)(I2CDevPtr d);
+ void (*save)(I2CDevPtr d);
+ void (*restore)(I2CDevPtr d);
} I830I2CVidOutputRec, *I830I2CVidOutputPtr;
#endif
diff --git a/src/i830_dvo.c b/src/i830_dvo.c
index 804f0fc..c3ad4c0 100644
--- a/src/i830_dvo.c
+++ b/src/i830_dvo.c
@@ -62,12 +62,13 @@ i830_dvo_dpms(xf86OutputPtr output, int
ScrnInfoPtr pScrn = output->scrn;
I830Ptr pI830 = I830PTR(pScrn);
I830OutputPrivatePtr intel_output = output->driver_private;
+ void * dev_priv = intel_output->i2c_drv->dev_priv;
if (mode == DPMSModeOn) {
OUTREG(DVOC, INREG(DVOC) | DVO_ENABLE);
- (*intel_output->i2c_drv->vid_rec->Power)(intel_output->i2c_drv->dev_priv, TRUE);
+ (*intel_output->i2c_drv->vid_rec->dpms)(dev_priv, mode);
} else {
- (*intel_output->i2c_drv->vid_rec->Power)(intel_output->i2c_drv->dev_priv, FALSE);
+ (*intel_output->i2c_drv->vid_rec->dpms)(dev_priv, mode);
OUTREG(DVOC, INREG(DVOC) & ~DVO_ENABLE);
}
}
@@ -78,6 +79,7 @@ i830_dvo_save(xf86OutputPtr output)
ScrnInfoPtr pScrn = output->scrn;
I830Ptr pI830 = I830PTR(pScrn);
I830OutputPrivatePtr intel_output = output->driver_private;
+ void * dev_priv = intel_output->i2c_drv->dev_priv;
/* Each output should probably just save the registers it touches, but for
* now, use more overkill.
@@ -86,7 +88,7 @@ i830_dvo_save(xf86OutputPtr output)
pI830->saveDVOB = INREG(DVOB);
pI830->saveDVOC = INREG(DVOC);
- (*intel_output->i2c_drv->vid_rec->SaveRegs)(intel_output->i2c_drv->dev_priv);
+ (*intel_output->i2c_drv->vid_rec->save)(dev_priv);
}
static void
@@ -95,12 +97,13 @@ i830_dvo_restore(xf86OutputPtr output)
ScrnInfoPtr pScrn = output->scrn;
I830Ptr pI830 = I830PTR(pScrn);
I830OutputPrivatePtr intel_output = output->driver_private;
+ void * dev_priv = intel_output->i2c_drv->dev_priv;
OUTREG(DVOA, pI830->saveDVOA);
OUTREG(DVOB, pI830->saveDVOB);
OUTREG(DVOC, pI830->saveDVOC);
- (*intel_output->i2c_drv->vid_rec->RestoreRegs)(intel_output->i2c_drv->dev_priv);
+ (*intel_output->i2c_drv->vid_rec->restore)(dev_priv);
}
static int
@@ -114,7 +117,7 @@ i830_dvo_mode_valid(xf86OutputPtr output
/* XXX: Validate clock range */
- return intel_output->i2c_drv->vid_rec->ModeValid(dev_priv, pMode);
+ return intel_output->i2c_drv->vid_rec->mode_valid(dev_priv, pMode);
}
static Bool
@@ -139,8 +142,8 @@ i830_dvo_mode_set(xf86OutputPtr output,
CARD32 dvo;
int dpll_reg = (pipe == 0) ? DPLL_A : DPLL_B;
- intel_output->i2c_drv->vid_rec->Mode(intel_output->i2c_drv->dev_priv,
- mode);
+ intel_output->i2c_drv->vid_rec->mode_set(intel_output->i2c_drv->dev_priv,
+ mode);
/* Save the data order, since I don't know what it should be set to. */
dvo = INREG(DVOC) & (DVO_PRESERVE_MASK | DVO_DATA_ORDER_GBRG);
@@ -196,7 +199,7 @@ I830I2CDetectDVOControllers(ScrnInfoPtr
ret_ptr = NULL;
drv->vid_rec = LoaderSymbol(drv->fntablename);
if (drv->vid_rec != NULL)
- ret_ptr = drv->vid_rec->Detect(pI2CBus, drv->address);
+ ret_ptr = drv->vid_rec->init(pI2CBus, drv->address);
if (ret_ptr != NULL) {
drv->dev_priv = ret_ptr;
diff --git a/src/sil164/sil164.c b/src/sil164/sil164.c
index 0a68d69..497336c 100644
--- a/src/sil164/sil164.c
+++ b/src/sil164/sil164.c
@@ -32,16 +32,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
#include "compiler.h"
#include "miscstruct.h"
#include "xf86i2c.h"
+#define DPMS_SERVER
+#include <X11/extensions/dpms.h>
#include "../i2c_vid.h"
#include "sil164.h"
#include "sil164_reg.h"
-static void
-sil164PrintRegs(I2CDevPtr d);
-static void
-sil164Power(I2CDevPtr d, Bool On);
-
static Bool
sil164ReadByte(SIL164Ptr sil, int addr, CARD8 *ch)
{
@@ -68,7 +65,7 @@ sil164WriteByte(SIL164Ptr sil, int addr,
/* Silicon Image 164 driver for chip on i2c bus */
static void *
-sil164Detect(I2CBusPtr b, I2CSlaveAddr addr)
+sil164_init(I2CBusPtr b, I2CSlaveAddr addr)
{
/* this will detect the SIL164 chip on the specified i2c bus */
SIL164Ptr sil;
@@ -120,26 +117,19 @@ out:
return NULL;
}
-
-static Bool
-sil164Init(I2CDevPtr d)
-{
- /* not much to do */
- return TRUE;
-}
-
static ModeStatus
-sil164ModeValid(I2CDevPtr d, DisplayModePtr mode)
+sil164_mode_valid(I2CDevPtr d, DisplayModePtr mode)
{
return MODE_OK;
}
static void
-sil164Mode(I2CDevPtr d, DisplayModePtr mode)
+sil164_mode_set(I2CDevPtr d, DisplayModePtr mode)
{
- sil164Power(d, TRUE);
- sil164PrintRegs(d);
-
+ /* As long as the basics are set up, since we don't have clock dependencies
+ * in the mode setup, we can just leave the registers alone and everything
+ * will work fine.
+ */
/* recommended programming sequence from doc */
/*sil164WriteByte(sil, 0x08, 0x30);
sil164WriteByte(sil, 0x09, 0x00);
@@ -152,7 +142,7 @@ sil164Mode(I2CDevPtr d, DisplayModePtr m
/* set the SIL164 power state */
static void
-sil164Power(I2CDevPtr d, Bool On)
+sil164_dpms(I2CDevPtr d, int mode)
{
SIL164Ptr sil = SILPTR(d);
int ret;
@@ -162,7 +152,7 @@ sil164Power(I2CDevPtr d, Bool On)
if (ret == FALSE)
return;
- if (On)
+ if (mode == DPMSModeOn)
ch |= SIL164_8_PD;
else
ch &= ~SIL164_8_PD;
@@ -173,7 +163,7 @@ sil164Power(I2CDevPtr d, Bool On)
}
static void
-sil164PrintRegs(I2CDevPtr d)
+sil164_dump_regs(I2CDevPtr d)
{
SIL164Ptr sil = SILPTR(d);
CARD8 val;
@@ -193,7 +183,7 @@ sil164PrintRegs(I2CDevPtr d)
}
static void
-sil164SaveRegs(I2CDevPtr d)
+sil164_save(I2CDevPtr d)
{
SIL164Ptr sil = SILPTR(d);
@@ -210,7 +200,7 @@ sil164SaveRegs(I2CDevPtr d)
}
static void
-sil164RestoreRegs(I2CDevPtr d)
+sil164_restore(I2CDevPtr d)
{
SIL164Ptr sil = SILPTR(d);
@@ -224,12 +214,11 @@ sil164RestoreRegs(I2CDevPtr d)
I830I2CVidOutputRec SIL164VidOutput = {
- sil164Detect,
- sil164Init,
- sil164ModeValid,
- sil164Mode,
- sil164Power,
- sil164PrintRegs,
- sil164SaveRegs,
- sil164RestoreRegs,
+ .init = sil164_init,
+ .mode_valid = sil164_mode_valid,
+ .mode_set = sil164_mode_set,
+ .dpms = sil164_dpms,
+ .dump_regs = sil164_dump_regs,
+ .save = sil164_save,
+ .restore = sil164_restore,
};
More information about the xorg-commit
mailing list