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

Commit fa5527cd authored by Ivan Kalvachev's avatar Ivan Kalvachev Committed by Mauro Carvalho Chehab
Browse files

[media] em28xx: support for 2304:0242 PCTV QuatroStick (510e)



It is mostly copy/paste of the 520e code with setting GPIO7 removed
(no LED light).

I've worked on just released vanilla linux-3.3.0 kernel, so there may
be 1/2 lines offset to the internal working source, but most of the
code should apply cleanly.

I was able to get the DVB-C working (tuned and watched TV). Haven't
tested DVB-T (no signal atm).

Special thanks to everybody who worked on the code and to Antti
Palosaari and Devin Heitmueller who provided essential support on irc.

Hardware is based of:
Empia EM2884
Micronas DRX 3926K
NXP TDA18271HDC2
AVF4910 (not used atm)

Signed-off-by: default avatarIvan Kalvachev <ikalvachev@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent c247d7b1
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -364,6 +364,19 @@ static struct em28xx_reg_seq maxmedia_ub425_tc[] = {
	{-1,                 -1,    -1,   -1},
};

/* 2304:0242 PCTV QuatroStick (510e)
 * GPIO_2: decoder reset, 0=active
 * GPIO_4: decoder suspend, 0=active
 * GPIO_6: demod reset, 0=active
 * GPIO_7: LED, 1=active
 */
static struct em28xx_reg_seq pctv_510e[] = {
	{EM2874_R80_GPIO, 0x10, 0xff, 100},
	{EM2874_R80_GPIO, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
	{EM2874_R80_GPIO, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
	{             -1,   -1,   -1,  -1},
};

/* 2013:0251 PCTV QuatroStick nano (520e)
 * GPIO_2: decoder reset, 0=active
 * GPIO_4: decoder suspend, 0=active
@@ -1944,6 +1957,18 @@ struct em28xx_board em28xx_boards[] = {
				EM28XX_I2C_CLK_WAIT_ENABLE |
				EM28XX_I2C_FREQ_400_KHZ,
	},
	/* 2304:0242 PCTV QuatroStick (510e)
	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
	[EM2884_BOARD_PCTV_510E] = {
		.name          = "PCTV QuatroStick (510e)",
		.tuner_type    = TUNER_ABSENT,
		.tuner_gpio    = pctv_510e,
		.has_dvb       = 1,
		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
		.i2c_speed     = EM2874_I2C_SECONDARY_BUS_SELECT |
				EM28XX_I2C_CLK_WAIT_ENABLE |
				EM28XX_I2C_FREQ_400_KHZ,
	},
	/* 2013:0251 PCTV QuatroStick nano (520e)
	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
	[EM2884_BOARD_PCTV_520E] = {
@@ -2109,6 +2134,8 @@ struct usb_device_id em28xx_id_table[] = {
			.driver_info = EM2860_BOARD_EASYCAP },
	{ USB_DEVICE(0x1b80, 0xe425),
			.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
	{ USB_DEVICE(0x2304, 0x0242),
			.driver_info = EM2884_BOARD_PCTV_510E },
	{ USB_DEVICE(0x2013, 0x0251),
			.driver_info = EM2884_BOARD_PCTV_520E },
	{ },
+53 −0
Original line number Diff line number Diff line
@@ -338,6 +338,13 @@ struct drxk_config pctv_520e_drxk = {
	.chunk_size = 58,
};

struct drxk_config pctv_520e_drxk = {
	.adr = 0x29,
	.single_master = 1,
	.microcode_name = "dvb-demod-drxk-pctv.fw",
	.chunk_size = 58,
};

static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
{
	struct em28xx_dvb *dvb = fe->sec_priv;
@@ -498,6 +505,33 @@ static void pctv_520e_init(struct em28xx *dev)
		i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
};

static void pctv_520e_init(struct em28xx *dev)
{
	/*
	 * Init TDA8295(?) analog demodulator. Looks like I2C traffic to
	 * digital demodulator and tuner are routed via TDA8295.
	 */
	int i;
	struct {
		unsigned char r[4];
		int len;
	} regs[] = {
		{{ 0x06, 0x02, 0x00, 0x31 }, 4},
		{{ 0x01, 0x02 }, 2},
		{{ 0x01, 0x02, 0x00, 0xc6 }, 4},
		{{ 0x01, 0x00 }, 2},
		{{ 0x01, 0x00, 0xff, 0xaf }, 4},
		{{ 0x01, 0x00, 0x03, 0xa0 }, 4},
		{{ 0x01, 0x00 }, 2},
		{{ 0x01, 0x00, 0x73, 0xaf }, 4},
	};

	dev->i2c_client.addr = 0x82 >> 1; /* 0x41 */

	for (i = 0; i < ARRAY_SIZE(regs); i++)
		i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len);
};

static int em28xx_mt352_terratec_xs_init(struct dvb_frontend *fe)
{
	/* Values extracted from a USB trace of the Terratec Windows driver */
@@ -1002,6 +1036,25 @@ static int em28xx_dvb_init(struct em28xx *dev)
	case EM2884_BOARD_PCTV_520E:
		pctv_520e_init(dev);

		/* attach demodulator */
		dvb->fe[0] = dvb_attach(drxk_attach, &pctv_520e_drxk,
				&dev->i2c_adap);

		if (dvb->fe[0]) {
			/* attach tuner */
			if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60,
					&dev->i2c_adap,
					&em28xx_cxd2820r_tda18271_config)) {
				dvb_frontend_detach(dvb->fe[0]);
				result = -EINVAL;
				goto out_free;
			}
		}
		break;
	case EM2884_BOARD_PCTV_510E:
	case EM2884_BOARD_PCTV_520E:
		pctv_520e_init(dev);

		/* attach demodulator */
		dvb->fe[0] = dvb_attach(drxk_attach, &pctv_520e_drxk,
				&dev->i2c_adap);
+2 −1
Original line number Diff line number Diff line
@@ -126,7 +126,8 @@
#define EM2884_BOARD_CINERGY_HTC_STICK		  82
#define EM2860_BOARD_HT_VIDBOX_NW03 		  83
#define EM2874_BOARD_MAXMEDIA_UB425_TC            84
#define EM2884_BOARD_PCTV_520E                    85
#define EM2884_BOARD_PCTV_510E                    85
#define EM2884_BOARD_PCTV_520E                    86

/* Limits minimum and default number of buffers */
#define EM28XX_MIN_BUF 4