Commit 0975fc68 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

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: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 767f3b3b
...@@ -1013,11 +1013,6 @@ static int xc2028_set_params(struct dvb_frontend *fe, ...@@ -1013,11 +1013,6 @@ static int xc2028_set_params(struct dvb_frontend *fe,
tuner_dbg("%s called\n", __func__); tuner_dbg("%s called\n", __func__);
if (priv->ctrl.d2633)
type |= D2633;
else
type |= D2620;
switch(fe->ops.info.type) { switch(fe->ops.info.type) {
case FE_OFDM: case FE_OFDM:
bw = p->u.ofdm.bandwidth; bw = p->u.ofdm.bandwidth;
...@@ -1032,10 +1027,8 @@ static int xc2028_set_params(struct dvb_frontend *fe, ...@@ -1032,10 +1027,8 @@ static int xc2028_set_params(struct dvb_frontend *fe,
break; break;
case FE_ATSC: case FE_ATSC:
bw = BANDWIDTH_6_MHZ; bw = BANDWIDTH_6_MHZ;
/* The only ATSC firmware (at least on v2.7) is D2633, /* The only ATSC firmware (at least on v2.7) is D2633 */
so overrides ctrl->d2633 */ type |= ATSC | D2633;
type |= ATSC| D2633;
type &= ~D2620;
break; break;
/* DVB-S is not supported */ /* DVB-S is not supported */
default: default:
...@@ -1068,6 +1061,28 @@ static int xc2028_set_params(struct dvb_frontend *fe, ...@@ -1068,6 +1061,28 @@ static int xc2028_set_params(struct dvb_frontend *fe,
tuner_err("error: bandwidth not supported.\n"); tuner_err("error: bandwidth not supported.\n");
}; };
/*
Selects between D2633 or D2620 firmware.
It doesn't make sense for ATSC, since it should be D2633 on all cases
*/
if (fe->ops.info.type != FE_ATSC) {
switch (priv->ctrl.type) {
case XC2028_D2633:
type |= D2633;
break;
case XC2028_D2620:
type |= D2620;
break;
case XC2028_AUTO:
default:
/* Zarlink seems to need D2633 */
if (priv->ctrl.demod == XC3028_FE_ZARLINK456)
type |= D2633;
else
type |= D2620;
}
}
/* All S-code tables need a 200kHz shift */ /* All S-code tables need a 200kHz shift */
if (priv->ctrl.demod) if (priv->ctrl.demod)
demod = priv->ctrl.demod + 200; demod = priv->ctrl.demod + 200;
......
...@@ -24,16 +24,22 @@ ...@@ -24,16 +24,22 @@
#define XC3028_FE_ZARLINK456 4560 #define XC3028_FE_ZARLINK456 4560
#define XC3028_FE_CHINA 5200 #define XC3028_FE_CHINA 5200
enum firmware_type {
XC2028_AUTO = 0, /* By default, auto-detects */
XC2028_D2633,
XC2028_D2620,
};
struct xc2028_ctrl { struct xc2028_ctrl {
char *fname; char *fname;
int max_len; int max_len;
unsigned int scode_table; unsigned int scode_table;
unsigned int mts :1; unsigned int mts :1;
unsigned int d2633 :1;
unsigned int input1:1; unsigned int input1:1;
unsigned int vhfbw7:1; unsigned int vhfbw7:1;
unsigned int uhfbw8:1; unsigned int uhfbw8:1;
unsigned int demod; unsigned int demod;
enum firmware_type type:2;
}; };
struct xc2028_config { struct xc2028_config {
......
...@@ -444,7 +444,8 @@ static int dvb_register(struct cx23885_tsport *port) ...@@ -444,7 +444,8 @@ static int dvb_register(struct cx23885_tsport *port)
.fname = XC3028L_DEFAULT_FIRMWARE, .fname = XC3028L_DEFAULT_FIRMWARE,
.max_len = 64, .max_len = 64,
.demod = 5000, .demod = 5000,
.d2633 = 1 /* This is true for all demods with v36 firmware? */
.type = XC2028_D2633,
}; };
fe = dvb_attach(xc2028_attach, fe = dvb_attach(xc2028_attach,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment