diff options
| author | Alex Deucher <alexander.deucher@amd.com> | 2012-07-19 20:11:44 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2012-08-13 10:50:48 -0400 |
| commit | 3d61bd42135a5801ce6c2bc47f33277fde74e5ea (patch) | |
| tree | 4833499bd9455ee95524017ff9d06323dd91a27d | |
| parent | 9830605d4c070b16ec5c24a75503877cc7698409 (diff) | |
drm/radeon: fix handling for ddc type 5 on combios
When ddc type is 5, need to look up the i2c channel
in the i2c table.
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 57 |
1 files changed, 36 insertions, 21 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 576f4f6919f2..f75247d42ffd 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -719,6 +719,34 @@ static struct radeon_i2c_bus_rec combios_setup_i2c_bus(struct radeon_device *rde | |||
| 719 | return i2c; | 719 | return i2c; |
| 720 | } | 720 | } |
| 721 | 721 | ||
| 722 | static struct radeon_i2c_bus_rec radeon_combios_get_i2c_info_from_table(struct radeon_device *rdev) | ||
| 723 | { | ||
| 724 | struct drm_device *dev = rdev->ddev; | ||
| 725 | struct radeon_i2c_bus_rec i2c; | ||
| 726 | u16 offset; | ||
| 727 | u8 id, blocks, clk, data; | ||
| 728 | int i; | ||
| 729 | |||
| 730 | i2c.valid = false; | ||
| 731 | |||
| 732 | offset = combios_get_table_offset(dev, COMBIOS_I2C_INFO_TABLE); | ||
| 733 | if (offset) { | ||
| 734 | blocks = RBIOS8(offset + 2); | ||
| 735 | for (i = 0; i < blocks; i++) { | ||
| 736 | id = RBIOS8(offset + 3 + (i * 5) + 0); | ||
| 737 | if (id == 136) { | ||
| 738 | clk = RBIOS8(offset + 3 + (i * 5) + 3); | ||
| 739 | data = RBIOS8(offset + 3 + (i * 5) + 4); | ||
| 740 | /* gpiopad */ | ||
| 741 | i2c = combios_setup_i2c_bus(rdev, DDC_MONID, | ||
| 742 | (1 << clk), (1 << data)); | ||
| 743 | break; | ||
| 744 | } | ||
| 745 | } | ||
| 746 | } | ||
| 747 | return i2c; | ||
| 748 | } | ||
| 749 | |||
| 722 | void radeon_combios_i2c_init(struct radeon_device *rdev) | 750 | void radeon_combios_i2c_init(struct radeon_device *rdev) |
| 723 | { | 751 | { |
| 724 | struct drm_device *dev = rdev->ddev; | 752 | struct drm_device *dev = rdev->ddev; |
| @@ -755,30 +783,14 @@ void radeon_combios_i2c_init(struct radeon_device *rdev) | |||
| 755 | } else if (rdev->family == CHIP_RS300 || | 783 | } else if (rdev->family == CHIP_RS300 || |
| 756 | rdev->family == CHIP_RS400 || | 784 | rdev->family == CHIP_RS400 || |
| 757 | rdev->family == CHIP_RS480) { | 785 | rdev->family == CHIP_RS480) { |
| 758 | u16 offset; | ||
| 759 | u8 id, blocks, clk, data; | ||
| 760 | int i; | ||
| 761 | |||
| 762 | /* 0x68 */ | 786 | /* 0x68 */ |
| 763 | i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0); | 787 | i2c = combios_setup_i2c_bus(rdev, DDC_CRT2, 0, 0); |
| 764 | rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); | 788 | rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); |
| 765 | 789 | ||
| 766 | offset = combios_get_table_offset(dev, COMBIOS_I2C_INFO_TABLE); | 790 | /* gpiopad */ |
| 767 | if (offset) { | 791 | i2c = radeon_combios_get_i2c_info_from_table(rdev); |
| 768 | blocks = RBIOS8(offset + 2); | 792 | if (i2c.valid) |
| 769 | for (i = 0; i < blocks; i++) { | 793 | rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "GPIOPAD_MASK"); |
| 770 | id = RBIOS8(offset + 3 + (i * 5) + 0); | ||
| 771 | if (id == 136) { | ||
| 772 | clk = RBIOS8(offset + 3 + (i * 5) + 3); | ||
| 773 | data = RBIOS8(offset + 3 + (i * 5) + 4); | ||
| 774 | /* gpiopad */ | ||
| 775 | i2c = combios_setup_i2c_bus(rdev, DDC_MONID, | ||
| 776 | (1 << clk), (1 << data)); | ||
| 777 | rdev->i2c_bus[4] = radeon_i2c_create(dev, &i2c, "GPIOPAD_MASK"); | ||
| 778 | break; | ||
| 779 | } | ||
| 780 | } | ||
| 781 | } | ||
| 782 | } else if ((rdev->family == CHIP_R200) || | 794 | } else if ((rdev->family == CHIP_R200) || |
| 783 | (rdev->family >= CHIP_R300)) { | 795 | (rdev->family >= CHIP_R300)) { |
| 784 | /* 0x68 */ | 796 | /* 0x68 */ |
| @@ -2321,7 +2333,10 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev) | |||
| 2321 | connector = (tmp >> 12) & 0xf; | 2333 | connector = (tmp >> 12) & 0xf; |
| 2322 | 2334 | ||
| 2323 | ddc_type = (tmp >> 8) & 0xf; | 2335 | ddc_type = (tmp >> 8) & 0xf; |
| 2324 | ddc_i2c = combios_setup_i2c_bus(rdev, ddc_type, 0, 0); | 2336 | if (ddc_type == 5) |
| 2337 | ddc_i2c = radeon_combios_get_i2c_info_from_table(rdev); | ||
| 2338 | else | ||
| 2339 | ddc_i2c = combios_setup_i2c_bus(rdev, ddc_type, 0, 0); | ||
| 2325 | 2340 | ||
| 2326 | switch (connector) { | 2341 | switch (connector) { |
| 2327 | case CONNECTOR_PROPRIETARY_LEGACY: | 2342 | case CONNECTOR_PROPRIETARY_LEGACY: |
