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
@@ -805,13 +805,12 @@ static void
rhdAtomOutputDestroy(struct rhdOutput *Output)
{
struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private;
RHDFUNC(Output);
if (Private->Save)
xfree(Private->Save);
- RHDHdmiDestroy(Private->Hdmi);
if (Private)
xfree(Private);
Output->Private = NULL;
xfree(Output->Name);
}
@@ -861,36 +860,44 @@ RHDAtomOutputAllocFree(struct rhdOutput *Output, enum rhdOutputAllocation Alloc)
* LVTMA can only use DIG2. Thus exclude
* DIG1 for LVTMA and prefer it for the
* UNIPHYs.
*/
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;
}
}
/*
@@ -960,29 +967,28 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
Private = xnfcalloc(sizeof(struct rhdAtomOutputPrivate), 1);
Output->Private = Private;
Output->OutputDriverPrivate = NULL;
EncoderConfig = &Private->EncoderConfig;
Private->PixelClock = 0;
+ Private->Hdmi = NULL;
switch (OutputType) {
case RHD_OUTPUT_NONE:
xfree(Output);
xfree(Private);
return NULL;
case RHD_OUTPUT_DACA:
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:
if (OutputType == RHD_OUTPUT_LVTMA) {
if (ConnectorType == RHD_CONNECTOR_PANEL) {
Private->OutputControlId = atomLCDOutput;
@@ -1002,17 +1008,12 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
if (OutputType == RHD_CONNECTOR_DVI)
Private->DualLink = TRUE;
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:
EncoderConfig->u.lvds.Is24bit = Private->LVDS24Bit;
break;
case 2:
@@ -1089,18 +1090,16 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
TransmitterConfig->Link = atomTransLinkA;
TransmitterConfig->Encoder = Private->TransmitterId;
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;
case RHD_OUTPUT_UNIPHYA:
case RHD_OUTPUT_UNIPHYB:
case RHD_OUTPUT_UNIPHYC:
@@ -1170,13 +1169,12 @@ RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType,
TMDSInfoRetrieve(rhdPtr, Private);
switch (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;
break;
#if 0
case RHD_CONNECTOR_DP:
@@ -1268,13 +1266,12 @@ RhdAtomSetupBacklightControlProperty(struct rhdOutput *Output,
else if (rhdPtr->DigEncoderOutput[1] == Output)
TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG2;
else
TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone;
LVDSInfoRetrieve(Output, Private);
Private->PixelClock = 0;
- Private->Hdmi = NULL;
break;
case RHD_OUTPUT_LVTMA:
Private->OutputControlId = atomLCDOutput;
break;
default:
xfree(Private);