Commit 2072d9aa authored by Connor Behan's avatar Connor Behan

Improve handling of monitor and output types

Checking for OUTPUT_DVI is not the same as checking for MT_DFP. There
might be r128 cards with a DVI-I connector. These have the capability of
driving an MT_CRT so we now check the monitor type before programming
DAC or TMDS registers.

This patch also removes R128ConnectorType and R128BIOSConnector because
they were not doing much. These data structures are more useful for the
radeon driver where there is a much wider range of cards.
Signed-off-by: Connor Behan's avatarConnor Behan <connor.behan@gmail.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 6dc5e9ab
......@@ -504,7 +504,6 @@ typedef struct {
Bool DDC;
Bool VGAAccess;
R128BIOSConnector BiosConnector[R128_MAX_BIOS_CONNECTOR];
/****** Added for dualhead support *******************/
BOOL IsSecondary; /* second Screen */
......
......@@ -3225,7 +3225,7 @@ void R128InitRMXRegisters(R128SavePtr orig, R128SavePtr save,
save->fp_h_sync_strt_wid = save->crtc_h_sync_strt_wid;
save->fp_v_sync_strt_wid = save->crtc_v_sync_strt_wid;
if (r128_output->type != OUTPUT_DVI && r128_output->type != OUTPUT_LVDS)
if (r128_output->MonType != MT_DFP && r128_output->MonType != MT_LCD)
return;
if (r128_output->PanelXRes == 0 || r128_output->PanelYRes == 0) {
......
......@@ -90,21 +90,21 @@ static void r128_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayMode
if (r128_crtc->crtc_id == 0)
R128InitRMXRegisters(&info->SavedReg, &info->ModeReg, output, adjusted_mode);
if (r128_output->type == OUTPUT_DVI)
if (r128_output->MonType == MT_DFP)
R128InitFPRegisters(&info->SavedReg, &info->ModeReg, output);
else if (r128_output->type == OUTPUT_LVDS)
else if (r128_output->MonType == MT_LCD)
R128InitLVDSRegisters(&info->SavedReg, &info->ModeReg, output);
else if (r128_output->type == OUTPUT_VGA)
else if (r128_output->MonType == MT_CRT)
R128InitDACRegisters(&info->SavedReg, &info->ModeReg, output);
if (r128_crtc->crtc_id == 0)
R128RestoreRMXRegisters(pScrn, &info->ModeReg);
if (r128_output->type == OUTPUT_DVI)
if (r128_output->MonType == MT_DFP)
R128RestoreFPRegisters(pScrn, &info->ModeReg);
else if (r128_output->type == OUTPUT_LVDS)
else if (r128_output->MonType == MT_LCD)
R128RestoreLVDSRegisters(pScrn, &info->ModeReg);
else if (r128_output->type == OUTPUT_VGA)
else if (r128_output->MonType == MT_CRT)
R128RestoreDACRegisters(pScrn, &info->ModeReg);
}
......@@ -375,133 +375,91 @@ static Bool R128I2CInit(xf86OutputPtr output, I2CBusPtr *bus_ptr, char *name)
return TRUE;
}
void R128SetOutputType(ScrnInfoPtr pScrn, R128OutputPrivatePtr r128_output)
{
R128OutputType output = OUTPUT_NONE;
switch (r128_output->ConnectorType) {
case CONNECTOR_VGA:
output = OUTPUT_VGA;
break;
case CONNECTOR_LVDS:
output = OUTPUT_LVDS;
break;
case CONNECTOR_DVI_D:
case CONNECTOR_DVI_I:
case CONNECTOR_DVI_A:
output = OUTPUT_DVI;
break;
default:
output = OUTPUT_NONE;
}
r128_output->type = output;
}
void R128SetupGenericConnectors(ScrnInfoPtr pScrn)
void R128SetupGenericConnectors(ScrnInfoPtr pScrn, R128OutputType *otypes)
{
R128InfoPtr info = R128PTR(pScrn);
R128EntPtr pR128Ent = R128EntPriv(pScrn);
if (!pR128Ent->HasCRTC2 && !info->isDFP) {
info->BiosConnector[0].ConnectorType = CONNECTOR_VGA;
info->BiosConnector[0].valid = TRUE;
otypes[0] = OUTPUT_VGA;
return;
} else if (!pR128Ent->HasCRTC2) {
info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_D;
info->BiosConnector[0].valid = TRUE;
otypes[0] = OUTPUT_DVI;
return;
}
info->BiosConnector[0].ConnectorType = CONNECTOR_LVDS;
info->BiosConnector[0].valid = TRUE;
info->BiosConnector[1].ConnectorType = CONNECTOR_VGA;
info->BiosConnector[1].valid = TRUE;
otypes[0] = OUTPUT_LVDS;
otypes[1] = OUTPUT_VGA;
}
Bool R128SetupConnectors(ScrnInfoPtr pScrn)
{
R128InfoPtr info = R128PTR(pScrn);
R128EntPtr pR128Ent = R128EntPriv(pScrn);
xf86OutputPtr output;
R128OutputType otypes[R128_MAX_BIOS_CONNECTOR];
xf86OutputPtr output;
int num_vga = 0;
int num_dvi = 0;
int i;
for (i = 0; i < R128_MAX_BIOS_CONNECTOR; i++) {
info->BiosConnector[i].valid = FALSE;
info->BiosConnector[i].ConnectorType = CONNECTOR_NONE;
}
/* XXX: Can we make R128GetConnectorInfoFromBIOS()? */
R128SetupGenericConnectors(pScrn);
R128SetupGenericConnectors(pScrn, otypes);
for (i = 0; i < R128_MAX_BIOS_CONNECTOR; i++) {
if (info->BiosConnector[i].valid) {
if ((info->BiosConnector[i].ConnectorType == CONNECTOR_DVI_D) ||
(info->BiosConnector[i].ConnectorType == CONNECTOR_DVI_I) ||
(info->BiosConnector[i].ConnectorType == CONNECTOR_DVI_A)) {
num_dvi++;
} else if (info->BiosConnector[i].ConnectorType == CONNECTOR_VGA) {
num_vga++;
}
}
if (otypes[i] == OUTPUT_VGA)
num_vga++;
else if (otypes[i] == OUTPUT_DVI)
num_dvi++;
}
for (i = 0; i < R128_MAX_BIOS_CONNECTOR; i++) {
if (info->BiosConnector[i].valid) {
R128I2CBusRec i2c;
R128OutputPrivatePtr r128_output;
R128ConnectorType conntype = info->BiosConnector[i].ConnectorType;
if (otypes[i] == OUTPUT_NONE) continue;
if (conntype == CONNECTOR_NONE)
continue;
R128I2CBusRec i2c;
R128OutputPrivatePtr r128_output;
r128_output = xnfcalloc(sizeof(R128OutputPrivateRec), 1);
if (!r128_output) return FALSE;
r128_output = xnfcalloc(sizeof(R128OutputPrivateRec), 1);
if (!r128_output) return FALSE;
r128_output->MonType = MT_UNKNOWN;
r128_output->ConnectorType = conntype;
r128_output->num = i;
r128_output->MonType = MT_UNKNOWN;
r128_output->type = otypes[i];
r128_output->num = i;
if (conntype == CONNECTOR_LVDS) {
output = R128OutputCreate(pScrn, "LVDS", 0);
} else if (conntype == CONNECTOR_VGA) {
output = R128OutputCreate(pScrn, "VGA-%d", --num_vga);
} else {
output = R128OutputCreate(pScrn, "DVI-%d", --num_dvi);
}
if (otypes[i] == OUTPUT_LVDS) {
output = R128OutputCreate(pScrn, "LVDS", 0);
} else if (otypes[i] == OUTPUT_VGA) {
output = R128OutputCreate(pScrn, "VGA-%d", --num_vga);
} else {
output = R128OutputCreate(pScrn, "DVI-%d", --num_dvi);
}
if (!output) return FALSE;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
output->driver_private = r128_output;
output->possible_clones = 0;
if (conntype == CONNECTOR_LVDS || !pR128Ent->HasCRTC2)
output->possible_crtcs = 1;
else
output->possible_crtcs = 2;
if (conntype != CONNECTOR_LVDS && info->DDC) {
i2c.ddc_reg = R128_GPIO_MONID;
i2c.put_clk_mask = R128_GPIO_MONID_EN_3;
i2c.get_clk_mask = R128_GPIO_MONID_Y_3;
if (conntype == CONNECTOR_VGA) {
i2c.put_data_mask = R128_GPIO_MONID_EN_1;
i2c.get_data_mask = R128_GPIO_MONID_Y_1;
} else {
i2c.put_data_mask = R128_GPIO_MONID_EN_0;
i2c.get_data_mask = R128_GPIO_MONID_Y_0;
}
r128_output->ddc_i2c = i2c;
R128I2CInit(output, &r128_output->pI2CBus, output->name);
} else if (conntype == CONNECTOR_LVDS) {
r128_output->PanelXRes = info->PanelXRes;
r128_output->PanelYRes = info->PanelYRes;
if (!output) return FALSE;
output->interlaceAllowed = TRUE;
output->doubleScanAllowed = TRUE;
output->driver_private = r128_output;
output->possible_clones = 0;
if (otypes[i] == OUTPUT_LVDS || !pR128Ent->HasCRTC2)
output->possible_crtcs = 1;
else
output->possible_crtcs = 2;
if (otypes[i] != OUTPUT_LVDS && info->DDC) {
i2c.ddc_reg = R128_GPIO_MONID;
i2c.put_clk_mask = R128_GPIO_MONID_EN_3;
i2c.get_clk_mask = R128_GPIO_MONID_Y_3;
if (otypes[i] == OUTPUT_VGA) {
i2c.put_data_mask = R128_GPIO_MONID_EN_1;
i2c.get_data_mask = R128_GPIO_MONID_Y_1;
} else {
i2c.put_data_mask = R128_GPIO_MONID_EN_0;
i2c.get_data_mask = R128_GPIO_MONID_Y_0;
}
R128SetOutputType(pScrn, r128_output);
r128_output->ddc_i2c = i2c;
R128I2CInit(output, &r128_output->pI2CBus, output->name);
} else if (otypes[i] == OUTPUT_LVDS) {
r128_output->PanelXRes = info->PanelXRes;
r128_output->PanelYRes = info->PanelYRes;
}
}
......
......@@ -110,16 +110,6 @@ typedef enum
MT_STV = 5
} R128MonitorType;
typedef enum
{
CONNECTOR_NONE,
CONNECTOR_VGA,
CONNECTOR_DVI_I,
CONNECTOR_DVI_D,
CONNECTOR_DVI_A,
CONNECTOR_LVDS
} R128ConnectorType;
typedef enum
{
OUTPUT_NONE,
......@@ -144,15 +134,9 @@ typedef struct _R128CrtcPrivateRec {
uint8_t lut_r[256], lut_g[256], lut_b[256];
} R128CrtcPrivateRec, *R128CrtcPrivatePtr;
typedef struct {
R128ConnectorType ConnectorType;
Bool valid;
} R128BIOSConnector;
typedef struct _R128OutputPrivateRec {
int num;
R128OutputType type;
R128ConnectorType ConnectorType;
R128MonitorType MonType;
I2CBusPtr pI2CBus;
R128I2CBusRec ddc_i2c;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment