From 37fa53c6a13ac9e82f9c6d334862b514e34de2a4 Mon Sep 17 00:00:00 2001
From: Mauro Carvalho Chehab <mchehab@redhat.com>
Date: Thu, 5 Jan 2012 14:39:05 -0200
Subject: [PATCH] [media] dvb_frontend: improve documentation on
 set_delivery_system()

While this patch change some things, the updated fields there are
used just on printk, so it shouldn't cause any functional changes.

Yet, this routine is a little complex, so explain a little more
how it works.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
---
 drivers/media/dvb/dvb-core/dvb_frontend.c | 27 +++++++++++++++--------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c
index 128f67715ad7..0e079a1a4f49 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -1440,9 +1440,13 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
 	if (desired_system == SYS_UNDEFINED) {
 		/*
 		 * A DVBv3 call doesn't know what's the desired system.
-		 * So, don't change the current delivery system. Instead,
-		 * find the closest DVBv3 system that matches the delivery
-		 * system.
+		 * Also, DVBv3 applications don't know that ops.info->type
+		 * could be changed, and they simply dies when it doesn't
+		 * match.
+		 * So, don't change the current delivery system, as it
+		 * may be trying to do the wrong thing, like setting an
+		 * ISDB-T frontend as DVB-T. Instead, find the closest
+		 * DVBv3 system that matches the delivery system.
 		 */
 		if (is_dvbv3_delsys(c->delivery_system)) {
 			dprintk("%s() Using delivery system to %d\n",
@@ -1452,27 +1456,29 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
 		type = dvbv3_type(c->delivery_system);
 		switch (type) {
 		case DVBV3_QPSK:
-			desired_system = FE_QPSK;
+			desired_system = SYS_DVBS;
 			break;
 		case DVBV3_QAM:
-			desired_system = FE_QAM;
+			desired_system = SYS_DVBC_ANNEX_A;
 			break;
 		case DVBV3_ATSC:
-			desired_system = FE_ATSC;
+			desired_system = SYS_ATSC;
 			break;
 		case DVBV3_OFDM:
-			desired_system = FE_OFDM;
+			desired_system = SYS_DVBT;
 			break;
 		default:
 			dprintk("%s(): This frontend doesn't support DVBv3 calls\n",
 				__func__);
 			return -EINVAL;
 		}
-		delsys = c->delivery_system;
 	} else {
 		/*
-		 * Check if the desired delivery system is supported
+		 * This is a DVBv5 call. So, it likely knows the supported
+		 * delivery systems.
 		 */
+
+		/* Check if the desired delivery system is supported */
 		ncaps = 0;
 		while (fe->ops.delsys[ncaps] && ncaps < MAX_DELSYS) {
 			if (fe->ops.delsys[ncaps] == desired_system) {
@@ -1518,6 +1524,9 @@ static int set_delivery_system(struct dvb_frontend *fe, u32 desired_system)
 	}
 
 	/*
+	 * The DVBv3 or DVBv5 call is requesting a different system. So,
+	 * emulation is needed.
+	 *
 	 * Emulate newer delivery systems like ISDBT, DVBT and DMBTH
 	 * for older DVBv5 applications. The emulation will try to use
 	 * the auto mode for most things, and will assume that the desired
-- 
2.20.1