V4L/DVB (4202): allow selecting CX2341x port mode

CX2341X port was always set to 'memory', but 'streaming' is also possible

ivtv uses the memory (DMA) interface with the CX2341X, while pvrusb2 and
cx88-blackbird use the streaming interface. This setting is now selectable
by the driver.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
diff --git a/Documentation/video4linux/cx2341x/fw-encoder-api.txt b/Documentation/video4linux/cx2341x/fw-encoder-api.txt
index f74b0ae..001c686 100644
--- a/Documentation/video4linux/cx2341x/fw-encoder-api.txt
+++ b/Documentation/video4linux/cx2341x/fw-encoder-api.txt
@@ -270,11 +270,17 @@
 Name 	CX2341X_ENC_SET_OUTPUT_PORT
 Enum 	187/0xBB
 Description
-	Assign stream output port (not recommended you change setting from default)
+	Assign stream output port. Normally 0 when the data is copied through
+	the PCI bus (DMA), and 1 when the data is streamed to another chip
+	(pvrusb and cx88-blackbird).
 Param[0]
 	0=Memory (default)
 	1=Streaming
 	2=Serial
+Param[1]
+	Unknown, but leaving this to 0 seems to work best. Indications are that
+	this might have to do with USB support, although passing anything but 0
+	onl breaks things.
 
 -------------------------------------------------------------------------------
 
diff --git a/drivers/media/video/cx2341x.c b/drivers/media/video/cx2341x.c
index 7cd1c4c..554813e 100644
--- a/drivers/media/video/cx2341x.c
+++ b/drivers/media/video/cx2341x.c
@@ -639,6 +639,7 @@
 {
 	static struct cx2341x_mpeg_params default_params = {
 	/* misc */
+	.port = CX2341X_PORT_MEMORY,
 	.width = 720,
 	.height = 480,
 	.is_50hz = 0,
@@ -714,7 +715,7 @@
 
 	int err = 0;
 
-	cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 1, 0);	/* 0 = Memory */
+	cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 2, new->port, 0);
 
 	if (old == NULL || old->is_50hz != new->is_50hz) {
 		err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_RATE, 1, new->is_50hz);
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
index 6e945de..26aac42 100644
--- a/drivers/media/video/cx88/cx88-blackbird.c
+++ b/drivers/media/video/cx88/cx88-blackbird.c
@@ -1043,6 +1043,7 @@
 	dev->width = 720;
 	dev->height = 576;
 	cx2341x_fill_defaults(&dev->params);
+	dev->params.port = CX2341X_PORT_STREAMING;
 
 	switch (core->board) {
 	case CX88_BOARD_HAUPPAUGE_ROSLYN:
diff --git a/include/media/cx2341x.h b/include/media/cx2341x.h
index 0c9292f..fb170d4 100644
--- a/include/media/cx2341x.h
+++ b/include/media/cx2341x.h
@@ -19,8 +19,15 @@
 #ifndef CX2341X_H
 #define CX2341X_H
 
+enum cx2341x_port {
+	CX2341X_PORT_MEMORY,
+	CX2341X_PORT_STREAMING,
+	CX2341X_PORT_SERIAL
+};
+
 struct cx2341x_mpeg_params {
 	/* misc */
+	enum cx2341x_port port;
 	u16 width;
 	u16 height;
 	u16 is_50hz;