aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_combios.c
diff options
context:
space:
mode:
authorAlex Deucher <alexdeucher@gmail.com>2010-08-05 21:21:16 -0400
committerDave Airlie <airlied@redhat.com>2010-08-09 20:46:48 -0400
commitf376b94fbc0a313a606748206340cbef6c2adf6b (patch)
tree79687e8c214bf70251c242f8042bc46d6fc61020 /drivers/gpu/drm/radeon/radeon_combios.c
parent1729dd33d20bddf1b3f371f3090f0cfd6be50b7a (diff)
drm/radeon/kms: unify i2c handling
Previously we added i2c buses as needed when enumerating connectors power management, etc. This only exposed the actual buses used and could have lead to the same buse getting created more than once if one buses was used for more than one purpose. This patch sets up all i2c buses on the card in one place and users of the buses just point back to the one instance. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_combios.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_combios.c77
1 files changed, 69 insertions, 8 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c
index 5e1474cde4b4..18c84cf3eafa 100644
--- a/drivers/gpu/drm/radeon/radeon_combios.c
+++ b/drivers/gpu/drm/radeon/radeon_combios.c
@@ -479,6 +479,17 @@ radeon_combios_get_hardcoded_edid(struct radeon_device *rdev)
479 return NULL; 479 return NULL;
480} 480}
481 481
482/* standard i2c gpio lines */
483#define RADEON_I2C_MONID_ID 0
484#define RADEON_I2C_DVI_ID 1
485#define RADEON_I2C_VGA_ID 2
486#define RADEON_I2C_CRT2_ID 3
487#define RADEON_I2C_MM_ID 4
488/* custom defined gpio lines */
489#define RADEON_I2C_LCD_ID 5 /* ddc for laptop panels */
490#define RADEON_I2C_GPIO_ID 6 /* rs4xx gpio ddc */
491#define RADEON_I2C_DVO_ID 7 /* i2c bus for dvo */
492
482static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rdev, 493static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rdev,
483 int ddc_line) 494 int ddc_line)
484{ 495{
@@ -599,7 +610,24 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
599 break; 610 break;
600 } 611 }
601 i2c.mm_i2c = false; 612 i2c.mm_i2c = false;
602 i2c.i2c_id = 0; 613
614 switch (ddc_line) {
615 case RADEON_GPIO_MONID:
616 i2c.i2c_id = RADEON_I2C_MONID_ID;
617 break;
618 case RADEON_GPIO_DVI_DDC:
619 i2c.i2c_id = RADEON_I2C_DVI_ID;
620 break;
621 case RADEON_GPIO_VGA_DDC:
622 i2c.i2c_id = RADEON_I2C_VGA_ID;
623 break;
624 case RADEON_GPIO_CRT2_DDC:
625 i2c.i2c_id = RADEON_I2C_CRT2_ID;
626 break;
627 default:
628 i2c.i2c_id = 0xff;
629 break;
630 }
603 i2c.hpd = RADEON_HPD_NONE; 631 i2c.hpd = RADEON_HPD_NONE;
604 632
605 if (ddc_line) 633 if (ddc_line)
@@ -610,6 +638,30 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde
610 return i2c; 638 return i2c;
611} 639}
612 640
641void radeon_combios_i2c_init(struct radeon_device *rdev)
642{
643 struct drm_device *dev = rdev->ddev;
644 struct radeon_i2c_bus_rec i2c;
645
646 i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
647 rdev->i2c_bus[0] = radeon_i2c_create(dev, &i2c, "MONID");
648
649 i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
650 rdev->i2c_bus[1] = radeon_i2c_create(dev, &i2c, "DVI_DDC");
651
652 i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
653 rdev->i2c_bus[2] = radeon_i2c_create(dev, &i2c, "VGA_DDC");
654
655 i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
656 rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "CRT2_DDC");
657
658 i2c.valid = true;
659 i2c.hw_capable = true;
660 i2c.mm_i2c = true;
661 i2c.i2c_id = RADEON_I2C_MM_ID;
662 rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "MM_I2C");
663}
664
613bool radeon_combios_get_clock_info(struct drm_device *dev) 665bool radeon_combios_get_clock_info(struct drm_device *dev)
614{ 666{
615 struct radeon_device *rdev = dev->dev_private; 667 struct radeon_device *rdev = dev->dev_private;
@@ -1248,7 +1300,7 @@ bool radeon_legacy_get_ext_tmds_info_from_table(struct radeon_encoder *encoder,
1248 1300
1249 /* default for macs */ 1301 /* default for macs */
1250 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); 1302 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
1251 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1303 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1252 1304
1253 /* XXX some macs have duallink chips */ 1305 /* XXX some macs have duallink chips */
1254 switch (rdev->mode_info.connector_table) { 1306 switch (rdev->mode_info.connector_table) {
@@ -1303,7 +1355,9 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
1303 i2c_bus.en_data_reg = RADEON_GPIOPAD_EN; 1355 i2c_bus.en_data_reg = RADEON_GPIOPAD_EN;
1304 i2c_bus.y_clk_reg = RADEON_GPIOPAD_Y; 1356 i2c_bus.y_clk_reg = RADEON_GPIOPAD_Y;
1305 i2c_bus.y_data_reg = RADEON_GPIOPAD_Y; 1357 i2c_bus.y_data_reg = RADEON_GPIOPAD_Y;
1306 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1358 i2c_bus.i2c_id = RADEON_I2C_DVO_ID;
1359 radeon_i2c_add(rdev, &i2c_bus, "DVO");
1360 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1307 tmds->dvo_chip = DVO_SIL164; 1361 tmds->dvo_chip = DVO_SIL164;
1308 tmds->slave_addr = 0x70 >> 1; /* 7 bit addressing */ 1362 tmds->slave_addr = 0x70 >> 1; /* 7 bit addressing */
1309 break; 1363 break;
@@ -1321,15 +1375,15 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
1321 switch (gpio) { 1375 switch (gpio) {
1322 case DDC_MONID: 1376 case DDC_MONID:
1323 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); 1377 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
1324 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1378 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1325 break; 1379 break;
1326 case DDC_DVI: 1380 case DDC_DVI:
1327 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC); 1381 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_DVI_DDC);
1328 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1382 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1329 break; 1383 break;
1330 case DDC_VGA: 1384 case DDC_VGA:
1331 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); 1385 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC);
1332 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1386 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1333 break; 1387 break;
1334 case DDC_CRT2: 1388 case DDC_CRT2:
1335 /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ 1389 /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */
@@ -1337,13 +1391,14 @@ bool radeon_legacy_get_ext_tmds_info_from_combios(struct radeon_encoder *encoder
1337 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID); 1391 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_MONID);
1338 else 1392 else
1339 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); 1393 i2c_bus = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC);
1340 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1394 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1341 break; 1395 break;
1342 case DDC_LCD: /* MM i2c */ 1396 case DDC_LCD: /* MM i2c */
1343 i2c_bus.valid = true; 1397 i2c_bus.valid = true;
1344 i2c_bus.hw_capable = true; 1398 i2c_bus.hw_capable = true;
1345 i2c_bus.mm_i2c = true; 1399 i2c_bus.mm_i2c = true;
1346 tmds->i2c_bus = radeon_i2c_create(dev, &i2c_bus, "DVO"); 1400 i2c_bus.i2c_id = RADEON_I2C_MM_ID;
1401 tmds->i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1347 break; 1402 break;
1348 default: 1403 default:
1349 DRM_ERROR("Unsupported gpio %d\n", gpio); 1404 DRM_ERROR("Unsupported gpio %d\n", gpio);
@@ -1926,6 +1981,8 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev,
1926 ddc_i2c->en_data_mask = 0x80; 1981 ddc_i2c->en_data_mask = 0x80;
1927 ddc_i2c->y_clk_mask = (0x20 << 8); 1982 ddc_i2c->y_clk_mask = (0x20 << 8);
1928 ddc_i2c->y_data_mask = 0x80; 1983 ddc_i2c->y_data_mask = 0x80;
1984 ddc_i2c->i2c_id = RADEON_I2C_GPIO_ID;
1985 radeon_i2c_add(rdev, ddc_i2c, "GPIO_DDC");
1929 } 1986 }
1930 1987
1931 /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ 1988 /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */
@@ -2318,6 +2375,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
2318 RBIOS32(lcd_ddc_info + 3); 2375 RBIOS32(lcd_ddc_info + 3);
2319 ddc_i2c.y_data_mask = 2376 ddc_i2c.y_data_mask =
2320 RBIOS32(lcd_ddc_info + 7); 2377 RBIOS32(lcd_ddc_info + 7);
2378 ddc_i2c.i2c_id = RADEON_I2C_LCD_ID;
2379 radeon_i2c_add(rdev, &ddc_i2c, "LCD");
2321 break; 2380 break;
2322 case DDC_GPIO: 2381 case DDC_GPIO:
2323 ddc_i2c = 2382 ddc_i2c =
@@ -2339,6 +2398,8 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
2339 RBIOS32(lcd_ddc_info + 3); 2398 RBIOS32(lcd_ddc_info + 3);
2340 ddc_i2c.y_data_mask = 2399 ddc_i2c.y_data_mask =
2341 RBIOS32(lcd_ddc_info + 7); 2400 RBIOS32(lcd_ddc_info + 7);
2401 ddc_i2c.i2c_id = RADEON_I2C_LCD_ID;
2402 radeon_i2c_add(rdev, &ddc_i2c, "LCD");
2342 break; 2403 break;
2343 default: 2404 default:
2344 ddc_i2c.valid = false; 2405 ddc_i2c.valid = false;