Commit 0975fc68719c75cbe14132c6f0dead57cd4d5210
1 parent
767f3b3bf2
Exists in
master
and in
4 other branches
V4L/DVB (9055): tuner-xc2028: Do a better job selecting firmware type
Firmware selection is very tricky on this device. This patch do a better selection of the proper firmware type, by using a code to hint if the firmware to be loaded should be D2620 or D2633. It also allows overriding the hint at the control structure. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Showing 3 changed files with 33 additions and 11 deletions Side-by-side Diff
drivers/media/common/tuners/tuner-xc2028.c
... | ... | @@ -1013,11 +1013,6 @@ |
1013 | 1013 | |
1014 | 1014 | tuner_dbg("%s called\n", __func__); |
1015 | 1015 | |
1016 | - if (priv->ctrl.d2633) | |
1017 | - type |= D2633; | |
1018 | - else | |
1019 | - type |= D2620; | |
1020 | - | |
1021 | 1016 | switch(fe->ops.info.type) { |
1022 | 1017 | case FE_OFDM: |
1023 | 1018 | bw = p->u.ofdm.bandwidth; |
... | ... | @@ -1032,10 +1027,8 @@ |
1032 | 1027 | break; |
1033 | 1028 | case FE_ATSC: |
1034 | 1029 | bw = BANDWIDTH_6_MHZ; |
1035 | - /* The only ATSC firmware (at least on v2.7) is D2633, | |
1036 | - so overrides ctrl->d2633 */ | |
1037 | - type |= ATSC| D2633; | |
1038 | - type &= ~D2620; | |
1030 | + /* The only ATSC firmware (at least on v2.7) is D2633 */ | |
1031 | + type |= ATSC | D2633; | |
1039 | 1032 | break; |
1040 | 1033 | /* DVB-S is not supported */ |
1041 | 1034 | default: |
... | ... | @@ -1067,6 +1060,28 @@ |
1067 | 1060 | default: |
1068 | 1061 | tuner_err("error: bandwidth not supported.\n"); |
1069 | 1062 | }; |
1063 | + | |
1064 | + /* | |
1065 | + Selects between D2633 or D2620 firmware. | |
1066 | + It doesn't make sense for ATSC, since it should be D2633 on all cases | |
1067 | + */ | |
1068 | + if (fe->ops.info.type != FE_ATSC) { | |
1069 | + switch (priv->ctrl.type) { | |
1070 | + case XC2028_D2633: | |
1071 | + type |= D2633; | |
1072 | + break; | |
1073 | + case XC2028_D2620: | |
1074 | + type |= D2620; | |
1075 | + break; | |
1076 | + case XC2028_AUTO: | |
1077 | + default: | |
1078 | + /* Zarlink seems to need D2633 */ | |
1079 | + if (priv->ctrl.demod == XC3028_FE_ZARLINK456) | |
1080 | + type |= D2633; | |
1081 | + else | |
1082 | + type |= D2620; | |
1083 | + } | |
1084 | + } | |
1070 | 1085 | |
1071 | 1086 | /* All S-code tables need a 200kHz shift */ |
1072 | 1087 | if (priv->ctrl.demod) |
drivers/media/common/tuners/tuner-xc2028.h
... | ... | @@ -24,16 +24,22 @@ |
24 | 24 | #define XC3028_FE_ZARLINK456 4560 |
25 | 25 | #define XC3028_FE_CHINA 5200 |
26 | 26 | |
27 | +enum firmware_type { | |
28 | + XC2028_AUTO = 0, /* By default, auto-detects */ | |
29 | + XC2028_D2633, | |
30 | + XC2028_D2620, | |
31 | +}; | |
32 | + | |
27 | 33 | struct xc2028_ctrl { |
28 | 34 | char *fname; |
29 | 35 | int max_len; |
30 | 36 | unsigned int scode_table; |
31 | 37 | unsigned int mts :1; |
32 | - unsigned int d2633 :1; | |
33 | 38 | unsigned int input1:1; |
34 | 39 | unsigned int vhfbw7:1; |
35 | 40 | unsigned int uhfbw8:1; |
36 | 41 | unsigned int demod; |
42 | + enum firmware_type type:2; | |
37 | 43 | }; |
38 | 44 | |
39 | 45 | struct xc2028_config { |
drivers/media/video/cx23885/cx23885-dvb.c