From 3dfefc50ff45744ffb97ce0bf9c213a3fb6d5d3d Mon Sep 17 00:00:00 2001
From: Chris Pascoe <c.pascoe@itee.uq.edu.au>
Date: Sun, 2 Dec 2007 10:07:06 -0300
Subject: [PATCH] V4L/DVB (6855): xc2028: select DTV78 firmware if tuning 7MHz
 VHF / 8MHz UHF

It seems that the DTV78 firmware is intended for use in locations where
VHF channels have 7MHz bandwidth and UHF channels have 8MHz bandwidth.
If we switch to DTV78 firmware when we detect this condition, we can
avoid firmware reloads when switching between VHF and UHF transponders.

Place the state for this in the control structure so that card drivers
can hint to us to use DTV78 firmware from the first tuning attempt.

Signed-off-by: Chris Pascoe <c.pascoe@itee.uq.edu.au>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
---
 drivers/media/video/tuner-xc2028.c | 23 +++++++++++++++--------
 drivers/media/video/tuner-xc2028.h |  2 ++
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/drivers/media/video/tuner-xc2028.c b/drivers/media/video/tuner-xc2028.c
index 63a6fca1f8cf..0565edd224bc 100644
--- a/drivers/media/video/tuner-xc2028.c
+++ b/drivers/media/video/tuner-xc2028.c
@@ -998,20 +998,27 @@ static int xc2028_set_params(struct dvb_frontend *fe,
 		return -EINVAL;
 	}
 
-	/* FIXME:
-	  There are two Scodes that will never be selected:
-		DTV78 ZARLINK456, DTV78 DIBCOM52
-	  When it should opt for DTV78 instead of DTV7 or DTV8?
-	*/
 	switch (bw) {
 	case BANDWIDTH_8_MHZ:
-		type |= DTV8 | F8MHZ;
+		if (p->frequency < 470000000)
+			priv->ctrl.vhfbw7 = 0;
+		else
+			priv->ctrl.uhfbw8 = 1;
+		type |= (priv->ctrl.vhfbw7 && priv->ctrl.uhfbw8) ? DTV78 : DTV8;
+		type |= F8MHZ;
 		break;
 	case BANDWIDTH_7_MHZ:
-		type |= DTV7 | F8MHZ;
+		if (p->frequency < 470000000)
+			priv->ctrl.vhfbw7 = 1;
+		else
+			priv->ctrl.uhfbw8 = 0;
+		type |= (priv->ctrl.vhfbw7 && priv->ctrl.uhfbw8) ? DTV78 : DTV7;
+		type |= F8MHZ;
 		break;
 	case BANDWIDTH_6_MHZ:
-		type |= DTV6 ;
+		type |= DTV6;
+		priv->ctrl.vhfbw7 = 0;
+		priv->ctrl.uhfbw8 = 0;
 		break;
 	default:
 		tuner_err("error: bandwidth not supported.\n");
diff --git a/drivers/media/video/tuner-xc2028.h b/drivers/media/video/tuner-xc2028.h
index 1fe8b195960c..7462629b98fd 100644
--- a/drivers/media/video/tuner-xc2028.h
+++ b/drivers/media/video/tuner-xc2028.h
@@ -30,6 +30,8 @@ struct xc2028_ctrl {
 	unsigned int		mts   :1;
 	unsigned int		d2633 :1;
 	unsigned int		input1:1;
+	unsigned int		vhfbw7:1;
+	unsigned int		uhfbw8:1;
 	unsigned int		demod;
 };
 
-- 
GitLab