diff --git a/src/rhd.h b/src/rhd.h index 8790f4f..cbba493 100644 --- a/src/rhd.h +++ b/src/rhd.h @@ -154,6 +154,7 @@ union rhdPropertyData #define RHD_POWER_ON 0 #define RHD_POWER_RESET 1 /* off temporarily */ #define RHD_POWER_SHUTDOWN 2 /* long term shutdown */ +#define RHD_POWER_UNKNOWN 3 /* initial state */ #define RHD_VBIOS_SIZE 0x10000 diff --git a/src/rhd_dac.c b/src/rhd_dac.c index 77b9f6a..1012491 100644 --- a/src/rhd_dac.c +++ b/src/rhd_dac.c @@ -295,9 +295,13 @@ DACPower(struct rhdOutput *Output, CARD16 offset, int Power) { CARD32 powerdown; + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + switch (Power) { - case RHD_POWER_ON: + + case RHD_POWER_ON: switch (Output->SensedType) { case RHD_SENSED_TV_SVIDEO: powerdown = 0 /* 0x100 */; diff --git a/src/rhd_ddia.c b/src/rhd_ddia.c index 5b51b38..0bf2c32 100644 --- a/src/rhd_ddia.c +++ b/src/rhd_ddia.c @@ -215,7 +215,8 @@ DDIAMode(struct rhdOutput *Output, DisplayModePtr Mode) static void DDIAPower(struct rhdOutput *Output, int Power) { - RHDFUNC(Output); + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); switch (Power) { case RHD_POWER_ON: diff --git a/src/rhd_dig.c b/src/rhd_dig.c index f79c7fc..9718c46 100644 --- a/src/rhd_dig.c +++ b/src/rhd_dig.c @@ -945,7 +945,8 @@ DigPower(struct rhdOutput *Output, int Power) struct transmitter *Transmitter = &Private->Transmitter; struct encoder *Encoder = &Private->Encoder; - RHDFUNC(Output); + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); switch (Power) { case RHD_POWER_ON: diff --git a/src/rhd_lvtma.c b/src/rhd_lvtma.c index 05fec46..53649ab 100644 --- a/src/rhd_lvtma.c +++ b/src/rhd_lvtma.c @@ -478,7 +478,8 @@ LVDSShutdown(struct rhdOutput *Output) static void LVDSPower(struct rhdOutput *Output, int Power) { - RHDFUNC(Output); + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); switch (Power) { case RHD_POWER_ON: @@ -1122,7 +1123,8 @@ TMDSBPower(struct rhdOutput *Output, int Power) RHDPtr rhdPtr = RHDPTRI(Output); struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; - RHDFUNC(Output); + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); RHDRegMask(Output, LVTMA_MODE, 0x00000001, 0x00000001); /* select TMDS */ diff --git a/src/rhd_output.c b/src/rhd_output.c index bee1a46..6da5e96 100644 --- a/src/rhd_output.c +++ b/src/rhd_output.c @@ -34,6 +34,12 @@ #include "rhd_output.h" #include "rhd_crtc.h" +char *rhdPowerString[] = { + "POWER_ON", + "POWER_RESET", + "POWER_SHUTDOWN" +}; + void RHDOutputAdd(RHDPtr rhdPtr, struct rhdOutput *New) { diff --git a/src/rhd_output.h b/src/rhd_output.h index 1f7fbc2..c0e772b 100644 --- a/src/rhd_output.h +++ b/src/rhd_output.h @@ -57,6 +57,8 @@ enum rhdOutputProperty { RHD_OUTPUT_COHERENT }; +char *rhdPowerString[3]; + /* * * This structure should deal with everything output related. diff --git a/src/rhd_tmds.c b/src/rhd_tmds.c index 8fa0cde..c9f8112 100644 --- a/src/rhd_tmds.c +++ b/src/rhd_tmds.c @@ -51,6 +51,7 @@ struct rhdTMDSPrivate { Bool RunsDualLink; DisplayModePtr Mode; Bool Coherent; + int PowerState; Bool Stored; @@ -339,33 +340,37 @@ TMDSAPower(struct rhdOutput *Output, int Power) RHDPtr rhdPtr = RHDPTRI(Output); struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; - RHDFUNC(Output); + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); switch (Power) { case RHD_POWER_ON: - RHDRegMask(Output, TMDSA_CNTL, 0x00000001, 0x00000001); - - RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001); - usleep(20); + if (Private->PowerState == RHD_POWER_SHUTDOWN + || Private->PowerState == RHD_POWER_UNKNOWN) { + RHDRegMask(Output, TMDSA_CNTL, 0x00000001, 0x00000001); - /* reset transmitter PLL */ - RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); - usleep(2); - RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x00000002); + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001); + usleep(20); - usleep(30); - - /* restart data synchronisation */ - if (rhdPtr->ChipSet < RHD_R600) { - RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0x00000001, 0x00000001); - usleep(2); - RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0x00000100, 0x00000100); - RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0, 0x00000001); - } else { - RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0x00000001, 0x00000001); + /* reset transmitter PLL */ + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); usleep(2); - RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0x00000100, 0x00000100); - RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0, 0x00000001); + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x00000002); + + usleep(30); + + /* restart data synchronisation */ + if (rhdPtr->ChipSet < RHD_R600) { + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0x00000100, 0x00000100); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0, 0x00000001); + } else { + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0x00000100, 0x00000100); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0, 0x00000001); + } } if (Private->RunsDualLink) { @@ -374,10 +379,12 @@ TMDSAPower(struct rhdOutput *Output, int Power) RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x00001F1F, 0x00001F1F); } else RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x0000001F, 0x00001F1F); + Private->PowerState = RHD_POWER_ON; return; case RHD_POWER_RESET: RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00001F1F); + Private->PowerState = RHD_POWER_RESET; return; case RHD_POWER_SHUTDOWN: @@ -387,6 +394,7 @@ TMDSAPower(struct rhdOutput *Output, int Power) RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x00000001); RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00001F1F); RHDRegMask(Output, TMDSA_CNTL, 0, 0x00000001); + Private->PowerState = RHD_POWER_SHUTDOWN; return; } } @@ -505,6 +513,7 @@ RHDTMDSAInit(RHDPtr rhdPtr) Private = xnfcalloc(sizeof(struct rhdTMDSPrivate), 1); Private->RunsDualLink = FALSE; Private->Coherent = TRUE; + Private->PowerState = RHD_POWER_UNKNOWN; Output->Private = Private;