diff options
Diffstat (limited to 'src/rhd_tmds.c')
-rw-r--r-- | src/rhd_tmds.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/rhd_tmds.c b/src/rhd_tmds.c index 31dfea1..1e5b4b3 100644 --- a/src/rhd_tmds.c +++ b/src/rhd_tmds.c @@ -46,6 +46,7 @@ #include "rhd_connector.h" #include "rhd_output.h" #include "rhd_regs.h" +#include "rhd_hdmi.h" struct rhdTMDSPrivate { Bool RunsDualLink; @@ -53,6 +54,8 @@ struct rhdTMDSPrivate { Bool Coherent; int PowerState; + struct rhdHdmi *Hdmi; + Bool Stored; CARD32 StoreControl; @@ -348,7 +351,7 @@ TMDSAPower(struct rhdOutput *Output, int Power) case RHD_POWER_ON: if (Private->PowerState == RHD_POWER_SHUTDOWN || Private->PowerState == RHD_POWER_UNKNOWN) { - RHDRegMask(Output, TMDSA_CNTL, 0x00000001, 0x00000001); + RHDRegMask(Output, TMDSA_CNTL, rhdPtr->enableHDMI_TMDSA ? 0x5 : 0x1, 0x00000005); RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001); usleep(20); @@ -380,6 +383,8 @@ TMDSAPower(struct rhdOutput *Output, int Power) RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x00001F1F, 0x00001F1F); } else RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x0000001F, 0x00001F1F); + + RHDHdmiEnable(Private->Hdmi, rhdPtr->enableHDMI_TMDSA); Private->PowerState = RHD_POWER_ON; return; @@ -397,7 +402,8 @@ TMDSAPower(struct rhdOutput *Output, int Power) usleep(2); RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x00000001); RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00001F1F); - RHDRegMask(Output, TMDSA_CNTL, 0, 0x00000001); + RHDRegMask(Output, TMDSA_CNTL, 0, 0x00000005); + RHDHdmiEnable(Private->Hdmi, FALSE); Private->PowerState = RHD_POWER_SHUTDOWN; return; } @@ -433,6 +439,8 @@ TMDSASave(struct rhdOutput *Output) if (ChipSet >= RHD_RV610) Private->StoreTXAdjust = RHDRegRead(Output, TMDSA_TRANSMITTER_ADJUST); + RHDHdmiSave(Private->Hdmi); + Private->Stored = TRUE; } @@ -471,6 +479,8 @@ TMDSARestore(struct rhdOutput *Output) if (ChipSet >= RHD_RV610) RHDRegWrite(Output, TMDSA_TRANSMITTER_ADJUST, Private->StoreTXAdjust); + + RHDHdmiRestore(Private->Hdmi); } /* @@ -479,12 +489,15 @@ TMDSARestore(struct rhdOutput *Output) static void TMDSADestroy(struct rhdOutput *Output) { + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; RHDFUNC(Output); - if (!Output->Private) + if (!Private) return; - xfree(Output->Private); + RHDHdmiDestroy(Private->Hdmi); + + xfree(Private); Output->Private = NULL; } @@ -518,6 +531,7 @@ RHDTMDSAInit(RHDPtr rhdPtr) Private->RunsDualLink = FALSE; Private->Coherent = FALSE; Private->PowerState = RHD_POWER_UNKNOWN; + Private->Hdmi = RHDHdmiInit(rhdPtr, HDMI_TMDS); Output->Private = Private; |