diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 48 |
1 files changed, 19 insertions, 29 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index afc4db280b94..2a027e00762a 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -685,23 +685,15 @@ static const uint32_t default_tvdac_adj[CHIP_LAST] = { | |||
| 685 | 0x00780000, /* rs480 */ | 685 | 0x00780000, /* rs480 */ |
| 686 | }; | 686 | }; |
| 687 | 687 | ||
| 688 | static struct radeon_encoder_tv_dac | 688 | static void radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev, |
| 689 | *radeon_legacy_get_tv_dac_info_from_table(struct radeon_device *rdev) | 689 | struct radeon_encoder_tv_dac *tv_dac) |
| 690 | { | 690 | { |
| 691 | struct radeon_encoder_tv_dac *tv_dac = NULL; | ||
| 692 | |||
| 693 | tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); | ||
| 694 | |||
| 695 | if (!tv_dac) | ||
| 696 | return NULL; | ||
| 697 | |||
| 698 | tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; | 691 | tv_dac->ps2_tvdac_adj = default_tvdac_adj[rdev->family]; |
| 699 | if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) | 692 | if ((rdev->flags & RADEON_IS_MOBILITY) && (rdev->family == CHIP_RV250)) |
| 700 | tv_dac->ps2_tvdac_adj = 0x00880000; | 693 | tv_dac->ps2_tvdac_adj = 0x00880000; |
| 701 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; | 694 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 702 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; | 695 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 703 | 696 | return; | |
| 704 | return tv_dac; | ||
| 705 | } | 697 | } |
| 706 | 698 | ||
| 707 | struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | 699 | struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct |
| @@ -713,19 +705,18 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 713 | uint16_t dac_info; | 705 | uint16_t dac_info; |
| 714 | uint8_t rev, bg, dac; | 706 | uint8_t rev, bg, dac; |
| 715 | struct radeon_encoder_tv_dac *tv_dac = NULL; | 707 | struct radeon_encoder_tv_dac *tv_dac = NULL; |
| 708 | int found = 0; | ||
| 709 | |||
| 710 | tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); | ||
| 711 | if (!tv_dac) | ||
| 712 | return NULL; | ||
| 716 | 713 | ||
| 717 | if (rdev->bios == NULL) | 714 | if (rdev->bios == NULL) |
| 718 | return radeon_legacy_get_tv_dac_info_from_table(rdev); | 715 | goto out; |
| 719 | 716 | ||
| 720 | /* first check TV table */ | 717 | /* first check TV table */ |
| 721 | dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); | 718 | dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE); |
| 722 | if (dac_info) { | 719 | if (dac_info) { |
| 723 | tv_dac = | ||
| 724 | kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); | ||
| 725 | |||
| 726 | if (!tv_dac) | ||
| 727 | return NULL; | ||
| 728 | |||
| 729 | rev = RBIOS8(dac_info + 0x3); | 720 | rev = RBIOS8(dac_info + 0x3); |
| 730 | if (rev > 4) { | 721 | if (rev > 4) { |
| 731 | bg = RBIOS8(dac_info + 0xc) & 0xf; | 722 | bg = RBIOS8(dac_info + 0xc) & 0xf; |
| @@ -739,6 +730,7 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 739 | bg = RBIOS8(dac_info + 0x10) & 0xf; | 730 | bg = RBIOS8(dac_info + 0x10) & 0xf; |
| 740 | dac = RBIOS8(dac_info + 0x11) & 0xf; | 731 | dac = RBIOS8(dac_info + 0x11) & 0xf; |
| 741 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); | 732 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); |
| 733 | found = 1; | ||
| 742 | } else if (rev > 1) { | 734 | } else if (rev > 1) { |
| 743 | bg = RBIOS8(dac_info + 0xc) & 0xf; | 735 | bg = RBIOS8(dac_info + 0xc) & 0xf; |
| 744 | dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; | 736 | dac = (RBIOS8(dac_info + 0xc) >> 4) & 0xf; |
| @@ -751,22 +743,15 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 751 | bg = RBIOS8(dac_info + 0xe) & 0xf; | 743 | bg = RBIOS8(dac_info + 0xe) & 0xf; |
| 752 | dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; | 744 | dac = (RBIOS8(dac_info + 0xe) >> 4) & 0xf; |
| 753 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); | 745 | tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); |
| 746 | found = 1; | ||
| 754 | } | 747 | } |
| 755 | |||
| 756 | tv_dac->tv_std = radeon_combios_get_tv_info(encoder); | 748 | tv_dac->tv_std = radeon_combios_get_tv_info(encoder); |
| 757 | 749 | } | |
| 758 | } else { | 750 | if (!found) { |
| 759 | /* then check CRT table */ | 751 | /* then check CRT table */ |
| 760 | dac_info = | 752 | dac_info = |
| 761 | combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); | 753 | combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); |
| 762 | if (dac_info) { | 754 | if (dac_info) { |
| 763 | tv_dac = | ||
| 764 | kzalloc(sizeof(struct radeon_encoder_tv_dac), | ||
| 765 | GFP_KERNEL); | ||
| 766 | |||
| 767 | if (!tv_dac) | ||
| 768 | return NULL; | ||
| 769 | |||
| 770 | rev = RBIOS8(dac_info) & 0x3; | 755 | rev = RBIOS8(dac_info) & 0x3; |
| 771 | if (rev < 2) { | 756 | if (rev < 2) { |
| 772 | bg = RBIOS8(dac_info + 0x3) & 0xf; | 757 | bg = RBIOS8(dac_info + 0x3) & 0xf; |
| @@ -775,6 +760,7 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 775 | (bg << 16) | (dac << 20); | 760 | (bg << 16) | (dac << 20); |
| 776 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; | 761 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 777 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; | 762 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 763 | found = 1; | ||
| 778 | } else { | 764 | } else { |
| 779 | bg = RBIOS8(dac_info + 0x4) & 0xf; | 765 | bg = RBIOS8(dac_info + 0x4) & 0xf; |
| 780 | dac = RBIOS8(dac_info + 0x5) & 0xf; | 766 | dac = RBIOS8(dac_info + 0x5) & 0xf; |
| @@ -782,13 +768,17 @@ struct radeon_encoder_tv_dac *radeon_combios_get_tv_dac_info(struct | |||
| 782 | (bg << 16) | (dac << 20); | 768 | (bg << 16) | (dac << 20); |
| 783 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; | 769 | tv_dac->pal_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 784 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; | 770 | tv_dac->ntsc_tvdac_adj = tv_dac->ps2_tvdac_adj; |
| 771 | found = 1; | ||
| 785 | } | 772 | } |
| 786 | } else { | 773 | } else { |
| 787 | DRM_INFO("No TV DAC info found in BIOS\n"); | 774 | DRM_INFO("No TV DAC info found in BIOS\n"); |
| 788 | return radeon_legacy_get_tv_dac_info_from_table(rdev); | ||
| 789 | } | 775 | } |
| 790 | } | 776 | } |
| 791 | 777 | ||
| 778 | out: | ||
| 779 | if (!found) /* fallback to defaults */ | ||
| 780 | radeon_legacy_get_tv_dac_info_from_table(rdev, tv_dac); | ||
| 781 | |||
| 792 | return tv_dac; | 782 | return tv_dac; |
| 793 | } | 783 | } |
| 794 | 784 | ||
