summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerome Glisse <glisse@localhost.localdomain>2007-08-21 18:48:50 +0200
committerJerome Glisse <glisse@localhost.localdomain>2007-08-21 18:48:50 +0200
commit8cb859a0dc6b3eed9ccb5797f0c41422f02ff7e4 (patch)
tree6fc17fa1890bef56a4b4ec8ff28427872420a213
parentacb551a3589ab6f528113793a1f4a1d242c25461 (diff)
avivo: differentiate digital from analog connected monitor & misc cleanup.
-rw-r--r--include/avivo.h1
-rw-r--r--xorg/avivo_output.c95
2 files changed, 58 insertions, 38 deletions
diff --git a/include/avivo.h b/include/avivo.h
index 5e644ed..92d2982 100644
--- a/include/avivo.h
+++ b/include/avivo.h
@@ -70,7 +70,6 @@ struct avivo_output_private {
xf86ConnectorType type;
I2CBusPtr i2c;
unsigned long gpio;
- unsigned long output_offset;
int number;
char *name;
void (*setup)(xf86OutputPtr output);
diff --git a/xorg/avivo_output.c b/xorg/avivo_output.c
index 6a06134..567d8dd 100644
--- a/xorg/avivo_output.c
+++ b/xorg/avivo_output.c
@@ -309,20 +309,46 @@ avivo_output_commit(xf86OutputPtr output)
output->funcs->dpms(output, DPMSModeOn);
}
-static Bool
-avivo_output_detect_ddc(xf86OutputPtr output)
+static xf86OutputStatus
+avivo_output_detect_ddc_dac(xf86OutputPtr output)
{
struct avivo_output_private *avivo_output = output->driver_private;
+ xf86MonPtr edid_mon;
- return xf86I2CProbeAddress(avivo_output->i2c, 0x00A0);
+ if (!xf86I2CProbeAddress(avivo_output->i2c, 0x00A0))
+ return XF86OutputStatusDisconnected;
+ edid_mon = xf86OutputGetEDID(output, avivo_output->i2c);
+ if (edid_mon->features.input_type) {
+ xfree(edid_mon);
+ return XF86OutputStatusDisconnected;
+ }
+ if (edid_mon->features.input_dfp) {
+ xfree(edid_mon);
+ return XF86OutputStatusDisconnected;
+ }
+ xfree(edid_mon);
+ return XF86OutputStatusConnected;
}
static xf86OutputStatus
-avivo_output_detect(xf86OutputPtr output)
+avivo_output_detect_ddc_tmds(xf86OutputPtr output)
{
- if (avivo_output_detect_ddc(output))
+ struct avivo_output_private *avivo_output = output->driver_private;
+ xf86MonPtr edid_mon;
+
+ if (!xf86I2CProbeAddress(avivo_output->i2c, 0x00A0))
+ return XF86OutputStatusDisconnected;
+ edid_mon = xf86OutputGetEDID(output, avivo_output->i2c);
+ if (edid_mon->features.input_type) {
+ xfree(edid_mon);
return XF86OutputStatusConnected;
- return XF86OutputStatusUnknown;
+ }
+ if (edid_mon->features.input_dfp) {
+ xfree(edid_mon);
+ return XF86OutputStatusConnected;
+ }
+ xfree(edid_mon);
+ return XF86OutputStatusDisconnected;
}
DisplayModePtr
@@ -350,7 +376,7 @@ avivo_output_destroy(xf86OutputPtr output)
xfree(avivo_output);
}
-static const xf86OutputFuncsRec avivo_output_funcs = {
+static const xf86OutputFuncsRec avivo_output_dac_funcs = {
.dpms = avivo_output_dpms,
.save = NULL,
.restore = NULL,
@@ -359,7 +385,21 @@ static const xf86OutputFuncsRec avivo_output_funcs = {
.prepare = avivo_output_prepare,
.mode_set = avivo_output_mode_set,
.commit = avivo_output_commit,
- .detect = avivo_output_detect,
+ .detect = avivo_output_detect_ddc_dac,
+ .get_modes = avivo_output_get_modes,
+ .destroy = avivo_output_destroy
+};
+
+static const xf86OutputFuncsRec avivo_output_tmds_funcs = {
+ .dpms = avivo_output_dpms,
+ .save = NULL,
+ .restore = NULL,
+ .mode_valid = avivo_output_mode_valid,
+ .mode_fixup = avivo_output_mode_fixup,
+ .prepare = avivo_output_prepare,
+ .mode_set = avivo_output_mode_set,
+ .commit = avivo_output_commit,
+ .detect = avivo_output_detect_ddc_tmds,
.get_modes = avivo_output_get_modes,
.destroy = avivo_output_destroy
};
@@ -373,7 +413,7 @@ static const xf86OutputFuncsRec avivo_output_lfp_funcs = {
.prepare = avivo_output_prepare,
.mode_set = avivo_output_mode_set,
.commit = avivo_output_commit,
- .detect = avivo_output_detect,
+ .detect = avivo_output_detect_ddc_tmds,
.get_modes = avivo_output_lfp_get_modes,
.destroy = avivo_output_destroy
};
@@ -453,22 +493,6 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
avivo_output->gpio = ddc_reg;
avivo_output->type = type;
avivo_output->number = number;
- avivo_output->output_offset = 0;
- if (number >= 1) {
- switch (avivo_output->type) {
- case XF86ConnectorVGA:
- avivo_output->output_offset = AVIVO_DAC2_CNTL - AVIVO_DAC1_CNTL;
- break;
- case XF86ConnectorLFP:
- case XF86ConnectorDVI_I:
- case XF86ConnectorDVI_D:
- case XF86ConnectorDVI_A:
- avivo_output->output_offset = AVIVO_TMDS2_CNTL - AVIVO_TMDS1_CNTL;
- break;
- default:
- break;
- }
- }
switch (avivo_output->type) {
case XF86ConnectorVGA:
if (!number) {
@@ -478,10 +502,16 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
avivo_output->setup = avivo_output_dac2_setup;
avivo_output->dpms = avivo_output_dac2_dpms;
}
+ output = xf86OutputCreate (screen_info,
+ &avivo_output_dac_funcs,
+ xf86ConnectorGetName(type));
break;
case XF86ConnectorLFP:
avivo_output->setup = avivo_output_tmds2_setup;
avivo_output->dpms = avivo_output_lvds_dpms;
+ output = xf86OutputCreate (screen_info,
+ &avivo_output_lfp_funcs,
+ xf86ConnectorGetName(type));
break;
case XF86ConnectorDVI_I:
case XF86ConnectorDVI_D:
@@ -493,23 +523,14 @@ avivo_output_init(ScrnInfoPtr screen_info, xf86ConnectorType type,
avivo_output->setup = avivo_output_tmds2_setup;
avivo_output->dpms = avivo_output_tmds2_dpms;
}
+ output = xf86OutputCreate (screen_info,
+ &avivo_output_tmds_funcs,
+ xf86ConnectorGetName(type));
break;
default:
avivo_output->setup = NULL;
break;
}
- if (avivo_output->type == XF86ConnectorLFP) {
- avivo_output->output_offset = AVIVO_TMDS2_CNTL - AVIVO_TMDS1_CNTL;
- /* allocate & initialize xf86Output */
- output = xf86OutputCreate (screen_info,
- &avivo_output_lfp_funcs,
- xf86ConnectorGetName(type));
- } else {
- /* allocate & initialize xf86Output */
- output = xf86OutputCreate (screen_info,
- &avivo_output_funcs,
- xf86ConnectorGetName(type));
- }
if (output == NULL) {
xf86DestroyI2CBusRec(avivo_output->i2c, TRUE, TRUE);