Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+24 −9
Original line number Diff line number Diff line
@@ -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 */
		/* The only ATSC firmware (at least on v2.7) is D2633 */
		type |= ATSC | D2633;
		type &= ~D2620;
		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;
+7 −1
Original line number Diff line number Diff line
@@ -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 {
+2 −1
Original line number Diff line number Diff line
@@ -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,