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

Commit 03c28085 authored by Sri Deevi's avatar Sri Deevi Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (8089): cx18: add support for Conexant Raptor PAL/SECAM card

Patch provided courtesy of Conexant http://www.conexant.com

.

Signed-off-by: default avatarSrinivasa Deevi <srinivasa.deevi@conexant.com>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 464e9f3a
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@
#include "cx18-i2c.h"
#include <media/cs5345.h>

#define V4L2_STD_NOT_MN (V4L2_STD_PAL|V4L2_STD_SECAM)

/********************** card configuration *******************************/

/* usual i2c tuner addresses to probe */
@@ -232,11 +234,64 @@ static const struct cx18_card cx18_card_mpc718 = {
	.i2c = &cx18_i2c_std,
};

/* ------------------------------------------------------------------------- */

/* Conexant Raptor PAL/SECAM: note that this card is analog only! */

static const struct cx18_card_pci_info cx18_pci_cnxt_raptor_pal[] = {
	{ PCI_DEVICE_ID_CX23418, CX18_PCI_ID_CONEXANT, 0x0009 },
	{ 0, 0, 0 }
};

static const struct cx18_card cx18_card_cnxt_raptor_pal = {
	.type = CX18_CARD_CNXT_RAPTOR_PAL,
	.name = "Conexant Raptor PAL/SECAM",
	.comment = "VBI is not yet supported\n",
	.v4l2_capabilities = CX18_CAP_ENCODER,
	.hw_audio_ctrl = CX18_HW_CX23418,
	.hw_muxer = CX18_HW_GPIO,
	.hw_all = CX18_HW_TUNER | CX18_HW_GPIO,
	.video_inputs = {
		{ CX18_CARD_INPUT_VID_TUNER,  0, CX18_AV_COMPOSITE2 },
		{ CX18_CARD_INPUT_SVIDEO1,    1,
			CX18_AV_SVIDEO_LUMA3 | CX18_AV_SVIDEO_CHROMA4 },
		{ CX18_CARD_INPUT_COMPOSITE1, 1, CX18_AV_COMPOSITE1 },
		{ CX18_CARD_INPUT_SVIDEO2,    2,
			CX18_AV_SVIDEO_LUMA7 | CX18_AV_SVIDEO_CHROMA8 },
		{ CX18_CARD_INPUT_COMPOSITE2, 2, CX18_AV_COMPOSITE6 },
	},
	.audio_inputs = {
		{ CX18_CARD_INPUT_AUD_TUNER, CX18_AV_AUDIO_SERIAL, 1 },
		{ CX18_CARD_INPUT_LINE_IN1,  CX18_AV_AUDIO_SERIAL, 0 },
		{ CX18_CARD_INPUT_LINE_IN2,  CX18_AV_AUDIO_SERIAL, 0 },
	},
	.tuners = {
		{ .std = V4L2_STD_NOT_MN, .tuner = TUNER_PHILIPS_FM1216ME_MK3 },
	},
	.ddr = {
		/* MT 46V16M16 memory */
		.chip_config = 0x50306,
		.refresh = 0x753,
		.timing1 = 0x33220953,
		.timing2 = 0x09,
		.tune_lane = 0,
		.initial_emrs = 0,
	},
	.gpio_init.initial_value = 0x02,
	.gpio_init.direction = 0x02,
	.gpio_audio_input  = { .mask = 0x02, .tuner  = 0x02, .linein = 0x00 },
	.pci_list = cx18_pci_cnxt_raptor_pal,
	.i2c = &cx18_i2c_std,
};

/* ------------------------------------------------------------------------- */

static const struct cx18_card *cx18_card_list[] = {
	&cx18_card_hvr1600_esmt,
	&cx18_card_hvr1600_samsung,
	&cx18_card_h900,
	&cx18_card_mpc718,
	&cx18_card_cnxt_raptor_pal,
};

const struct cx18_card *cx18_get_card(u16 index)
+8 −0
Original line number Diff line number Diff line
@@ -85,6 +85,13 @@ struct cx18_gpio_i2c_slave_reset {
	int msecs_recovery; /* time after deassert for chips to be ready */
};

