xf86-video-intel: Branch 'modesetting' - src/i830.h src/i830_sdvo.c src/i830_sdvo.h
Dave Airlie
airlied at kemper.freedesktop.org
Fri May 12 11:44:54 EEST 2006
src/i830.h | 1
src/i830_sdvo.c | 101 +++++++++++++++++++++++++++++++++++++++++---------------
src/i830_sdvo.h | 11 ++++++
3 files changed, 86 insertions(+), 27 deletions(-)
New commits:
diff-tree fbba4312e7cb326fdcf6a71194c4fc4a7a9b5488 (from 190f9ad0606e96e684e0b028d576d822dc9aa3cf)
Author: Dave Airlie <airlied at linux.ie>
Date: Fri May 12 18:44:27 2006 +1000
add sdvo capability reading support
This reads the SDVO cap bits and uses them to figure out the input/output
to save/restore
diff --git a/src/i830.h b/src/i830.h
index 7c4d50c..c60bfbe 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -194,6 +194,7 @@ typedef struct _I830SDVODriver {
unsigned char sdvo_regs[20];
CARD32 output_device; /* SDVOB or SDVOC */
+ i830_sdvo_caps caps;
int save_sdvo_mult;
Bool save_sdvo_active_1, save_sdvo_active_2;
i830_sdvo_dtd save_input_dtd_1, save_input_dtd_2;
diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c
index 99cdc6a..fe37d21 100644
--- a/src/i830_sdvo.c
+++ b/src/i830_sdvo.c
@@ -579,19 +579,29 @@ i830SDVOSave(ScrnInfoPtr pScrn, int outp
I830SDVOGetActiveOutputs(sdvo, &sdvo->save_sdvo_active_1,
&sdvo->save_sdvo_active_2);
- I830SDVOSetTargetInput(sdvo, TRUE, FALSE);
- I830SDVOGetTimings(sdvo, &sdvo->save_input_dtd_1,
- SDVO_CMD_GET_INPUT_TIMINGS_PART1);
- I830SDVOSetTargetInput(sdvo, FALSE, TRUE);
- I830SDVOGetTimings(sdvo, &sdvo->save_input_dtd_2,
- SDVO_CMD_GET_INPUT_TIMINGS_PART1);
-
- I830SDVOSetTargetOutput(sdvo, TRUE, FALSE);
- I830SDVOGetTimings(sdvo, &sdvo->save_output_dtd_1,
- SDVO_CMD_GET_OUTPUT_TIMINGS_PART1);
- I830SDVOSetTargetOutput(sdvo, FALSE, TRUE);
- I830SDVOGetTimings(sdvo, &sdvo->save_output_dtd_2,
- SDVO_CMD_GET_OUTPUT_TIMINGS_PART1);
+ if (sdvo->caps.caps & 0x1) {
+ I830SDVOSetTargetInput(sdvo, TRUE, FALSE);
+ I830SDVOGetTimings(sdvo, &sdvo->save_input_dtd_1,
+ SDVO_CMD_GET_INPUT_TIMINGS_PART1);
+ }
+
+ if (sdvo->caps.caps & 0x2) {
+ I830SDVOSetTargetInput(sdvo, FALSE, TRUE);
+ I830SDVOGetTimings(sdvo, &sdvo->save_input_dtd_2,
+ SDVO_CMD_GET_INPUT_TIMINGS_PART1);
+ }
+
+ if (sdvo->caps.output_0_supported) {
+ I830SDVOSetTargetOutput(sdvo, TRUE, FALSE);
+ I830SDVOGetTimings(sdvo, &sdvo->save_output_dtd_1,
+ SDVO_CMD_GET_OUTPUT_TIMINGS_PART1);
+ }
+
+ if (sdvo->caps.output_1_supported) {
+ I830SDVOSetTargetOutput(sdvo, FALSE, TRUE);
+ I830SDVOGetTimings(sdvo, &sdvo->save_output_dtd_2,
+ SDVO_CMD_GET_OUTPUT_TIMINGS_PART1);
+ }
sdvo->save_SDVOX = INREG(sdvo->output_device);
}
@@ -611,19 +621,29 @@ i830SDVOPostRestore(ScrnInfoPtr pScrn, i
I830Ptr pI830 = I830PTR(pScrn);
I830SDVOPtr sdvo = pI830->output[output_index].sdvo_drv;
- I830SDVOSetTargetInput(sdvo, TRUE, FALSE);
- I830SDVOSetTimings(sdvo, &sdvo->save_input_dtd_1,
- SDVO_CMD_SET_INPUT_TIMINGS_PART1);
- I830SDVOSetTargetInput(sdvo, FALSE, TRUE);
- I830SDVOSetTimings(sdvo, &sdvo->save_input_dtd_2,
- SDVO_CMD_SET_INPUT_TIMINGS_PART1);
-
- I830SDVOSetTargetOutput(sdvo, TRUE, FALSE);
- I830SDVOSetTimings(sdvo, &sdvo->save_output_dtd_1,
- SDVO_CMD_SET_OUTPUT_TIMINGS_PART1);
- I830SDVOSetTargetOutput(sdvo, FALSE, TRUE);
- I830SDVOSetTimings(sdvo, &sdvo->save_output_dtd_2,
- SDVO_CMD_SET_OUTPUT_TIMINGS_PART1);
+ if (sdvo->caps.caps & 0x1) {
+ I830SDVOSetTargetInput(sdvo, TRUE, FALSE);
+ I830SDVOSetTimings(sdvo, &sdvo->save_input_dtd_1,
+ SDVO_CMD_SET_INPUT_TIMINGS_PART1);
+ }
+
+ if (sdvo->caps.caps & 0x2) {
+ I830SDVOSetTargetInput(sdvo, FALSE, TRUE);
+ I830SDVOSetTimings(sdvo, &sdvo->save_input_dtd_2,
+ SDVO_CMD_SET_INPUT_TIMINGS_PART1);
+ }
+
+ if (sdvo->caps.output_0_supported) {
+ I830SDVOSetTargetOutput(sdvo, TRUE, FALSE);
+ I830SDVOSetTimings(sdvo, &sdvo->save_output_dtd_1,
+ SDVO_CMD_SET_OUTPUT_TIMINGS_PART1);
+ }
+
+ if (sdvo->caps.output_1_supported) {
+ I830SDVOSetTargetOutput(sdvo, FALSE, TRUE);
+ I830SDVOSetTimings(sdvo, &sdvo->save_output_dtd_2,
+ SDVO_CMD_SET_OUTPUT_TIMINGS_PART1);
+ }
I830SDVOSetClockRateMult(sdvo, sdvo->save_sdvo_mult);
@@ -633,6 +653,24 @@ i830SDVOPostRestore(ScrnInfoPtr pScrn, i
sdvo->save_sdvo_active_2);
}
+static void
+I830SDVOGetCapabilities(I830SDVOPtr s, i830_sdvo_caps *caps)
+{
+ memset(s->sdvo_regs, 0, 9);
+ s->sdvo_regs[SDVO_I2C_OPCODE] = SDVO_CMD_GET_DEVICE_CAPS;
+ I830SDVOWriteOutputs(s, 0);
+ I830SDVOReadInputRegs(s);
+
+ caps->vendor_id = s->sdvo_regs[SDVO_I2C_RETURN_0];
+ caps->device_id = s->sdvo_regs[SDVO_I2C_RETURN_1];
+ caps->device_rev_id = s->sdvo_regs[SDVO_I2C_RETURN_2];
+ caps->sdvo_version_major = s->sdvo_regs[SDVO_I2C_RETURN_3];
+ caps->sdvo_version_minor = s->sdvo_regs[SDVO_I2C_RETURN_4];
+ caps->caps = s->sdvo_regs[SDVO_I2C_RETURN_5];
+ caps->output_0_supported = s->sdvo_regs[SDVO_I2C_RETURN_6];
+ caps->output_1_supported = s->sdvo_regs[SDVO_I2C_RETURN_7];
+}
+
static Bool
I830SDVODDCI2CGetByte(I2CDevPtr d, I2CByte *data, Bool last)
{
@@ -669,7 +707,7 @@ I830SDVODDCI2CStart(I2CBusPtr b, int tim
I830SDVOPtr sdvo = b->DriverPrivate.ptr;
I2CBusPtr i2cbus = sdvo->d.pI2CBus;
- I830SDVOSetControlBusSwitch(sdvo, SDVO_CONTROL_BUS_DDC1);
+ I830SDVOSetControlBusSwitch(sdvo, SDVO_CONTROL_BUS_DDC2);
return i2cbus->I2CStart(i2cbus, timeout);
}
@@ -781,5 +819,14 @@ I830SDVOInit(ScrnInfoPtr pScrn, int outp
pI830->output[output_index].sdvo_drv = sdvo;
+ I830SDVOGetCapabilities(sdvo, &sdvo->caps);
+
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "SDVO device VID/DID: %02X:%02X.%02X, %02X, output 1: %c, output 2: %c\n",
+ sdvo->caps.vendor_id, sdvo->caps.device_id,
+ sdvo->caps.device_rev_id, sdvo->caps.caps,
+ sdvo->caps.output_0_supported ? 'Y' : 'N',
+ sdvo->caps.output_1_supported ? 'Y' : 'N');
+
return sdvo;
}
diff --git a/src/i830_sdvo.h b/src/i830_sdvo.h
index ec4b538..6b77c97 100644
--- a/src/i830_sdvo.h
+++ b/src/i830_sdvo.h
@@ -25,6 +25,17 @@
*
*/
+typedef struct _i830_sdvo_caps {
+ CARD8 vendor_id;
+ CARD8 device_id;
+ CARD8 device_rev_id;
+ CARD8 sdvo_version_major;
+ CARD8 sdvo_version_minor;
+ CARD8 caps;
+ CARD8 output_0_supported;
+ CARD8 output_1_supported;
+} __attribute__((packed)) i830_sdvo_caps;
+
typedef struct _i830_sdvo_dtd {
CARD16 clock;
CARD8 h_active;
More information about the xorg-commit
mailing list