diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_combios.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 565 | 
1 files changed, 297 insertions, 268 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 5e1474cde4b..7b7ea269549 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c @@ -39,8 +39,8 @@  /* from radeon_encoder.c */  extern uint32_t -radeon_get_encoder_id(struct drm_device *dev, uint32_t supported_device, -		      uint8_t dac); +radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device, +			uint8_t dac);  extern void radeon_link_encoder_connector(struct drm_device *dev);  /* from radeon_connector.c */ @@ -55,7 +55,7 @@ radeon_add_legacy_connector(struct drm_device *dev,  /* from radeon_legacy_encoder.c */  extern void -radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, +radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum,  			  uint32_t supported_device);  /* old legacy ATI BIOS routines */ @@ -480,9 +480,66 @@ radeon_combios_get_hardcoded_edid(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; +	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; @@ -503,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; @@ -522,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: @@ -599,7 +667,8 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde  		break;  	}  	i2c.mm_i2c = false; -	i2c.i2c_id = 0; + +	i2c.i2c_id = ddc;  	i2c.hpd = RADEON_HPD_NONE;  	if (ddc_line) @@ -610,6 +679,62 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde  	return i2c;  } +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, DDC_DVI, 0, 0); +	rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "DVI_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 = 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)  {  	struct radeon_device *rdev = dev->dev_private; @@ -788,47 +913,47 @@ radeon_combios_get_tv_info(struct radeon_device *rdev)  			switch (RBIOS8(tv_info + 7) & 0xf) {  			case 1:  				tv_std = TV_STD_NTSC; -				DRM_INFO("Default TV standard: NTSC\n"); +				DRM_DEBUG_KMS("Default TV standard: NTSC\n");  				break;  			case 2:  				tv_std = TV_STD_PAL; -				DRM_INFO("Default TV standard: PAL\n"); +				DRM_DEBUG_KMS("Default TV standard: PAL\n");  				break;  			case 3:  				tv_std = TV_STD_PAL_M; -				DRM_INFO("Default TV standard: PAL-M\n"); +				DRM_DEBUG_KMS("Default TV standard: PAL-M\n");  				break;  			case 4:  				tv_std = TV_STD_PAL_60; -				DRM_INFO("Default TV standard: PAL-60\n"); +				DRM_DEBUG_KMS("Default TV standard: PAL-60\n");  				break;  			case 5:  				tv_std = TV_STD_NTSC_J; -				DRM_INFO("Default TV standard: NTSC-J\n"); +				DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");  				break;  			case 6:  				tv_std = TV_STD_SCART_PAL; -				DRM_INFO("Default TV standard: SCART-PAL\n"); +				DRM_DEBUG_KMS("Default TV standard: SCART-PAL\n");  				break;  			default:  				tv_std = TV_STD_NTSC; -				DRM_INFO +				DRM_DEBUG_KMS  				    ("Unknown TV standard; defaulting to NTSC\n");  				break;  			}  			switch ((RBIOS8(tv_info + 9) >> 2) & 0x3) {  			case 0: -				DRM_INFO("29.498928713 MHz TV ref clk\n"); +				DRM_DEBUG_KMS("29.498928713 MHz TV ref clk\n");  				break;  			case 1: -				DRM_INFO("28.636360000 MHz TV ref clk\n"); +				DRM_DEBUG_KMS("28.636360000 MHz TV ref clk\n");  				break;  			case 2: -				DRM_INFO("14.318180000 MHz TV ref clk\n"); +				DRM_DEBUG_KMS("14.318180000 MHz TV ref clk\n");  				break;  			case 3: -				DRM_INFO("27.000000000 MHz TV ref clk\n"); +				DRM_DEBUG_KMS("27.000000000 MHz TV ref clk\n");  				break;  			default:  				break; @@ -1199,7 +1324,7 @@ bool radeon_legacy_get_tmds_info_from_combios(struct radeon_encoder *encoder,  	if (tmds_info) {  		ver = RBIOS8(tmds_info); -		DRM_INFO("DFP table revision: %d\n", ver); +		DRM_DEBUG_KMS("DFP table revision: %d\n", ver);  		if (ver == 3) {  			n = RBIOS8(tmds_info + 5) + 1;  			if (n > 4) @@ -1247,8 +1372,8 @@ 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); -	tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); +	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 */  	switch (rdev->mode_info.connector_table) { @@ -1269,86 +1394,33 @@ 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; -					tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); -					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) {  			ver = RBIOS8(offset); -			DRM_INFO("External TMDS Table revision: %d\n", ver); +			DRM_DEBUG_KMS("External TMDS Table revision: %d\n", ver);  			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_create(dev, &i2c_bus, "DVO"); -				break; -			case DDC_DVI: -				i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); -				tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); -				break; -			case DDC_VGA: -				i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); -				tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); -				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_create(dev, &i2c_bus, "DVO"); -				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; -				tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); -				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);  		}  	} @@ -1413,6 +1485,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  			/* PowerMac8,1 ? */  			/* imac g5 isight */  			rdev->mode_info.connector_table = CT_IMAC_G5_ISIGHT; +		} else if ((rdev->pdev->device == 0x4a48) && +			   (rdev->pdev->subsystem_vendor == 0x1002) && +			   (rdev->pdev->subsystem_device == 0x4a48)) { +			/* Mac X800 */ +			rdev->mode_info.connector_table = CT_MAC_X800;  		} else  #endif /* CONFIG_PPC_PMAC */  #ifdef CONFIG_PPC64 @@ -1430,10 +1507,10 @@ 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, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_CRT1_SUPPORT,  									1),  						  ATOM_DEVICE_CRT1_SUPPORT); @@ -1445,10 +1522,10 @@ 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, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_LCD1_SUPPORT,  									0),  						  ATOM_DEVICE_LCD1_SUPPORT); @@ -1460,10 +1537,10 @@ 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, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_CRT1_SUPPORT,  									1),  						  ATOM_DEVICE_CRT1_SUPPORT); @@ -1475,15 +1552,15 @@ 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, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_DFP1_SUPPORT,  									0),  						  ATOM_DEVICE_DFP1_SUPPORT);  			radeon_add_legacy_encoder(dev, -						  radeon_get_encoder_id(dev, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_CRT2_SUPPORT,  									2),  						  ATOM_DEVICE_CRT2_SUPPORT); @@ -1496,10 +1573,10 @@ 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, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_CRT1_SUPPORT,  									1),  						  ATOM_DEVICE_CRT1_SUPPORT); @@ -1516,7 +1593,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  			ddc_i2c.valid = false;  			hpd.hpd = RADEON_HPD_NONE;  			radeon_add_legacy_encoder(dev, -						  radeon_get_encoder_id(dev, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_TV1_SUPPORT,  									2),  						  ATOM_DEVICE_TV1_SUPPORT); @@ -1532,10 +1609,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_LCD1_SUPPORT,  								0),  					  ATOM_DEVICE_LCD1_SUPPORT); @@ -1544,10 +1621,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT2_SUPPORT,  								2),  					  ATOM_DEVICE_CRT2_SUPPORT); @@ -1559,7 +1636,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1573,10 +1650,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_LCD1_SUPPORT,  								0),  					  ATOM_DEVICE_LCD1_SUPPORT); @@ -1585,15 +1662,15 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_DFP2_SUPPORT,  								0),  					  ATOM_DEVICE_DFP2_SUPPORT);  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT1_SUPPORT,  								1),  					  ATOM_DEVICE_CRT1_SUPPORT); @@ -1608,7 +1685,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1622,10 +1699,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_LCD1_SUPPORT,  								0),  					  ATOM_DEVICE_LCD1_SUPPORT); @@ -1634,15 +1711,15 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_DFP1_SUPPORT,  								0),  					  ATOM_DEVICE_DFP1_SUPPORT);  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT1_SUPPORT,  								1),  					  ATOM_DEVICE_CRT1_SUPPORT); @@ -1656,7 +1733,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1670,10 +1747,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_LCD1_SUPPORT,  								0),  					  ATOM_DEVICE_LCD1_SUPPORT); @@ -1682,10 +1759,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT1_SUPPORT,  								1),  					  ATOM_DEVICE_CRT1_SUPPORT); @@ -1697,7 +1774,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1711,15 +1788,15 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_DFP2_SUPPORT,  								0),  					  ATOM_DEVICE_DFP2_SUPPORT);  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT2_SUPPORT,  								2),  					  ATOM_DEVICE_CRT2_SUPPORT); @@ -1734,7 +1811,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1748,15 +1825,15 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_DFP1_SUPPORT,  								0),  					  ATOM_DEVICE_DFP1_SUPPORT);  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT2_SUPPORT,  								2),  					  ATOM_DEVICE_CRT2_SUPPORT); @@ -1770,7 +1847,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1784,10 +1861,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_DFP1_SUPPORT,  								0),  					  ATOM_DEVICE_DFP1_SUPPORT); @@ -1796,10 +1873,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT2_SUPPORT,  								2),  					  ATOM_DEVICE_CRT2_SUPPORT); @@ -1811,7 +1888,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1825,10 +1902,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT1_SUPPORT,  								1),  					  ATOM_DEVICE_CRT1_SUPPORT); @@ -1837,10 +1914,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT2_SUPPORT,  								2),  					  ATOM_DEVICE_CRT2_SUPPORT); @@ -1852,7 +1929,7 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  		ddc_i2c.valid = false;  		hpd.hpd = RADEON_HPD_NONE;  		radeon_add_legacy_encoder(dev, -					  radeon_get_encoder_id(dev, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_TV1_SUPPORT,  								2),  					  ATOM_DEVICE_TV1_SUPPORT); @@ -1866,10 +1943,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT1_SUPPORT,  								1),  					  ATOM_DEVICE_CRT1_SUPPORT); @@ -1877,10 +1954,10 @@ 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, +					  radeon_get_encoder_enum(dev,  								ATOM_DEVICE_CRT2_SUPPORT,  								2),  					  ATOM_DEVICE_CRT2_SUPPORT); @@ -1889,6 +1966,48 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  					    CONNECTOR_OBJECT_ID_VGA,  					    &hpd);  		break; +	case CT_MAC_X800: +		DRM_INFO("Connector Table: %d (mac x800)\n", +			 rdev->mode_info.connector_table); +		/* DVI - primary dac, internal tmds */ +		ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); +		hpd.hpd = RADEON_HPD_1; /* ??? */ +		radeon_add_legacy_encoder(dev, +					  radeon_get_encoder_enum(dev, +								  ATOM_DEVICE_DFP1_SUPPORT, +								  0), +					  ATOM_DEVICE_DFP1_SUPPORT); +		radeon_add_legacy_encoder(dev, +					  radeon_get_encoder_enum(dev, +								  ATOM_DEVICE_CRT1_SUPPORT, +								  1), +					  ATOM_DEVICE_CRT1_SUPPORT); +		radeon_add_legacy_connector(dev, 0, +					    ATOM_DEVICE_DFP1_SUPPORT | +					    ATOM_DEVICE_CRT1_SUPPORT, +					    DRM_MODE_CONNECTOR_DVII, &ddc_i2c, +					    CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, +					    &hpd); +		/* DVI - tv dac, dvo */ +		ddc_i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); +		hpd.hpd = RADEON_HPD_2; /* ??? */ +		radeon_add_legacy_encoder(dev, +					  radeon_get_encoder_enum(dev, +								  ATOM_DEVICE_DFP2_SUPPORT, +								  0), +					  ATOM_DEVICE_DFP2_SUPPORT); +		radeon_add_legacy_encoder(dev, +					  radeon_get_encoder_enum(dev, +								  ATOM_DEVICE_CRT2_SUPPORT, +								  2), +					  ATOM_DEVICE_CRT2_SUPPORT); +		radeon_add_legacy_connector(dev, 1, +					    ATOM_DEVICE_DFP2_SUPPORT | +					    ATOM_DEVICE_CRT2_SUPPORT, +					    DRM_MODE_CONNECTOR_DVII, &ddc_i2c, +					    CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, +					    &hpd); +		break;  	default:  		DRM_INFO("Connector table: %d (invalid)\n",  			 rdev->mode_info.connector_table); @@ -1907,31 +2026,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; -	} - -	/* 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 */ @@ -2035,27 +2129,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: @@ -2082,7 +2156,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				else  					devices = ATOM_DEVICE_DFP1_SUPPORT;  				radeon_add_legacy_encoder(dev, -							  radeon_get_encoder_id +							  radeon_get_encoder_enum  							  (dev, devices, 0),  							  devices);  				radeon_add_legacy_connector(dev, i, devices, @@ -2096,7 +2170,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				if (tmp & 0x1) {  					devices = ATOM_DEVICE_CRT2_SUPPORT;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_CRT2_SUPPORT,  								   2), @@ -2104,7 +2178,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				} else {  					devices = ATOM_DEVICE_CRT1_SUPPORT;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_CRT1_SUPPORT,  								   1), @@ -2124,7 +2198,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				if (tmp & 0x1) {  					devices |= ATOM_DEVICE_CRT2_SUPPORT;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_CRT2_SUPPORT,  								   2), @@ -2132,7 +2206,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				} else {  					devices |= ATOM_DEVICE_CRT1_SUPPORT;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_CRT1_SUPPORT,  								   1), @@ -2141,7 +2215,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				if ((tmp >> 4) & 0x1) {  					devices |= ATOM_DEVICE_DFP2_SUPPORT;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_DFP2_SUPPORT,  								   0), @@ -2150,7 +2224,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  				} else {  					devices |= ATOM_DEVICE_DFP1_SUPPORT;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_DFP1_SUPPORT,  								   0), @@ -2175,7 +2249,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  					connector_object_id = CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I;  				}  				radeon_add_legacy_encoder(dev, -							  radeon_get_encoder_id +							  radeon_get_encoder_enum  							  (dev, devices, 0),  							  devices);  				radeon_add_legacy_connector(dev, i, devices, @@ -2188,7 +2262,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  			case CONNECTOR_CTV_LEGACY:  			case CONNECTOR_STV_LEGACY:  				radeon_add_legacy_encoder(dev, -							  radeon_get_encoder_id +							  radeon_get_encoder_enum  							  (dev,  							   ATOM_DEVICE_TV1_SUPPORT,  							   2), @@ -2215,17 +2289,17 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  			DRM_DEBUG_KMS("Found DFP table, assuming DVI connector\n");  			radeon_add_legacy_encoder(dev, -						  radeon_get_encoder_id(dev, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_CRT1_SUPPORT,  									1),  						  ATOM_DEVICE_CRT1_SUPPORT);  			radeon_add_legacy_encoder(dev, -						  radeon_get_encoder_id(dev, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_DFP1_SUPPORT,  									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, @@ -2241,11 +2315,11 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  			DRM_DEBUG_KMS("Found CRT table, assuming VGA connector\n");  			if (crt_info) {  				radeon_add_legacy_encoder(dev, -							  radeon_get_encoder_id(dev, +							  radeon_get_encoder_enum(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, @@ -2270,7 +2344,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  						     COMBIOS_LCD_DDC_INFO_TABLE);  			radeon_add_legacy_encoder(dev, -						  radeon_get_encoder_id(dev, +						  radeon_get_encoder_enum(dev,  									ATOM_DEVICE_LCD1_SUPPORT,  									0),  						  ATOM_DEVICE_LCD1_SUPPORT); @@ -2278,70 +2352,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); +						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); +						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"); @@ -2369,7 +2398,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  					hpd.hpd = RADEON_HPD_NONE;  					ddc_i2c.valid = false;  					radeon_add_legacy_encoder(dev, -								  radeon_get_encoder_id +								  radeon_get_encoder_enum  								  (dev,  								   ATOM_DEVICE_TV1_SUPPORT,  								   2),  |