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

Commit 2cf36ac4 authored by Hartmut Hackmann's avatar Hartmut Hackmann Committed by Linus Torvalds
Browse files

[PATCH] v4l: 656: added support for the following cards



- Added support for the following cards:
- Philips EUROPA reference desigh
- Compro VideoMate DVB-T300
- Compro VideoMate DVB-T200 (initial)

Signed-off-by: default avatarHartmut Hackmann <hartmut.hackmann@t.online.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 93df3413
Loading
Loading
Loading
Loading
+103 −1
Original line number Diff line number Diff line
@@ -2185,6 +2185,72 @@ struct saa7134_board saa7134_boards[] = {
                        .gpio = 0x00200003,
                },
        },
	[SAA7134_BOARD_PHILIPS_EUROPA] = {
		.name           = "Philips EUROPA V3 reference design",
		.audio_clock    = 0x00187de7,
		.tuner_type     = TUNER_PHILIPS_TD1316,
		.radio_type     = UNSET,
		.tuner_addr	= 0x61,
		.radio_addr	= ADDR_UNSET,
		.tda9887_conf   = TDA9887_PRESENT,
		.mpeg           = SAA7134_MPEG_DVB,
		.inputs = {{
			.name   = name_tv,
			.vmux   = 3,
			.amux   = TV,
			.tv     = 1,
		},{
			.name   = name_comp1,
			.vmux   = 0,
			.amux   = LINE2,
		},{
			.name   = name_svideo,
			.vmux   = 8,
			.amux   = LINE2,
		}},
	},
	[SAA7134_BOARD_VIDEOMATE_DVBT_300] = {
		.name           = "Compro Videomate DVB-T300",
		.audio_clock    = 0x00187de7,
		.tuner_type     = TUNER_PHILIPS_TD1316,
		.radio_type     = UNSET,
		.tuner_addr	= 0x61,
		.radio_addr	= ADDR_UNSET,
		.tda9887_conf   = TDA9887_PRESENT,
		.mpeg           = SAA7134_MPEG_DVB,
		.inputs = {{
			.name   = name_tv,
			.vmux   = 3,
			.amux   = TV,
			.tv     = 1,
		},{
			.name   = name_comp1,
			.vmux   = 1,
			.amux   = LINE2,
		},{
			.name   = name_svideo,
			.vmux   = 8,
			.amux   = LINE2,
		}},
	},
	[SAA7134_BOARD_VIDEOMATE_DVBT_200] = {
		.name           = "Compro Videomate DVB-T200",
		.tuner_type	= TUNER_ABSENT,
		.audio_clock    = 0x00187de7,
		.radio_type     = UNSET,
		.tuner_addr	= ADDR_UNSET,
		.radio_addr	= ADDR_UNSET,
		.mpeg           = SAA7134_MPEG_DVB,
		.inputs = {{
			.name   = name_comp1,
			.vmux   = 0,
			.amux   = LINE1,
		},{
			.name   = name_svideo,
			.vmux   = 8,
			.amux   = LINE1,
		}},
	},
};

const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
@@ -2554,6 +2620,24 @@ struct pci_device_id saa7134_pci_tbl[] = {
                .subvendor    = 0x5456, /* GoTView */
                .subdevice    = 0x7135,
                .driver_data  = SAA7134_BOARD_GOTVIEW_7135,
        },{
		.vendor       = PCI_VENDOR_ID_PHILIPS,
		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
		.subvendor    = PCI_VENDOR_ID_PHILIPS,
		.subdevice    = 0x2004,
		.driver_data  = SAA7134_BOARD_PHILIPS_EUROPA,
 	},{
		.vendor       = PCI_VENDOR_ID_PHILIPS,
		.device       = PCI_DEVICE_ID_PHILIPS_SAA7134,
		.subvendor    = 0x185b,
		.subdevice    = 0xc900,
		.driver_data  = SAA7134_BOARD_VIDEOMATE_DVBT_300,
 	},{
		.vendor       = PCI_VENDOR_ID_PHILIPS,
		.device       = PCI_DEVICE_ID_PHILIPS_SAA7130,
		.subvendor    = 0x185b,
		.subdevice    = 0xc901,
		.driver_data  = SAA7134_BOARD_VIDEOMATE_DVBT_200,
	},{
		/* --- boards without eeprom + subsystem ID --- */
		.vendor       = PCI_VENDOR_ID_PHILIPS,
@@ -2772,6 +2856,24 @@ case SAA7134_BOARD_MD7134:
		tun_setup.type = dev->tuner_type;
		tun_setup.addr = ADDR_UNSET;

		saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup);
		}
		break;
	case SAA7134_BOARD_PHILIPS_EUROPA:
	case SAA7134_BOARD_VIDEOMATE_DVBT_300:
		/* The Philips EUROPA based hybrid boards have the tuner connected through
		 * the channel decoder. We have to make it transparent to find it
	 	 */
		{
		struct tuner_setup tun_setup;
		u8 data[] = { 0x07, 0x02};
		struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
		i2c_transfer(&dev->i2c_adap, &msg, 1);

		tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
		tun_setup.type = dev->tuner_type;
		tun_setup.addr = dev->tuner_addr;

		saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup);
 		}
		break;
