summaryrefslogtreecommitdiff
path: root/src/rhd_dig.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rhd_dig.c')
-rw-r--r--src/rhd_dig.c29
1 files changed, 16 insertions, 13 deletions
diff --git a/src/rhd_dig.c b/src/rhd_dig.c
index 3458d4b..3156c37 100644
--- a/src/rhd_dig.c
+++ b/src/rhd_dig.c
@@ -1568,13 +1568,12 @@ DigDestroy(struct rhdOutput *Output)
struct encoder *Encoder = &Private->Encoder;
RHDFUNC(Output);
Encoder->Destroy(Output);
Transmitter->Destroy(Output);
- RHDHdmiDestroy(Private->Hdmi);
if (Transmitter->PropertyPrivate)
RhdAtomDestroyBacklightControlProperty(Output, Transmitter->PropertyPrivate);
xfree(Private);
Output->Private = NULL;
}
@@ -1617,13 +1616,12 @@ DigAllocFree(struct rhdOutput *Output, enum rhdOutputAllocation Alloc)
if (Output->Id == RHD_OUTPUT_KLDSKP_LVTMA) {
if (!rhdPtr->DigEncoderOutput[1]) {
rhdPtr->DigEncoderOutput[1] = Output;
Private->EncoderID = ENCODER_DIG2;
xf86DrvMsg(Output->scrnIndex, X_INFO,
"Mapping DIG2 encoder to %s\n",TransmitterName);
- return TRUE;
} else
return FALSE;
} else
#if defined(ATOM_BIOS) && defined(ATOM_BIOS_PARSER)
{
struct ATOMTransmitterPrivate *transPrivate =
@@ -1632,36 +1630,43 @@ DigAllocFree(struct rhdOutput *Output, enum rhdOutputAllocation Alloc)
if (!rhdPtr->DigEncoderOutput[0]) {
rhdPtr->DigEncoderOutput[0] = Output;
Private->EncoderID = ENCODER_DIG1;
atc->Encoder = atomEncoderDIG1;
xf86DrvMsg(Output->scrnIndex, X_INFO,
"Mapping DIG1 encoder to %s\n",TransmitterName);
- return TRUE;
} else if (!rhdPtr->DigEncoderOutput[1]) {
rhdPtr->DigEncoderOutput[1] = Output;
Private->EncoderID = ENCODER_DIG2;
atc->Encoder = atomEncoderDIG2;
xf86DrvMsg(Output->scrnIndex, X_INFO,
"Mapping DIG2 encoder to %s\n",TransmitterName);
- return TRUE;
} else
return FALSE;
}
#else
return FALSE;
#endif
+ if(Private->EncoderMode == TMDS_DVI || Private->EncoderMode == TMDS_HDMI) {
+ Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
+ RHDHdmiSave(Private->Hdmi);
+ RHDHdmiCommitAudioWorkaround(Private->Hdmi);
+ }
+
case RHD_OUTPUT_FREE:
- Private->EncoderID = ENCODER_NONE;
- if (rhdPtr->DigEncoderOutput[0] == Output) {
+ Private->EncoderID = ENCODER_NONE;
+ if (rhdPtr->DigEncoderOutput[0] == Output)
rhdPtr->DigEncoderOutput[0] = NULL;
- return TRUE;
- } else if (rhdPtr->DigEncoderOutput[1] == Output) {
+ else if (rhdPtr->DigEncoderOutput[1] == Output)
rhdPtr->DigEncoderOutput[1] = NULL;
- return TRUE;
- } else
+ else
return FALSE;
+
+ RHDHdmiRestore(Private->Hdmi);
+ RHDHdmiDestroy(Private->Hdmi);
+ Private->Hdmi = NULL;
+ return TRUE;
break;
default:
return FALSE;
}
}
@@ -1715,12 +1720,13 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType, CARD8 ConnectorType)
Output->AllocFree = DigAllocFree;
Private = xnfcalloc(sizeof(struct DIGPrivate), 1);
Output->Private = Private;
Private->EncoderID = ENCODER_NONE;
+ Private->Hdmi = NULL;
switch (outputType) {
case RHD_OUTPUT_UNIPHYA:
#if defined (ATOM_BIOS) && defined (ATOM_BIOS_PARSER)
Output->Name = "UNIPHY_A";
Private->Transmitter.Private =
@@ -1877,22 +1883,19 @@ RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType, CARD8 ConnectorType)
xf86DrvMsg(Output->scrnIndex,X_INFO,
"Falling back to AtomBIOS controlled Backlight.\n");
}
#endif
}
- Private->Hdmi = NULL;
break;
case RHD_CONNECTOR_DVI:
Private->RunDualLink = FALSE; /* will be set later acc to pxclk */
Private->EncoderMode = TMDS_DVI;
- Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
break;
case RHD_CONNECTOR_DVI_SINGLE:
Private->RunDualLink = FALSE;
Private->EncoderMode = TMDS_DVI; /* changed later to HDMI if aplicateable */
- Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
break;
}
return Output;
}