mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
[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: Ivan Kalvachev <ikalvachev@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
c247d7b107
commit
fa5527cd3f
@ -364,6 +364,19 @@ static struct em28xx_reg_seq maxmedia_ub425_tc[] = {
|
|||||||
{-1, -1, -1, -1},
|
{-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)
|
/* 2013:0251 PCTV QuatroStick nano (520e)
|
||||||
* GPIO_2: decoder reset, 0=active
|
* GPIO_2: decoder reset, 0=active
|
||||||
* GPIO_4: decoder suspend, 0=active
|
* GPIO_4: decoder suspend, 0=active
|
||||||
@ -1944,6 +1957,18 @@ struct em28xx_board em28xx_boards[] = {
|
|||||||
EM28XX_I2C_CLK_WAIT_ENABLE |
|
EM28XX_I2C_CLK_WAIT_ENABLE |
|
||||||
EM28XX_I2C_FREQ_400_KHZ,
|
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)
|
/* 2013:0251 PCTV QuatroStick nano (520e)
|
||||||
* Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
|
* Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
|
||||||
[EM2884_BOARD_PCTV_520E] = {
|
[EM2884_BOARD_PCTV_520E] = {
|
||||||
@ -2109,6 +2134,8 @@ struct usb_device_id em28xx_id_table[] = {
|
|||||||
.driver_info = EM2860_BOARD_EASYCAP },
|
.driver_info = EM2860_BOARD_EASYCAP },
|
||||||
{ USB_DEVICE(0x1b80, 0xe425),
|
{ USB_DEVICE(0x1b80, 0xe425),
|
||||||
.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
|
.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
|
||||||
|
{ USB_DEVICE(0x2304, 0x0242),
|
||||||
|
.driver_info = EM2884_BOARD_PCTV_510E },
|
||||||
{ USB_DEVICE(0x2013, 0x0251),
|
{ USB_DEVICE(0x2013, 0x0251),
|
||||||
.driver_info = EM2884_BOARD_PCTV_520E },
|
.driver_info = EM2884_BOARD_PCTV_520E },
|
||||||
{ },
|
{ },
|
||||||
|
@ -338,6 +338,13 @@ struct drxk_config pctv_520e_drxk = {
|
|||||||
.chunk_size = 58,
|
.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)
|
static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable)
|
||||||
{
|
{
|
||||||
struct em28xx_dvb *dvb = fe->sec_priv;
|
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);
|
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)
|
static int em28xx_mt352_terratec_xs_init(struct dvb_frontend *fe)
|
||||||
{
|
{
|
||||||
/* Values extracted from a USB trace of the Terratec Windows driver */
|
/* 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:
|
case EM2884_BOARD_PCTV_520E:
|
||||||
pctv_520e_init(dev);
|
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 */
|
/* attach demodulator */
|
||||||
dvb->fe[0] = dvb_attach(drxk_attach, &pctv_520e_drxk,
|
dvb->fe[0] = dvb_attach(drxk_attach, &pctv_520e_drxk,
|
||||||
&dev->i2c_adap);
|
&dev->i2c_adap);
|
||||||
|
@ -126,7 +126,8 @@
|
|||||||
#define EM2884_BOARD_CINERGY_HTC_STICK 82
|
#define EM2884_BOARD_CINERGY_HTC_STICK 82
|
||||||
#define EM2860_BOARD_HT_VIDBOX_NW03 83
|
#define EM2860_BOARD_HT_VIDBOX_NW03 83
|
||||||
#define EM2874_BOARD_MAXMEDIA_UB425_TC 84
|
#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 */
|
/* Limits minimum and default number of buffers */
|
||||||
#define EM28XX_MIN_BUF 4
|
#define EM28XX_MIN_BUF 4
|
||||||
|
Loading…
Reference in New Issue
Block a user