summaryrefslogtreecommitdiff
path: root/src/rhd_atomout.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rhd_atomout.c')
-rw-r--r--src/rhd_atomout.c39
1 files changed, 18 insertions, 21 deletions
diff --git a/src/rhd_atomout.c b/src/rhd_atomout.c
index 5f3db26..9f879a8 100644
--- a/src/rhd_atomout.c
+++ b/src/rhd_atomout.c
@@ -808,7 +808,6 @@ rhdAtomOutputDestroy(struct rhdOutput *Output)
RHDFUNC(Output);
if (Private->Save)
xfree(Private->Save);
- RHDHdmiDestroy(Private->Hdmi);
if (Private)
xfree(Private);
@@ -864,30 +863,38 @@ RHDAtomOutputAllocFree(struct rhdOutput *Output, enum rhdOutputAllocation Alloc)
*/
if (Private->EncoderId != atomEncoderNone)
return TRUE;
+
if (Output->Id != RHD_OUTPUT_KLDSKP_LVTMA
&& !rhdPtr->DigEncoderOutput[0]) {
rhdPtr->DigEncoderOutput[0] = Output;
TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG1;
xf86DrvMsg(Output->scrnIndex, X_INFO, "Mapping DIG1 encoder to %s\n",TransmitterName);
- return TRUE;
} else if (!rhdPtr->DigEncoderOutput[1]) {
rhdPtr->DigEncoderOutput[1] = Output;
TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG2;
xf86DrvMsg(Output->scrnIndex, X_INFO, "Mapping DIG2 encoder to %s\n",TransmitterName);
- return TRUE;
} else
return FALSE;
+
+ Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
+ RHDHdmiSave(Private->Hdmi);
+ RHDHdmiCommitAudioWorkaround(Private->Hdmi);
+ return TRUE;
+
case RHD_OUTPUT_FREE:
- TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone;
- if (rhdPtr->DigEncoderOutput[0] == Output) {
+ TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone;
+ 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;
- break;
+
+ RHDHdmiRestore(Private->Hdmi);
+ RHDHdmiDestroy(Private->Hdmi);
+ Private->Hdmi = NULL;
+ return TRUE;
+
default:
return FALSE;
}
@@ -963,6 +970,7 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
EncoderConfig = &Private->EncoderConfig;
Private->PixelClock = 0;
+ Private->Hdmi = NULL;
switch (OutputType) {
case RHD_OUTPUT_NONE:
@@ -973,13 +981,11 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
Output->Sense = RHDBIOSScratchDACSense;
Private->EncoderId = atomEncoderDACA;
Private->OutputControlId = atomDAC1Output;
- Private->Hdmi = NULL;
break;
case RHD_OUTPUT_DACB:
Output->Sense = RHDBIOSScratchDACSense;
Private->EncoderId = atomEncoderDACB;
Private->OutputControlId = atomDAC2Output;
- Private->Hdmi = NULL;
break;
case RHD_OUTPUT_TMDSA:
case RHD_OUTPUT_LVTMA:
@@ -1005,11 +1011,6 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
else
Private->DualLink = FALSE;
- if (ConnectorType != RHD_CONNECTOR_PANEL)
- Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
- else
- Private->Hdmi = NULL;
-
Private->EncoderVersion = rhdAtomEncoderControlVersion(rhdPtr->atomBIOS, Private->EncoderId);
switch (Private->EncoderVersion.cref) {
case 1:
@@ -1092,12 +1093,10 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
if (ConnectorType == RHD_CONNECTOR_PANEL) {
TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomLVDS;
LVDSInfoRetrieve(Output, Private);
- Private->Hdmi = NULL;
} else {
TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomDVI;
TMDSInfoRetrieve(rhdPtr, Private);
Private->Coherent = FALSE;
- Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
}
break;
@@ -1173,7 +1172,6 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
case RHD_CONNECTOR_DVI:
case RHD_CONNECTOR_DVI_SINGLE:
TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomDVI;
- Private->Hdmi = RHDHdmiInit(rhdPtr, Output);
break;
case RHD_CONNECTOR_PANEL:
TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomLVDS;
@@ -1271,7 +1269,6 @@ RhdAtomSetupBacklightControlProperty(struct rhdOutput *Output,
TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone;
LVDSInfoRetrieve(Output, Private);
Private->PixelClock = 0;
- Private->Hdmi = NULL;
break;
case RHD_OUTPUT_LVTMA:
Private->OutputControlId = atomLCDOutput;