drm/radeon/kms: rework combios i2c handling
authorAlex Deucher <alexdeucher@gmail.com>
Fri, 6 Aug 2010 01:21:17 +0000 (21:21 -0400)
committerDave Airlie <airlied@redhat.com>
Tue, 10 Aug 2010 00:46:49 +0000 (10:46 +1000)
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: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_combios.c

index 18c84cf..885dcfa 100644 (file)
@@ -479,21 +479,67 @@ radeon_combios_get_hardcoded_edid(struct radeon_device *rdev)
        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,
-                                                      int ddc_line)
+                                                      enum radeon_combios_ddc ddc,
+                                                      u32 clk_mask,
+                                                      u32 data_mask)
 {
        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) {
                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
                i2c.y_clk_reg = RADEON_MDGPIO_Y;
                i2c.y_data_reg = RADEON_MDGPIO_Y;
        } 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_data_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
                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) {
        case CHIP_R100:
        case CHIP_RV100:
@@ -611,23 +668,7 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
        }
        i2c.mm_i2c = false;
 
-       switch (ddc_line) {
-       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.i2c_id = ddc;
        i2c.hpd = RADEON_HPD_NONE;
 
        if (ddc_line)
@@ -643,23 +684,55 @@ void radeon_combios_i2c_init(struct radeon_device *rdev)
        struct drm_device *dev = rdev->ddev;
        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);
-       rdev->i2c_bus[2] = radeon_i2c_create(dev, &i2c, "VGA_DDC");
+       i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0);
+       rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "DVI_DDC");
 
-       i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
-       rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "CRT2_DDC");
+       i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0);
+       rdev->i2c_bus[1] = radeon_i2c_create(dev, &i2c, "VGA_DDC");
 
        i2c.valid = true;
        i2c.hw_capable = true;
        i2c.mm_i2c = true;
-       i2c.i2c_id = RADEON_I2C_MM_ID;
-       rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "MM_I2C");
+       i2c.i2c_id = 0xa0;
+       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)
@@ -1299,7 +1372,7 @@ bool radeon_legacy_get_ext_tmds_info_from_table(struct radeon_encoder *encoder,
        struct radeon_i2c_bus_rec i2c_bus;
 
        /* 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);
 
        /* XXX some macs have duallink chips */
@@ -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 radeon_device *rdev = dev->dev_private;
        uint16_t offset;
-       uint8_t ver, id, blocks, clk, data;
-       int i;
+       uint8_t ver;
        enum radeon_combios_ddc gpio;
        struct radeon_i2c_bus_rec i2c_bus;
 
        tmds->i2c_bus = NULL;
        if (rdev->flags & RADEON_IS_IGP) {
-               offset = combios_get_table_offset(dev, COMBIOS_I2C_INFO_TABLE);
-               if (offset) {
-                       ver = RBIOS8(offset);
-                       DRM_INFO("GPIO Table revision: %d\n", ver);
-                       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;
-                               }
-                       }
-               }
+               i2c_bus = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0);
+               tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
+               tmds->dvo_chip = DVO_SIL164;
+               tmds->slave_addr = 0x70 >> 1; /* 7 bit addressing */
        } else {
                offset = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
                if (offset) {
@@ -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 >>= 1; /* 7 bit addressing */
                        gpio = RBIOS8(offset + 4 + 3);
-                       switch (gpio) {
-                       case DDC_MONID:
-                               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 */
+                       if (gpio == DDC_LCD) {
+                               /* MM i2c */
                                i2c_bus.valid = true;
                                i2c_bus.hw_capable = true;
                                i2c_bus.mm_i2c = true;
-                               i2c_bus.i2c_id = RADEON_I2C_MM_ID;
-                               tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
-                               break;
-                       default:
-                               DRM_ERROR("Unsupported gpio %d\n", gpio);
-                               break;
-                       }
+                               i2c_bus.i2c_id = 0xa0;
+                       } else
+                               i2c_bus = combios_setup_i2c_bus(rdev, gpio, 0, 0);
+                       tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
                }
        }
 
