summary refs log tree commit diff
path: root/drivers/media
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2009-01-18 19:37:59 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-03-30 12:42:22 -0300
commitc7d29e2f530654aa0c323aafb94d42a6a718482c (patch)
tree76e876fc6de0f79c281c2a31695ecc58c5f12122 /drivers/media
parentfac6986c4777ae85fa2108ea25fee98de2c1f7b2 (diff)
downloadlinux-c7d29e2f530654aa0c323aafb94d42a6a718482c.tar.gz
V4L/DVB (10249): v4l2-common: added v4l2_i2c_tuner_addrs()
Add v4l2_i2c_tuner_addrs() to obtain the various I2C tuner addresses.
This will be used in several drivers, so make this a common function
as we do not want to have these I2C addresses all over the place.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c42
-rw-r--r--drivers/media/video/v4l2-common.c36
2 files changed, 52 insertions, 26 deletions
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index ac23ff53543d..829006ebdf34 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -980,35 +980,25 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
 
 	/* initialize hardware #2 */
 	if (TUNER_ABSENT != dev->tuner_type) {
-		if (dev->radio_type != UNSET) {
-			v4l2_i2c_new_subdev(&dev->i2c_adap, "tuner", "tuner",
-					dev->radio_addr);
-		}
-		if (dev->tda9887_conf & TDA9887_PRESENT) {
-			unsigned short addrs[] = { 0x42, 0x43, 0x4a, 0x4b,
-						   I2C_CLIENT_END };
+		int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
 
-			v4l2_i2c_new_probed_subdev(&dev->i2c_adap,
-					"tuner", "tuner", addrs);
-		}
-		if (dev->tuner_addr != ADDR_UNSET) {
+		/* Note: radio tuner address is always filled in,
+		   so we do not need to probe for a radio tuner device. */
+		if (dev->radio_type != UNSET)
 			v4l2_i2c_new_subdev(&dev->i2c_adap,
-					"tuner", "tuner", dev->tuner_addr);
+				"tuner", "tuner", dev->radio_addr);
+		if (has_demod)
+			v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "tuner",
+				"tuner", v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
+		if (dev->tuner_addr == ADDR_UNSET) {
+			enum v4l2_i2c_tuner_type type =
+				has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
+
+			v4l2_i2c_new_probed_subdev(&dev->i2c_adap, "tuner",
+				"tuner", v4l2_i2c_tuner_addrs(type));
 		} else {
-			unsigned short addrs[] = {
-				0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
-				0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-				0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
-				I2C_CLIENT_END
-			};
-
-			if (dev->tda9887_conf & TDA9887_PRESENT) {
-				v4l2_i2c_new_probed_subdev(&dev->i2c_adap,
-						"tuner", "tuner", addrs + 4);
-			} else {
-				v4l2_i2c_new_probed_subdev(&dev->i2c_adap,
-						"tuner", "tuner", addrs);
-			}
+			v4l2_i2c_new_subdev(&dev->i2c_adap,
+				"tuner", "tuner", dev->tuner_addr);
 		}
 	}
 	saa7134_board_init2(dev);
diff --git a/drivers/media/video/v4l2-common.c b/drivers/media/video/v4l2-common.c
index 0f450a73477a..26e162f13f7f 100644
--- a/drivers/media/video/v4l2-common.c
+++ b/drivers/media/video/v4l2-common.c
@@ -991,4 +991,40 @@ struct v4l2_subdev *v4l2_i2c_new_probed_subdev(struct i2c_adapter *adapter,
 }
 EXPORT_SYMBOL_GPL(v4l2_i2c_new_probed_subdev);
 
+/* Return a list of I2C tuner addresses to probe. Use only if the tuner
+   addresses are unknown. */
+const unsigned short *v4l2_i2c_tuner_addrs(enum v4l2_i2c_tuner_type type)
+{
+	static const unsigned short radio_addrs[] = {
+#if defined(CONFIG_MEDIA_TUNER_TEA5761) || defined(CONFIG_MEDIA_TUNER_TEA5761_MODULE)
+		0x10,
+#endif
+		0x60,
+		I2C_CLIENT_END
+	};
+	static const unsigned short demod_addrs[] = {
+		0x42, 0x43, 0x4a, 0x4b,
+		I2C_CLIENT_END
+	};
+	static const unsigned short tv_addrs[] = {
+		0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
+		0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+		0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+		I2C_CLIENT_END
+	};
+
+	switch (type) {
+	case ADDRS_RADIO:
+		return radio_addrs;
+	case ADDRS_DEMOD:
+		return demod_addrs;
+	case ADDRS_TV:
+		return tv_addrs;
+	case ADDRS_TV_WITH_DEMOD:
+		return tv_addrs + 4;
+	}
+	return NULL;
+}
+EXPORT_SYMBOL_GPL(v4l2_i2c_tuner_addrs);
+
 #endif