diff options
Diffstat (limited to 'src/rhd_atomout.c')
-rw-r--r-- | src/rhd_atomout.c | 39 |
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); |