@@ -1485,7 +1502,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                /* these are the most common settings */
                if (rdev->flags & RADEON_SINGLE_CRTC) {
                        /* 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;
                        radeon_add_legacy_encoder(dev,
                                                  radeon_get_encoder_id(dev,
@@ -1500,7 +1517,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                                    &hpd);
                } else if (rdev->flags & RADEON_IS_MOBILITY) {
                        /* 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;
                        radeon_add_legacy_encoder(dev,
                                                  radeon_get_encoder_id(dev,
@@ -1515,7 +1532,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                                    &hpd);
 
                        /* 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;
                        radeon_add_legacy_encoder(dev,
                                                  radeon_get_encoder_id(dev,
@@ -1530,7 +1547,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                                    &hpd);
                } else {
                        /* 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;
                        radeon_add_legacy_encoder(dev,
                                                  radeon_get_encoder_id(dev,
@@ -1551,7 +1568,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                                    &hpd);
 
                        /* 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;
                        radeon_add_legacy_encoder(dev,
                                                  radeon_get_encoder_id(dev,
@@ -1587,7 +1604,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                DRM_INFO("Connector Table: %d (ibook)\n",
                         rdev->mode_info.connector_table);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1599,7 +1616,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_LVDS,
                                            &hpd);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1640,7 +1657,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_LVDS,
                                            &hpd);
                /* 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; /* ??? */
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1689,7 +1706,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_LVDS,
                                            &hpd);
                /* 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; /* ??? */
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1737,7 +1754,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_LVDS,
                                            &hpd);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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; /* ??? */
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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; /* ??? */
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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; /* ??? */
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1851,7 +1868,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D,
                                            &hpd);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1880,7 +1897,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                DRM_INFO("Connector Table: %d (emac)\n",
                         rdev->mode_info.connector_table);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1892,7 +1909,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            CONNECTOR_OBJECT_ID_VGA,
                                            &hpd);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(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",
                         rdev->mode_info.connector_table);
                /* 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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1932,7 +1949,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)
                                            DRM_MODE_CONNECTOR_VGA, &ddc_i2c,
                                            CONNECTOR_OBJECT_ID_VGA,
                                            &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;
                radeon_add_legacy_encoder(dev,
                                          radeon_get_encoder_id(dev,
@@ -1962,33 +1979,6 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev,
                                       struct radeon_i2c_bus_rec *ddc_i2c,
                                       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,
           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)
                        connector = (tmp >> 12) & 0xf;
 
                        ddc_type = (tmp >> 8) & 0xf;
-                       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;
-                       default:
-                               ddc_i2c.valid = false;
-                               break;
-                       }
+                       ddc_i2c = combios_setup_i2c_bus(rdev, ddc_type, 0, 0);
 
                        switch (connector) {
                        case CONNECTOR_PROPRIETARY_LEGACY:
@@ -2282,7 +2252,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
                                                                        0),
                                                  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;
                        radeon_add_legacy_connector(dev,
                                                    0,
@@ -2302,7 +2272,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
                                                                                ATOM_DEVICE_CRT1_SUPPORT,
                                                                                1),
                                                          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;
                                radeon_add_legacy_connector(dev,
                                                            0,
@@ -2335,74 +2305,25 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
                        if (lcd_ddc_info) {
                                ddc_type = RBIOS8(lcd_ddc_info + 2);
                                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:
                                        ddc_i2c =
-                                           combios_setup_i2c_bus
-                                               (rdev, RADEON_GPIOPAD_MASK);
-                                       ddc_i2c.mask_clk_mask =
-                                           RBIOS32(lcd_ddc_info + 3);
-                                       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;
+                                               combios_setup_i2c_bus(rdev,
+                                                                     DDC_LCD,
+                                                                     RBIOS32(lcd_ddc_info + 3),
+                                                                     RBIOS32(lcd_ddc_info + 7));
                                        radeon_i2c_add(rdev, &ddc_i2c, "LCD");
                                        break;
                                case DDC_GPIO:
                                        ddc_i2c =
-                                           combios_setup_i2c_bus
-                                               (rdev, RADEON_MDGPIO_MASK);
-                                       ddc_i2c.mask_clk_mask =
-                                           RBIOS32(lcd_ddc_info + 3);
-                                       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;
+                                               combios_setup_i2c_bus(rdev,
+                                                                     DDC_GPIO,
+                                                                     RBIOS32(lcd_ddc_info + 3),
+                                                                     RBIOS32(lcd_ddc_info + 7));
                                        radeon_i2c_add(rdev, &ddc_i2c, "LCD");
                                        break;
                                default:
-                                       ddc_i2c.valid = false;
+                                       ddc_i2c =
+                                               combios_setup_i2c_bus(rdev, ddc_type, 0, 0);
                                        break;
                                }
                                DRM_DEBUG_KMS("LCD DDC Info Table found!\n");