Commit 0975fc68719c75cbe14132c6f0dead57cd4d5210

Authored by Mauro Carvalho Chehab
1 parent 767f3b3bf2

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
... ... @@ -444,7 +444,8 @@
444 444 .fname = XC3028L_DEFAULT_FIRMWARE,
445 445 .max_len = 64,
446 446 .demod = 5000,
447   - .d2633 = 1
  447 + /* This is true for all demods with v36 firmware? */
  448 + .type = XC2028_D2633,
448 449 };
449 450  
450 451 fe = dvb_attach(xc2028_attach,