diff options
| author | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2010-07-28 19:06:04 -0400 |
|---|---|---|
| committer | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2010-09-23 22:14:44 -0400 |
| commit | a54be174e425cb41eb774714d03ff98562ee0824 (patch) | |
| tree | 18629d30908ed45af499d610ff404558faaf944c | |
| parent | b002741d174a32f8162b2110ad9757b6fb6afcc3 (diff) | |
viafb: rework output device routing
This patch rips the device routing out of the 3 main functions to
separate functions to make them available for transition to a better
controlling scheme.
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Joseph Chan <JosephChan@via.com.tw>
| -rw-r--r-- | drivers/video/via/hw.c | 183 |
1 files changed, 94 insertions, 89 deletions
diff --git a/drivers/video/via/hw.c b/drivers/video/via/hw.c index 1ce2c211bd1d..2f7f64006499 100644 --- a/drivers/video/via/hw.c +++ b/drivers/video/via/hw.c | |||
| @@ -860,18 +860,78 @@ void viafb_set_output_path(int device, int set_iga, int output_interface) | |||
| 860 | enable_second_display_channel(); | 860 | enable_second_display_channel(); |
| 861 | } | 861 | } |
| 862 | 862 | ||
| 863 | static void set_crt_output_path(int set_iga) | 863 | static void set_source_common(u8 index, u8 offset, u8 iga) |
| 864 | { | 864 | { |
| 865 | viafb_write_reg_mask(CR36, VIACR, 0x00, BIT4 + BIT5); | 865 | u8 value, mask = 1 << offset; |
| 866 | 866 | ||
| 867 | switch (set_iga) { | 867 | switch (iga) { |
| 868 | case IGA1: | ||
| 869 | value = 0x00; | ||
| 870 | break; | ||
| 871 | case IGA2: | ||
| 872 | value = mask; | ||
| 873 | break; | ||
| 874 | default: | ||
| 875 | printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga); | ||
| 876 | return; | ||
| 877 | } | ||
| 878 | |||
| 879 | via_write_reg_mask(VIACR, index, value, mask); | ||
| 880 | } | ||
| 881 | |||
| 882 | static void set_crt_source(u8 iga) | ||
| 883 | { | ||
| 884 | u8 value; | ||
| 885 | |||
| 886 | switch (iga) { | ||
| 868 | case IGA1: | 887 | case IGA1: |
| 869 | viafb_write_reg_mask(SR16, VIASR, 0x00, BIT6); | 888 | value = 0x00; |
| 870 | break; | 889 | break; |
| 871 | case IGA2: | 890 | case IGA2: |
| 872 | viafb_write_reg_mask(SR16, VIASR, 0x40, BIT6); | 891 | value = 0x40; |
| 873 | break; | 892 | break; |
| 893 | default: | ||
| 894 | printk(KERN_WARNING "viafb: Unsupported source: %d\n", iga); | ||
| 895 | return; | ||
| 874 | } | 896 | } |
| 897 | |||
| 898 | via_write_reg_mask(VIASR, 0x16, value, 0x40); | ||
| 899 | } | ||
| 900 | |||
| 901 | static inline void set_6C_source(u8 iga) | ||
| 902 | { | ||
| 903 | set_source_common(0x6C, 7, iga); | ||
| 904 | } | ||
| 905 | |||
| 906 | static inline void set_93_source(u8 iga) | ||
| 907 | { | ||
| 908 | set_source_common(0x93, 7, iga); | ||
| 909 | } | ||
| 910 | |||
| 911 | static inline void set_96_source(u8 iga) | ||
| 912 | { | ||
| 913 | set_source_common(0x96, 4, iga); | ||
| 914 | } | ||
| 915 | |||
| 916 | static inline void set_dvp1_source(u8 iga) | ||
| 917 | { | ||
| 918 | set_source_common(0x9B, 4, iga); | ||
| 919 | } | ||
| 920 | |||
| 921 | static inline void set_lvds1_source(u8 iga) | ||
| 922 | { | ||
| 923 | set_source_common(0x99, 4, iga); | ||
| 924 | } | ||
| 925 | |||
| 926 | static inline void set_lvds2_source(u8 iga) | ||
| 927 | { | ||
| 928 | set_source_common(0x97, 4, iga); | ||
| 929 | } | ||
| 930 | |||
| 931 | static void set_crt_output_path(int set_iga) | ||
| 932 | { | ||
| 933 | viafb_write_reg_mask(CR36, VIACR, 0x00, BIT4 + BIT5); | ||
| 934 | set_crt_source(set_iga); | ||
| 875 | } | 935 | } |
| 876 | 936 | ||
| 877 | static void dvi_patch_skew_dvp0(void) | 937 | static void dvi_patch_skew_dvp0(void) |
| @@ -944,76 +1004,45 @@ static void set_dvi_output_path(int set_iga, int output_interface) | |||
| 944 | { | 1004 | { |
| 945 | switch (output_interface) { | 1005 | switch (output_interface) { |
| 946 | case INTERFACE_DVP0: | 1006 | case INTERFACE_DVP0: |
| 1007 | set_96_source(set_iga); | ||
| 1008 | set_6C_source(set_iga); | ||
| 947 | viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0); | 1009 | viafb_write_reg_mask(CR6B, VIACR, 0x01, BIT0); |
| 948 | 1010 | viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 + BIT5); | |
| 949 | if (set_iga == IGA1) { | ||
| 950 | viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4); | ||
| 951 | viafb_write_reg_mask(CR6C, VIACR, 0x21, BIT0 + | ||
| 952 | BIT5 + BIT7); | ||
| 953 | } else { | ||
| 954 | viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4); | ||
| 955 | viafb_write_reg_mask(CR6C, VIACR, 0xA1, BIT0 + | ||
| 956 | BIT5 + BIT7); | ||
| 957 | } | ||
| 958 | |||
| 959 | viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT7 + BIT6); | 1011 | viafb_write_reg_mask(SR1E, VIASR, 0xC0, BIT7 + BIT6); |
| 960 | |||
| 961 | dvi_patch_skew_dvp0(); | 1012 | dvi_patch_skew_dvp0(); |
| 962 | break; | 1013 | break; |
| 963 | 1014 | ||
| 964 | case INTERFACE_DVP1: | 1015 | case INTERFACE_DVP1: |
| 965 | if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) { | 1016 | if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) { |
| 966 | if (set_iga == IGA1) | 1017 | set_93_source(set_iga); |
| 967 | viafb_write_reg_mask(CR93, VIACR, 0x21, | 1018 | viafb_write_reg_mask(CR93, VIACR, 0x21, BIT0 + BIT5); |
| 968 | BIT0 + BIT5 + BIT7); | ||
| 969 | else | ||
| 970 | viafb_write_reg_mask(CR93, VIACR, 0xA1, | ||
| 971 | BIT0 + BIT5 + BIT7); | ||
| 972 | } else { | 1019 | } else { |
| 973 | if (set_iga == IGA1) | 1020 | set_dvp1_source(set_iga); |
| 974 | viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4); | ||
| 975 | else | ||
| 976 | viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4); | ||
| 977 | } | 1021 | } |
| 978 | 1022 | ||
| 979 | viafb_write_reg_mask(SR1E, VIASR, 0x30, BIT4 + BIT5); | 1023 | viafb_write_reg_mask(SR1E, VIASR, 0x30, BIT4 + BIT5); |
| 980 | break; | 1024 | break; |
| 981 | case INTERFACE_DFP_HIGH: | 1025 | case INTERFACE_DFP_HIGH: |
| 982 | if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266) { | 1026 | if (viaparinfo->chip_info->gfx_chip_name != UNICHROME_CLE266) { |
| 983 | if (set_iga == IGA1) { | 1027 | via_write_reg_mask(VIACR, CR97, 0x03, 0x03); |
| 984 | viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4); | 1028 | set_lvds2_source(set_iga); |
| 985 | viafb_write_reg_mask(CR97, VIACR, 0x03, | 1029 | set_96_source(set_iga); |
| 986 | BIT0 + BIT1 + BIT4); | ||
| 987 | } else { | ||
| 988 | viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4); | ||
| 989 | viafb_write_reg_mask(CR97, VIACR, 0x13, | ||
| 990 | BIT0 + BIT1 + BIT4); | ||
| 991 | } | ||
| 992 | } | 1030 | } |
| 1031 | |||
| 993 | viafb_write_reg_mask(SR2A, VIASR, 0x0C, BIT2 + BIT3); | 1032 | viafb_write_reg_mask(SR2A, VIASR, 0x0C, BIT2 + BIT3); |
| 994 | break; | 1033 | break; |
| 995 | 1034 | ||
| 996 | case INTERFACE_DFP_LOW: | 1035 | case INTERFACE_DFP_LOW: |
| 997 | if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) | 1036 | if (viaparinfo->chip_info->gfx_chip_name == UNICHROME_CLE266) |
| 998 | break; | 1037 | break; |
| 999 | 1038 | set_dvp1_source(set_iga); | |
| 1000 | if (set_iga == IGA1) { | 1039 | set_lvds1_source(set_iga); |
| 1001 | viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4); | ||
| 1002 | viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4); | ||
| 1003 | } else { | ||
| 1004 | viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4); | ||
| 1005 | viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4); | ||
| 1006 | } | ||
| 1007 | |||
| 1008 | viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1); | 1040 | viafb_write_reg_mask(SR2A, VIASR, 0x03, BIT0 + BIT1); |
| 1009 | dvi_patch_skew_dvp_low(); | 1041 | dvi_patch_skew_dvp_low(); |
| 1010 | break; | 1042 | break; |
| 1011 | 1043 | ||
| 1012 | case INTERFACE_TMDS: | 1044 | case INTERFACE_TMDS: |
| 1013 | if (set_iga == IGA1) | 1045 | set_lvds1_source(set_iga); |
| 1014 | viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4); | ||
| 1015 | else | ||
| 1016 | viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4); | ||
| 1017 | break; | 1046 | break; |
| 1018 | } | 1047 | } |
| 1019 | 1048 | ||
| @@ -1031,45 +1060,31 @@ static void set_lcd_output_path(int set_iga, int output_interface) | |||
| 1031 | 1060 | ||
| 1032 | viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3); | 1061 | viafb_write_reg_mask(CR6B, VIACR, 0x00, BIT3); |
| 1033 | viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3); | 1062 | viafb_write_reg_mask(CR6A, VIACR, 0x08, BIT3); |
| 1034 | |||
| 1035 | switch (output_interface) { | 1063 | switch (output_interface) { |
| 1036 | case INTERFACE_DVP0: | 1064 | case INTERFACE_DVP0: |
| 1037 | if (set_iga == IGA1) { | 1065 | set_96_source(set_iga); |
| 1038 | viafb_write_reg_mask(CR96, VIACR, 0x00, BIT4); | 1066 | if (set_iga == IGA2) |
| 1039 | } else { | ||
| 1040 | viafb_write_reg(CR91, VIACR, 0x00); | 1067 | viafb_write_reg(CR91, VIACR, 0x00); |
| 1041 | viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4); | ||
| 1042 | } | ||
| 1043 | break; | 1068 | break; |
| 1044 | 1069 | ||
| 1045 | case INTERFACE_DVP1: | 1070 | case INTERFACE_DVP1: |
| 1046 | if (set_iga == IGA1) | 1071 | set_dvp1_source(set_iga); |
| 1047 | viafb_write_reg_mask(CR9B, VIACR, 0x00, BIT4); | 1072 | if (set_iga == IGA2) |
| 1048 | else { | ||
| 1049 | viafb_write_reg(CR91, VIACR, 0x00); | 1073 | viafb_write_reg(CR91, VIACR, 0x00); |
| 1050 | viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4); | ||
| 1051 | } | ||
| 1052 | break; | 1074 | break; |
| 1053 | 1075 | ||
| 1054 | case INTERFACE_DFP_HIGH: | 1076 | case INTERFACE_DFP_HIGH: |
| 1055 | if (set_iga == IGA1) | 1077 | set_lvds2_source(set_iga); |
| 1056 | viafb_write_reg_mask(CR97, VIACR, 0x00, BIT4); | 1078 | set_96_source(set_iga); |
| 1057 | else { | 1079 | if (set_iga == IGA2) |
| 1058 | viafb_write_reg(CR91, VIACR, 0x00); | 1080 | viafb_write_reg(CR91, VIACR, 0x00); |
| 1059 | viafb_write_reg_mask(CR97, VIACR, 0x10, BIT4); | ||
| 1060 | viafb_write_reg_mask(CR96, VIACR, 0x10, BIT4); | ||
| 1061 | } | ||
| 1062 | break; | 1081 | break; |
| 1063 | 1082 | ||
| 1064 | case INTERFACE_DFP_LOW: | 1083 | case INTERFACE_DFP_LOW: |
| 1065 | if (set_iga == IGA1) | 1084 | set_lvds1_source(set_iga); |
| 1066 | viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4); | 1085 | set_dvp1_source(set_iga); |
| 1067 | else { | 1086 | if (set_iga == IGA2) |
| 1068 | viafb_write_reg(CR91, VIACR, 0x00); | 1087 | viafb_write_reg(CR91, VIACR, 0x00); |
| 1069 | viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4); | ||
| 1070 | viafb_write_reg_mask(CR9B, VIACR, 0x10, BIT4); | ||
| 1071 | } | ||
| 1072 | |||
| 1073 | break; | 1088 | break; |
| 1074 | 1089 | ||
| 1075 | case INTERFACE_DFP: | 1090 | case INTERFACE_DFP: |
| @@ -1078,30 +1093,20 @@ static void set_lcd_output_path(int set_iga, int output_interface) | |||
| 1078 | viaparinfo->chip_info->gfx_chip_name)) | 1093 | viaparinfo->chip_info->gfx_chip_name)) |
| 1079 | viafb_write_reg_mask(CR97, VIACR, 0x84, | 1094 | viafb_write_reg_mask(CR97, VIACR, 0x84, |
| 1080 | BIT7 + BIT2 + BIT1 + BIT0); | 1095 | BIT7 + BIT2 + BIT1 + BIT0); |
| 1081 | if (set_iga == IGA1) { | 1096 | |
| 1082 | viafb_write_reg_mask(CR97, VIACR, 0x00, BIT4); | 1097 | set_lvds1_source(set_iga); |
| 1083 | viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4); | 1098 | set_lvds2_source(set_iga); |
| 1084 | } else { | 1099 | if (set_iga == IGA2) |
| 1085 | viafb_write_reg(CR91, VIACR, 0x00); | 1100 | viafb_write_reg(CR91, VIACR, 0x00); |
| 1086 | viafb_write_reg_mask(CR97, VIACR, 0x10, BIT4); | ||
| 1087 | viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4); | ||
| 1088 | } | ||
| 1089 | break; | 1101 | break; |
| 1090 | 1102 | ||
| 1091 | case INTERFACE_LVDS0: | 1103 | case INTERFACE_LVDS0: |
| 1092 | case INTERFACE_LVDS0LVDS1: | 1104 | case INTERFACE_LVDS0LVDS1: |
| 1093 | if (set_iga == IGA1) | 1105 | set_lvds1_source(set_iga); |
| 1094 | viafb_write_reg_mask(CR99, VIACR, 0x00, BIT4); | ||
| 1095 | else | ||
| 1096 | viafb_write_reg_mask(CR99, VIACR, 0x10, BIT4); | ||
| 1097 | |||
| 1098 | break; | 1106 | break; |
| 1099 | 1107 | ||
| 1100 | case INTERFACE_LVDS1: | 1108 | case INTERFACE_LVDS1: |
| 1101 | if (set_iga == IGA1) | 1109 | set_lvds2_source(set_iga); |
| 1102 | viafb_write_reg_mask(CR97, VIACR, 0x00, BIT4); | ||
| 1103 | else | ||
| 1104 | viafb_write_reg_mask(CR97, VIACR, 0x10, BIT4); | ||
| 1105 | break; | 1110 | break; |
| 1106 | } | 1111 | } |
| 1107 | } | 1112 | } |
