mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-10 07:00:48 +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
@ -1,5 +1,5 @@
|
|||||||
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800]
|
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]
|
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036]
|
||||||
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
|
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
|
||||||
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201]
|
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_LGDT330X if !DVB_FE_CUSTOMISE
|
||||||
select DVB_ZL10353 if !DVB_FE_CUSTOMISE
|
select DVB_ZL10353 if !DVB_FE_CUSTOMISE
|
||||||
select DVB_TDA10023 if !DVB_FE_CUSTOMISE
|
select DVB_TDA10023 if !DVB_FE_CUSTOMISE
|
||||||
|
select DVB_S921 if !DVB_FE_CUSTOMISE
|
||||||
select VIDEOBUF_DVB
|
select VIDEOBUF_DVB
|
||||||
---help---
|
---help---
|
||||||
This adds support for DVB cards based on the
|
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
|
* Board definitions
|
||||||
*/
|
*/
|
||||||
@ -1224,6 +1238,19 @@ struct em28xx_board em28xx_boards[] = {
|
|||||||
.vmux = SAA7115_COMPOSITE0,
|
.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] = {
|
[EM2880_BOARD_MSI_DIGIVOX_AD] = {
|
||||||
.name = "MSI DigiVox A/D",
|
.name = "MSI DigiVox A/D",
|
||||||
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
||||||
@ -1754,6 +1781,8 @@ struct usb_device_id em28xx_id_table[] = {
|
|||||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||||
{ USB_DEVICE(0xeb1a, 0x2868),
|
{ USB_DEVICE(0xeb1a, 0x2868),
|
||||||
.driver_info = EM2820_BOARD_UNKNOWN },
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||||
|
{ USB_DEVICE(0xeb1a, 0x2875),
|
||||||
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
||||||
{ USB_DEVICE(0xeb1a, 0xe300),
|
{ USB_DEVICE(0xeb1a, 0xe300),
|
||||||
.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
|
.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
|
||||||
{ USB_DEVICE(0xeb1a, 0xe303),
|
{ USB_DEVICE(0xeb1a, 0xe303),
|
||||||
@ -1873,6 +1902,7 @@ static struct em28xx_hash_table em28xx_i2c_hash[] = {
|
|||||||
{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
|
{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
|
||||||
{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
|
{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
|
||||||
{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
|
{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
|
||||||
|
{0x6b800080, EM2874_LEADERSHIP_ISDBT, TUNER_ABSENT},
|
||||||
};
|
};
|
||||||
|
|
||||||
/* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
|
/* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
|
||||||
@ -2430,8 +2460,36 @@ void em28xx_card_setup(struct em28xx *dev)
|
|||||||
dev->board.is_webcam = 0;
|
dev->board.is_webcam = 0;
|
||||||
else
|
else
|
||||||
dev->progressive = 1;
|
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",
|
em28xx_info("Identified as %s (card=%d)\n",
|
||||||
dev->board.name, dev->model);
|
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);
|
em28xx_pre_card_setup(dev);
|
||||||
|
|
||||||
if (!dev->board.is_em2800) {
|
if (!dev->board.is_em2800) {
|
||||||
/* Sets I2C speed to 100 KHz */
|
/* Resets I2C speed */
|
||||||
retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
|
em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
|
||||||
if (retval < 0) {
|
if (retval < 0) {
|
||||||
em28xx_errdev("%s: em28xx_write_regs_req failed!"
|
em28xx_errdev("%s: em28xx_write_regs_req failed!"
|
||||||
" retval [%d]\n",
|
" retval [%d]\n",
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include "mt352_priv.h" /* FIXME */
|
#include "mt352_priv.h" /* FIXME */
|
||||||
#include "tda1002x.h"
|
#include "tda1002x.h"
|
||||||
#include "tda18271.h"
|
#include "tda18271.h"
|
||||||
|
#include "s921.h"
|
||||||
|
|
||||||
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
|
MODULE_DESCRIPTION("driver for em28xx based DVB cards");
|
||||||
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
|
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
|
||||||
@ -245,6 +246,10 @@ static struct lgdt3305_config em2870_lgdt3304_dev = {
|
|||||||
.qam_if_khz = 4000,
|
.qam_if_khz = 4000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct s921_config sharp_isdbt = {
|
||||||
|
.demod_address = 0x30 >> 1
|
||||||
|
};
|
||||||
|
|
||||||
static struct zl10353_config em28xx_zl10353_with_xc3028 = {
|
static struct zl10353_config em28xx_zl10353_with_xc3028 = {
|
||||||
.demod_address = (0x1e >> 1),
|
.demod_address = (0x1e >> 1),
|
||||||
.no_tuner = 1,
|
.no_tuner = 1,
|
||||||
@ -481,6 +486,7 @@ static int dvb_init(struct em28xx *dev)
|
|||||||
|
|
||||||
if (!dev->board.has_dvb) {
|
if (!dev->board.has_dvb) {
|
||||||
/* This device does not support the extension */
|
/* This device does not support the extension */
|
||||||
|
printk(KERN_INFO "em28xx_dvb: This device does not support the extension\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -496,6 +502,16 @@ static int dvb_init(struct em28xx *dev)
|
|||||||
em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
|
em28xx_set_mode(dev, EM28XX_DIGITAL_MODE);
|
||||||
/* init frontend */
|
/* init frontend */
|
||||||
switch (dev->model) {
|
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_850:
|
||||||
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
||||||
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
||||||
|
@ -117,6 +117,8 @@
|
|||||||
#define EM2800_BOARD_VC211A 74
|
#define EM2800_BOARD_VC211A 74
|
||||||
#define EM2882_BOARD_DIKOM_DK300 75
|
#define EM2882_BOARD_DIKOM_DK300 75
|
||||||
#define EM2870_BOARD_KWORLD_A340 76
|
#define EM2870_BOARD_KWORLD_A340 76
|
||||||
|
#define EM2874_LEADERSHIP_ISDBT 77
|
||||||
|
|
||||||
|
|
||||||
/* 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…
x
Reference in New Issue
Block a user