diff options
-rw-r--r-- | drivers/media/video/tuner-core.c | 93 |
1 files changed, 28 insertions, 65 deletions
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 6c007aa00236..1e7505eb32e9 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
@@ -823,7 +823,8 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
823 | /** | 823 | /** |
824 | * tuner_fixup_std - force a given video standard variant | 824 | * tuner_fixup_std - force a given video standard variant |
825 | * | 825 | * |
826 | * @t: tuner internal struct | 826 | * @t: tuner internal struct |
827 | * @std: TV standard | ||
827 | * | 828 | * |
828 | * A few devices or drivers have problem to detect some standard variations. | 829 | * A few devices or drivers have problem to detect some standard variations. |
829 | * On other operational systems, the drivers generally have a per-country | 830 | * On other operational systems, the drivers generally have a per-country |
@@ -833,57 +834,39 @@ static void set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
833 | * to distinguish all video standard variations, a modprobe parameter can | 834 | * to distinguish all video standard variations, a modprobe parameter can |
834 | * be used to force a video standard match. | 835 | * be used to force a video standard match. |
835 | */ | 836 | */ |
836 | static int tuner_fixup_std(struct tuner *t) | 837 | static v4l2_std_id tuner_fixup_std(struct tuner *t, v4l2_std_id std) |
837 | { | 838 | { |
838 | if ((t->std & V4L2_STD_PAL) == V4L2_STD_PAL) { | 839 | if (pal[0] != '-' && (std & V4L2_STD_PAL) == V4L2_STD_PAL) { |
839 | switch (pal[0]) { | 840 | switch (pal[0]) { |
840 | case '6': | 841 | case '6': |
841 | tuner_dbg("insmod fixup: PAL => PAL-60\n"); | 842 | return V4L2_STD_PAL_60; |
842 | t->std = V4L2_STD_PAL_60; | ||
843 | break; | ||
844 | case 'b': | 843 | case 'b': |
845 | case 'B': | 844 | case 'B': |
846 | case 'g': | 845 | case 'g': |
847 | case 'G': | 846 | case 'G': |
848 | tuner_dbg("insmod fixup: PAL => PAL-BG\n"); | 847 | return V4L2_STD_PAL_BG; |
849 | t->std = V4L2_STD_PAL_BG; | ||
850 | break; | ||
851 | case 'i': | 848 | case 'i': |
852 | case 'I': | 849 | case 'I': |
853 | tuner_dbg("insmod fixup: PAL => PAL-I\n"); | 850 | return V4L2_STD_PAL_I; |
854 | t->std = V4L2_STD_PAL_I; | ||
855 | break; | ||
856 | case 'd': | 851 | case 'd': |
857 | case 'D': | 852 | case 'D': |
858 | case 'k': | 853 | case 'k': |
859 | case 'K': | 854 | case 'K': |
860 | tuner_dbg("insmod fixup: PAL => PAL-DK\n"); | 855 | return V4L2_STD_PAL_DK; |
861 | t->std = V4L2_STD_PAL_DK; | ||
862 | break; | ||
863 | case 'M': | 856 | case 'M': |
864 | case 'm': | 857 | case 'm': |
865 | tuner_dbg("insmod fixup: PAL => PAL-M\n"); | 858 | return V4L2_STD_PAL_M; |
866 | t->std = V4L2_STD_PAL_M; | ||
867 | break; | ||
868 | case 'N': | 859 | case 'N': |
869 | case 'n': | 860 | case 'n': |
870 | if (pal[1] == 'c' || pal[1] == 'C') { | 861 | if (pal[1] == 'c' || pal[1] == 'C') |
871 | tuner_dbg("insmod fixup: PAL => PAL-Nc\n"); | 862 | return V4L2_STD_PAL_Nc; |
872 | t->std = V4L2_STD_PAL_Nc; | 863 | return V4L2_STD_PAL_N; |
873 | } else { | ||
874 | tuner_dbg("insmod fixup: PAL => PAL-N\n"); | ||
875 | t->std = V4L2_STD_PAL_N; | ||
876 | } | ||
877 | break; | ||
878 | case '-': | ||
879 | /* default parameter, do nothing */ | ||
880 | break; | ||
881 | default: | 864 | default: |
882 | tuner_warn("pal= argument not recognised\n"); | 865 | tuner_warn("pal= argument not recognised\n"); |
883 | break; | 866 | break; |
884 | } | 867 | } |
885 | } | 868 | } |
886 | if ((t->std & V4L2_STD_SECAM) == V4L2_STD_SECAM) { | 869 | if (secam[0] != '-' && (std & V4L2_STD_SECAM) == V4L2_STD_SECAM) { |
887 | switch (secam[0]) { | 870 | switch (secam[0]) { |
888 | case 'b': | 871 | case 'b': |
889 | case 'B': | 872 | case 'B': |
@@ -891,63 +874,42 @@ static int tuner_fixup_std(struct tuner *t) | |||
891 | case 'G': | 874 | case 'G': |
892 | case 'h': | 875 | case 'h': |
893 | case 'H': | 876 | case 'H': |
894 | tuner_dbg("insmod fixup: SECAM => SECAM-BGH\n"); | 877 | return V4L2_STD_SECAM_B | |
895 | t->std = V4L2_STD_SECAM_B | | 878 | V4L2_STD_SECAM_G | |
896 | V4L2_STD_SECAM_G | | 879 | V4L2_STD_SECAM_H; |
897 | V4L2_STD_SECAM_H; | ||
898 | break; | ||
899 | case 'd': | 880 | case 'd': |
900 | case 'D': | 881 | case 'D': |
901 | case 'k': | 882 | case 'k': |
902 | case 'K': | 883 | case 'K': |
903 | tuner_dbg("insmod fixup: SECAM => SECAM-DK\n"); | 884 | return V4L2_STD_SECAM_DK; |
904 | t->std = V4L2_STD_SECAM_DK; | ||
905 | break; | ||
906 | case 'l': | 885 | case 'l': |
907 | case 'L': | 886 | case 'L': |
908 | if ((secam[1] == 'C') || (secam[1] == 'c')) { | 887 | if ((secam[1] == 'C') || (secam[1] == 'c')) |
909 | tuner_dbg("insmod fixup: SECAM => SECAM-L'\n"); | 888 | return V4L2_STD_SECAM_LC; |
910 | t->std = V4L2_STD_SECAM_LC; | 889 | return V4L2_STD_SECAM_L; |
911 | } else { | ||
912 | tuner_dbg("insmod fixup: SECAM => SECAM-L\n"); | ||
913 | t->std = V4L2_STD_SECAM_L; | ||
914 | } | ||
915 | break; | ||
916 | case '-': | ||
917 | /* default parameter, do nothing */ | ||
918 | break; | ||
919 | default: | 890 | default: |
920 | tuner_warn("secam= argument not recognised\n"); | 891 | tuner_warn("secam= argument not recognised\n"); |
921 | break; | 892 | break; |
922 | } | 893 | } |
923 | } | 894 | } |
924 | 895 | ||
925 | if ((t->std & V4L2_STD_NTSC) == V4L2_STD_NTSC) { | 896 | if (ntsc[0] != '-' && (std & V4L2_STD_NTSC) == V4L2_STD_NTSC) { |
926 | switch (ntsc[0]) { | 897 | switch (ntsc[0]) { |
927 | case 'm': | 898 | case 'm': |
928 | case 'M': | 899 | case 'M': |
929 | tuner_dbg("insmod fixup: NTSC => NTSC-M\n"); | 900 | return V4L2_STD_NTSC_M; |
930 | t->std = V4L2_STD_NTSC_M; | ||
931 | break; | ||
932 | case 'j': | 901 | case 'j': |
933 | case 'J': | 902 | case 'J': |
934 | tuner_dbg("insmod fixup: NTSC => NTSC_M_JP\n"); | 903 | return V4L2_STD_NTSC_M_JP; |
935 | t->std = V4L2_STD_NTSC_M_JP; | ||
936 | break; | ||
937 | case 'k': | 904 | case 'k': |
938 | case 'K': | 905 | case 'K': |
939 | tuner_dbg("insmod fixup: NTSC => NTSC_M_KR\n"); | 906 | return V4L2_STD_NTSC_M_KR; |
940 | t->std = V4L2_STD_NTSC_M_KR; | ||
941 | break; | ||
942 | case '-': | ||
943 | /* default parameter, do nothing */ | ||
944 | break; | ||
945 | default: | 907 | default: |
946 | tuner_info("ntsc= argument not recognised\n"); | 908 | tuner_info("ntsc= argument not recognised\n"); |
947 | break; | 909 | break; |
948 | } | 910 | } |
949 | } | 911 | } |
950 | return 0; | 912 | return std; |
951 | } | 913 | } |
952 | 914 | ||
953 | /* | 915 | /* |
@@ -1102,8 +1064,9 @@ static int tuner_s_std(struct v4l2_subdev *sd, v4l2_std_id std) | |||
1102 | if (set_mode(t, V4L2_TUNER_ANALOG_TV)) | 1064 | if (set_mode(t, V4L2_TUNER_ANALOG_TV)) |
1103 | return 0; | 1065 | return 0; |
1104 | 1066 | ||
1105 | t->std = std; | 1067 | t->std = tuner_fixup_std(t, std); |
1106 | tuner_fixup_std(t); | 1068 | if (t->std != std) |
1069 | tuner_dbg("Fixup standard %llx to %llx\n", std, t->std); | ||
1107 | set_freq(t, 0); | 1070 | set_freq(t, 0); |
1108 | return 0; | 1071 | return 0; |
1109 | } | 1072 | } |