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