Skip to content

Commit

Permalink
V4L/DVB (9055): tuner-xc2028: Do a better job selecting firmware type
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Mauro Carvalho Chehab committed Oct 12, 2008
1 parent 767f3b3 commit 0975fc6
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 11 deletions.
33 changes: 24 additions & 9 deletions drivers/media/common/tuners/tuner-xc2028.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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;
Expand Down
8 changes: 7 additions & 1 deletion drivers/media/common/tuners/tuner-xc2028.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
3 changes: 2 additions & 1 deletion drivers/media/video/cx23885/cx23885-dvb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 0975fc6

Please sign in to comment.