summaryrefslogtreecommitdiff
path: root/linux-core
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2008-08-11 14:26:43 -0400
committerDave Airlie <airlied@redhat.com>2008-08-14 09:19:02 +1000
commitb6f5b8ec7169320b79561c88ad04aefa795b3497 (patch)
tree760c11490bb0aee86f5ea26fa327957e86d12871 /linux-core
parent5f427e9aaed76ec827b9523b4022205f5bd09a4a (diff)
unify connector, i2c handling for atom and legacy
Diffstat (limited to 'linux-core')
-rw-r--r--linux-core/radeon_atombios.c4
-rw-r--r--linux-core/radeon_combios.c41
-rw-r--r--linux-core/radeon_connectors.c64
-rw-r--r--linux-core/radeon_display.c27
-rw-r--r--linux-core/radeon_mode.h8
5 files changed, 77 insertions, 67 deletions
diff --git a/linux-core/radeon_atombios.c b/linux-core/radeon_atombios.c
index cdb001c1..eb482d92 100644
--- a/linux-core/radeon_atombios.c
+++ b/linux-core/radeon_atombios.c
@@ -62,12 +62,16 @@ static inline struct radeon_i2c_bus_rec radeon_lookup_gpio_for_ddc(struct drm_de
i2c.put_data_reg = le16_to_cpu(gpio.usDataEnRegisterIndex) * 4;
i2c.get_clk_reg = le16_to_cpu(gpio.usClkY_RegisterIndex) * 4;
i2c.get_data_reg = le16_to_cpu(gpio.usDataY_RegisterIndex) * 4;
+ i2c.a_clk_reg = le16_to_cpu(gpio.usClkA_RegisterIndex) * 4;
+ i2c.a_data_reg = le16_to_cpu(gpio.usDataA_RegisterIndex) * 4;
i2c.mask_clk_mask = (1 << gpio.ucClkMaskShift);
i2c.mask_data_mask = (1 << gpio.ucDataMaskShift);
i2c.put_clk_mask = (1 << gpio.ucClkEnShift);
i2c.put_data_mask = (1 << gpio.ucDataEnShift);
i2c.get_clk_mask = (1 << gpio.ucClkY_Shift);
i2c.get_data_mask = (1 << gpio.ucDataY_Shift);
+ i2c.a_clk_mask = (1 << gpio.ucClkA_Shift);
+ i2c.a_data_mask = (1 << gpio.ucDataA_Shift);
i2c.valid = true;
return i2c;
diff --git a/linux-core/radeon_combios.c b/linux-core/radeon_combios.c
index 8a1dd8b3..3b01385c 100644
--- a/linux-core/radeon_combios.c
+++ b/linux-core/radeon_combios.c
@@ -57,8 +57,10 @@ struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line)
{
struct radeon_i2c_bus_rec i2c;
- i2c.mask_clk_mask = RADEON_GPIO_EN_1 | RADEON_GPIO_Y_1;
- i2c.mask_data_mask = RADEON_GPIO_EN_0 | RADEON_GPIO_Y_0;
+ 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.put_clk_mask = RADEON_GPIO_EN_1;
i2c.put_data_mask = RADEON_GPIO_EN_0;
i2c.get_clk_mask = RADEON_GPIO_Y_1;
@@ -67,6 +69,8 @@ struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line)
(ddc_line == RADEON_MDGPIO_EN_REG)) {
i2c.mask_clk_reg = ddc_line;
i2c.mask_data_reg = ddc_line;
+ i2c.a_clk_reg = ddc_line;
+ i2c.a_data_reg = ddc_line;
i2c.put_clk_reg = ddc_line;
i2c.put_data_reg = ddc_line;
i2c.get_clk_reg = ddc_line + 4;
@@ -74,17 +78,19 @@ struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line)
} else {
i2c.mask_clk_reg = ddc_line;
i2c.mask_data_reg = ddc_line;
+ i2c.a_clk_reg = ddc_line;
+ i2c.a_data_reg = ddc_line;
i2c.put_clk_reg = ddc_line;
i2c.put_data_reg = ddc_line;
i2c.get_clk_reg = ddc_line;
i2c.get_data_reg = ddc_line;
}
-
+
if (ddc_line)
i2c.valid = true;
else
i2c.valid = false;
-
+
return i2c;
}
@@ -196,7 +202,7 @@ bool radeon_combios_get_tmds_info(struct radeon_encoder *encoder)
if (n > 4) n = 4;
for (i = 0; i < n; i++) {
encoder->tmds_pll[i].value = radeon_bios32(dev_priv, tmp+i*10+0x08);
- encoder->tmds_pll[i].freq = radeon_bios16(dev_priv, tmp+i*10+0x10);
+ encoder->tmds_pll[i].freq = radeon_bios16(dev_priv, tmp+i*10+0x10);
}
return true;
} else if (ver == 4) {
@@ -219,7 +225,7 @@ static void radeon_apply_legacy_quirks(struct drm_device *dev, int bios_index)
struct drm_radeon_private *dev_priv = dev->dev_private;
struct radeon_mode_info *mode_info = &dev_priv->mode_info;
- /* on XPRESS chips, CRT2_DDC and MONID_DCC both use the
+ /* on XPRESS chips, CRT2_DDC and MONID_DCC both use the
* MONID gpio, but use different pins.
* CRT2_DDC uses the standard pinout, MONID_DDC uses
* something else.
@@ -231,17 +237,6 @@ static void radeon_apply_legacy_quirks(struct drm_device *dev, int bios_index)
mode_info->bios_connector[bios_index].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID);
}
- /* XPRESS desktop chips seem to have a proprietary connector listed for
- * DVI-D, try and do the right thing here.
- */
- if ((dev_priv->flags & RADEON_IS_MOBILITY) &&
- (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_LVDS)) {
- DRM_INFO("proprietary connector found. assuming DVI-D\n");
- mode_info->bios_connector[bios_index].dac_type = DAC_NONE;
- mode_info->bios_connector[bios_index].tmds_type = TMDS_EXT;
- mode_info->bios_connector[bios_index].connector_type = CONNECTOR_DVI_D;
- }
-
/* Certain IBM chipset RN50s have a BIOS reporting two VGAs,
one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */
if (dev->pdev->device == 0x515e &&
@@ -272,16 +267,16 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
enum radeon_combios_ddc ddctype;
enum radeon_combios_connector connector_type;
int i;
-
+
DRM_DEBUG("\n");
offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x50);
if (offset) {
for (i = 0; i < 4; i++) {
entry = offset + 2 + i * 2;
-
+
if (!radeon_bios16(dev_priv, entry))
break;
-
+
mode_info->bios_connector[i].valid = true;
tmp = radeon_bios16(dev_priv, entry);
@@ -291,7 +286,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
switch(connector_type) {
case CONNECTOR_PROPRIETARY_LEGACY:
- mode_info->bios_connector[i].connector_type = CONNECTOR_LVDS;
+ mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_D;
break;
case CONNECTOR_CRT_LEGACY:
mode_info->bios_connector[i].connector_type = CONNECTOR_VGA;
@@ -406,7 +401,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
if (!mode_info->bios_connector[i].valid)
continue;
-
+
DRM_DEBUG("Port %d: ddc_type 0x%x, dac_type %d, tmds_type %d, connector type %d, hpd_mask %d\n",
i, mode_info->bios_connector[i].ddc_i2c.mask_clk_reg,
mode_info->bios_connector[i].dac_type,
@@ -417,4 +412,4 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
return true;
}
-
+
diff --git a/linux-core/radeon_connectors.c b/linux-core/radeon_connectors.c
index 344b4f77..2cc0be06 100644
--- a/linux-core/radeon_connectors.c
+++ b/linux-core/radeon_connectors.c
@@ -36,9 +36,9 @@ static int radeon_lvds_get_modes(struct drm_connector *connector)
int ret = 0;
struct edid *edid;
- avivo_i2c_do_lock(radeon_connector, 1);
+ radeon_i2c_do_lock(radeon_connector, 1);
edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
- avivo_i2c_do_lock(radeon_connector, 0);
+ radeon_i2c_do_lock(radeon_connector, 0);
if (edid) {
drm_mode_connector_update_edid_property(&radeon_connector->base, edid);
ret = drm_add_edid_modes(&radeon_connector->base, edid);
@@ -53,7 +53,7 @@ static int radeon_lvds_get_modes(struct drm_connector *connector)
return ret;
radeon_encoder_update_panel_size(lvds_encoder, connector);
-#endif
+#endif
return ret;
}
@@ -111,33 +111,33 @@ struct drm_connector_funcs radeon_lvds_connector_funcs = {
.destroy = radeon_connector_destroy,
};
-static int radeon_atom_vga_get_modes(struct drm_connector *connector)
+static int radeon_vga_get_modes(struct drm_connector *connector)
{
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
int ret;
ret = radeon_ddc_get_modes(radeon_connector);
-
+
return ret;
}
-static int radeon_atom_vga_mode_valid(struct drm_connector *connector,
+static int radeon_vga_mode_valid(struct drm_connector *connector,
struct drm_display_mode *mode)
{
return MODE_OK;
}
-static enum drm_connector_status radeon_atom_vga_detect(struct drm_connector *connector)
+static enum drm_connector_status radeon_vga_detect(struct drm_connector *connector)
{
struct edid *edid;
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
struct drm_encoder *encoder;
struct drm_encoder_helper_funcs *encoder_funcs;
- avivo_i2c_do_lock(radeon_connector, 1);
+ radeon_i2c_do_lock(radeon_connector, 1);
edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
- avivo_i2c_do_lock(radeon_connector, 0);
+ radeon_i2c_do_lock(radeon_connector, 0);
if (edid) {
kfree(edid);
return connector_status_connected;
@@ -152,20 +152,20 @@ static enum drm_connector_status radeon_atom_vga_detect(struct drm_connector *co
return encoder_funcs->detect(encoder, connector);
}
-struct drm_connector_helper_funcs radeon_atom_vga_connector_helper_funcs = {
- .get_modes = radeon_atom_vga_get_modes,
- .mode_valid = radeon_atom_vga_mode_valid,
+struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
+ .get_modes = radeon_vga_get_modes,
+ .mode_valid = radeon_vga_mode_valid,
.best_encoder = radeon_best_single_encoder,
};
-struct drm_connector_funcs radeon_atom_vga_connector_funcs = {
- .detect = radeon_atom_vga_detect,
+struct drm_connector_funcs radeon_vga_connector_funcs = {
+ .detect = radeon_vga_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = radeon_connector_destroy,
};
-static enum drm_connector_status radeon_atom_dvi_detect(struct drm_connector *connector)
+static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connector)
{
struct edid *edid;
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
@@ -175,9 +175,9 @@ static enum drm_connector_status radeon_atom_dvi_detect(struct drm_connector *co
int i;
enum drm_connector_status ret;
- avivo_i2c_do_lock(radeon_connector, 1);
+ radeon_i2c_do_lock(radeon_connector, 1);
edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
- avivo_i2c_do_lock(radeon_connector, 0);
+ radeon_i2c_do_lock(radeon_connector, 0);
if (edid) {
/* if the monitor is digital - set the bits */
if (edid->digital)
@@ -212,7 +212,7 @@ static enum drm_connector_status radeon_atom_dvi_detect(struct drm_connector *co
}
/* okay need to be smart in here about which encoder to pick */
-struct drm_encoder *radeon_atom_dvi_encoder(struct drm_connector *connector)
+struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
{
int enc_id = connector->encoder_ids[0];
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
@@ -253,14 +253,14 @@ struct drm_encoder *radeon_atom_dvi_encoder(struct drm_connector *connector)
return NULL;
}
-struct drm_connector_helper_funcs radeon_atom_dvi_connector_helper_funcs = {
- .get_modes = radeon_atom_vga_get_modes,
- .mode_valid = radeon_atom_vga_mode_valid,
- .best_encoder = radeon_atom_dvi_encoder,
+struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
+ .get_modes = radeon_vga_get_modes,
+ .mode_valid = radeon_vga_mode_valid,
+ .best_encoder = radeon_dvi_encoder,
};
-struct drm_connector_funcs radeon_atom_dvi_connector_funcs = {
- .detect = radeon_atom_dvi_detect,
+struct drm_connector_funcs radeon_dvi_connector_funcs = {
+ .detect = radeon_dvi_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
.destroy = radeon_connector_destroy,
};
@@ -272,12 +272,12 @@ static struct connector_funcs {
struct drm_connector_helper_funcs *helper_funcs;
int conn_type;
char *i2c_id;
-} connector_fns[] = {
+} connector_fns[] = {
{ CONNECTOR_NONE, NULL, NULL, DRM_MODE_CONNECTOR_Unknown },
- { CONNECTOR_VGA, &radeon_atom_vga_connector_funcs, &radeon_atom_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA , "VGA"},
+ { CONNECTOR_VGA, &radeon_vga_connector_funcs, &radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA , "VGA"},
{ CONNECTOR_LVDS, &radeon_lvds_connector_funcs, &radeon_lvds_connector_helper_funcs, DRM_MODE_CONNECTOR_LVDS, "LVDS" },
- { CONNECTOR_DVI_A, &radeon_atom_vga_connector_funcs, &radeon_atom_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_DVIA, "DVI" },
- { CONNECTOR_DVI_I, &radeon_atom_dvi_connector_funcs, &radeon_atom_dvi_connector_helper_funcs, DRM_MODE_CONNECTOR_DVII, "DVI" },
+ { CONNECTOR_DVI_A, &radeon_vga_connector_funcs, &radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_DVIA, "DVI" },
+ { CONNECTOR_DVI_I, &radeon_dvi_connector_funcs, &radeon_dvi_connector_helper_funcs, DRM_MODE_CONNECTOR_DVII, "DVI" },
#if 0
{ CONNECTOR_DVI_D, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },
@@ -294,14 +294,14 @@ static struct connector_funcs {
{ CONNECTOR_DIN, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },
{ CONNECTOR_DISPLAY_PORT, radeon_vga_connector_funcs, radeon_vga_connector_helper_funcs, DRM_MODE_CONNECTOR_VGA },
#endif
-};
-
+};
+
struct drm_connector *radeon_connector_add(struct drm_device *dev, int bios_index)
{
struct radeon_connector *radeon_connector;
struct drm_radeon_private *dev_priv = dev->dev_private;
struct radeon_mode_info *mode_info = &dev_priv->mode_info;
- struct drm_connector *connector;
+ struct drm_connector *connector;
int table_idx;
for (table_idx = 0; table_idx < ARRAY_SIZE(connector_fns); table_idx++) {
@@ -323,7 +323,7 @@ struct drm_connector *radeon_connector_add(struct drm_device *dev, int bios_inde
connector_fns[table_idx].conn_type);
drm_connector_helper_add(&radeon_connector->base, connector_fns[table_idx].helper_funcs);
-
+
if (mode_info->bios_connector[bios_index].ddc_i2c.valid) {
radeon_connector->ddc_bus = radeon_i2c_create(dev, &mode_info->bios_connector[bios_index].ddc_i2c,
connector_fns[table_idx].i2c_id);
diff --git a/linux-core/radeon_display.c b/linux-core/radeon_display.c
index 97e9da55..5272d198 100644
--- a/linux-core/radeon_display.c
+++ b/linux-core/radeon_display.c
@@ -361,25 +361,35 @@ bool radeon_setup_enc_conn(struct drm_device *dev)
-void avivo_i2c_do_lock(struct radeon_connector *radeon_connector, int lock_state)
+void radeon_i2c_do_lock(struct radeon_connector *radeon_connector, int lock_state)
{
struct drm_radeon_private *dev_priv = radeon_connector->base.dev->dev_private;
uint32_t temp;
struct radeon_i2c_bus_rec *rec = &radeon_connector->ddc_bus->rec;
+ if (lock_state) {
+ temp = RADEON_READ(rec->a_clk_reg);
+ temp &= ~(rec->a_clk_mask);
+ RADEON_WRITE(rec->a_clk_reg, temp);
+
+ temp = RADEON_READ(rec->a_data_reg);
+ temp &= ~(rec->a_data_mask);
+ RADEON_WRITE(rec->a_data_reg, temp);
+ }
+
temp = RADEON_READ(rec->mask_clk_reg);
if (lock_state)
- temp |= rec->put_clk_mask;
+ temp |= rec->mask_clk_mask;
else
- temp &= ~rec->put_clk_mask;
+ temp &= ~rec->mask_clk_mask;
RADEON_WRITE(rec->mask_clk_reg, temp);
temp = RADEON_READ(rec->mask_clk_reg);
temp = RADEON_READ(rec->mask_data_reg);
if (lock_state)
- temp |= rec->put_data_mask;
+ temp |= rec->mask_data_mask;
else
- temp &= ~rec->put_data_mask;
+ temp &= ~rec->mask_data_mask;
RADEON_WRITE(rec->mask_data_reg, temp);
temp = RADEON_READ(rec->mask_data_reg);
}
@@ -392,12 +402,9 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
if (!radeon_connector->ddc_bus)
return -1;
-
- if (radeon_is_avivo(dev_priv))
- avivo_i2c_do_lock(radeon_connector, 1);
+ radeon_i2c_do_lock(radeon_connector, 1);
edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
- if (radeon_is_avivo(dev_priv))
- avivo_i2c_do_lock(radeon_connector, 0);
+ radeon_i2c_do_lock(radeon_connector, 0);
if (edid) {
drm_mode_connector_update_edid_property(&radeon_connector->base, edid);
ret = drm_add_edid_modes(&radeon_connector->base, edid);
diff --git a/linux-core/radeon_mode.h b/linux-core/radeon_mode.h
index 91c6f48d..b92490fc 100644
--- a/linux-core/radeon_mode.h
+++ b/linux-core/radeon_mode.h
@@ -91,6 +91,8 @@ struct radeon_i2c_bus_rec {
bool valid;
uint32_t mask_clk_reg;
uint32_t mask_data_reg;
+ uint32_t a_clk_reg;
+ uint32_t a_data_reg;
uint32_t put_clk_reg;
uint32_t put_data_reg;
uint32_t get_clk_reg;
@@ -101,6 +103,8 @@ struct radeon_i2c_bus_rec {
uint32_t put_data_mask;
uint32_t get_clk_mask;
uint32_t get_data_mask;
+ uint32_t a_clk_mask;
+ uint32_t a_data_mask;
};
struct radeon_bios_connector {
@@ -121,7 +125,7 @@ struct radeon_tmds_pll {
};
#define RADEON_MAX_BIOS_CONNECTOR 16
-
+
#define RADEON_PLL_USE_BIOS_DIVS (1 << 0)
#define RADEON_PLL_NO_ODD_POST_DIV (1 << 1)
#define RADEON_PLL_USE_REF_DIV (1 << 2)
@@ -406,7 +410,7 @@ void radeon_atombios_init_crtc(struct drm_device *dev,
struct radeon_crtc *radeon_crtc);
void radeon_legacy_init_crtc(struct drm_device *dev,
struct radeon_crtc *radeon_crtc);
-void avivo_i2c_do_lock(struct radeon_connector *radeon_connector, int lock_state);
+void radeon_i2c_do_lock(struct radeon_connector *radeon_connector, int lock_state);
void radeon_atom_static_pwrmgt_setup(struct drm_device *dev, int enable);
void radeon_atom_dyn_clk_setup(struct drm_device *dev, int enable);