+130 −22
Original line number Diff line number Diff line
@@ -151,25 +151,12 @@ static struct mt352_config pinnacle_300i = {
/* ------------------------------------------------------------------ */

#ifdef HAVE_TDA1004X
static int philips_tu1216_pll_init(struct dvb_frontend *fe)
{
	struct saa7134_dev *dev = fe->dvb->priv;
	static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
	struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };

	/* setup PLL configuration */
	if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
		return -EIO;
	msleep(1);

	return 0;
}

static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
static int philips_tda6651_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
{
	struct saa7134_dev *dev = fe->dvb->priv;
	u8 tuner_buf[4];
	struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf,.len =
	struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len =
			sizeof(tuner_buf) };
	int tuner_frequency = 0;
	u8 band, cp, filter;
@@ -242,11 +229,36 @@ static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_p

	if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
		return -EIO;
	msleep(1);
	return 0;
}

static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe)
{
	struct saa7134_dev *dev = fe->dvb->priv;
	static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
	struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };

	/* setup PLL configuration */
	if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
		return -EIO;
	msleep(1);

	return 0;
}

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

static int philips_tu1216_pll_60_init(struct dvb_frontend *fe)
{
	return philips_tda6651_pll_init(0x60, fe);
}

static int philips_tu1216_pll_60_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
{
	return philips_tda6651_pll_set(0x60, fe, params);
}

static int philips_tu1216_request_firmware(struct dvb_frontend *fe,
					   const struct firmware **fw, char *name)
{
@@ -254,22 +266,108 @@ static int philips_tu1216_request_firmware(struct dvb_frontend *fe,
	return request_firmware(fw, name, &dev->pci->dev);
}

static struct tda1004x_config philips_tu1216_config = {
static struct tda1004x_config philips_tu1216_60_config = {

	.demod_address = 0x8,
	.invert        = 1,
	.invert_oclk   = 1,
	.invert_oclk   = 0,
	.xtal_freq     = TDA10046_XTAL_4M,
	.agc_config    = TDA10046_AGC_DEFAULT,
	.if_freq       = TDA10046_FREQ_3617,
	.pll_init      = philips_tu1216_pll_init,
	.pll_set       = philips_tu1216_pll_set,
	.pll_init      = philips_tu1216_pll_60_init,
	.pll_set       = philips_tu1216_pll_60_set,
	.pll_sleep     = NULL,
	.request_firmware = philips_tu1216_request_firmware,
};

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

static int philips_tu1216_pll_61_init(struct dvb_frontend *fe)
{
	return philips_tda6651_pll_init(0x61, fe);
}

static int philips_tu1216_pll_61_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
{
	return philips_tda6651_pll_set(0x61, fe, params);
}

static struct tda1004x_config philips_tu1216_61_config = {

	.demod_address = 0x8,
	.invert        = 1,
	.invert_oclk   = 0,
	.xtal_freq     = TDA10046_XTAL_4M,
	.agc_config    = TDA10046_AGC_DEFAULT,
	.if_freq       = TDA10046_FREQ_3617,
	.pll_init      = philips_tu1216_pll_61_init,
	.pll_set       = philips_tu1216_pll_61_set,
	.pll_sleep     = NULL,
	.request_firmware = philips_tu1216_request_firmware,
};

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

static int philips_europa_pll_init(struct dvb_frontend *fe)
{
	struct saa7134_dev *dev = fe->dvb->priv;
	static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
	struct i2c_msg init_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) };

	/* setup PLL configuration */
	if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
		return -EIO;
	msleep(1);

	/* switch the board to dvb mode */
	init_msg.addr = 0x43;
	init_msg.len  = 0x02;
	msg[0] = 0x00;
	msg[1] = 0x40;
	if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
		return -EIO;

	return 0;
}

