mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
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>
This commit is contained in:
parent
767f3b3bf2
commit
0975fc6871
3 changed files with 33 additions and 11 deletions
|
@ -1013,11 +1013,6 @@ static int xc2028_set_params(struct dvb_frontend *fe,
|
|||
|
||||
tuner_dbg("%s called\n", __func__);
|
||||
|
||||
if (priv->ctrl.d2633)
|
||||
type |= D2633;
|
||||
else
|
||||
type |= D2620;
|
||||
|
||||
switch(fe->ops.info.type) {
|
||||
case FE_OFDM:
|
||||
bw = p->u.ofdm.bandwidth;
|
||||
|
@ -1032,10 +1027,8 @@ static int xc2028_set_params(struct dvb_frontend *fe,
|
|||
break;
|
||||
case FE_ATSC:
|
||||
bw = BANDWIDTH_6_MHZ;
|
||||
/* The only ATSC firmware (at least on v2.7) is D2633,
|
||||
so overrides ctrl->d2633 */
|
||||
type |= ATSC| D2633;
|
||||
type &= ~D2620;
|
||||
/* The only ATSC firmware (at least on v2.7) is D2633 */
|
||||
type |= ATSC | D2633;
|
||||
break;
|
||||
/* DVB-S is not supported */
|
||||
default:
|
||||
|
@ -1068,6 +1061,28 @@ static int xc2028_set_params(struct dvb_frontend *fe,
|
|||
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 */
|
||||
if (priv->ctrl.demod)
|
||||
demod = priv->ctrl.demod + 200;
|
||||
|
|
|
@ -24,16 +24,22 @@
|
|||
#define XC3028_FE_ZARLINK456 4560
|
||||
#define XC3028_FE_CHINA 5200
|
||||
|
||||
enum firmware_type {
|
||||
XC2028_AUTO = 0, /* By default, auto-detects */
|
||||
XC2028_D2633,
|
||||
XC2028_D2620,
|
||||
};
|
||||
|
||||
struct xc2028_ctrl {
|
||||
char *fname;
|
||||
int max_len;
|
||||
unsigned int scode_table;
|
||||
unsigned int mts :1;
|
||||
unsigned int d2633 :1;
|
||||
unsigned int input1:1;
|
||||
unsigned int vhfbw7:1;
|
||||
unsigned int uhfbw8:1;
|
||||
unsigned int demod;
|
||||
enum firmware_type type:2;
|
||||
};
|
||||
|
||||
struct xc2028_config {
|
||||
|
|
|
@ -444,7 +444,8 @@ static int dvb_register(struct cx23885_tsport *port)
|
|||
.fname = XC3028L_DEFAULT_FIRMWARE,
|
||||
.max_len = 64,
|
||||
.demod = 5000,
|
||||
.d2633 = 1
|
||||
/* This is true for all demods with v36 firmware? */
|
||||
.type = XC2028_D2633,
|
||||
};
|
||||
|
||||
fe = dvb_attach(xc2028_attach,
|
||||
|
|
Loading…
Reference in a new issue