struct ivtv_gpio_audio_input { 	/* select tuner/line in input */
	u32 mask; 		/* leave to 0 if not supported */
	u32 tuner;
	u32 linein;
	u32 radio;
};

struct cx18_card_tuner {
	v4l2_std_id std; 	/* standard for which the tuner is suitable */
	int 	    tuner; 	/* tuner ID (from tuner.h) */
@@ -123,6 +130,7 @@ struct cx18_card {
	u8 xceive_pin; 		/* XCeive tuner GPIO reset pin */
	struct cx18_gpio_init 		 gpio_init;
	struct cx18_gpio_i2c_slave_reset gpio_i2c_slave_reset;
	struct ivtv_gpio_audio_input    gpio_audio_input;

	struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS];
	struct cx18_card_tuner_i2c *i2c;
+2 −1
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ MODULE_PARM_DESC(cardtype,
		 "\t\t\t 2 = Hauppauge HVR 1600 (Samsung memory)\n"
		 "\t\t\t 3 = Compro VideoMate H900\n"
		 "\t\t\t 4 = Yuan MPC718\n"
		 "\t\t\t 5 = Conexant Raptor PAL/SECAM\n"
		 "\t\t\t 0 = Autodetect (default)\n"
		 "\t\t\t-1 = Ignore this card\n\t\t");
MODULE_PARM_DESC(pal, "Set PAL standard: B, G, H, D, K, I, M, N, Nc, 60");
@@ -435,7 +436,7 @@ static int __devinit cx18_init_struct1(struct cx18 *cx)
		(cx->params.video_temporal_filter_mode << 1) |
		(cx->params.video_median_filter_type << 2);
	cx->params.port = CX2341X_PORT_MEMORY;
	cx->params.capabilities = CX2341X_CAP_HAS_SLICED_VBI;
	cx->params.capabilities = 0;
	init_waitqueue_head(&cx->cap_w);
	init_waitqueue_head(&cx->mb_apu_waitq);
	init_waitqueue_head(&cx->mb_cpu_waitq);
+3 −1
Original line number Diff line number Diff line
@@ -75,7 +75,8 @@
#define CX18_CARD_HVR_1600_SAMSUNG    1	/* Hauppauge HVR 1600 (Samsung memory) */
#define CX18_CARD_COMPRO_H900 	      2	/* Compro VideoMate H900 */
#define CX18_CARD_YUAN_MPC718 	      3	/* Yuan MPC718 */
#define CX18_CARD_LAST 		      3
#define CX18_CARD_CNXT_RAPTOR_PAL     4	/* Conexant Raptor PAL */
#define CX18_CARD_LAST 		      4

#define CX18_ENC_STREAM_TYPE_MPG  0
#define CX18_ENC_STREAM_TYPE_TS   1
@@ -94,6 +95,7 @@
#define CX18_PCI_ID_HAUPPAUGE 		0x0070
#define CX18_PCI_ID_COMPRO 		0x185b
#define CX18_PCI_ID_YUAN 		0x12ab
#define CX18_PCI_ID_CONEXANT		0x14f1

/* ======================================================================== */
/* ========================== START USER SETTABLE DMA VARIABLES =========== */
+34 −0
Original line number Diff line number Diff line
@@ -122,3 +122,37 @@ int cx18_reset_tuner_gpio(void *dev, int cmd, int value)
	schedule_timeout_interruptible(msecs_to_jiffies(1));
	return 0;
}

int cx18_gpio(struct cx18 *cx, unsigned int command, void *arg)
{
	struct v4l2_routing *route = arg;
	u32 mask, data;

	switch (command) {
	case VIDIOC_INT_S_AUDIO_ROUTING:
		if (route->input > 2)
			return -EINVAL;
		mask = cx->card->gpio_audio_input.mask;
		switch (route->input) {
		case 0:
			data = cx->card->gpio_audio_input.tuner;
			break;
		case 1:
			data = cx->card->gpio_audio_input.linein;
			break;
		case 2:
		default:
			data = cx->card->gpio_audio_input.radio;
			break;
		}
		break;

	default:
		return -EINVAL;
	}
	if (mask) {
		cx->gpio_val = (cx->gpio_val & ~mask) | (data & mask);
		gpio_write(cx);
	}
	return 0;
}
Loading