static int philips_td1316_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
{
	return philips_tda6651_pll_set(0x61, fe, params);
}

static void philips_europa_analog(struct dvb_frontend *fe)
{
	struct saa7134_dev *dev = fe->dvb->priv;
	/* this message actually turns the tuner back to analog mode */
	static u8 msg[] = { 0x0b, 0xdc, 0x86, 0xa4 };
	struct i2c_msg analog_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) };

	i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
	msleep(1);

	/* switch the board to analog mode */
	analog_msg.addr = 0x43;
	analog_msg.len  = 0x02;
	msg[0] = 0x00;
	msg[1] = 0x14;
	i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
}

static struct tda1004x_config philips_europa_config = {

	.demod_address = 0x8,
	.invert        = 0,
	.invert_oclk   = 0,
	.xtal_freq     = TDA10046_XTAL_4M,
	.agc_config    = TDA10046_AGC_IFO_AUTO_POS,
	.if_freq       = TDA10046_FREQ_052,
	.pll_init      = philips_europa_pll_init,
	.pll_set       = philips_td1316_pll_set,
	.pll_sleep     = philips_europa_analog,
	.request_firmware = NULL,
};

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

static int philips_fmd1216_pll_init(struct dvb_frontend *fe)
{
@@ -382,7 +480,6 @@ static int philips_fmd1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_
	return 0;
}

#ifdef HAVE_TDA1004X
static struct tda1004x_config medion_cardbus = {
	.demod_address = 0x08,
	.invert        = 1,
@@ -395,7 +492,6 @@ static struct tda1004x_config medion_cardbus = {
	.pll_sleep	   = philips_fmd1216_analog,
	.request_firmware = NULL,
};
#endif

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

@@ -558,7 +654,7 @@ static int dvb_init(struct saa7134_dev *dev)
						    &dev->i2c_adap);
		break;
	case SAA7134_BOARD_PHILIPS_TOUGH:
		dev->dvb.frontend = tda10046_attach(&philips_tu1216_config,
		dev->dvb.frontend = tda10046_attach(&philips_tu1216_60_config,
						    &dev->i2c_adap);
		break;
	case SAA7134_BOARD_FLYDVBTDUO:
@@ -569,6 +665,18 @@ static int dvb_init(struct saa7134_dev *dev)
		dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
						    &dev->i2c_adap);
		break;
	case SAA7134_BOARD_PHILIPS_EUROPA:
		dev->dvb.frontend = tda10046_attach(&philips_europa_config,
						    &dev->i2c_adap);
		break;
	case SAA7134_BOARD_VIDEOMATE_DVBT_300:
		dev->dvb.frontend = tda10046_attach(&philips_europa_config,
						    &dev->i2c_adap);
		break;
	case SAA7134_BOARD_VIDEOMATE_DVBT_200:
		dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config,
						    &dev->i2c_adap);
		break;
#endif
	default:
		printk("%s: Huh? unknown DVB card?\n",dev->name);
+3 −0
Original line number Diff line number Diff line
@@ -189,6 +189,9 @@ struct saa7134_format {
#define SAA7134_BOARD_YUAN_TUN900 66
#define SAA7134_BOARD_BEHOLD_409FM 67
#define SAA7134_BOARD_GOTVIEW_7135 68
#define SAA7134_BOARD_PHILIPS_EUROPA  69
#define SAA7134_BOARD_VIDEOMATE_DVBT_300 70
#define SAA7134_BOARD_VIDEOMATE_DVBT_200 71

#define SAA7134_MAXBOARDS 8
#define SAA7134_INPUT_MAX 8