unify connector, i2c handling for atom and legacy
authorAlex Deucher <alexdeucher@gmail.com>
Mon, 11 Aug 2008 18:26:43 +0000 (14:26 -0400)
committerDave Airlie <airlied@redhat.com>
Wed, 13 Aug 2008 23:19:02 +0000 (09:19 +1000)
linux-core/radeon_atombios.c
linux-core/radeon_combios.c
linux-core/radeon_connectors.c
linux-core/radeon_display.c
linux-core/radeon_mode.h

index cdb001c..eb482d9 100644 (file)
@@ -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;
index 8a1dd8b..3b01385 100644 (file)
@@ -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;
 }
-               
+
index 344b4f7..2cc0be0 100644 (file)
@@ -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);
index 97e9da5..5272d19 100644 (file)
@@ -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);
index 91c6f48..b92490f 100644 (file)
@@ -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);