summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rhd_atombios.c34
-rw-r--r--src/rhd_atombios.h3
-rw-r--r--src/rhd_atomcrtc.c3
-rw-r--r--src/rhd_crtc.c12
-rw-r--r--src/rhd_regs.h4
5 files changed, 47 insertions, 9 deletions
diff --git a/src/rhd_atombios.c b/src/rhd_atombios.c
index 26e32fc..be36d54 100644
--- a/src/rhd_atombios.c
+++ b/src/rhd_atombios.c
@@ -887,7 +887,7 @@ rhdAtomASICInitVersion(atomBiosHandlePtr handle)
*
*/
Bool
-rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomScaleMode mode)
+rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomScaleMode mode, enum AtomTVMode tvMode)
{
ENABLE_SCALER_PARAMETERS scaler;
AtomBiosArgRec data;
@@ -917,6 +917,38 @@ rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomSc
scaler.ucEnable = ATOM_SCALER_MULTI_EX;
break;
}
+ switch (tvMode) {
+ case ATOM_TVMODE_NTSC:
+ scaler.ucTVStandard = ATOM_TV_NTSC;
+ break;
+ case ATOM_TVMODE_NTSCJ:
+ scaler.ucTVStandard = ATOM_TV_NTSCJ;
+ break;
+ case ATOM_TVMODE_PAL:
+ scaler.ucTVStandard = ATOM_TV_PAL;
+ break;
+ case ATOM_TVMODE_PALM:
+ scaler.ucTVStandard = ATOM_TV_PALM;
+ break;
+ case ATOM_TVMODE_PALCN:
+ scaler.ucTVStandard = ATOM_TV_PALCN;
+ break;
+ case ATOM_TVMODE_PALN:
+ scaler.ucTVStandard = ATOM_TV_PALN;
+ break;
+ case ATOM_TVMODE_PAL60:
+ scaler.ucTVStandard = ATOM_TV_PAL60;
+ break;
+ case ATOM_TVMODE_SECAM:
+ scaler.ucTVStandard = ATOM_TV_SECAM;
+ break;
+ case ATOM_TVMODE_CV:
+ scaler.ucTVStandard = ATOM_TV_CV;
+ break;
+ case ATOM_TVMODE_NONE:
+ scaler.ucTVStandard = 0;
+ break;
+ }
data.exec.dataSpace = NULL;
data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableScaler);
diff --git a/src/rhd_atombios.h b/src/rhd_atombios.h
index 16c24f5..6c73deb 100644
--- a/src/rhd_atombios.h
+++ b/src/rhd_atombios.h
@@ -152,6 +152,7 @@ struct AtomDacCodeTableData
};
typedef enum AtomTVMode {
+ ATOM_TVMODE_NONE = 0,
ATOM_TVMODE_NTSC = 1 << 0,
ATOM_TVMODE_NTSCJ = 1 << 1,
ATOM_TVMODE_PAL = 1 << 2,
@@ -526,7 +527,7 @@ extern Bool rhdAtomASICInit(atomBiosHandlePtr handle);
extern struct atomCodeTableVersion rhdAtomASICInitVersion(atomBiosHandlePtr handle);
# endif
extern Bool rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scaler,
- enum atomScaleMode mode);
+ enum atomScaleMode mode, enum AtomTVMode tvMode);
extern struct atomCodeTableVersion rhdAtomSetScalerVersion(atomBiosHandlePtr handle);
extern Bool rhdAtomDigTransmitterControl(atomBiosHandlePtr handle, enum atomTransmitter id,
enum atomTransmitterAction action,
diff --git a/src/rhd_atomcrtc.c b/src/rhd_atomcrtc.c
index 72b3d8d..e1a92e4 100644
--- a/src/rhd_atomcrtc.c
+++ b/src/rhd_atomcrtc.c
@@ -136,7 +136,8 @@ rhdAtomScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type,
ScaleMode = atomScaleExpand;
break;
}
- rhdAtomSetScaler(rhdPtr->atomBIOS, Scaler, ScaleMode);
+ ScaleMode = atomScaleDisable;
+ rhdAtomSetScaler(rhdPtr->atomBIOS, Scaler, ScaleMode, ATOM_TVMODE_NONE);
data.Address = NULL;
RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data);
diff --git a/src/rhd_crtc.c b/src/rhd_crtc.c
index ea0728c..5181474 100644
--- a/src/rhd_crtc.c
+++ b/src/rhd_crtc.c
@@ -756,7 +756,7 @@ DxScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type,
ErrorF("None\n");
RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 0);
RHDRegWrite(Crtc, RegOff + D1SCL_TAP_CONTROL, 0);
- RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 0);
+ RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 2);
break;
case RHD_CRTC_SCALE_TYPE_CENTER: /* center of the actual mode */
ErrorF("Center\n");
@@ -773,7 +773,7 @@ DxScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type,
RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 0);
RHDRegWrite(Crtc, RegOff + D1SCL_UPDATE, 0);
- RHDRegWrite(Crtc, RegOff + D1SCL_DITHER, 0);
+ RHDRegWrite(Crtc, RegOff + D1SCL_FLIP_CONTROL, 0);
RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 1);
RHDRegWrite(Crtc, RegOff + D1SCL_HVSCALE, 0x00010001); /* both h/v */
@@ -980,9 +980,9 @@ D1ViewPortStart(struct rhdCrtc *Crtc, CARD16 X, CARD16 Y)
X = (X + 0x02) & ~0x03;
Y &= ~0x01;
- RHDRegMask(Crtc, D1SCL_UPDATE, 0x00010000, 0x0001000);
+ RHDRegMask(Crtc, D1SCL_UPDATE, DXSCL_UPDATE_LOCK, DXSCL_UPDATE_LOCK);
RHDRegWrite(Crtc, D1MODE_VIEWPORT_START, (X << 16) | Y);
- RHDRegMask(Crtc, D1SCL_UPDATE, 0, 0x0001000);
+ RHDRegMask(Crtc, D1SCL_UPDATE, 0, DXSCL_UPDATE_LOCK);
Crtc->X = X;
Crtc->Y = Y;
@@ -1000,9 +1000,9 @@ D2ViewPortStart(struct rhdCrtc *Crtc, CARD16 X, CARD16 Y)
X = (X + 0x02) & ~0x03;
Y &= ~0x01;
- RHDRegMask(Crtc, D2SCL_UPDATE, 0x00010000, 0x0001000);
+ RHDRegMask(Crtc, D2SCL_UPDATE, DXSCL_UPDATE_LOCK, DXSCL_UPDATE_LOCK);
RHDRegWrite(Crtc, D2MODE_VIEWPORT_START, (X << 16) | Y);
- RHDRegMask(Crtc, D2SCL_UPDATE, 0, 0x0001000);
+ RHDRegMask(Crtc, D2SCL_UPDATE, 0, DXSCL_UPDATE_LOCK);
Crtc->X = X;
Crtc->Y = Y;
diff --git a/src/rhd_regs.h b/src/rhd_regs.h
index 04c3f50..a233153 100644
--- a/src/rhd_regs.h
+++ b/src/rhd_regs.h
@@ -407,6 +407,10 @@ enum {
DC_GPIO_HPD_Y = 0x7E9C
};
+enum DXSCL_UPDATE_bits {
+ DXSCL_UPDATE_LOCK = (1 << 16)
+};
+
enum CONFIG_CNTL_BITS {
RS69_CFG_ATI_REV_ID_SHIFT = 8,
RS69_CFG_ATI_REV_ID_MASK = 0xF << RS69_CFG_ATI_REV_ID_SHIFT