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

[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
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
  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]
+1 −0
Original line number Diff line number Diff line
@@ -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
+62 −4
Original line number Diff line number Diff line
@@ -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
	}

	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",
+16 −0
Original line number Diff line number Diff line
@@ -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:
+2 −0
Original line number Diff line number Diff line
@@ -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