mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
[media] em28xx: Add support for Leadership ISDB-T
This device uses an em2874B + Sharp 921 One Seg frontend. Signed-off-by: Douglas Schilling Landgraf <dougsland@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
3a509bb11a
commit
ca3dfd6a6f
5 changed files with 82 additions and 5 deletions
|
@ -1,5 +1,5 @@
|
|||
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800]
|
||||
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2862,eb1a:2863,eb1a:2870,eb1a:2881,eb1a:2883,eb1a:2868]
|
||||
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2710,eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2862,eb1a:2863,eb1a:2870,eb1a:2881,eb1a:2883,eb1a:2868,eb1a:2875]
|
||||
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036]
|
||||
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
|
||||
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201]
|
||||
|
|
|
@ -37,6 +37,7 @@ config VIDEO_EM28XX_DVB
|
|||
select DVB_LGDT330X if !DVB_FE_CUSTOMISE
|
||||
select DVB_ZL10353 if !DVB_FE_CUSTOMISE
|
||||
select DVB_TDA10023 if !DVB_FE_CUSTOMISE
|
||||
select DVB_S921 if !DVB_FE_CUSTOMISE
|
||||
select VIDEOBUF_DVB
|
||||
---help---
|
||||
This adds support for DVB cards based on the
|
||||
|
|
|
@ -268,6 +268,20 @@ static struct em28xx_reg_seq dikom_dk300_digital[] = {
|
|||
};
|
||||
|
||||
|
||||
/* Reset for the most [digital] boards */
|
||||
static struct em28xx_reg_seq leadership_digital[] = {
|
||||
{EM2874_R80_GPIO, 0x70, 0xff, 10},
|
||||
{ -1, -1, -1, -1},
|
||||
};
|
||||
|
||||
static struct em28xx_reg_seq leadership_reset[] = {
|
||||
{EM2874_R80_GPIO, 0xf0, 0xff, 10},
|
||||
{EM2874_R80_GPIO, 0xb0, 0xff, 10},
|
||||
{EM2874_R80_GPIO, 0xf0, 0xff, 10},
|
||||
{ -1, -1, -1, -1},
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Board definitions
|
||||
*/
|
||||
|
@ -1224,6 +1238,19 @@ struct em28xx_board em28xx_boards[] = {
|
|||
.vmux = SAA7115_COMPOSITE0,
|
||||
} },
|
||||
},
|
||||
|
||||
[EM2874_LEADERSHIP_ISDBT] = {
|
||||
.i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT |
|
||||
EM28XX_I2C_CLK_WAIT_ENABLE |
|
||||
EM28XX_I2C_FREQ_100_KHZ,
|
||||
.xclk = EM28XX_XCLK_FREQUENCY_10MHZ,
|
||||
.name = "EM2874 Leadership ISDBT",
|
||||
.tuner_type = TUNER_ABSENT,
|
||||
.tuner_gpio = leadership_reset,
|
||||
.dvb_gpio = leadership_digital,
|
||||
.has_dvb = 1,
|
||||
},
|
||||
|
||||
[EM2880_BOARD_MSI_DIGIVOX_AD] = {
|
||||
.name = "MSI DigiVox A/D",
|
||||
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
||||
|
@ -1754,6 +1781,8 @@ struct usb_device_id em28xx_id_table[] = {
|
|||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2868),
|
||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0x2875),
|
||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||
{ USB_DEVICE(0xeb1a, 0xe300),
|
||||
.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
|
||||
{ USB_DEVICE(0xeb1a, 0xe303),
|
||||
|
@ -1873,6 +1902,7 @@ static struct em28xx_hash_table em28xx_i2c_hash[] = {
|
|||
{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
|
||||
{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
|
||||
{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
|
||||
{0x6b800080, EM2874_LEADERSHIP_ISDBT, TUNER_ABSENT},
|
||||
};
|
||||
|
||||
/* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
|
||||
|
@ -2430,8 +2460,36 @@ void em28xx_card_setup(struct em28xx *dev)
|
|||
dev->board.is_webcam = 0;
|
||||
else
|
||||
dev->progressive = 1;
|
||||
} else
|
||||
em28xx_set_model(dev);
|
||||
}
|
||||
|
||||
if (!dev->board.is_webcam) {
|
||||
switch (dev->model) {
|
||||
case EM2820_BOARD_UNKNOWN:
|
||||
case EM2800_BOARD_UNKNOWN:
|
||||
/*
|
||||
* The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
|
||||
*
|
||||
* This occurs because they share identical USB vendor and
|
||||
* product IDs.
|
||||
*
|
||||
* What we do here is look up the EEPROM hash of the K-WORLD
|
||||
* and if it is found then we decide that we do not have
|
||||
* a DIGIVOX and reset the device to the K-WORLD instead.
|
||||
*
|
||||
* This solution is only valid if they do not share eeprom
|
||||
* hash identities which has not been determined as yet.
|
||||
*/
|
||||
if (em28xx_hint_board(dev) < 0)
|
||||
em28xx_errdev("Board not discovered\n");
|
||||
else {
|
||||
em28xx_set_model(dev);
|
||||
em28xx_pre_card_setup(dev);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
em28xx_set_model(dev);
|
||||
}
|
||||
}
|
||||
|
||||
em28xx_info("Identified as %s (card=%d)\n",
|
||||
dev->board.name, dev->model);
|
||||
|
@ -2749,8 +2807,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
|
|||
em28xx_pre_card_setup(dev);
|
||||
|
||||
if (!dev->board.is_em2800) {
|
||||
/* Sets I2C speed to 100 KHz */
|
||||
retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
|
||||
/* Resets I2C speed */
|
||||
em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
|
||||
if (retval < 0) {
|
||||
em28xx_errdev("%s: em28xx_write_regs_req failed!"
|
||||
" retval [%d]\n",
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "mt352_priv.h" /* FIXME */
|
||||
#include "tda1002x.h"
|
||||
#include "tda18271.h"
|
||||
#include "s921.h"
|
||||
|
||||
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
|
||||
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
|
||||
|
@ -245,6 +246,10 @@ static struct lgdt3305_config em2870_lgdt3304_dev = {
|
|||
.qam_if_khz = 4000,
|
||||
};
|
||||
|
||||
static struct s921_config sharp_isdbt = {
|
||||
.demod_address = 0x30 >> 1
|
||||
};
|
||||
|
||||
static struct zl10353_config em28xx_zl10353_with_xc3028 = {
|
||||
.demod_address = (0x1e >> 1),
|
||||
.no_tuner = 1,
|
||||
|
@ -481,6 +486,7 @@ static int dvb_init(struct em28xx *dev)
|
|||
|
||||
if (!dev->board.has_dvb) {
|
||||
/* This device does not support the extension */
|
||||
printk(KERN_INFO "em28xx_dvb: This device does not support the extension\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -496,6 +502,16 @@ static int dvb_init(struct em28xx *dev)
|
|||
em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
|
||||
/* init frontend */
|
||||
switch (dev->model) {
|
||||
case EM2874_LEADERSHIP_ISDBT:
|
||||
dvb->frontend = dvb_attach(s921_attach,
|
||||
&sharp_isdbt, &dev->i2c_adap);
|
||||
|
||||
if (!dvb->frontend) {
|
||||
result = -EINVAL;
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
break;
|
||||
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
|
||||
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
||||
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
||||
|
|
|
@ -117,6 +117,8 @@
|
|||
#define EM2800_BOARD_VC211A 74
|
||||
#define EM2882_BOARD_DIKOM_DK300 75
|
||||
#define EM2870_BOARD_KWORLD_A340 76
|
||||
#define EM2874_LEADERSHIP_ISDBT 77
|
||||
|
||||
|
||||
/* Limits minimum and default number of buffers */
|
||||
#define EM28XX_MIN_BUF 4
|
||||
|
|
Loading…
Reference in a new issue