Commit 179e8078 authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie

drm/radeon/kms: rework combios i2c handling

Handle asic specific table to hw mappings in
combios_setup_i2c_bus() directly.  This allows us
to remove most of the combios quirks and clean up
the i2c bus setup.
Signed-off-by: default avatarAlex Deucher <alexdeucher@gmail.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent f376b94f
...@@ -479,21 +479,67 @@ radeon_combios_get_hardcoded_edid(struct radeon_device *rdev) ...@@ -479,21 +479,67 @@ radeon_combios_get_hardcoded_edid(struct radeon_device *rdev)
return NULL; return NULL;
} }
/* standard i2c gpio lines */
#define RADEON_I2C_MONID_ID 0
#define RADEON_I2C_DVI_ID 1
#define RADEON_I2C_VGA_ID 2
#define RADEON_I2C_CRT2_ID 3
#define RADEON_I2C_MM_ID 4
/* custom defined gpio lines */
#define RADEON_I2C_LCD_ID 5 /* ddc for laptop panels */
#define RADEON_I2C_GPIO_ID 6 /* rs4xx gpio ddc */
#define RADEON_I2C_DVO_ID 7 /* i2c bus for dvo */
static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rdev, static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rdev,
int ddc_line) enum radeon_combios_ddc ddc,
u32 clk_mask,
u32 data_mask)
{ {
struct radeon_i2c_bus_rec i2c; struct radeon_i2c_bus_rec i2c;
int ddc_line = 0;
/* ddc id = mask reg
* DDC_NONE_DETECTED = none
* DDC_DVI = RADEON_GPIO_DVI_DDC
* DDC_VGA = RADEON_GPIO_VGA_DDC
* DDC_LCD = RADEON_GPIOPAD_MASK
* DDC_GPIO = RADEON_MDGPIO_MASK
* r1xx/r2xx
* DDC_MONID = RADEON_GPIO_MONID
* DDC_CRT2 = RADEON_GPIO_CRT2_DDC
* r3xx
* DDC_MONID = RADEON_GPIO_MONID
* DDC_CRT2 = RADEON_GPIO_DVI_DDC
* rs3xx/rs4xx
* DDC_MONID = RADEON_GPIOPAD_MASK
* DDC_CRT2 = RADEON_GPIO_MONID
*/
switch (ddc) {
case DDC_NONE_DETECTED:
default:
ddc_line = 0;
break;
case DDC_DVI:
ddc_line = RADEON_GPIO_DVI_DDC;
break;
case DDC_VGA:
ddc_line = RADEON_GPIO_VGA_DDC;
break;
case DDC_LCD:
ddc_line = RADEON_GPIOPAD_MASK;
break;
case DDC_GPIO:
ddc_line = RADEON_MDGPIO_MASK;
break;
case DDC_MONID:
if (rdev->family == CHIP_RS300 ||
rdev->family == CHIP_RS400 ||
rdev->family == CHIP_RS480)
ddc_line = RADEON_GPIOPAD_MASK;
else
ddc_line = RADEON_GPIO_MONID;
break;
case DDC_CRT2:
if (rdev->family == CHIP_RS300 ||
rdev->family == CHIP_RS400 ||
rdev->family == CHIP_RS480)
ddc_line = RADEON_GPIO_MONID;
else if (rdev->family >= CHIP_R300) {
ddc_line = RADEON_GPIO_DVI_DDC;
ddc = DDC_DVI;
} else
ddc_line = RADEON_GPIO_CRT2_DDC;
break;
}
if (ddc_line == RADEON_GPIOPAD_MASK) { if (ddc_line == RADEON_GPIOPAD_MASK) {
i2c.mask_clk_reg = RADEON_GPIOPAD_MASK; i2c.mask_clk_reg = RADEON_GPIOPAD_MASK;
...@@ -514,15 +560,6 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde ...@@ -514,15 +560,6 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
i2c.y_clk_reg = RADEON_MDGPIO_Y; i2c.y_clk_reg = RADEON_MDGPIO_Y;
i2c.y_data_reg = RADEON_MDGPIO_Y; i2c.y_data_reg = RADEON_MDGPIO_Y;
} else { } else {
i2c.mask_clk_mask = RADEON_GPIO_EN_1;
i2c.mask_data_mask = RADEON_GPIO_EN_0;
i2c.a_clk_mask = RADEON_GPIO_A_1;
i2c.a_data_mask = RADEON_GPIO_A_0;
i2c.en_clk_mask = RADEON_GPIO_EN_1;
i2c.en_data_mask = RADEON_GPIO_EN_0;
i2c.y_clk_mask = RADEON_GPIO_Y_1;
i2c.y_data_mask = RADEON_GPIO_Y_0;
i2c.mask_clk_reg = ddc_line; i2c.mask_clk_reg = ddc_line;
i2c.mask_data_reg = ddc_line; i2c.mask_data_reg = ddc_line;
i2c.a_clk_reg = ddc_line; i2c.a_clk_reg = ddc_line;
...@@ -533,6 +570,26 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde ...@@ -533,6 +570,26 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
i2c.y_data_reg = ddc_line; i2c.y_data_reg = ddc_line;
} }
if (clk_mask && data_mask) {
i2c.mask_clk_mask = clk_mask;
i2c.mask_data_mask = data_mask;
i2c.a_clk_mask = clk_mask;
i2c.a_data_mask = data_mask;
i2c.en_clk_mask = clk_mask;
i2c.en_data_mask = data_mask;
i2c.y_clk_mask = clk_mask;
i2c.y_data_mask = data_mask;
} else {
i2c.mask_clk_mask = RADEON_GPIO_EN_1;
i2c.mask_data_mask = RADEON_GPIO_EN_0;
i2c.a_clk_mask = RADEON_GPIO_A_1;
i2c.a_data_mask = RADEON_GPIO_A_0;
i2c.en_clk_mask = RADEON_GPIO_EN_1;
i2c.en_data_mask = RADEON_GPIO_EN_0;
i2c.y_clk_mask = RADEON_GPIO_Y_1;
i2c.y_data_mask = RADEON_GPIO_Y_0;
}
switch (rdev->family) { switch (rdev->family) {
case CHIP_R100: case CHIP_R100:
case CHIP_RV100: case CHIP_RV100:
...@@ -611,23 +668,7 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde ...@@ -611,23 +668,7 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
} }
i2c.mm_i2c = false; i2c.mm_i2c = false;
switch (ddc_line) { i2c.i2c_id = ddc;
case RADEON_GPIO_MONID:
i2c.i2c_id = RADEON_I2C_MONID_ID;
break;
case RADEON_GPIO_DVI_DDC:
i2c.i2c_id = RADEON_I2C_DVI_ID;
break;
case RADEON_GPIO_VGA_DDC:
i2c.i2c_id = RADEON_I2C_VGA_ID;
break;
case RADEON_GPIO_CRT2_DDC:
i2c.i2c_id = RADEON_I2C_CRT2_ID;
break;
default:
i2c.i2c_id = 0xff;
break;
}
i2c.hpd = RADEON_HPD_NONE; i2c.hpd = RADEON_HPD_NONE;
if (ddc_line) if (ddc_line)
...@@ -643,23 +684,55 @@ void radeon_combios_i2c_init(struct radeon_device *rdev) ...@@ -643,23 +684,55 @@ void radeon_combios_i2c_init(struct radeon_device *rdev)
struct drm_device *dev = rdev->ddev; struct drm_device *dev = rdev->ddev;
struct radeon_i2c_bus_rec i2c; struct radeon_i2c_bus_rec i2c;
i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "MONID");
i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
rdev->i2c_bus[1] = radeon_i2c_create(dev, &i2c, "DVI_DDC");
i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
rdev->i2c_bus[2] = radeon_i2c_create(dev, &i2c, "VGA_DDC"); rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "DVI_DDC");
i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "CRT2_DDC"); rdev->i2c_bus[1] = radeon_i2c_create(dev, &i2c, "VGA_DDC");
i2c.valid = true; i2c.valid = true;
i2c.hw_capable = true; i2c.hw_capable = true;
i2c.mm_i2c = true; i2c.mm_i2c = true;
i2c.i2c_id = RADEON_I2C_MM_ID; i2c.i2c_id = 0xa0;
rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "MM_I2C"); rdev->i2c_bus[2] = radeon_i2c_create(dev, &i2c, "MM_I2C");
if (rdev->family == CHIP_RS300 ||
rdev->family == CHIP_RS400 ||
rdev->family == CHIP_RS480) {
u16 offset;
u8 id, blocks, clk, data;
int i;
i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID");
offset = combios_get_table_offset(dev, COMBIOS_I2C_INFO_TABLE);
if (offset) {
blocks = RBIOS8(offset + 2);
for (i = 0; i < blocks; i++) {
id = RBIOS8(offset + 3 + (i * 5) + 0);
if (id == 136) {
clk = RBIOS8(offset + 3 + (i * 5) + 3);
data = RBIOS8(offset + 3 + (i * 5) + 4);
i2c = combios_setup_i2c_bus(rdev, DDC_MONID,
clk, data);
rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "GPIOPAD_MASK");
break;
}
}
}
} else if (rdev->family >= CHIP_R300) {
i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID");
} else {
i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID");
i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "CRT2_DDC");
}
} }
bool radeon_combios_get_clock_info(struct drm_device *dev) bool radeon_combios_get_clock_info(struct drm_device *dev)
...@@ -1299,7 +1372,7 @@ bool radeon_legacy_get_ext_tmds_info_from_table(struct radeon_encoder *encoder, ...@@ -1299,7 +1372,7 @@ bool radeon_legacy_get_ext_tmds_info_from_table(struct radeon_encoder *encoder,
struct radeon_i2c_bus_rec i2c_bus; struct radeon_i2c_bus_rec i2c_bus;
/* default for macs */ /* default for macs */
i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); i2c_bus = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus); tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
/* XXX some macs have duallink chips */ /* XXX some macs have duallink chips */
...@@ -1321,49 +1394,16 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder ...@@ -1321,49 +1394,16 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
struct drm_device *dev = encoder->base.dev; struct drm_device *dev = encoder->base.dev;
struct radeon_device *rdev = dev->dev_private; struct radeon_device *rdev = dev->dev_private;
uint16_t offset; uint16_t offset;
uint8_t ver, id, blocks, clk, data; uint8_t ver;
int i;
enum radeon_combios_ddc gpio; enum radeon_combios_ddc gpio;
struct radeon_i2c_bus_rec i2c_bus; struct radeon_i2c_bus_rec i2c_bus;
tmds->i2c_bus = NULL; tmds->i2c_bus = NULL;
if (rdev->flags & RADEON_IS_IGP) { if (rdev->flags & RADEON_IS_IGP) {
offset = combios_get_table_offset(dev, COMBIOS_I2C_INFO_TABLE); i2c_bus = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
if (offset) { tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
ver = RBIOS8(offset); tmds->dvo_chip = DVO_SIL164;
DRM_INFO("GPIO Table revision: %d\n", ver); tmds->slave_addr = 0x70 >> 1; /* 7 bit addressing */
blocks = RBIOS8(offset + 2);
for (i = 0; i < blocks; i++) {
id = RBIOS8(offset + 3 + (i * 5) + 0);
if (id == 136) {
clk = RBIOS8(offset + 3 + (i * 5) + 3);
data = RBIOS8(offset + 3 + (i * 5) + 4);
i2c_bus.valid = true;
i2c_bus.mask_clk_mask = (1 << clk);
i2c_bus.mask_data_mask = (1 << data);
i2c_bus.a_clk_mask = (1 << clk);
i2c_bus.a_data_mask = (1 << data);
i2c_bus.en_clk_mask = (1 << clk);
i2c_bus.en_data_mask = (1 << data);
i2c_bus.y_clk_mask = (1 << clk);
i2c_bus.y_data_mask = (1 << data);
i2c_bus.mask_clk_reg = RADEON_GPIOPAD_MASK;
i2c_bus.mask_data_reg = RADEON_GPIOPAD_MASK;
i2c_bus.a_clk_reg = RADEON_GPIOPAD_A;
i2c_bus.a_data_reg = RADEON_GPIOPAD_A;
i2c_bus.en_clk_reg = RADEON_GPIOPAD_EN;
i2c_bus.en_data_reg = RADEON_GPIOPAD_EN;
i2c_bus.y_clk_reg = RADEON_GPIOPAD_Y;
i2c_bus.y_data_reg = RADEON_GPIOPAD_Y;
i2c_bus.i2c_id = RADEON_I2C_DVO_ID;
radeon_i2c_add(rdev, &i2c_bus, "DVO");
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
tmds->dvo_chip = DVO_SIL164;
tmds->slave_addr = 0x70 >> 1; /* 7 bit addressing */
break;
}
}
}
} else { } else {
offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE); offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
if (offset) { if (offset) {
...@@ -1372,38 +1412,15 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder ...@@ -1372,38 +1412,15 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
tmds->slave_addr = RBIOS8(offset + 4 + 2); tmds->slave_addr = RBIOS8(offset + 4 + 2);
tmds->slave_addr >>= 1; /* 7 bit addressing */ tmds->slave_addr >>= 1; /* 7 bit addressing */
gpio = RBIOS8(offset + 4 + 3); gpio = RBIOS8(offset + 4 + 3);
switch (gpio) { if (gpio == DDC_LCD) {
case DDC_MONID: /* MM i2c */
i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
break;
case DDC_DVI:
i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
break;
case DDC_VGA:
i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
break;
case DDC_CRT2:
/* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */
if (rdev->family >= CHIP_R300)
i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
else
i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
break;
case DDC_LCD: /* MM i2c */
i2c_bus.valid = true; i2c_bus.valid = true;
i2c_bus.hw_capable = true; i2c_bus.hw_capable = true;
i2c_bus.mm_i2c = true; i2c_bus.mm_i2c = true;
i2c_bus.i2c_id = RADEON_I2C_MM_ID; i2c_bus.i2c_id = 0xa0;
tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus); } else
break; i2c_bus = combios_setup_i2c_bus(rdev, gpio, 0, 0);
default: tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
DRM_ERROR("Unsupported gpio %d\n", gpio);
break;
}
} }
} }
...@@ -1485,7 +1502,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1485,7 +1502,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
/* these are the most common settings */ /* these are the most common settings */
if (rdev->flags & RADEON_SINGLE_CRTC) { if (rdev->flags & RADEON_SINGLE_CRTC) {
/* VGA - primary dac */ /* VGA - primary dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1500,7 +1517,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1500,7 +1517,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
&hpd); &hpd);
} else if (rdev->flags & RADEON_IS_MOBILITY) { } else if (rdev->flags & RADEON_IS_MOBILITY) {
/* LVDS */ /* LVDS */
ddc_i2c = combios_setup_i2c_bus(rdev, 0); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_NONE_DETECTED, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1515,7 +1532,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1515,7 +1532,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
&hpd); &hpd);
/* VGA - primary dac */ /* VGA - primary dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1530,7 +1547,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1530,7 +1547,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
&hpd); &hpd);
} else { } else {
/* DVI-I - tv dac, int tmds */ /* DVI-I - tv dac, int tmds */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_1; hpd.hpd = RADEON_HPD_1;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1551,7 +1568,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1551,7 +1568,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
&hpd); &hpd);
/* VGA - primary dac */ /* VGA - primary dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1587,7 +1604,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1587,7 +1604,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (ibook)\n", DRM_INFO("Connector Table: %d (ibook)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* LVDS */ /* LVDS */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1599,7 +1616,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1599,7 +1616,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
CONNECTOR_OBJECT_ID_LVDS, CONNECTOR_OBJECT_ID_LVDS,
&hpd); &hpd);
/* VGA - TV DAC */ /* VGA - TV DAC */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1628,7 +1645,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1628,7 +1645,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (powerbook external tmds)\n", DRM_INFO("Connector Table: %d (powerbook external tmds)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* LVDS */ /* LVDS */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1640,7 +1657,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1640,7 +1657,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
CONNECTOR_OBJECT_ID_LVDS, CONNECTOR_OBJECT_ID_LVDS,
&hpd); &hpd);
/* DVI-I - primary dac, ext tmds */ /* DVI-I - primary dac, ext tmds */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_2; /* ??? */ hpd.hpd = RADEON_HPD_2; /* ??? */
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1677,7 +1694,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1677,7 +1694,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (powerbook internal tmds)\n", DRM_INFO("Connector Table: %d (powerbook internal tmds)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* LVDS */ /* LVDS */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1689,7 +1706,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1689,7 +1706,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
CONNECTOR_OBJECT_ID_LVDS, CONNECTOR_OBJECT_ID_LVDS,
&hpd); &hpd);
/* DVI-I - primary dac, int tmds */ /* DVI-I - primary dac, int tmds */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_1; /* ??? */ hpd.hpd = RADEON_HPD_1; /* ??? */
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1725,7 +1742,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1725,7 +1742,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (powerbook vga)\n", DRM_INFO("Connector Table: %d (powerbook vga)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* LVDS */ /* LVDS */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1737,7 +1754,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1737,7 +1754,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
CONNECTOR_OBJECT_ID_LVDS, CONNECTOR_OBJECT_ID_LVDS,
&hpd); &hpd);
/* VGA - primary dac */ /* VGA - primary dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1766,7 +1783,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1766,7 +1783,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (mini external tmds)\n", DRM_INFO("Connector Table: %d (mini external tmds)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* DVI-I - tv dac, ext tmds */ /* DVI-I - tv dac, ext tmds */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
hpd.hpd = RADEON_HPD_2; /* ??? */ hpd.hpd = RADEON_HPD_2; /* ??? */
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1803,7 +1820,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1803,7 +1820,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (mini internal tmds)\n", DRM_INFO("Connector Table: %d (mini internal tmds)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* DVI-I - tv dac, int tmds */ /* DVI-I - tv dac, int tmds */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
hpd.hpd = RADEON_HPD_1; /* ??? */ hpd.hpd = RADEON_HPD_1; /* ??? */
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1839,7 +1856,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1839,7 +1856,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (imac g5 isight)\n", DRM_INFO("Connector Table: %d (imac g5 isight)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* DVI-D - int tmds */ /* DVI-D - int tmds */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
hpd.hpd = RADEON_HPD_1; /* ??? */ hpd.hpd = RADEON_HPD_1; /* ??? */
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1851,7 +1868,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1851,7 +1868,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D, CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D,
&hpd); &hpd);
/* VGA - tv dac */ /* VGA - tv dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1880,7 +1897,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1880,7 +1897,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (emac)\n", DRM_INFO("Connector Table: %d (emac)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* VGA - primary dac */ /* VGA - primary dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1892,7 +1909,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1892,7 +1909,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
CONNECTOR_OBJECT_ID_VGA, CONNECTOR_OBJECT_ID_VGA,
&hpd); &hpd);
/* VGA - tv dac */ /* VGA - tv dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1921,7 +1938,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1921,7 +1938,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_INFO("Connector Table: %d (rn50-power)\n", DRM_INFO("Connector Table: %d (rn50-power)\n",
rdev->mode_info.connector_table); rdev->mode_info.connector_table);
/* VGA - primary dac */ /* VGA - primary dac */
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1932,7 +1949,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) ...@@ -1932,7 +1949,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
DRM_MODE_CONNECTOR_VGA, &ddc_i2c, DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
CONNECTOR_OBJECT_ID_VGA, CONNECTOR_OBJECT_ID_VGA,
&hpd); &hpd);
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_encoder(dev, radeon_add_legacy_encoder(dev,
radeon_get_encoder_id(dev, radeon_get_encoder_id(dev,
...@@ -1962,33 +1979,6 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev, ...@@ -1962,33 +1979,6 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev,
struct radeon_i2c_bus_rec *ddc_i2c, struct radeon_i2c_bus_rec *ddc_i2c,
struct radeon_hpd *hpd) struct radeon_hpd *hpd)
{ {
struct radeon_device *rdev = dev->dev_private;
/* XPRESS DDC quirks */
if ((rdev->family == CHIP_RS400 ||
rdev->family == CHIP_RS480) &&
ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC)
*ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
else if ((rdev->family == CHIP_RS400 ||
rdev->family == CHIP_RS480) &&
ddc_i2c->mask_clk_reg == RADEON_GPIO_MONID) {
*ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIOPAD_MASK);
ddc_i2c->mask_clk_mask = (0x20 << 8);
ddc_i2c->mask_data_mask = 0x80;
ddc_i2c->a_clk_mask = (0x20 << 8);
ddc_i2c->a_data_mask = 0x80;
ddc_i2c->en_clk_mask = (0x20 << 8);
ddc_i2c->en_data_mask = 0x80;
ddc_i2c->y_clk_mask = (0x20 << 8);
ddc_i2c->y_data_mask = 0x80;
ddc_i2c->i2c_id = RADEON_I2C_GPIO_ID;
radeon_i2c_add(rdev, ddc_i2c, "GPIO_DDC");
}
/* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */
if ((rdev->family >= CHIP_R300) &&
ddc_i2c->mask_clk_reg == RADEON_GPIO_CRT2_DDC)
*ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
/* Certain IBM chipset RN50s have a BIOS reporting two VGAs, /* Certain IBM chipset RN50s have a BIOS reporting two VGAs,
one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */ one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */
...@@ -2092,27 +2082,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) ...@@ -2092,27 +2082,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
connector = (tmp >> 12) & 0xf; connector = (tmp >> 12) & 0xf;
ddc_type = (tmp >> 8) & 0xf; ddc_type = (tmp >> 8) & 0xf;
switch (ddc_type) { ddc_i2c = combios_setup_i2c_bus(rdev, ddc_type, 0, 0);
case DDC_MONID:
ddc_i2c =
combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
break;
case DDC_DVI:
ddc_i2c =
combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
break;
case DDC_VGA:
ddc_i2c =
combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
break;
case DDC_CRT2:
ddc_i2c =
combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
break;
default:
ddc_i2c.valid = false;
break;
}
switch (connector) { switch (connector) {
case CONNECTOR_PROPRIETARY_LEGACY: case CONNECTOR_PROPRIETARY_LEGACY:
...@@ -2282,7 +2252,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) ...@@ -2282,7 +2252,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
0), 0),
ATOM_DEVICE_DFP1_SUPPORT); ATOM_DEVICE_DFP1_SUPPORT);
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
hpd.hpd = RADEON_HPD_1; hpd.hpd = RADEON_HPD_1;
radeon_add_legacy_connector(dev, radeon_add_legacy_connector(dev,
0, 0,
...@@ -2302,7 +2272,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) ...@@ -2302,7 +2272,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
ATOM_DEVICE_CRT1_SUPPORT, ATOM_DEVICE_CRT1_SUPPORT,
1), 1),
ATOM_DEVICE_CRT1_SUPPORT); ATOM_DEVICE_CRT1_SUPPORT);
ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
hpd.hpd = RADEON_HPD_NONE; hpd.hpd = RADEON_HPD_NONE;
radeon_add_legacy_connector(dev, radeon_add_legacy_connector(dev,
0, 0,
...@@ -2335,74 +2305,25 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) ...@@ -2335,74 +2305,25 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
if (lcd_ddc_info) { if (lcd_ddc_info) {
ddc_type = RBIOS8(lcd_ddc_info + 2); ddc_type = RBIOS8(lcd_ddc_info + 2);
switch (ddc_type) { switch (ddc_type) {
case DDC_MONID:
ddc_i2c =
combios_setup_i2c_bus
(rdev, RADEON_GPIO_MONID);
break;
case DDC_DVI:
ddc_i2c =
combios_setup_i2c_bus
(rdev, RADEON_GPIO_DVI_DDC);
break;
case DDC_VGA:
ddc_i2c =
combios_setup_i2c_bus
(rdev, RADEON_GPIO_VGA_DDC);
break;
case DDC_CRT2:
ddc_i2c =
combios_setup_i2c_bus
(rdev, RADEON_GPIO_CRT2_DDC);
break;
case DDC_LCD: case DDC_LCD:
ddc_i2c = ddc_i2c =
combios_setup_i2c_bus combios_setup_i2c_bus(rdev,
(rdev, RADEON_GPIOPAD_MASK); DDC_LCD,
ddc_i2c.mask_clk_mask = RBIOS32(lcd_ddc_info + 3),
RBIOS32(lcd_ddc_info + 3); RBIOS32(lcd_ddc_info + 7));
ddc_i2c.mask_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.a_clk_mask =
RBIOS32(lcd_ddc_info + 3);
ddc_i2c.a_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.en_clk_mask =
RBIOS32(lcd_ddc_info + 3);
ddc_i2c.en_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.y_clk_mask =
RBIOS32(lcd_ddc_info + 3);
ddc_i2c.y_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.i2c_id = RADEON_I2C_LCD_ID;
radeon_i2c_add(rdev, &ddc_i2c, "LCD"); radeon_i2c_add(rdev, &ddc_i2c, "LCD");
break; break;
case DDC_GPIO: case DDC_GPIO:
ddc_i2c = ddc_i2c =
combios_setup_i2c_bus combios_setup_i2c_bus(rdev,
(rdev, RADEON_MDGPIO_MASK); DDC_GPIO,
ddc_i2c.mask_clk_mask = RBIOS32(lcd_ddc_info + 3),
RBIOS32(lcd_ddc_info + 3); RBIOS32(lcd_ddc_info + 7));
ddc_i2c.mask_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.a_clk_mask =
RBIOS32(lcd_ddc_info + 3);
ddc_i2c.a_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.en_clk_mask =
RBIOS32(lcd_ddc_info + 3);
ddc_i2c.en_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.y_clk_mask =
RBIOS32(lcd_ddc_info + 3);
ddc_i2c.y_data_mask =
RBIOS32(lcd_ddc_info + 7);
ddc_i2c.i2c_id = RADEON_I2C_LCD_ID;
radeon_i2c_add(rdev, &ddc_i2c, "LCD"); radeon_i2c_add(rdev, &ddc_i2c, "LCD");
break; break;
default: default:
ddc_i2c.valid = false; ddc_i2c =
combios_setup_i2c_bus(rdev, ddc_type, 0, 0);
break; break;
} }
DRM_DEBUG_KMS("LCD DDC Info Table found!\n"); DRM_DEBUG_KMS("LCD DDC Info Table found!\n");
......
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