Commit ca3dfd6a authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

[media] em28xx: Add support for Leadership ISDB-T

This device uses an em2874B + Sharp 921 One Seg frontend.
Signed-off-by: default avatarDouglas Schilling Landgraf <dougsland@redhat.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3a509bb1
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 ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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 }
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_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, ...@@ -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 @@ ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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 @@ ...@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment