2005-11-09 05:37:07 +00:00
|
|
|
/*
|
2007-11-23 17:22:14 +00:00
|
|
|
em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
|
|
|
|
video capture devices
|
2005-11-09 05:37:07 +00:00
|
|
|
|
2005-11-09 05:38:25 +00:00
|
|
|
Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
|
|
|
|
Markus Rechberger <mrechberger@gmail.com>
|
2006-04-03 10:53:40 +00:00
|
|
|
Mauro Carvalho Chehab <mchehab@infradead.org>
|
2005-11-09 05:38:25 +00:00
|
|
|
Sascha Sommer <saschasommer@freenet.de>
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
|
2005-11-09 05:37:07 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
|
2016-10-12 10:26:47 +00:00
|
|
|
#include "em28xx.h"
|
|
|
|
|
2005-11-09 05:37:07 +00:00
|
|
|
#include <linux/init.h>
|
|
|
|
#include <linux/module.h>
|
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h
percpu.h is included by sched.h and module.h and thus ends up being
included when building most .c files. percpu.h includes slab.h which
in turn includes gfp.h making everything defined by the two files
universally available and complicating inclusion dependencies.
percpu.h -> slab.h dependency is about to be removed. Prepare for
this change by updating users of gfp and slab facilities include those
headers directly instead of assuming availability. As this conversion
needs to touch large number of source files, the following script is
used as the basis of conversion.
http://userweb.kernel.org/~tj/misc/slabh-sweep.py
The script does the followings.
* Scan files for gfp and slab usages and update includes such that
only the necessary includes are there. ie. if only gfp is used,
gfp.h, if slab is used, slab.h.
* When the script inserts a new include, it looks at the include
blocks and try to put the new include such that its order conforms
to its surrounding. It's put in the include block which contains
core kernel includes, in the same order that the rest are ordered -
alphabetical, Christmas tree, rev-Xmas-tree or at the end if there
doesn't seem to be any matching order.
* If the script can't find a place to put a new include (mostly
because the file doesn't have fitting include block), it prints out
an error message indicating which .h file needs to be added to the
file.
The conversion was done in the following steps.
1. The initial automatic conversion of all .c files updated slightly
over 4000 files, deleting around 700 includes and adding ~480 gfp.h
and ~3000 slab.h inclusions. The script emitted errors for ~400
files.
2. Each error was manually checked. Some didn't need the inclusion,
some needed manual addition while adding it to implementation .h or
embedding .c file was more appropriate for others. This step added
inclusions to around 150 files.
3. The script was run again and the output was compared to the edits
from #2 to make sure no file was left behind.
4. Several build tests were done and a couple of problems were fixed.
e.g. lib/decompress_*.c used malloc/free() wrappers around slab
APIs requiring slab.h to be added manually.
5. The script was run on all .h files but without automatically
editing them as sprinkling gfp.h and slab.h inclusions around .h
files could easily lead to inclusion dependency hell. Most gfp.h
inclusion directives were ignored as stuff from gfp.h was usually
wildly available and often used in preprocessor macros. Each
slab.h inclusion directive was examined and added manually as
necessary.
6. percpu.h was updated not to include slab.h.
7. Build test were done on the following configurations and failures
were fixed. CONFIG_GCOV_KERNEL was turned off for all tests (as my
distributed build env didn't work with gcov compiles) and a few
more options had to be turned off depending on archs to make things
build (like ipr on powerpc/64 which failed due to missing writeq).
* x86 and x86_64 UP and SMP allmodconfig and a custom test config.
* powerpc and powerpc64 SMP allmodconfig
* sparc and sparc64 SMP allmodconfig
* ia64 SMP allmodconfig
* s390 SMP allmodconfig
* alpha SMP allmodconfig
* um on x86_64 SMP allmodconfig
8. percpu.h modifications were reverted so that it could be applied as
a separate patch and serve as bisection point.
Given the fact that I had only a couple of failures from tests on step
6, I'm fairly confident about the coverage of this conversion patch.
If there is a breakage, it's likely to be something in one of the arch
headers which should be easily discoverable easily on most builds of
the specific arch.
Signed-off-by: Tejun Heo <tj@kernel.org>
Guess-its-ok-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>
2010-03-24 08:04:11 +00:00
|
|
|
#include <linux/slab.h>
|
2005-11-09 05:37:07 +00:00
|
|
|
#include <linux/delay.h>
|
|
|
|
#include <linux/i2c.h>
|
|
|
|
#include <linux/usb.h>
|
|
|
|
#include <media/tuner.h>
|
2015-11-13 21:40:07 +00:00
|
|
|
#include <media/drv-intf/msp3400.h>
|
2015-11-10 14:01:44 +00:00
|
|
|
#include <media/i2c/saa7115.h>
|
2016-02-05 19:09:56 +00:00
|
|
|
#include <dt-bindings/media/tvp5150.h>
|
2015-11-10 14:01:44 +00:00
|
|
|
#include <media/i2c/tvaudio.h>
|
2005-11-09 05:37:16 +00:00
|
|
|
#include <media/tveeprom.h>
|
2006-01-09 17:25:37 +00:00
|
|
|
#include <media/v4l2-common.h>
|
2016-03-04 21:33:08 +00:00
|
|
|
#include <sound/ac97_codec.h>
|
2005-11-09 05:37:07 +00:00
|
|
|
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
#define DRIVER_NAME "em28xx"
|
|
|
|
|
2007-11-04 00:20:59 +00:00
|
|
|
static int tuner = -1;
|
|
|
|
module_param(tuner, int, 0444);
|
|
|
|
MODULE_PARM_DESC(tuner, "tuner type");
|
|
|
|
|
2008-01-13 18:42:17 +00:00
|
|
|
static unsigned int disable_ir;
|
|
|
|
module_param(disable_ir, int, 0444);
|
|
|
|
MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
|
|
|
|
|
2009-05-28 02:44:10 +00:00
|
|
|
static unsigned int disable_usb_speed_check;
|
|
|
|
module_param(disable_usb_speed_check, int, 0444);
|
|
|
|
MODULE_PARM_DESC(disable_usb_speed_check,
|
|
|
|
"override min bandwidth requirement of 480M bps");
|
|
|
|
|
2013-01-04 19:16:24 +00:00
|
|
|
static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
|
2008-12-29 01:18:14 +00:00
|
|
|
module_param_array(card, int, NULL, 0444);
|
|
|
|
MODULE_PARM_DESC(card, "card type");
|
|
|
|
|
2012-12-26 18:12:37 +00:00
|
|
|
static int usb_xfer_mode = -1;
|
|
|
|
module_param(usb_xfer_mode, int, 0444);
|
|
|
|
MODULE_PARM_DESC(usb_xfer_mode,
|
|
|
|
"USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
|
2012-11-08 17:11:53 +00:00
|
|
|
|
2011-08-20 11:21:03 +00:00
|
|
|
/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
|
2014-01-15 21:50:26 +00:00
|
|
|
static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
|
2008-12-29 01:18:14 +00:00
|
|
|
|
2007-11-04 00:20:59 +00:00
|
|
|
struct em28xx_hash_table {
|
|
|
|
unsigned long hash;
|
|
|
|
unsigned int model;
|
|
|
|
unsigned int tuner;
|
|
|
|
};
|
|
|
|
|
2012-04-28 12:57:01 +00:00
|
|
|
static void em28xx_pre_card_setup(struct em28xx *dev);
|
|
|
|
|
2008-11-25 16:16:13 +00:00
|
|
|
/*
|
|
|
|
* Reset sequences for analog/digital modes
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Reset for the most [analog] boards */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq default_analog[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
|
2008-11-25 16:16:13 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Reset for the most [digital] boards */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq default_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
|
2008-11-25 16:16:13 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Board Hauppauge WinTV HVR 900 analog */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x2d, ~EM_GPIO_4, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ 0x05, 0xff, 0x10, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
2008-11-25 16:16:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Board Hauppauge WinTV HVR 900 digital */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
|
2008-11-25 16:16:13 +00:00
|
|
|
{EM2880_R04_GPO, 0x04, 0x0f, 10},
|
|
|
|
{EM2880_R04_GPO, 0x0c, 0x0f, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2008-11-25 16:16:13 +00:00
|
|
|
};
|
|
|
|
|
2011-03-13 05:04:53 +00:00
|
|
|
/* Board Hauppauge WinTV HVR 900 (R2) digital */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x2e, ~EM_GPIO_4, 10},
|
2011-03-13 05:04:53 +00:00
|
|
|
{EM2880_R04_GPO, 0x0c, 0x0f, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2011-03-13 05:04:53 +00:00
|
|
|
};
|
|
|
|
|
2008-11-25 16:16:13 +00:00
|
|
|
/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x69, ~EM_GPIO_4, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
2008-11-25 16:16:13 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
|
|
|
|
|
|
|
|
/* Board - EM2870 Kworld 355u
|
|
|
|
Analog - No input analog */
|
|
|
|
|
2009-06-06 20:05:02 +00:00
|
|
|
/* Board - EM2882 Kworld 315U digital */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
|
2009-06-06 20:05:02 +00:00
|
|
|
{EM2880_R04_GPO, 0x04, 0xff, 10},
|
|
|
|
{EM2880_R04_GPO, 0x0c, 0xff, 10},
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x7e, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2009-06-06 20:05:02 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
|
2009-06-06 20:05:02 +00:00
|
|
|
{EM2880_R04_GPO, 0x08, 0xff, 10},
|
|
|
|
{EM2880_R04_GPO, 0x0c, 0xff, 10},
|
|
|
|
{EM2880_R04_GPO, 0x08, 0xff, 10},
|
|
|
|
{EM2880_R04_GPO, 0x0c, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2009-06-06 20:05:02 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq kworld_330u_analog[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
|
2009-01-19 00:59:34 +00:00
|
|
|
{EM2880_R04_GPO, 0x00, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2009-01-19 00:59:34 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq kworld_330u_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
|
2009-01-19 00:59:34 +00:00
|
|
|
{EM2880_R04_GPO, 0x08, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2009-01-19 00:59:34 +00:00
|
|
|
};
|
|
|
|
|
2009-06-19 03:33:54 +00:00
|
|
|
/* Evga inDtube
|
|
|
|
GPIO0 - Enable digital power (s5h1409) - low to enable
|
|
|
|
GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
|
|
|
|
GPIO4 - xc3028 reset
|
|
|
|
GOP3 - s5h1409 reset
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq evga_indtube_analog[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x79, 0xff, 60},
|
2009-06-19 03:33:54 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq evga_indtube_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x7a, 0xff, 1},
|
2009-06-19 03:33:54 +00:00
|
|
|
{EM2880_R04_GPO, 0x04, 0xff, 10},
|
|
|
|
{EM2880_R04_GPO, 0x0c, 0xff, 1},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2009-06-19 03:33:54 +00:00
|
|
|
};
|
|
|
|
|
2010-03-07 20:55:43 +00:00
|
|
|
/*
|
2013-10-09 14:18:05 +00:00
|
|
|
* KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
|
2010-03-07 20:55:43 +00:00
|
|
|
* EM_GPIO_0 - currently unknown
|
|
|
|
* EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
|
|
|
|
* EM_GPIO_2 - currently unknown
|
|
|
|
* EM_GPIO_3 - currently unknown
|
|
|
|
* EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
|
|
|
|
* EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
|
|
|
|
* EM_GPIO_6 - currently unknown
|
|
|
|
* EM_GPIO_7 - currently unknown
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq kworld_a340_digital[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
2010-03-07 20:55:43 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
|
2014-11-28 11:34:15 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
|
2014-03-03 19:28:39 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 100},
|
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2009-07-09 00:51:35 +00:00
|
|
|
/* Pinnacle Hybrid Pro eb1a:2881 */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xfd, ~EM_GPIO_4, 10},
|
2009-07-09 00:51:35 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
|
2009-07-09 00:51:35 +00:00
|
|
|
{EM2880_R04_GPO, 0x04, 0xff, 100},/* zl10353 reset */
|
|
|
|
{EM2880_R04_GPO, 0x0c, 0xff, 1},
|
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6d, ~EM_GPIO_4, 10},
|
2010-10-16 17:42:01 +00:00
|
|
|
{EM2880_R04_GPO, 0x00, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2010-10-16 17:42:01 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
|
2010-10-16 17:42:01 +00:00
|
|
|
{EM2880_R04_GPO, 0x08, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2010-10-16 17:42:01 +00:00
|
|
|
};
|
|
|
|
|
2012-08-14 00:18:02 +00:00
|
|
|
/* PCTV HD Mini (80e) GPIOs
|
|
|
|
0-5: not used
|
|
|
|
6: demod reset, active low
|
|
|
|
7: LED on, active high */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
|
2012-08-14 00:18:02 +00:00
|
|
|
{EM28XX_R06_I2C_CLK, 0x45, 0xff, 10}, /*400 KHz*/
|
2014-03-04 23:49:07 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 100},/*Demod reset*/
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 10},
|
2012-08-14 00:18:02 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2009-09-15 17:42:13 +00:00
|
|
|
/* eb1a:2868 Reddo DVB-C USB TV Box
|
|
|
|
GPIO4 - CU1216L NIM
|
|
|
|
Other GPIOs seems to be don't care. */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xde, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0x7f, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6f, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2009-09-15 17:42:13 +00:00
|
|
|
};
|
2009-07-09 00:51:35 +00:00
|
|
|
|
2008-11-25 16:16:13 +00:00
|
|
|
/* Callback for the most boards */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq default_tuner_gpio[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0, EM_GPIO_4, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, EM_GPIO_4, EM_GPIO_4, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2008-11-25 16:16:13 +00:00
|
|
|
};
|
|
|
|
|
2009-03-04 11:27:52 +00:00
|
|
|
/* Mute/unmute */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 5, 7, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
2009-03-04 11:27:52 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 4, 7, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
2009-03-04 11:27:52 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq compro_mute_gpio[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 6, 7, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
2009-03-04 11:27:52 +00:00
|
|
|
};
|
|
|
|
|
2009-05-24 03:46:01 +00:00
|
|
|
/* Terratec AV350 */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0x7f, 10},
|
2009-05-24 03:46:01 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
|
2009-05-24 03:46:01 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
2009-06-29 14:35:05 +00:00
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq silvercrest_reg_seq[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0x01, 0xf7, 10},
|
2009-06-29 14:35:05 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq vc211a_enable[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0x07, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0x0f, 10},
|
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0x0b, 10},
|
2009-11-27 00:26:13 +00:00
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq dikom_dk300_digital[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0x6e, ~EM_GPIO_4, 10},
|
2010-02-09 20:53:38 +00:00
|
|
|
{EM2880_R04_GPO, 0x08, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2010-02-09 20:53:38 +00:00
|
|
|
};
|
|
|
|
|
2010-09-10 20:29:14 +00:00
|
|
|
/* Reset for the most [digital] boards */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq leadership_digital[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x70, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2010-09-10 20:29:14 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq leadership_reset[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xb0, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf0, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2010-09-10 20:29:14 +00:00
|
|
|
};
|
|
|
|
|
2011-05-25 20:03:50 +00:00
|
|
|
/* 2013:024f PCTV nanoStick T2 290e
|
2011-04-07 19:34:44 +00:00
|
|
|
* GPIO_6 - demod reset
|
|
|
|
* GPIO_7 - LED
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pctv_290e[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 80},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x40, 0xff, 80}, /* GPIO_6 = 1 */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xc0, 0xff, 80}, /* GPIO_7 = 1 */
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2011-04-07 19:34:44 +00:00
|
|
|
};
|
2010-09-10 20:29:14 +00:00
|
|
|
|
2011-07-04 00:05:06 +00:00
|
|
|
#if 0
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_h5_gpio[] = {
|
2013-06-03 17:12:03 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xff, 0xff, 10},
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf2, 0xff, 50},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 50},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2011-07-04 00:05:06 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_h5_digital[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2011-07-04 00:05:06 +00:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2011-08-01 04:15:30 +00:00
|
|
|
/* 2013:024f PCTV DVB-S2 Stick 460e
|
|
|
|
* GPIO_0 - POWER_ON
|
|
|
|
* GPIO_1 - BOOST
|
|
|
|
* GPIO_2 - VUV_LNB (red LED)
|
|
|
|
* GPIO_3 - EXT_12V
|
|
|
|
* GPIO_4 - INT_DEM (DEMOD GPIO_0)
|
|
|
|
* GPIO_5 - INT_LNB
|
|
|
|
* GPIO_6 - RESET_DEM
|
|
|
|
* GPIO_7 - LED (green LED)
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pctv_460e[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x01, 0xff, 50},
|
|
|
|
{ 0x0d, 0xff, 0xff, 50},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x41, 0xff, 50}, /* GPIO_6=1 */
|
|
|
|
{ 0x0d, 0x42, 0xff, 50},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x61, 0xff, 50}, /* GPIO_5=1 */
|
|
|
|
{ -1, -1, -1, -1},
|
2011-08-01 04:15:30 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10}, /* xc5000 reset */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf9, 0xff, 35},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xbe, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfe, 0xff, 20},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2013-02-28 13:35:56 +00:00
|
|
|
};
|
|
|
|
|
2013-02-25 12:01:13 +00:00
|
|
|
/*
|
|
|
|
* 2013:0258 PCTV DVB-S2 Stick (461e)
|
|
|
|
* GPIO 0 = POWER_ON
|
|
|
|
* GPIO 1 = BOOST
|
|
|
|
* GPIO 2 = VUV_LNB (red LED)
|
|
|
|
* GPIO 3 = #EXT_12V
|
|
|
|
* GPIO 4 = INT_DEM
|
|
|
|
* GPIO 5 = INT_LNB
|
|
|
|
* GPIO 6 = #RESET_DEM
|
|
|
|
* GPIO 7 = P07_LED (green LED)
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pctv_461e[] = {
|
2013-02-25 12:01:13 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x7f, 0xff, 0},
|
|
|
|
{0x0d, 0xff, 0xff, 0},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x3f, 0xff, 100}, /* reset demod */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x7f, 0xff, 200}, /* reset demod */
|
|
|
|
{0x0d, 0x42, 0xff, 0},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xeb, 0xff, 0},
|
|
|
|
{EM2874_R5F_TS_ENABLE, 0x84, 0x84, 0}, /* parallel? | null discard */
|
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2011-11-24 17:01:45 +00:00
|
|
|
#if 0
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq hauppauge_930c_gpio[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10}, /* xc5000 reset */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x6f, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x4f, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2011-11-19 14:37:14 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq hauppauge_930c_digital[] = {
|
2013-06-03 17:12:02 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf6, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xe6, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xa6, 0xff, 10},
|
2013-10-10 17:36:30 +00:00
|
|
|
{ -1, -1, -1, -1},
|
2011-11-19 14:37:14 +00:00
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2012-03-18 21:09:01 +00:00
|
|
|
/* 1b80:e425 MaxMedia UB425-TC
|
2013-04-13 14:03:37 +00:00
|
|
|
* 1b80:e1cc Delock 61959
|
2012-03-18 21:09:01 +00:00
|
|
|
* GPIO_6 - demod reset, 0=active
|
|
|
|
* GPIO_7 - LED, 0=active
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq maxmedia_ub425_tc[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x83, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xc3, 0xff, 100}, /* GPIO_6 = 1 */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x43, 0xff, 000}, /* GPIO_7 = 0 */
|
|
|
|
{ -1, -1, -1, -1},
|
2012-03-18 21:09:01 +00:00
|
|
|
};
|
|
|
|
|
2012-03-19 23:09:55 +00:00
|
|
|
/* 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
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pctv_510e[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
|
|
|
|
{ -1, -1, -1, -1},
|
2012-03-19 23:09:55 +00:00
|
|
|
};
|
|
|
|
|
2012-03-19 14:48:19 +00:00
|
|
|
/* 2013:0251 PCTV QuatroStick nano (520e)
|
|
|
|
* GPIO_2: decoder reset, 0=active
|
|
|
|
* GPIO_4: decoder suspend, 0=active
|
|
|
|
* GPIO_6: demod reset, 0=active
|
|
|
|
* GPIO_7: LED, 1=active
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pctv_520e[] = {
|
2013-10-10 17:36:30 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x10, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xd4, 0xff, 000}, /* GPIO_7 = 1 */
|
|
|
|
{ -1, -1, -1, -1},
|
2012-03-19 14:48:19 +00:00
|
|
|
};
|
|
|
|
|
2013-12-01 21:06:57 +00:00
|
|
|
/* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
|
|
|
|
* reg 0x80/0x84:
|
|
|
|
* GPIO_0: capturing LED, 0=on, 1=off
|
|
|
|
* GPIO_2: AV mute button, 0=pressed, 1=unpressed
|
|
|
|
* GPIO 3: illumination button, 0=pressed, 1=unpressed
|
|
|
|
* GPIO_6: illumination/flash LED, 0=on, 1=off
|
|
|
|
* reg 0x81/0x85:
|
|
|
|
* GPIO_7: snapshot button, 0=pressed, 1=unpressed
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
|
2013-12-01 21:06:57 +00:00
|
|
|
{EM2820_R08_GPIO_CTRL, 0xf7, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xb2, 10},
|
|
|
|
{ -1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq pctv_292e[] = {
|
2014-04-11 01:11:27 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
|
|
|
|
{0x0d, 0xff, 0xff, 950},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xbd, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 410},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x7d, 0xff, 300},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x7c, 0xff, 60},
|
|
|
|
{0x0d, 0x42, 0xff, 50},
|
|
|
|
{EM2874_R5F_TS_ENABLE, 0x85, 0xff, 0},
|
|
|
|
{-1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq terratec_t2_stick_hd[] = {
|
2014-11-24 06:57:34 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
|
|
|
|
{0x0d, 0xff, 0xff, 600},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xbc, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0x00, 0xff, 300},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xf8, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 300},
|
|
|
|
{0x0d, 0x42, 0xff, 1000},
|
|
|
|
{EM2874_R5F_TS_ENABLE, 0x85, 0xff, 0},
|
|
|
|
{-1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq plex_px_bcud[] = {
|
2016-05-06 19:35:05 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
|
|
|
|
{0x0d, 0xff, 0xff, 0},
|
|
|
|
{EM2874_R50_IR_CONFIG, 0x01, 0xff, 0},
|
|
|
|
{EM28XX_R06_I2C_CLK, 0x40, 0xff, 0},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 100},
|
|
|
|
{EM28XX_R12_VINENABLE, 0x20, 0x20, 0},
|
|
|
|
{0x0d, 0x42, 0xff, 1000},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfc, 0xff, 10},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xfd, 0xff, 10},
|
|
|
|
{0x73, 0xfd, 0xff, 100},
|
|
|
|
{-1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2016-04-04 15:12:52 +00:00
|
|
|
/*
|
2018-01-05 00:04:15 +00:00
|
|
|
* 2040:0265 Hauppauge WinTV-dualHD DVB Isoc
|
|
|
|
* 2040:8265 Hauppauge WinTV-dualHD DVB Bulk
|
|
|
|
* 2040:026d Hauppauge WinTV-dualHD ATSC/QAM Isoc
|
|
|
|
* 2040:826d Hauppauge WinTV-dualHD ATSC/QAM Bulk
|
2016-04-04 15:12:52 +00:00
|
|
|
* reg 0x80/0x84:
|
|
|
|
* GPIO_0: Yellow LED tuner 1, 0=on, 1=off
|
|
|
|
* GPIO_1: Green LED tuner 1, 0=on, 1=off
|
|
|
|
* GPIO_2: Yellow LED tuner 2, 0=on, 1=off
|
|
|
|
* GPIO_3: Green LED tuner 2, 0=on, 1=off
|
|
|
|
* GPIO_5: Reset #2, 0=active
|
|
|
|
* GPIO_6: Reset #1, 0=active
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {
|
2016-04-04 15:12:52 +00:00
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 0},
|
|
|
|
{0x0d, 0xff, 0xff, 200},
|
|
|
|
{0x50, 0x04, 0xff, 300},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xbf, 0xff, 100}, /* demod 1 reset */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xdf, 0xff, 100}, /* demod 2 reset */
|
|
|
|
{EM2874_R80_GPIO_P0_CTRL, 0xff, 0xff, 100},
|
|
|
|
{EM2874_R5F_TS_ENABLE, 0x44, 0xff, 50},
|
|
|
|
{EM2874_R5D_TS1_PKT_SIZE, 0x05, 0xff, 50},
|
|
|
|
{EM2874_R5E_TS2_PKT_SIZE, 0x05, 0xff, 50},
|
|
|
|
{-1, -1, -1, -1},
|
|
|
|
};
|
|
|
|
|
2013-12-01 21:06:52 +00:00
|
|
|
/*
|
|
|
|
* Button definitions
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_button std_snapshot_button[] = {
|
2013-12-01 21:06:52 +00:00
|
|
|
{
|
|
|
|
.role = EM28XX_BUTTON_SNAPSHOT,
|
|
|
|
.reg_r = EM28XX_R0C_USBSUSP,
|
|
|
|
.reg_clearing = EM28XX_R0C_USBSUSP,
|
|
|
|
.mask = EM28XX_R0C_USBSUSP_SNAPSHOT,
|
|
|
|
.inverted = 0,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_button speedlink_vad_laplace_buttons[] = {
|
2013-12-01 21:06:57 +00:00
|
|
|
{
|
|
|
|
.role = EM28XX_BUTTON_SNAPSHOT,
|
|
|
|
.reg_r = EM2874_R85_GPIO_P1_STATE,
|
|
|
|
.mask = 0x80,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.role = EM28XX_BUTTON_ILLUMINATION,
|
|
|
|
.reg_r = EM2874_R84_GPIO_P0_STATE,
|
|
|
|
.mask = 0x08,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* LED definitions
|
|
|
|
*/
|
|
|
|
static struct em28xx_led speedlink_vad_laplace_leds[] = {
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_ANALOG_CAPTURING,
|
|
|
|
.gpio_reg = EM2874_R80_GPIO_P0_CTRL,
|
|
|
|
.gpio_mask = 0x01,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_ILLUMINATION,
|
|
|
|
.gpio_reg = EM2874_R80_GPIO_P0_CTRL,
|
|
|
|
.gpio_mask = 0x40,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
2014-03-04 15:34:34 +00:00
|
|
|
static struct em28xx_led kworld_ub435q_v3_leds[] = {
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_DIGITAL_CAPTURING,
|
|
|
|
.gpio_reg = EM2874_R80_GPIO_P0_CTRL,
|
|
|
|
.gpio_mask = 0x80,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
2014-03-04 23:49:07 +00:00
|
|
|
static struct em28xx_led pctv_80e_leds[] = {
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_DIGITAL_CAPTURING,
|
|
|
|
.gpio_reg = EM2874_R80_GPIO_P0_CTRL,
|
|
|
|
.gpio_mask = 0x80,
|
|
|
|
.inverted = 0,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
2016-02-28 11:26:22 +00:00
|
|
|
static struct em28xx_led terratec_grabby_leds[] = {
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_ANALOG_CAPTURING,
|
|
|
|
.gpio_reg = EM2820_R08_GPIO_CTRL,
|
|
|
|
.gpio_mask = EM_GPIO_3,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
2016-04-04 15:12:52 +00:00
|
|
|
static struct em28xx_led hauppauge_dualhd_leds[] = {
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_DIGITAL_CAPTURING,
|
|
|
|
.gpio_reg = EM2874_R80_GPIO_P0_CTRL,
|
|
|
|
.gpio_mask = EM_GPIO_1,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.role = EM28XX_LED_DIGITAL_CAPTURING_TS2,
|
|
|
|
.gpio_reg = EM2874_R80_GPIO_P0_CTRL,
|
|
|
|
.gpio_mask = EM_GPIO_3,
|
|
|
|
.inverted = 1,
|
|
|
|
},
|
|
|
|
{-1, 0, 0, 0},
|
|
|
|
};
|
|
|
|
|
2008-11-25 16:16:13 +00:00
|
|
|
/*
|
|
|
|
* Board definitions
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
const struct em28xx_board em28xx_boards[] = {
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2750_BOARD_UNKNOWN] = {
|
2009-07-12 13:56:21 +00:00
|
|
|
.name = "EM2710/EM2750/EM2751 webcam grabber",
|
V4L/DVB (12411): em28xx: Fix artifacts with Silvercrest webcam
Silvercrest mt9v011 sensor produces a 640x480 image. However,
previously, the code were getting only half of the lines and merging two
consecutive frames to "produce" a 640x480 image.
With the addition of progressive mode, now em28xx is working with a full
image. However, when the number of lines is bigger than 240, the
beginning of some odd lines are filled with blank.
After lots of testing, and physically checking the device for a Xtal, it
was noticed experimentally that mt9v011 is using em28xx XCLK as its
clock. Due to that, changing XCLK value changes the maximum speed of the
stream.
At the tests, it were possible to produce up to 32 fps, using a 30 MHz
XCLK. However, at that rate, the artifacts happen even at 320x240. Lower
values of XCLK produces artifacts only at 640x480.
At some values of xclk (for example XCLKK = 6 MHz, 640x480), it is
possible to see an invalid sucession of artifacts with this pattern:
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(where the dots represent the blanked pixels)
So, it seems that a waveform in the format of a ramp is interferring at
the image.
The cause of this interference is currently unknown. Some possibilities
are:
- electrical interference (maybe this device is broken?);
- some issue at mt9v011 programming;
- some bug at em28xx chip.
So, for now, let's be conservative and use a value of XCLK that we know
for sure that it won't cause artifacts.
As I'm waiting for more of such devices with different em28xx chipset
revisions, I'll have the opportunity to double check the issue with
other pieces of hardware.
Later patches can vary XCLK depending on the vertical resolutions, if a
proper fix is not discovered.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2009-08-10 13:29:27 +00:00
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_20MHZ,
|
2009-07-12 13:26:36 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.is_webcam = 1,
|
2008-07-27 17:03:32 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = 0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2009-07-15 00:08:22 +00:00
|
|
|
.gpio = silvercrest_reg_seq,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2005-11-09 05:37:24 +00:00
|
|
|
[EM2800_BOARD_UNKNOWN] = {
|
|
|
|
.name = "Unknown EM2800 video grabber",
|
|
|
|
.is_em2800 = 1,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-27 10:46:59 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:24 +00:00
|
|
|
},
|
|
|
|
[EM2820_BOARD_UNKNOWN] = {
|
2008-11-25 10:05:06 +00:00
|
|
|
.name = "Unknown EM2750/28xx video grabber",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
2009-07-13 04:28:21 +00:00
|
|
|
.is_webcam = 1, /* To enable sensor probe */
|
2005-11-09 05:37:24 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2750_BOARD_DLCW_130] = {
|
|
|
|
/* Beijing Huaqi Information Digital Technology Co., Ltd */
|
|
|
|
.name = "Huaqi DLCW-130",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2008-11-25 10:05:06 +00:00
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_48MHZ,
|
2009-07-12 13:26:36 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.is_webcam = 1,
|
2008-07-27 17:03:32 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = 0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2006-02-07 08:25:39 +00:00
|
|
|
[EM2820_BOARD_KWORLD_PVRTV2800RF] = {
|
2006-02-07 08:25:41 +00:00
|
|
|
.name = "Kworld PVR TV 2800 RF",
|
V4L/DVB (7060): em28xx: remove has_tuner
has_tuner flag doesn't make much sense, since tuner_type=TUNER_ABSENT
means the same thing.
Having two ways to say that a tuner is not present is
not nice, since it may lead to bad setups. In fact, with the previous
code, if a device were using has_tuner=0, but the user forces a tuner,
with modprobe option tuner=type, the modprobe option won't work.
Also, tveeprom returns TUNER_ABSENT, when tuner is unknown or absent.
So, with the previous logic, in this case, the driver should set
has_tuner=0, or has_tuner=1 otherwise.
Instead of adding several additional tests and setups, better just to
remove .has_tuner.
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
2008-01-24 09:59:20 +00:00
|
|
|
.tuner_type = TUNER_TEMIC_PAL,
|
2006-02-07 08:25:39 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2006-02-07 08:25:39 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2006-02-07 08:25:39 +00:00
|
|
|
},
|
2009-01-19 12:31:55 +00:00
|
|
|
[EM2820_BOARD_GADMEI_TVR200] = {
|
|
|
|
.name = "Gadmei TVR200",
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-01-19 12:31:55 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2005-11-09 05:37:07 +00:00
|
|
|
[EM2820_BOARD_TERRATEC_CINERGY_250] = {
|
|
|
|
.name = "Terratec Cinergy 250 USB",
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
2009-09-08 17:04:41 +00:00
|
|
|
.has_ir_i2c = 1,
|
2005-11-09 05:37:07 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2013-01-05 11:44:09 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:07 +00:00
|
|
|
},
|
|
|
|
[EM2820_BOARD_PINNACLE_USB_2] = {
|
|
|
|
.name = "Pinnacle PCTV USB 2",
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
2009-09-08 17:04:41 +00:00
|
|
|
.has_ir_i2c = 1,
|
2005-11-09 05:37:07 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:07 +00:00
|
|
|
},
|
|
|
|
[EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
|
|
|
|
.name = "Hauppauge WinTV USB 2",
|
|
|
|
.tuner_type = TUNER_PHILIPS_FM1236_MK3,
|
2007-11-23 17:22:14 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT |
|
2009-02-11 02:28:24 +00:00
|
|
|
TDA9887_PORT1_ACTIVE |
|
2007-11-23 17:22:14 +00:00
|
|
|
TDA9887_PORT2_ACTIVE,
|
2005-11-09 05:38:27 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2005-11-09 05:37:07 +00:00
|
|
|
.has_msp34xx = 1,
|
2009-09-08 17:04:41 +00:00
|
|
|
.has_ir_i2c = 1,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2006-03-19 15:35:57 +00:00
|
|
|
.amux = MSP_INPUT_DEFAULT,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2006-04-02 16:35:00 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2006-04-01 21:03:23 +00:00
|
|
|
.amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
|
|
|
|
MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:07 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2820_BOARD_DLINK_USB_TV] = {
|
|
|
|
.name = "D-Link DUB-T210 TV Tuner",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
|
|
|
|
.name = "Hercules Smart TV USB 2.0",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-07-27 17:03:32 +00:00
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
|
|
|
|
.name = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2820_BOARD_GADMEI_UTV310] = {
|
|
|
|
.name = "Gadmei UTV310",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_TNF_5335MF,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
|
|
|
|
.name = "Leadtek Winfast USB II Deluxe",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
|
2009-11-13 08:48:24 +00:00
|
|
|
.has_ir_i2c = 1,
|
|
|
|
.tvaudio_addr = 0x58,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT |
|
|
|
|
TDA9887_PORT2_ACTIVE |
|
|
|
|
TDA9887_QSS,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2009-11-13 08:48:24 +00:00
|
|
|
.adecoder = EM28XX_TVAUDIO,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2009-11-13 08:48:24 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE4,
|
|
|
|
.amux = EM28XX_AMUX_AUX,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-11-13 08:48:24 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE5,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2009-11-13 08:48:24 +00:00
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
2009-11-13 08:48:24 +00:00
|
|
|
.radio = {
|
|
|
|
.type = EM28XX_RADIO,
|
|
|
|
.amux = EM28XX_AMUX_AUX,
|
|
|
|
}
|
2008-07-27 17:03:32 +00:00
|
|
|
},
|
|
|
|
[EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
|
2008-11-25 12:10:25 +00:00
|
|
|
.name = "Videology 20K14XUSB USB2.0",
|
2008-07-27 17:03:32 +00:00
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2009-07-12 13:26:36 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.is_webcam = 1,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = 0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2009-06-29 14:35:05 +00:00
|
|
|
[EM2820_BOARD_SILVERCREST_WEBCAM] = {
|
|
|
|
.name = "Silvercrest Webcam 1.3mpix",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
2009-07-12 13:23:23 +00:00
|
|
|
.is_webcam = 1,
|
2009-06-29 14:35:05 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-06-29 14:35:05 +00:00
|
|
|
.vmux = 0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = silvercrest_reg_seq,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2821_BOARD_SUPERCOMP_USB_2] = {
|
|
|
|
.name = "Supercomp USB 2.0 TV",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_PHILIPS_FM1236_MK3,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT |
|
|
|
|
TDA9887_PORT1_ACTIVE |
|
|
|
|
TDA9887_PORT2_ACTIVE,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2821_BOARD_USBGEAR_VD204] = {
|
2008-11-25 12:10:25 +00:00
|
|
|
.name = "Usbgear VD204v9",
|
2008-07-27 17:03:32 +00:00
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2008-11-27 10:46:59 +00:00
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture only device */
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2860_BOARD_NETGMBH_CAM] = {
|
|
|
|
/* Beijing Huaqi Information Digital Technology Co., Ltd */
|
2008-11-25 12:10:25 +00:00
|
|
|
.name = "NetGMBH Cam",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2009-07-12 13:26:36 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.is_webcam = 1,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = 0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2860_BOARD_TYPHOON_DVD_MAKER] = {
|
2008-11-25 12:10:25 +00:00
|
|
|
.name = "Typhoon DVD Maker",
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-27 10:46:59 +00:00
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture only device */
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2860_BOARD_GADMEI_UTV330] = {
|
|
|
|
.name = "Gadmei UTV330",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_TNF_5335MF,
|
2007-11-20 18:25:08 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2009-08-30 16:05:56 +00:00
|
|
|
[EM2861_BOARD_GADMEI_UTV330PLUS] = {
|
|
|
|
.name = "Gadmei UTV330+",
|
|
|
|
.tuner_type = TUNER_TNF_5335MF,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_GADMEI_RM008Z,
|
2009-08-30 16:05:56 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-08-30 16:05:56 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2860_BOARD_TERRATEC_HYBRID_XS] = {
|
|
|
|
.name = "Terratec Cinergy A Hybrid XS",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2007-11-20 18:25:08 +00:00
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2007-11-20 18:25:08 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-27 12:21:55 +00:00
|
|
|
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2007-11-20 18:25:08 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2007-11-20 18:25:08 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2007-11-20 18:25:08 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2007-11-20 18:25:08 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2861_BOARD_KWORLD_PVRTV_300U] = {
|
|
|
|
.name = "KWorld PVRTV 300U",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2008-06-08 13:22:03 +00:00
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-06-08 13:22:03 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-06-08 13:22:03 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-06-08 13:22:03 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-06-08 13:22:03 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-06-08 13:22:03 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-06-08 13:22:03 +00:00
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
|
|
|
|
.name = "Yakumo MovieMixer",
|
2009-02-11 02:28:24 +00:00
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture only device */
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
2007-10-24 14:08:20 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2007-11-02 00:52:58 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2007-10-24 14:08:20 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2007-10-24 14:08:20 +00:00
|
|
|
},
|
2010-03-20 02:53:12 +00:00
|
|
|
[EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
|
|
|
|
.name = "EM2860/TVP5150 Reference Design",
|
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture only device */
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2010-03-20 02:53:12 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2861_BOARD_PLEXTOR_PX_TV100U] = {
|
|
|
|
.name = "Plextor ConvertX PX-TV100U",
|
|
|
|
.tuner_type = TUNER_TNF_5335MF,
|
2009-07-29 04:39:12 +00:00
|
|
|
.xclk = EM28XX_XCLK_I2S_MSB_TIMING |
|
|
|
|
EM28XX_XCLK_FREQUENCY_12MHZ,
|
2008-07-27 17:03:32 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
2009-07-29 04:39:12 +00:00
|
|
|
.has_msp34xx = 1,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-06-04 16:43:46 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-07-29 04:39:12 +00:00
|
|
|
.gpio = pinnacle_hybrid_pro_analog,
|
2008-06-04 16:43:46 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-06-04 16:43:46 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-07-29 04:39:12 +00:00
|
|
|
.gpio = pinnacle_hybrid_pro_analog,
|
2008-06-04 16:43:46 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-07-29 04:39:12 +00:00
|
|
|
.gpio = pinnacle_hybrid_pro_analog,
|
2008-06-04 16:43:46 +00:00
|
|
|
} },
|
|
|
|
},
|
2008-11-27 10:46:59 +00:00
|
|
|
|
|
|
|
/* Those boards with em2870 are DVB Only*/
|
|
|
|
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2870_BOARD_TERRATEC_XS] = {
|
|
|
|
.name = "Terratec Cinergy T XS",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
},
|
|
|
|
[EM2870_BOARD_TERRATEC_XS_MT2060] = {
|
|
|
|
.name = "Terratec Cinergy T XS (MT2060)",
|
2015-10-27 19:24:14 +00:00
|
|
|
.xclk = EM28XX_XCLK_IR_RC5_MODE |
|
|
|
|
EM28XX_XCLK_FREQUENCY_12MHZ,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.tuner_type = TUNER_ABSENT, /* MT2060 */
|
2015-10-27 19:24:14 +00:00
|
|
|
.has_dvb = 1,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
},
|
|
|
|
[EM2870_BOARD_KWORLD_350U] = {
|
|
|
|
.name = "Kworld 350 U DVB-T",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
},
|
|
|
|
[EM2870_BOARD_KWORLD_355U] = {
|
|
|
|
.name = "Kworld 355 U DVB-T",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
2011-12-11 21:15:00 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = default_digital,
|
2008-07-27 17:03:32 +00:00
|
|
|
},
|
|
|
|
[EM2870_BOARD_PINNACLE_PCTV_DVB] = {
|
|
|
|
.name = "Pinnacle PCTV DVB-T",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_ABSENT, /* MT2060 */
|
2008-11-25 10:05:06 +00:00
|
|
|
/* djh - I have serious doubts this is right... */
|
|
|
|
.xclk = EM28XX_XCLK_IR_RC5_MODE |
|
|
|
|
EM28XX_XCLK_FREQUENCY_10MHZ,
|
2008-07-27 17:03:32 +00:00
|
|
|
},
|
|
|
|
[EM2870_BOARD_COMPRO_VIDEOMATE] = {
|
|
|
|
.name = "Compro, VideoMate U3",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_ABSENT, /* MT2060 */
|
|
|
|
},
|
2008-11-27 10:46:59 +00:00
|
|
|
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
|
|
|
|
.name = "Terratec Hybrid XS Secam",
|
|
|
|
.has_msp34xx = 1,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2010-02-18 21:06:32 +00:00
|
|
|
.has_dvb = 1,
|
2010-10-16 17:42:01 +00:00
|
|
|
.dvb_gpio = terratec_cinergy_USB_XS_FR_digital,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-26 14:04:33 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2010-10-16 17:42:01 +00:00
|
|
|
.gpio = terratec_cinergy_USB_XS_FR_analog,
|
2008-07-26 14:04:33 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-26 14:04:33 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2010-10-16 17:42:01 +00:00
|
|
|
.gpio = terratec_cinergy_USB_XS_FR_analog,
|
2008-07-26 14:04:33 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2010-10-16 17:42:01 +00:00
|
|
|
.gpio = terratec_cinergy_USB_XS_FR_analog,
|
2008-07-26 14:04:33 +00:00
|
|
|
} },
|
|
|
|
},
|
2011-07-04 00:05:06 +00:00
|
|
|
[EM2884_BOARD_TERRATEC_H5] = {
|
|
|
|
.name = "Terratec Cinergy H5",
|
|
|
|
.has_dvb = 1,
|
|
|
|
#if 0
|
|
|
|
.tuner_type = TUNER_PHILIPS_TDA8290,
|
|
|
|
.tuner_addr = 0x41,
|
|
|
|
.dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */
|
|
|
|
.tuner_gpio = terratec_h5_gpio,
|
2011-11-20 13:23:24 +00:00
|
|
|
#else
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
media: em28xx: add support for new of Terratec H6
There's a new version of Terratec H6 with uses USB ID
0ccd:10b2. This version is similar to the old one (with is
supported via the HTC entry), except that this one has the
eeprom on the second bus.
On this board, one side of this board is labeled with:
dvbc v2.0
The other side with:
94V-0, MO2, RK-4221 with huge digits: 1107
With those patches, the board is properly detected:
em28xx 1-1.5:1.0: New device TERRATEC TERRATCE H5 MKII @ 480 Mbps (0ccd:10b2, interface 0, class 0)
em28xx 1-1.5:1.0: Audio interface 0 found (Vendor Class)
em28xx 1-1.5:1.0: Video interface 0 found: isoc
em28xx 1-1.5:1.0: DVB interface 0 found: isoc
em28xx 1-1.5:1.0: chip ID is em2884
em28xx eeprom 00000000: 26 00 00 00 02 0b 0f e5 f5 64 01 60 09 e5 f5 64 &........d.`...d
em28xx eeprom 00000010: 09 60 03 c2 c6 22 e5 f7 b4 03 13 e5 f6 b4 87 03 .`..."..........
em28xx eeprom 00000020: 02 0a b9 e5 f6 b4 93 03 02 09 46 c2 c6 22 c2 c6 ..........F.."..
em28xx eeprom 00000030: 22 00 60 00 ef 70 08 85 3d 82 85 3c 83 93 ff ef ".`..p..=..<....
em28xx eeprom 00000040: 60 19 85 3d 82 85 3c 83 e4 93 12 07 a3 12 0a fe `..=..<.........
em28xx eeprom 00000050: 05 3d e5 3d 70 02 05 3c 1f 80 e4 22 12 0b 06 02 .=.=p..<..."....
em28xx eeprom 00000060: 07 e2 01 00 1a eb 67 95 cd 0c b2 10 f0 13 6b 03 ......g.......k.
em28xx eeprom 00000070: 98 22 6a 1c 86 12 27 57 4e 16 29 00 60 00 00 00 ."j...'WN.).`...
em28xx eeprom 00000080: 02 00 00 00 5e 00 13 00 f0 10 44 82 82 00 00 00 ....^.....D.....
em28xx eeprom 00000090: 5b 81 c0 00 00 00 20 40 20 80 02 20 10 01 00 00 [..... @ .. ....
em28xx eeprom 000000a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
em28xx eeprom 000000b0: c6 40 00 00 81 00 00 00 00 00 00 00 00 c4 00 00 .@..............
em28xx eeprom 000000c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1c 03 ................
em28xx eeprom 000000d0: 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 1.2.3.4.5.6.7.8.
em28xx eeprom 000000e0: 39 00 41 00 42 00 43 00 44 00 12 03 54 00 45 00 9.A.B.C.D...T.E.
em28xx eeprom 000000f0: 52 00 52 00 41 00 54 00 45 00 43 00 22 03 54 00 R.R.A.T.E.C.".T.
em28xx 1-1.5:1.0: eeprom 000100: ... (skipped)
em28xx 1-1.5:1.0: EEPROM ID = 26 00 00 00, EEPROM hash = 0xbcd5a8cf
em28xx 1-1.5:1.0: EEPROM info:
em28xx 1-1.5:1.0: microcode start address = 0x0004, boot configuration = 0x00
em28xx 1-1.5:1.0: I2S audio, 5 sample rates
em28xx 1-1.5:1.0: 500mA max power
em28xx 1-1.5:1.0: Table at offset 0x27, strings=0x2298, 0x1c6a, 0x1286
em28xx 1-1.5:1.0: Identified as Terratec Cinergy H6 rev. 2 (card=101)
em28xx 1-1.5:1.0: Currently, V4L2 is not supported on this model
em28xx 1-1.5:1.0: dvb set to isoc mode.
usbcore: registered new interface driver em28xx
em28xx 1-1.5:1.0: Binding audio extension
em28xx 1-1.5:1.0: em28xx-audio.c: Copyright (C) 2006 Markus Rechberger
em28xx 1-1.5:1.0: em28xx-audio.c: Copyright (C) 2007-2016 Mauro Carvalho Chehab
em28xx 1-1.5:1.0: Endpoint 0x83 high-speed on intf 0 alt 7 interval = 8, size 196
em28xx 1-1.5:1.0: Number of URBs: 1, with 64 packets and 192 size
em28xx 1-1.5:1.0: Audio extension successfully initialized
em28xx: Registered (Em28xx Audio Extension) extension
em28xx 1-1.5:1.0: Binding DVB extension
drxk: status = 0x639260d9
drxk: detected a drx-3926k, spin A3, xtal 20.250 MHz
drxk: DRXK driver version 0.9.4300
drxk: frontend initialized.
tda18271 4-0060: creating new instance
tda18271: TDA18271HD/C2 detected @ 4-0060
dvbdev: DVB: registering new adapter (1-1.5:1.0)
em28xx 1-1.5:1.0: DVB: registering adapter 0 frontend 0 (DRXK DVB-C DVB-T)...
dvbdev: dvb_create_media_entity: media entity 'DRXK DVB-C DVB-T' registered.
dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
em28xx 1-1.5:1.0: DVB extension successfully initialized
em28xx: Registered (Em28xx dvb Extension) extension
em28xx 1-1.5:1.0: Registering input extension
rc rc0: 1-1.5:1.0 IR as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/rc/rc0
Registered IR keymap rc-nec-terratec-cinergy-xs
input: 1-1.5:1.0 IR as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/rc/rc0/input0
em28xx 1-1.5:1.0: Input extension successfully initalized
em28xx: Registered (Em28xx Input Extension) extension
tda18271: performing RF tracking filter calibration
tda18271: RF tracking filter calibration complete
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-05-03 02:12:23 +00:00
|
|
|
#endif
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
|
|
|
[EM2884_BOARD_TERRATEC_H6] = {
|
|
|
|
.name = "Terratec Cinergy H6 rev. 2",
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
|
|
|
|
#if 0
|
|
|
|
.tuner_type = TUNER_PHILIPS_TDA8290,
|
|
|
|
.tuner_addr = 0x41,
|
|
|
|
.dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */
|
|
|
|
.tuner_gpio = terratec_h5_gpio,
|
|
|
|
#else
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
2011-07-04 00:05:06 +00:00
|
|
|
#endif
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2011-07-04 00:05:06 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2011-11-19 14:37:14 +00:00
|
|
|
[EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
|
|
|
|
.name = "Hauppauge WinTV HVR 930C",
|
|
|
|
.has_dvb = 1,
|
2011-11-20 13:23:24 +00:00
|
|
|
#if 0 /* FIXME: Add analog support */
|
|
|
|
.tuner_type = TUNER_XC5000,
|
|
|
|
.tuner_addr = 0x41,
|
|
|
|
.dvb_gpio = hauppauge_930c_digital,
|
2011-11-19 14:37:14 +00:00
|
|
|
.tuner_gpio = hauppauge_930c_gpio,
|
2011-11-20 13:23:24 +00:00
|
|
|
#else
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
#endif
|
2011-11-20 14:16:25 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2011-11-19 14:37:14 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2013-02-28 13:35:56 +00:00
|
|
|
[EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
|
|
|
|
.name = "C3 Tech Digital Duo HDTV/SDTV USB",
|
|
|
|
.has_dvb = 1,
|
|
|
|
/* FIXME: Add analog support - need a saa7136 driver */
|
|
|
|
.tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
|
|
|
|
.ir_codes = RC_MAP_EMPTY,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
|
|
|
|
.dvb_gpio = c3tech_digital_duo_digital,
|
|
|
|
},
|
2011-11-16 14:06:50 +00:00
|
|
|
[EM2884_BOARD_CINERGY_HTC_STICK] = {
|
|
|
|
.name = "Terratec Cinergy HTC Stick",
|
|
|
|
.has_dvb = 1,
|
2012-05-29 20:19:27 +00:00
|
|
|
.ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
|
2012-06-12 21:19:28 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2011-07-04 00:05:06 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2015-03-01 20:11:05 +00:00
|
|
|
[EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {
|
|
|
|
.name = "Elgato EyeTV Hybrid 2008 INT",
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
|
|
|
|
.name = "Hauppauge WinTV HVR 900",
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.mts_firmware = 1,
|
2008-11-25 10:05:06 +00:00
|
|
|
.has_dvb = 1,
|
2008-11-27 10:42:26 +00:00
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900_digital,
|
2011-01-24 15:18:48 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
|
|
|
|
.name = "Hauppauge WinTV HVR 900 (R2)",
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.mts_firmware = 1,
|
2011-03-13 05:01:02 +00:00
|
|
|
.has_dvb = 1,
|
2011-03-13 05:04:53 +00:00
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900R2_digital,
|
2011-01-24 15:18:48 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-27 10:44:00 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2008-12-02 00:01:04 +00:00
|
|
|
[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
|
|
|
|
.name = "Hauppauge WinTV HVR 850",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900_digital,
|
2011-01-24 15:18:48 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
2008-12-02 00:01:04 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-12-02 00:01:04 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:58:58 +00:00
|
|
|
[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
|
2008-07-27 17:03:32 +00:00
|
|
|
.name = "Hauppauge WinTV HVR 950",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
2008-11-27 10:42:26 +00:00
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900_digital,
|
2011-01-24 15:18:47 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
|
|
|
|
.name = "Pinnacle PCTV HD Pro Stick",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
2008-11-27 10:42:26 +00:00
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900_digital,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
|
|
|
|
.name = "AMD ATI TV Wonder HD 600",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
2008-11-27 10:42:26 +00:00
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900_digital,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_ATI_TV_WONDER_HD_600,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2880_BOARD_TERRATEC_HYBRID_XS] = {
|
2008-11-25 12:10:25 +00:00
|
|
|
.name = "Terratec Hybrid XS",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-11-25 12:10:25 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-07-27 17:03:32 +00:00
|
|
|
.has_dvb = 1,
|
2009-06-23 01:32:32 +00:00
|
|
|
.dvb_gpio = default_digital,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_TERRATEC_CINERGY_XS,
|
2009-08-04 02:56:51 +00:00
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
|
2008-07-27 17:03:32 +00:00
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
/* maybe there's a reason behind it why Terratec sells the Hybrid XS
|
|
|
|
as Prodigy XS with a different PID, let's keep it separated for now
|
|
|
|
maybe we'll need it lateron */
|
|
|
|
[EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
|
|
|
|
.name = "Terratec Prodigy XS",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2820_BOARD_MSI_VOX_USB_2] = {
|
|
|
|
.name = "MSI VOX USB 2.0",
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT |
|
|
|
|
TDA9887_PORT1_ACTIVE |
|
|
|
|
TDA9887_PORT2_ACTIVE,
|
|
|
|
.max_range_640_480 = 1,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-07-27 17:03:32 +00:00
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE4,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2800_BOARD_TERRATEC_CINERGY_200] = {
|
|
|
|
.name = "Terratec Cinergy 200 USB",
|
|
|
|
.is_em2800 = 1,
|
2009-09-08 17:04:41 +00:00
|
|
|
.has_ir_i2c = 1,
|
2012-01-08 19:41:22 +00:00
|
|
|
.tuner_type = TUNER_LG_TALN,
|
2008-07-27 17:03:32 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2800_BOARD_GRABBEEX_USB2800] = {
|
2009-02-11 02:28:24 +00:00
|
|
|
.name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
|
|
|
|
.is_em2800 = 1,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.tuner_type = TUNER_ABSENT, /* capture only board */
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2009-11-27 00:26:13 +00:00
|
|
|
[EM2800_BOARD_VC211A] = {
|
|
|
|
.name = "Actionmaster/LinXcel/Digitus VC211A",
|
|
|
|
.is_em2800 = 1,
|
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture-only board */
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-11-27 00:26:13 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = vc211a_enable,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = vc211a_enable,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
|
|
|
|
.name = "Leadtek Winfast USB II",
|
|
|
|
.is_em2800 = 1,
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2800_BOARD_KWORLD_USB2800] = {
|
|
|
|
.name = "Kworld USB2800",
|
|
|
|
.is_em2800 = 1,
|
|
|
|
.tuner_type = TUNER_PHILIPS_FCV1236D,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2820_BOARD_PINNACLE_DVC_90] = {
|
[media] em28xx: don't break long lines
Due to the 80-cols restrictions, and latter due to checkpatch
warnings, several strings were broken into multiple lines. This
is not considered a good practice anymore, as it makes harder
to grep for strings at the source code.
As we're right now fixing other drivers due to KERN_CONT, we need
to be able to identify what printk strings don't end with a "\n".
It is a way easier to detect those if we don't break long lines.
So, join those continuation lines.
The patch was generated via the script below, and manually
adjusted if needed.
</script>
use Text::Tabs;
while (<>) {
if ($next ne "") {
$c=$_;
if ($c =~ /^\s+\"(.*)/) {
$c2=$1;
$next =~ s/\"\n$//;
$n = expand($next);
$funpos = index($n, '(');
$pos = index($c2, '",');
if ($funpos && $pos > 0) {
$s1 = substr $c2, 0, $pos + 2;
$s2 = ' ' x ($funpos + 1) . substr $c2, $pos + 2;
$s2 =~ s/^\s+//;
$s2 = ' ' x ($funpos + 1) . $s2 if ($s2 ne "");
print unexpand("$next$s1\n");
print unexpand("$s2\n") if ($s2 ne "");
} else {
print "$next$c2\n";
}
$next="";
next;
} else {
print $next;
}
$next="";
} else {
if (m/\"$/) {
if (!m/\\n\"$/) {
$next=$_;
next;
}
}
}
print $_;
}
</script>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2016-10-18 19:44:15 +00:00
|
|
|
.name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
|
2008-11-27 10:46:59 +00:00
|
|
|
.tuner_type = TUNER_ABSENT, /* capture only board */
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2800_BOARD_VGEAR_POCKETTV] = {
|
|
|
|
.name = "V-Gear PocketTV",
|
|
|
|
.is_em2800 = 1,
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2008-12-28 00:38:14 +00:00
|
|
|
[EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
|
|
|
|
.name = "Pixelview PlayTV Box 4 USB 2.0",
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.tuner_type = TUNER_YMEC_TVF_5533MF,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2014-11-28 11:34:15 +00:00
|
|
|
.aout = EM28XX_AOUT_MONO | /* I2S */
|
2008-12-28 00:38:14 +00:00
|
|
|
EM28XX_AOUT_MASTER, /* Line out pin */
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-12-28 00:38:14 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
|
2009-02-25 19:54:31 +00:00
|
|
|
.name = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
|
2013-12-01 21:06:52 +00:00
|
|
|
.buttons = std_snapshot_button,
|
2008-07-27 17:03:32 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.tuner_type = TUNER_YMEC_TVF_5533MF,
|
2016-01-29 12:11:57 +00:00
|
|
|
.tuner_addr = 0x60,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
2008-11-20 16:43:05 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2014-11-28 11:34:15 +00:00
|
|
|
.aout = EM28XX_AOUT_MONO | /* I2S */
|
2008-11-20 16:43:05 +00:00
|
|
|
EM28XX_AOUT_MASTER, /* Line out pin */
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2009-05-28 02:27:26 +00:00
|
|
|
[EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
|
|
|
|
.name = "EM2860/SAA711X Reference Design",
|
2013-12-01 21:06:52 +00:00
|
|
|
.buttons = std_snapshot_button,
|
2008-11-25 12:10:25 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
2008-11-25 12:43:29 +00:00
|
|
|
.decoder = EM28XX_SAA711X,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2009-05-28 02:27:26 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-05-28 02:27:26 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
2010-09-10 20:29:14 +00:00
|
|
|
|
2011-06-01 13:16:25 +00:00
|
|
|
[EM2874_BOARD_LEADERSHIP_ISDBT] = {
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2010-09-10 20:29:14 +00:00
|
|
|
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,
|
|
|
|
},
|
|
|
|
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2880_BOARD_MSI_DIGIVOX_AD] = {
|
|
|
|
.name = "MSI DigiVox A/D",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = em2880_msi_digivox_ad_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = em2880_msi_digivox_ad_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = em2880_msi_digivox_ad_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
} },
|
|
|
|
},
|
|
|
|
[EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
|
|
|
|
.name = "MSI DigiVox A/D II",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-26 14:04:33 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = em2880_msi_digivox_ad_analog,
|
2008-07-26 14:04:33 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-26 14:04:33 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = em2880_msi_digivox_ad_analog,
|
2008-07-26 14:04:33 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = em2880_msi_digivox_ad_analog,
|
2008-07-26 14:04:33 +00:00
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2880_BOARD_KWORLD_DVB_305U] = {
|
|
|
|
.name = "KWorld DVB-T 305U",
|
2007-10-24 14:08:20 +00:00
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2007-10-24 14:08:20 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2007-10-24 14:08:20 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2007-10-24 14:08:20 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2007-10-24 14:08:20 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2007-10-24 14:08:20 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2880_BOARD_KWORLD_DVB_310U] = {
|
|
|
|
.name = "KWorld DVB-T 310U",
|
2007-10-24 14:08:20 +00:00
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-09-30 05:46:41 +00:00
|
|
|
.has_dvb = 1,
|
2008-11-27 10:42:26 +00:00
|
|
|
.dvb_gpio = default_digital,
|
2008-09-30 05:46:41 +00:00
|
|
|
.mts_firmware = 1,
|
2007-10-24 14:08:20 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2007-10-24 14:08:20 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-09-30 05:46:41 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2007-10-24 14:08:20 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:08:53 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2008-09-30 05:46:41 +00:00
|
|
|
}, { /* S-video has not been tested yet */
|
2007-10-24 14:08:20 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:08:53 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2007-10-24 14:08:20 +00:00
|
|
|
},
|
2009-06-06 20:05:02 +00:00
|
|
|
[EM2882_BOARD_KWORLD_ATSC_315U] = {
|
|
|
|
.name = "KWorld ATSC 315U HDTV TV Box",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_THOMSON_DTT761X,
|
|
|
|
.tuner_gpio = em2882_kworld_315u_tuner_gpio,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = em2882_kworld_315u_digital,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_KWORLD_315U,
|
2009-06-06 20:05:02 +00:00
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
|
|
|
|
/* Analog mode - still not ready */
|
|
|
|
/*.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = SAA7115_COMPOSITE2,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = em2882_kworld_315u_analog,
|
|
|
|
.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-06-06 20:05:02 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = em2882_kworld_315u_analog1,
|
|
|
|
.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = em2882_kworld_315u_analog1,
|
|
|
|
.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
|
|
|
} }, */
|
|
|
|
},
|
2009-04-09 21:24:34 +00:00
|
|
|
[EM2880_BOARD_EMPIRE_DUAL_TV] = {
|
|
|
|
.name = "Empire dual TV",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = default_digital,
|
|
|
|
.mts_firmware = 1,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = default_analog,
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-04-09 21:24:34 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = default_analog,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = default_analog,
|
|
|
|
} },
|
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2881_BOARD_DNT_DA2_HYBRID] = {
|
|
|
|
.name = "DNT DA2 Hybrid",
|
|
|
|
.valid = EM28XX_BOARD_NOT_VALIDATED,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = default_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:24 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
|
|
|
|
.name = "Pinnacle Hybrid Pro",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2009-07-09 00:51:35 +00:00
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = pinnacle_hybrid_pro_digital,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2009-07-09 00:51:35 +00:00
|
|
|
.gpio = pinnacle_hybrid_pro_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-07-09 00:51:35 +00:00
|
|
|
.gpio = pinnacle_hybrid_pro_analog,
|
2008-07-27 16:47:52 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-07-09 00:51:35 +00:00
|
|
|
.gpio = pinnacle_hybrid_pro_analog,
|
2008-07-27 16:47:52 +00:00
|
|
|
} },
|
|
|
|
},
|
2011-03-13 05:07:54 +00:00
|
|
|
[EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
|
|
|
|
.name = "Pinnacle Hybrid Pro (330e)",
|
2008-07-27 17:03:32 +00:00
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-08-01 11:23:41 +00:00
|
|
|
.mts_firmware = 1,
|
2011-03-13 05:09:59 +00:00
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900R2_digital,
|
2011-03-13 05:18:34 +00:00
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:24 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2882_BOARD_KWORLD_VS_DVBT] = {
|
|
|
|
.name = "Kworld VS-DVB-T 323UR",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2010-03-05 01:19:48 +00:00
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = kworld_330u_digital,
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_KWORLD_315U,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:37:24 +00:00
|
|
|
},
|
2008-07-27 17:03:32 +00:00
|
|
|
[EM2882_BOARD_TERRATEC_HYBRID_XS] = {
|
2010-10-31 12:57:58 +00:00
|
|
|
.name = "Terratec Cinnergy Hybrid T USB XS (em2882)",
|
2008-07-27 17:03:32 +00:00
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2009-10-01 01:53:37 +00:00
|
|
|
.mts_firmware = 1,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2009-10-01 01:53:37 +00:00
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = hauppauge_wintv_hvr_900_digital,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_TERRATEC_CINERGY_XS,
|
2009-10-01 01:53:37 +00:00
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:03:32 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2008-07-27 17:03:32 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2005-11-09 05:38:27 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2008-11-27 10:42:26 +00:00
|
|
|
.gpio = hauppauge_wintv_hvr_900_analog,
|
2007-11-23 17:22:14 +00:00
|
|
|
} },
|
2005-11-09 05:38:15 +00:00
|
|
|
},
|
2010-02-09 20:53:38 +00:00
|
|
|
[EM2882_BOARD_DIKOM_DK300] = {
|
|
|
|
.name = "Dikom DK300",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = dikom_dk300_digital,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = default_analog,
|
|
|
|
} },
|
|
|
|
},
|
2009-01-19 00:59:34 +00:00
|
|
|
[EM2883_BOARD_KWORLD_HYBRID_330U] = {
|
2008-07-27 17:03:32 +00:00
|
|
|
.name = "Kworld PlusTV HD Hybrid 330",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
2008-11-27 12:21:55 +00:00
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2008-07-27 17:03:32 +00:00
|
|
|
.decoder = EM28XX_TVP5150,
|
2008-12-09 18:43:10 +00:00
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
2009-01-19 00:59:34 +00:00
|
|
|
.dvb_gpio = kworld_330u_digital,
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
2009-02-11 02:28:24 +00:00
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_EEPROM_ON_BOARD |
|
|
|
|
EM28XX_I2C_EEPROM_KEY_VALID,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2007-11-04 00:21:57 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
2009-01-19 00:59:34 +00:00
|
|
|
.gpio = kworld_330u_analog,
|
|
|
|
.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-01-19 00:59:34 +00:00
|
|
|
.gpio = kworld_330u_analog,
|
|
|
|
.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
|
2007-11-23 17:22:14 +00:00
|
|
|
}, {
|
2007-11-04 00:21:57 +00:00
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
2008-07-27 17:03:32 +00:00
|
|
|
.vmux = TVP5150_SVIDEO,
|
2008-11-19 14:10:50 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-01-19 00:59:34 +00:00
|
|
|
.gpio = kworld_330u_analog,
|
2008-06-28 11:57:06 +00:00
|
|
|
} },
|
|
|
|
},
|
2008-07-27 19:58:04 +00:00
|
|
|
[EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
|
2008-07-27 17:10:11 +00:00
|
|
|
.name = "Compro VideoMate ForYou/Stereo",
|
|
|
|
.tuner_type = TUNER_LG_PAL_NEW_TAPC,
|
2009-03-31 20:10:58 +00:00
|
|
|
.tvaudio_addr = 0xb0,
|
2008-07-27 17:10:11 +00:00
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
V4L/DVB (10654): em28xx: VideoMate For You USB TV box requires tvaudio
As reported by Vitaly Wool <vital@embeddedalley.com>:
> about half a year ago I posted the patch that basically enabled Compro
> VideoMate For You USB TV box support.
> The main problem is I couldn't get the sound working.
> So I kind of decomposed the box and found out the audio decoder chip
> used there was Philips TDA9874A. As far as I can see, it's not supported
> within the em28xx suite although it is for other TV tuner drivers.
A tvaudio modprobing confirms that tda9874a chip is accessible via i2c:
tvaudio: TV audio decoder + audio/video mux driver
tvaudio: known chips: tda9840, tda9873h, tda9874h/a, tda9850, tda9855, tea6300, tea6320, tea6420, tda8425, pic16c54 (PV951), ta8874z
tvaudio' 1-0058: chip found @ 0xb0
tvaudio' 1-0058: tvaudio': chip_read2: reg254=0x11
tvaudio' 1-0058: tvaudio': chip_read2: reg255=0x2
tvaudio' 1-0058: tda9874a_checkit(): DIC=0x11, SIC=0x2.
tvaudio' 1-0058: found tda9874a.
tvaudio' 1-0058: tda9874h/a found @ 0xb0 (em28xx #0)
tvaudio' 1-0058: tda9874h/a: chip_write: reg0=0x0
tvaudio' 1-0058: tda9874h/a: chip_write: reg1=0xc0
tvaudio' 1-0058: tda9874h/a: chip_write: reg2=0x2
tvaudio' 1-0058: tda9874h/a: chip_write: reg11=0x80
tvaudio' 1-0058: tda9874h/a: chip_write: reg12=0x0
tvaudio' 1-0058: tda9874h/a: chip_write: reg13=0x0
tvaudio' 1-0058: tda9874h/a: chip_write: reg14=0x1
tvaudio' 1-0058: tda9874h/a: chip_write: reg15=0x0
tvaudio' 1-0058: tda9874h/a: chip_write: reg16=0x14
tvaudio' 1-0058: tda9874h/a: chip_write: reg17=0x50
tvaudio' 1-0058: tda9874h/a: chip_write: reg18=0xf9
tvaudio' 1-0058: tda9874h/a: chip_write: reg19=0x80
tvaudio' 1-0058: tda9874h/a: chip_write: reg20=0x80
tvaudio' 1-0058: tda9874h/a: chip_write: reg24=0x80
tvaudio' 1-0058: tda9874h/a: chip_write: reg255=0x0
tvaudio' 1-0058: tda9874a_setup(): A2, B/G [0x00].
tvaudio' 1-0058: tda9874h/a: thread started]
This patch automatically loads tvaudio when needed (currently, only
with this board).
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2009-02-25 12:06:13 +00:00
|
|
|
.adecoder = EM28XX_TVAUDIO,
|
2009-03-04 11:27:52 +00:00
|
|
|
.mute_gpio = compro_mute_gpio,
|
2008-11-25 12:10:25 +00:00
|
|
|
.input = { {
|
2008-07-27 17:10:11 +00:00
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
2009-03-04 11:27:52 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = compro_unmute_tv_gpio,
|
2008-07-27 17:10:11 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-03-04 11:27:52 +00:00
|
|
|
.gpio = compro_unmute_svid_gpio,
|
2008-07-27 17:10:11 +00:00
|
|
|
} },
|
|
|
|
},
|
2009-02-11 17:13:20 +00:00
|
|
|
[EM2860_BOARD_KAIOMY_TVNPC_U2] = {
|
|
|
|
.name = "Kaiomy TVnPC U2",
|
|
|
|
.vchannels = 3,
|
|
|
|
.tuner_type = TUNER_XC2028,
|
|
|
|
.tuner_addr = 0x61,
|
|
|
|
.mts_firmware = 1,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_KAIOMY,
|
2009-02-11 17:13:20 +00:00
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-02-11 17:13:20 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
.radio = {
|
|
|
|
.type = EM28XX_RADIO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}
|
2009-02-11 17:18:36 +00:00
|
|
|
},
|
|
|
|
[EM2860_BOARD_EASYCAP] = {
|
|
|
|
.name = "Easy Cap Capture DC-60",
|
|
|
|
.vchannels = 2,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-02-11 17:18:36 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2009-02-11 14:13:05 +00:00
|
|
|
[EM2820_BOARD_IODATA_GVMVP_SZ] = {
|
|
|
|
.name = "IO-DATA GV-MVP/SZ",
|
|
|
|
.tuner_type = TUNER_PHILIPS_FM1236_MK3,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.tda9887_conf = TDA9887_PRESENT,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
}, { /* Composite has not been tested yet */
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-02-11 14:13:05 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
}, { /* S-video has not been tested yet */
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
} },
|
|
|
|
},
|
2009-05-23 12:58:52 +00:00
|
|
|
[EM2860_BOARD_TERRATEC_GRABBY] = {
|
|
|
|
.name = "Terratec Grabby",
|
|
|
|
.vchannels = 2,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-05-23 12:58:52 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
2010-10-25 20:51:15 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-05-23 12:58:52 +00:00
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
2010-10-25 20:51:15 +00:00
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
2009-05-23 12:58:52 +00:00
|
|
|
} },
|
2016-02-28 11:26:21 +00:00
|
|
|
.buttons = std_snapshot_button,
|
2016-02-28 11:26:22 +00:00
|
|
|
.leds = terratec_grabby_leds,
|
2009-05-23 12:58:52 +00:00
|
|
|
},
|
2009-05-24 03:46:01 +00:00
|
|
|
[EM2860_BOARD_TERRATEC_AV350] = {
|
|
|
|
.name = "Terratec AV350",
|
|
|
|
.vchannels = 2,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
|
|
|
|
.mute_gpio = terratec_av350_mute_gpio,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-05-24 03:46:01 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AUDIO_SRC_LINE,
|
2009-05-13 19:48:07 +00:00
|
|
|
.gpio = terratec_av350_unmute_gpio,
|
2009-05-24 03:46:01 +00:00
|
|
|
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AUDIO_SRC_LINE,
|
2009-05-13 19:48:07 +00:00
|
|
|
.gpio = terratec_av350_unmute_gpio,
|
2009-05-24 03:46:01 +00:00
|
|
|
} },
|
|
|
|
},
|
2010-10-20 10:55:33 +00:00
|
|
|
|
|
|
|
[EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
|
|
|
|
.name = "Elgato Video Capture",
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture only device */
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2010-10-20 10:55:33 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
|
|
|
|
2009-06-19 03:33:54 +00:00
|
|
|
[EM2882_BOARD_EVGA_INDTUBE] = {
|
|
|
|
.name = "Evga inDtube",
|
|
|
|
.tuner_type = TUNER_XC2028,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.decoder = EM28XX_TVP5150,
|
2009-06-21 00:34:42 +00:00
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
|
2009-06-19 03:33:54 +00:00
|
|
|
.mts_firmware = 1,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = evga_indtube_digital,
|
2010-04-02 23:01:00 +00:00
|
|
|
.ir_codes = RC_MAP_EVGA_INDTUBE,
|
2009-06-19 03:33:54 +00:00
|
|
|
.input = { {
|
|
|
|
.type = EM28XX_VMUX_TELEVISION,
|
|
|
|
.vmux = TVP5150_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = evga_indtube_analog,
|
|
|
|
}, {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2009-06-19 03:33:54 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = evga_indtube_analog,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
.gpio = evga_indtube_analog,
|
|
|
|
} },
|
|
|
|
},
|
2009-09-15 17:42:13 +00:00
|
|
|
/* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 +
|
|
|
|
Infineon TUA6034) */
|
|
|
|
[EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
|
|
|
|
.name = "Reddo DVB-C USB TV Box",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
2009-10-04 15:59:35 +00:00
|
|
|
.tuner_gpio = reddo_dvb_c_usb_box,
|
2009-09-15 17:42:13 +00:00
|
|
|
.has_dvb = 1,
|
|
|
|
},
|
2010-03-07 20:55:43 +00:00
|
|
|
/* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
|
|
|
|
* initially as the KWorld PlusTV 340U, then as the UB435-Q.
|
|
|
|
* Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
|
|
|
|
[EM2870_BOARD_KWORLD_A340] = {
|
|
|
|
.name = "KWorld PlusTV 340U or UB435-Q (ATSC)",
|
|
|
|
.tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = kworld_a340_digital,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
},
|
2011-05-25 20:03:50 +00:00
|
|
|
/* 2013:024f PCTV nanoStick T2 290e.
|
2011-04-07 19:34:44 +00:00
|
|
|
* Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */
|
|
|
|
[EM28174_BOARD_PCTV_290E] = {
|
2011-05-25 20:03:50 +00:00
|
|
|
.name = "PCTV nanoStick T2 290e",
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
|
2011-04-07 19:34:44 +00:00
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = pctv_290e,
|
|
|
|
.has_dvb = 1,
|
2011-05-25 20:00:35 +00:00
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
2011-04-07 19:34:44 +00:00
|
|
|
},
|
2011-08-01 04:15:30 +00:00
|
|
|
/* 2013:024f PCTV DVB-S2 Stick 460e
|
|
|
|
* Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293 */
|
|
|
|
[EM28174_BOARD_PCTV_460E] = {
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
|
2011-08-01 04:15:30 +00:00
|
|
|
.name = "PCTV DVB-S2 Stick (460e)",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = pctv_460e,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
|
|
|
},
|
2011-12-24 08:47:29 +00:00
|
|
|
/* eb1a:5006 Honestech VIDBOX NW03
|
|
|
|
* Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */
|
|
|
|
[EM2860_BOARD_HT_VIDBOX_NW03] = {
|
|
|
|
.name = "Honestech Vidbox NW03",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.decoder = EM28XX_SAA711X,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2011-12-24 08:47:29 +00:00
|
|
|
.vmux = SAA7115_COMPOSITE0,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = SAA7115_SVIDEO3, /* S-VIDEO needs confirming */
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2012-03-18 21:09:01 +00:00
|
|
|
/* 1b80:e425 MaxMedia UB425-TC
|
|
|
|
* Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2 */
|
|
|
|
[EM2874_BOARD_MAXMEDIA_UB425_TC] = {
|
|
|
|
.name = "MaxMedia UB425-TC",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = maxmedia_ub425_tc,
|
|
|
|
.has_dvb = 1,
|
2013-04-12 16:59:03 +00:00
|
|
|
.ir_codes = RC_MAP_REDDO,
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2012-03-18 21:09:01 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2012-03-19 23:09:55 +00:00
|
|
|
/* 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,
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2012-03-19 23:09:55 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2012-03-19 14:48:19 +00:00
|
|
|
/* 2013:0251 PCTV QuatroStick nano (520e)
|
|
|
|
* Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
|
|
|
|
[EM2884_BOARD_PCTV_520E] = {
|
|
|
|
.name = "PCTV QuatroStick nano (520e)",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = pctv_520e,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2012-03-19 14:48:19 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2012-10-04 17:22:54 +00:00
|
|
|
[EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
|
|
|
|
.name = "Terratec Cinergy HTC USB XS",
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
2013-03-05 09:55:27 +00:00
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
2012-10-04 17:22:54 +00:00
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2013-04-13 14:03:37 +00:00
|
|
|
/* 1b80:e1cc Delock 61959
|
|
|
|
* Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
|
2013-12-22 16:13:41 +00:00
|
|
|
* mostly the same as MaxMedia UB-425-TC but different remote */
|
2013-04-13 14:03:37 +00:00
|
|
|
[EM2874_BOARD_DELOCK_61959] = {
|
|
|
|
.name = "Delock 61959",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = maxmedia_ub425_tc,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_DELOCK_61959,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
},
|
2013-10-09 14:18:05 +00:00
|
|
|
/*
|
|
|
|
* 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
|
|
|
|
* Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
|
|
|
|
*/
|
|
|
|
[EM2874_BOARD_KWORLD_UB435Q_V2] = {
|
|
|
|
.name = "KWorld USB ATSC TV Stick UB435-Q V2",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = kworld_a340_digital,
|
|
|
|
.tuner_gpio = default_tuner_gpio,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
},
|
2014-03-03 19:28:39 +00:00
|
|
|
/*
|
|
|
|
* 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
|
|
|
|
* Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
|
|
|
|
*/
|
|
|
|
[EM2874_BOARD_KWORLD_UB435Q_V3] = {
|
|
|
|
.name = "KWorld USB ATSC TV Stick UB435-Q V3",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.tuner_gpio = kworld_ub435q_v3_digital,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_100_KHZ,
|
2014-03-04 15:34:34 +00:00
|
|
|
.leds = kworld_ub435q_v3_leds,
|
2014-03-03 19:28:39 +00:00
|
|
|
},
|
2012-08-14 00:18:02 +00:00
|
|
|
[EM2874_BOARD_PCTV_HD_MINI_80E] = {
|
|
|
|
.name = "Pinnacle PCTV HD Mini",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.dvb_gpio = em2874_pctv_80e_digital,
|
|
|
|
.decoder = EM28XX_NODECODER,
|
2014-01-19 10:15:11 +00:00
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
2014-03-04 23:49:07 +00:00
|
|
|
.leds = pctv_80e_leds,
|
2012-08-14 00:18:02 +00:00
|
|
|
},
|
2013-12-01 21:06:57 +00:00
|
|
|
/* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
|
|
|
|
* Empia EM2765 + OmniVision OV2640 */
|
|
|
|
[EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
|
|
|
|
.name = "SpeedLink Vicious And Devine Laplace webcam",
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_24MHZ,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_100_KHZ,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.is_webcam = 1,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2013-12-01 21:06:57 +00:00
|
|
|
.amux = EM28XX_AMUX_VIDEO,
|
|
|
|
.gpio = speedlink_vad_laplace_reg_seq,
|
|
|
|
} },
|
|
|
|
.buttons = speedlink_vad_laplace_buttons,
|
|
|
|
.leds = speedlink_vad_laplace_leds,
|
|
|
|
},
|
2013-02-25 12:01:13 +00:00
|
|
|
/* 2013:0258 PCTV DVB-S2 Stick (461e)
|
|
|
|
* Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293 */
|
|
|
|
[EM28178_BOARD_PCTV_461E] = {
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
.name = "PCTV DVB-S2 Stick (461e)",
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = pctv_461e,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
|
|
|
},
|
2014-04-11 01:11:27 +00:00
|
|
|
/* 2013:025f PCTV tripleStick (292e).
|
|
|
|
* Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157 */
|
|
|
|
[EM28178_BOARD_PCTV_292E] = {
|
|
|
|
.name = "PCTV tripleStick (292e)",
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = pctv_292e,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_PINNACLE_PCTV_HD,
|
|
|
|
},
|
2014-10-19 22:25:59 +00:00
|
|
|
[EM2861_BOARD_LEADTEK_VC100] = {
|
|
|
|
.name = "Leadtek VC100",
|
|
|
|
.tuner_type = TUNER_ABSENT, /* Capture only device */
|
|
|
|
.decoder = EM28XX_TVP5150,
|
|
|
|
.input = { {
|
2016-01-27 11:24:29 +00:00
|
|
|
.type = EM28XX_VMUX_COMPOSITE,
|
2014-10-19 22:25:59 +00:00
|
|
|
.vmux = TVP5150_COMPOSITE1,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
}, {
|
|
|
|
.type = EM28XX_VMUX_SVIDEO,
|
|
|
|
.vmux = TVP5150_SVIDEO,
|
|
|
|
.amux = EM28XX_AMUX_LINE_IN,
|
|
|
|
} },
|
|
|
|
},
|
2014-11-24 06:57:34 +00:00
|
|
|
/* eb1a:8179 Terratec Cinergy T2 Stick HD.
|
|
|
|
* Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146 */
|
|
|
|
[EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
|
|
|
|
.name = "Terratec Cinergy T2 Stick HD",
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = terratec_t2_stick_hd,
|
|
|
|
.has_dvb = 1,
|
|
|
|
.ir_codes = RC_MAP_TERRATEC_SLIM_2,
|
|
|
|
},
|
2016-05-06 19:35:05 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 3275:0085 PLEX PX-BCUD.
|
|
|
|
* Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C0042
|
|
|
|
*/
|
|
|
|
[EM28178_BOARD_PLEX_PX_BCUD] = {
|
|
|
|
.name = "PLEX PX-BCUD",
|
|
|
|
.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ,
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = plex_px_bcud,
|
|
|
|
.has_dvb = 1,
|
|
|
|
},
|
2016-04-04 15:12:52 +00:00
|
|
|
/*
|
2018-01-05 00:04:15 +00:00
|
|
|
* 2040:0265 Hauppauge WinTV-dualHD (DVB version) Isoc.
|
|
|
|
* 2040:8265 Hauppauge WinTV-dualHD (DVB version) Bulk.
|
2016-04-04 15:12:52 +00:00
|
|
|
* Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si2157
|
|
|
|
*/
|
|
|
|
[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {
|
|
|
|
.name = "Hauppauge WinTV-dualHD DVB",
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = hauppauge_dualhd_dvb,
|
|
|
|
.has_dvb = 1,
|
2018-01-05 00:04:11 +00:00
|
|
|
.has_dual_ts = 1,
|
2016-04-04 15:12:52 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
|
|
|
.leds = hauppauge_dualhd_leds,
|
|
|
|
},
|
2017-01-10 03:14:29 +00:00
|
|
|
/*
|
2018-01-05 00:04:15 +00:00
|
|
|
* 2040:026d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Isoc.
|
|
|
|
* 2040:826d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Bulk.
|
2017-01-10 03:14:29 +00:00
|
|
|
* Empia EM28274, 2x LG LGDT3306A, 2x Silicon Labs Si2157
|
|
|
|
*/
|
|
|
|
[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595] = {
|
|
|
|
.name = "Hauppauge WinTV-dualHD 01595 ATSC/QAM",
|
|
|
|
.def_i2c_bus = 1,
|
|
|
|
.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_400_KHZ,
|
|
|
|
.tuner_type = TUNER_ABSENT,
|
|
|
|
.tuner_gpio = hauppauge_dualhd_dvb,
|
|
|
|
.has_dvb = 1,
|
2018-01-05 00:04:11 +00:00
|
|
|
.has_dual_ts = 1,
|
2017-01-10 03:14:29 +00:00
|
|
|
.ir_codes = RC_MAP_HAUPPAUGE,
|
|
|
|
.leds = hauppauge_dualhd_leds,
|
|
|
|
},
|
2005-11-09 05:37:07 +00:00
|
|
|
};
|
2013-12-22 16:27:02 +00:00
|
|
|
EXPORT_SYMBOL_GPL(em28xx_boards);
|
|
|
|
|
2014-08-21 19:43:03 +00:00
|
|
|
static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
|
2005-11-09 05:37:07 +00:00
|
|
|
|
|
|
|
/* table of devices that work with this driver */
|
2009-02-11 02:28:24 +00:00
|
|
|
struct usb_device_id em28xx_id_table[] = {
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2750),
|
2008-07-27 17:03:32 +00:00
|
|
|
.driver_info = EM2750_BOARD_UNKNOWN },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0x2751),
|
|
|
|
.driver_info = EM2750_BOARD_UNKNOWN },
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2800),
|
|
|
|
.driver_info = EM2800_BOARD_UNKNOWN },
|
2009-08-07 15:08:02 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2710),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2820),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0x2821),
|
2008-12-17 02:35:23 +00:00
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2860),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0x2861),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2009-10-01 01:44:19 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2862),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2010-03-20 02:53:12 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2863),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2870),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0x2881),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0x2883),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2009-09-15 17:42:13 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2868),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2010-09-10 20:29:14 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2875),
|
|
|
|
.driver_info = EM2820_BOARD_UNKNOWN },
|
2014-05-27 07:12:19 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */
|
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_H5 },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xe300),
|
|
|
|
.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
|
2009-02-11 17:13:20 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xe303),
|
|
|
|
.driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xe305),
|
|
|
|
.driver_info = EM2880_BOARD_KWORLD_DVB_305U },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0xe310),
|
|
|
|
.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
|
2009-06-06 20:05:02 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xa313),
|
|
|
|
.driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xa316),
|
2009-01-19 00:59:34 +00:00
|
|
|
.driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xe320),
|
|
|
|
.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0xe323),
|
|
|
|
.driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0xe350),
|
|
|
|
.driver_info = EM2870_BOARD_KWORLD_350U },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0xe355),
|
|
|
|
.driver_info = EM2870_BOARD_KWORLD_355U },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0x2801),
|
|
|
|
.driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
|
|
|
|
{ USB_DEVICE(0xeb1a, 0xe357),
|
|
|
|
.driver_info = EM2870_BOARD_KWORLD_355U },
|
2011-12-11 21:15:00 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0xe359),
|
|
|
|
.driver_info = EM2870_BOARD_KWORLD_355U },
|
2009-02-25 19:55:48 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe302),
|
|
|
|
.driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
|
2009-09-06 21:41:59 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe304),
|
|
|
|
.driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kworld DVD Maker 2 */
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x0036),
|
|
|
|
.driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x004c),
|
|
|
|
.driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
|
|
|
|
{ USB_DEVICE(0x0ccd, 0x004f),
|
|
|
|
.driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
|
|
|
|
{ USB_DEVICE(0x0ccd, 0x005e),
|
|
|
|
.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
|
|
|
|
{ USB_DEVICE(0x0ccd, 0x0042),
|
2010-10-31 12:57:58 +00:00
|
|
|
.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x0043),
|
2015-10-27 19:24:14 +00:00
|
|
|
.driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },
|
2011-12-24 02:15:32 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x008e), /* Cinergy HTC USB XS Rev. 1 */
|
2012-10-04 17:22:54 +00:00
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
|
2011-12-24 02:15:32 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x00ac), /* Cinergy HTC USB XS Rev. 2 */
|
2012-10-04 17:22:54 +00:00
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
|
2011-11-16 16:38:28 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x10a2), /* H5 Rev. 1 */
|
2011-07-04 00:05:06 +00:00
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_H5 },
|
2011-11-16 16:38:28 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x10ad), /* H5 Rev. 2 */
|
2011-07-15 00:48:00 +00:00
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_H5 },
|
2013-02-09 00:08:55 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x10b6), /* H5 Rev. 3 */
|
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_H5 },
|
media: em28xx: add support for new of Terratec H6
There's a new version of Terratec H6 with uses USB ID
0ccd:10b2. This version is similar to the old one (with is
supported via the HTC entry), except that this one has the
eeprom on the second bus.
On this board, one side of this board is labeled with:
dvbc v2.0
The other side with:
94V-0, MO2, RK-4221 with huge digits: 1107
With those patches, the board is properly detected:
em28xx 1-1.5:1.0: New device TERRATEC TERRATCE H5 MKII @ 480 Mbps (0ccd:10b2, interface 0, class 0)
em28xx 1-1.5:1.0: Audio interface 0 found (Vendor Class)
em28xx 1-1.5:1.0: Video interface 0 found: isoc
em28xx 1-1.5:1.0: DVB interface 0 found: isoc
em28xx 1-1.5:1.0: chip ID is em2884
em28xx eeprom 00000000: 26 00 00 00 02 0b 0f e5 f5 64 01 60 09 e5 f5 64 &........d.`...d
em28xx eeprom 00000010: 09 60 03 c2 c6 22 e5 f7 b4 03 13 e5 f6 b4 87 03 .`..."..........
em28xx eeprom 00000020: 02 0a b9 e5 f6 b4 93 03 02 09 46 c2 c6 22 c2 c6 ..........F.."..
em28xx eeprom 00000030: 22 00 60 00 ef 70 08 85 3d 82 85 3c 83 93 ff ef ".`..p..=..<....
em28xx eeprom 00000040: 60 19 85 3d 82 85 3c 83 e4 93 12 07 a3 12 0a fe `..=..<.........
em28xx eeprom 00000050: 05 3d e5 3d 70 02 05 3c 1f 80 e4 22 12 0b 06 02 .=.=p..<..."....
em28xx eeprom 00000060: 07 e2 01 00 1a eb 67 95 cd 0c b2 10 f0 13 6b 03 ......g.......k.
em28xx eeprom 00000070: 98 22 6a 1c 86 12 27 57 4e 16 29 00 60 00 00 00 ."j...'WN.).`...
em28xx eeprom 00000080: 02 00 00 00 5e 00 13 00 f0 10 44 82 82 00 00 00 ....^.....D.....
em28xx eeprom 00000090: 5b 81 c0 00 00 00 20 40 20 80 02 20 10 01 00 00 [..... @ .. ....
em28xx eeprom 000000a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
em28xx eeprom 000000b0: c6 40 00 00 81 00 00 00 00 00 00 00 00 c4 00 00 .@..............
em28xx eeprom 000000c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1c 03 ................
em28xx eeprom 000000d0: 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 1.2.3.4.5.6.7.8.
em28xx eeprom 000000e0: 39 00 41 00 42 00 43 00 44 00 12 03 54 00 45 00 9.A.B.C.D...T.E.
em28xx eeprom 000000f0: 52 00 52 00 41 00 54 00 45 00 43 00 22 03 54 00 R.R.A.T.E.C.".T.
em28xx 1-1.5:1.0: eeprom 000100: ... (skipped)
em28xx 1-1.5:1.0: EEPROM ID = 26 00 00 00, EEPROM hash = 0xbcd5a8cf
em28xx 1-1.5:1.0: EEPROM info:
em28xx 1-1.5:1.0: microcode start address = 0x0004, boot configuration = 0x00
em28xx 1-1.5:1.0: I2S audio, 5 sample rates
em28xx 1-1.5:1.0: 500mA max power
em28xx 1-1.5:1.0: Table at offset 0x27, strings=0x2298, 0x1c6a, 0x1286
em28xx 1-1.5:1.0: Identified as Terratec Cinergy H6 rev. 2 (card=101)
em28xx 1-1.5:1.0: Currently, V4L2 is not supported on this model
em28xx 1-1.5:1.0: dvb set to isoc mode.
usbcore: registered new interface driver em28xx
em28xx 1-1.5:1.0: Binding audio extension
em28xx 1-1.5:1.0: em28xx-audio.c: Copyright (C) 2006 Markus Rechberger
em28xx 1-1.5:1.0: em28xx-audio.c: Copyright (C) 2007-2016 Mauro Carvalho Chehab
em28xx 1-1.5:1.0: Endpoint 0x83 high-speed on intf 0 alt 7 interval = 8, size 196
em28xx 1-1.5:1.0: Number of URBs: 1, with 64 packets and 192 size
em28xx 1-1.5:1.0: Audio extension successfully initialized
em28xx: Registered (Em28xx Audio Extension) extension
em28xx 1-1.5:1.0: Binding DVB extension
drxk: status = 0x639260d9
drxk: detected a drx-3926k, spin A3, xtal 20.250 MHz
drxk: DRXK driver version 0.9.4300
drxk: frontend initialized.
tda18271 4-0060: creating new instance
tda18271: TDA18271HD/C2 detected @ 4-0060
dvbdev: DVB: registering new adapter (1-1.5:1.0)
em28xx 1-1.5:1.0: DVB: registering adapter 0 frontend 0 (DRXK DVB-C DVB-T)...
dvbdev: dvb_create_media_entity: media entity 'DRXK DVB-C DVB-T' registered.
dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered.
em28xx 1-1.5:1.0: DVB extension successfully initialized
em28xx: Registered (Em28xx dvb Extension) extension
em28xx 1-1.5:1.0: Registering input extension
rc rc0: 1-1.5:1.0 IR as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/rc/rc0
Registered IR keymap rc-nec-terratec-cinergy-xs
input: 1-1.5:1.0 IR as /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/rc/rc0/input0
em28xx 1-1.5:1.0: Input extension successfully initalized
em28xx: Registered (Em28xx Input Extension) extension
tda18271: performing RF tracking filter calibration
tda18271: RF tracking filter calibration complete
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2017-05-03 02:12:23 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x10b2), /* H6 */
|
|
|
|
.driver_info = EM2884_BOARD_TERRATEC_H6 },
|
2009-05-24 03:46:01 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x0084),
|
|
|
|
.driver_info = EM2860_BOARD_TERRATEC_AV350 },
|
2009-05-23 12:58:52 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x0096),
|
|
|
|
.driver_info = EM2860_BOARD_TERRATEC_GRABBY },
|
2011-10-14 08:40:29 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x10AF),
|
|
|
|
.driver_info = EM2860_BOARD_TERRATEC_GRABBY },
|
2011-11-16 14:06:50 +00:00
|
|
|
{ USB_DEVICE(0x0ccd, 0x00b2),
|
|
|
|
.driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
|
2015-03-01 20:11:05 +00:00
|
|
|
{ USB_DEVICE(0x0fd9, 0x0018),
|
|
|
|
.driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },
|
2010-10-20 10:55:33 +00:00
|
|
|
{ USB_DEVICE(0x0fd9, 0x0033),
|
2015-03-01 20:11:05 +00:00
|
|
|
.driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x185b, 0x2870),
|
|
|
|
.driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
|
2008-07-27 17:10:11 +00:00
|
|
|
{ USB_DEVICE(0x185b, 0x2041),
|
2008-07-27 19:58:04 +00:00
|
|
|
.driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x4200),
|
|
|
|
.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
|
2008-01-13 15:02:20 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x4201),
|
|
|
|
.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
|
2007-11-23 17:22:14 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x6500),
|
|
|
|
.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
|
2008-01-30 20:23:00 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x6502),
|
2008-06-08 13:22:03 +00:00
|
|
|
.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
|
2008-05-01 21:02:30 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
|
2008-07-27 17:58:58 +00:00
|
|
|
.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
|
2008-05-01 21:02:30 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */
|
2008-07-27 17:58:58 +00:00
|
|
|
.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
|
2008-05-01 21:02:30 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */
|
2008-07-27 17:58:58 +00:00
|
|
|
.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
|
2008-12-02 00:01:04 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x651f),
|
|
|
|
.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
|
2016-04-04 15:12:52 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x0265),
|
|
|
|
.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
|
2018-01-05 00:04:15 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x8265),
|
|
|
|
.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
|
2017-01-10 03:14:29 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x026d),
|
|
|
|
.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
|
2018-01-05 00:04:15 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x826d),
|
|
|
|
.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
|
2008-07-26 14:04:33 +00:00
|
|
|
{ USB_DEVICE(0x0438, 0xb002),
|
|
|
|
.driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x2001, 0xf112),
|
|
|
|
.driver_info = EM2820_BOARD_DLINK_USB_TV },
|
|
|
|
{ USB_DEVICE(0x2304, 0x0207),
|
|
|
|
.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
|
|
|
|
{ USB_DEVICE(0x2304, 0x0208),
|
|
|
|
.driver_info = EM2820_BOARD_PINNACLE_USB_2 },
|
|
|
|
{ USB_DEVICE(0x2304, 0x021a),
|
|
|
|
.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
|
|
|
|
{ USB_DEVICE(0x2304, 0x0226),
|
2011-03-13 05:07:54 +00:00
|
|
|
.driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x2304, 0x0227),
|
|
|
|
.driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
|
2012-08-14 00:18:02 +00:00
|
|
|
{ USB_DEVICE(0x2304, 0x023f),
|
|
|
|
.driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x0413, 0x6023),
|
|
|
|
.driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
|
2012-01-02 19:15:44 +00:00
|
|
|
{ USB_DEVICE(0x093b, 0xa003),
|
|
|
|
.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
|
2008-07-27 17:03:32 +00:00
|
|
|
{ USB_DEVICE(0x093b, 0xa005),
|
|
|
|
.driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
|
2009-02-11 14:13:05 +00:00
|
|
|
{ USB_DEVICE(0x04bb, 0x0515),
|
|
|
|
.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
|
2009-07-05 13:51:21 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x50a6),
|
|
|
|
.driver_info = EM2860_BOARD_GADMEI_UTV330 },
|
2010-03-07 20:55:43 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xa340),
|
|
|
|
.driver_info = EM2870_BOARD_KWORLD_A340 },
|
2013-10-09 14:18:05 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe346),
|
|
|
|
.driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
|
2014-03-03 19:28:39 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe34c),
|
|
|
|
.driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
|
2011-04-07 19:34:44 +00:00
|
|
|
{ USB_DEVICE(0x2013, 0x024f),
|
|
|
|
.driver_info = EM28174_BOARD_PCTV_290E },
|
2011-08-01 04:15:30 +00:00
|
|
|
{ USB_DEVICE(0x2013, 0x024c),
|
|
|
|
.driver_info = EM28174_BOARD_PCTV_460E },
|
2011-11-19 14:37:14 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x1605),
|
|
|
|
.driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
|
2013-02-28 13:35:56 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe755),
|
|
|
|
.driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
|
2011-12-24 08:47:29 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x5006),
|
|
|
|
.driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
|
2012-01-06 19:00:12 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
|
|
|
|
.driver_info = EM2860_BOARD_EASYCAP },
|
2012-03-18 21:09:01 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe425),
|
|
|
|
.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
|
2012-03-19 23:09:55 +00:00
|
|
|
{ USB_DEVICE(0x2304, 0x0242),
|
|
|
|
.driver_info = EM2884_BOARD_PCTV_510E },
|
2012-03-19 14:48:19 +00:00
|
|
|
{ USB_DEVICE(0x2013, 0x0251),
|
|
|
|
.driver_info = EM2884_BOARD_PCTV_520E },
|
2013-04-13 14:03:37 +00:00
|
|
|
{ USB_DEVICE(0x1b80, 0xe1cc),
|
|
|
|
.driver_info = EM2874_BOARD_DELOCK_61959 },
|
2013-12-01 21:06:57 +00:00
|
|
|
{ USB_DEVICE(0x1ae7, 0x9003),
|
|
|
|
.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
|
|
|
|
{ USB_DEVICE(0x1ae7, 0x9004),
|
|
|
|
.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
|
2013-02-25 12:01:13 +00:00
|
|
|
{ USB_DEVICE(0x2013, 0x0258),
|
|
|
|
.driver_info = EM28178_BOARD_PCTV_461E },
|
2014-04-11 01:11:27 +00:00
|
|
|
{ USB_DEVICE(0x2013, 0x025f),
|
|
|
|
.driver_info = EM28178_BOARD_PCTV_292E },
|
2018-01-05 00:04:16 +00:00
|
|
|
{ USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */
|
|
|
|
.driver_info = EM28178_BOARD_PCTV_292E },
|
2018-01-05 00:04:15 +00:00
|
|
|
{ USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD Isoc */
|
|
|
|
.driver_info = EM28178_BOARD_PCTV_292E },
|
|
|
|
{ USB_DEVICE(0x2040, 0x8264), /* Hauppauge OEM Generic WinTV-soloHD Bulk */
|
|
|
|
.driver_info = EM28178_BOARD_PCTV_292E },
|
|
|
|
{ USB_DEVICE(0x2040, 0x8268), /* Hauppauge Retail WinTV-soloHD Bulk */
|
2015-11-15 21:24:10 +00:00
|
|
|
.driver_info = EM28178_BOARD_PCTV_292E },
|
2014-10-19 22:25:59 +00:00
|
|
|
{ USB_DEVICE(0x0413, 0x6f07),
|
|
|
|
.driver_info = EM2861_BOARD_LEADTEK_VC100 },
|
2014-11-24 06:57:34 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x8179),
|
|
|
|
.driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
|
2016-05-06 19:35:05 +00:00
|
|
|
{ USB_DEVICE(0x3275, 0x0085),
|
|
|
|
.driver_info = EM28178_BOARD_PLEX_PX_BCUD },
|
2017-02-25 08:03:38 +00:00
|
|
|
{ USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */
|
|
|
|
.driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN },
|
2005-11-09 05:37:07 +00:00
|
|
|
{ },
|
|
|
|
};
|
2007-11-23 17:22:14 +00:00
|
|
|
MODULE_DEVICE_TABLE(usb, em28xx_id_table);
|
2007-11-04 00:20:59 +00:00
|
|
|
|
2008-04-18 00:40:45 +00:00
|
|
|
/*
|
|
|
|
* EEPROM hash table for devices with generic USB IDs
|
|
|
|
*/
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_hash_table em28xx_eeprom_hash[] = {
|
2007-11-04 00:21:57 +00:00
|
|
|
/* P/N: SA 60002070465 Tuner: TVF7533-MF */
|
2007-11-23 17:22:14 +00:00
|
|
|
{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
|
2008-12-28 00:38:14 +00:00
|
|
|
{0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
|
2008-09-30 05:46:41 +00:00
|
|
|
{0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
|
2009-08-06 15:52:11 +00:00
|
|
|
{0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
|
2009-06-19 03:33:54 +00:00
|
|
|
{0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
|
2009-07-09 00:51:35 +00:00
|
|
|
{0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
|
2009-09-15 17:42:13 +00:00
|
|
|
{0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
|
2010-02-09 20:53:38 +00:00
|
|
|
{0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
|
2007-11-04 00:20:59 +00:00
|
|
|
};
|
2005-11-09 05:37:07 +00:00
|
|
|
|
2007-11-04 11:32:42 +00:00
|
|
|
/* I2C devicelist hash table for devices with generic USB IDs */
|
2018-03-01 15:34:34 +00:00
|
|
|
static const struct em28xx_hash_table em28xx_i2c_hash[] = {
|
2007-11-23 17:22:14 +00:00
|
|
|
{0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
|
|
|
|
{0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
|
2009-05-28 02:27:26 +00:00
|
|
|
{0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
|
2010-03-20 02:53:12 +00:00
|
|
|
{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
|
2009-01-19 12:31:55 +00:00
|
|
|
{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
|
2009-08-30 16:05:56 +00:00
|
|
|
{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
|
2011-06-01 13:16:25 +00:00
|
|
|
{0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
|
2007-11-04 11:06:48 +00:00
|
|
|
};
|
2014-11-28 11:34:15 +00:00
|
|
|
|
2013-03-03 18:37:40 +00:00
|
|
|
/* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
|
2007-11-04 11:06:48 +00:00
|
|
|
|
2008-09-12 16:31:45 +00:00
|
|
|
int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
|
2008-04-18 00:37:31 +00:00
|
|
|
{
|
2013-03-22 12:54:00 +00:00
|
|
|
struct em28xx_i2c_bus *i2c_bus = ptr;
|
|
|
|
struct em28xx *dev = i2c_bus->dev;
|
2008-04-18 00:40:45 +00:00
|
|
|
int rc = 0;
|
2008-04-18 00:37:31 +00:00
|
|
|
|
2011-11-19 14:37:14 +00:00
|
|
|
if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
|
2008-04-18 00:37:31 +00:00
|
|
|
return 0;
|
|
|
|
|
2011-11-19 14:37:14 +00:00
|
|
|
if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
|
2008-04-18 00:37:31 +00:00
|
|
|
return 0;
|
|
|
|
|
2008-11-27 12:21:55 +00:00
|
|
|
rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
2008-04-18 00:37:31 +00:00
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
|
|
|
|
|
2018-03-01 14:59:28 +00:00
|
|
|
static inline void em28xx_set_xclk_i2c_speed(struct em28xx *dev)
|
2008-04-18 00:37:31 +00:00
|
|
|
{
|
2018-03-01 15:34:34 +00:00
|
|
|
const struct em28xx_board *board = &em28xx_boards[dev->model];
|
2018-03-01 14:59:28 +00:00
|
|
|
u8 xclk = board->xclk, i2c_speed = board->i2c_speed;
|
2008-12-30 01:27:30 +00:00
|
|
|
|
|
|
|
/* Those are the default values for the majority of boards
|
|
|
|
Use those values if not specified otherwise at boards entry
|
|
|
|
*/
|
2018-03-01 14:59:28 +00:00
|
|
|
if (!xclk)
|
|
|
|
xclk = EM28XX_XCLK_IR_RC5_MODE |
|
2008-12-30 01:27:30 +00:00
|
|
|
EM28XX_XCLK_FREQUENCY_12MHZ;
|
|
|
|
|
2018-03-01 14:59:28 +00:00
|
|
|
em28xx_write_reg(dev, EM28XX_R0F_XCLK, xclk);
|
|
|
|
|
|
|
|
|
|
|
|
if (!i2c_speed)
|
|
|
|
i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
|
|
|
|
EM28XX_I2C_FREQ_100_KHZ;
|
|
|
|
|
|
|
|
if (!dev->board.is_em2800)
|
|
|
|
em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, i2c_speed);
|
|
|
|
msleep(50);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void em28xx_set_model(struct em28xx *dev)
|
|
|
|
{
|
|
|
|
dev->board = em28xx_boards[dev->model];
|
2018-03-01 15:08:42 +00:00
|
|
|
dev->has_msp34xx = dev->board.has_msp34xx;
|
|
|
|
dev->is_webcam = dev->board.is_webcam;
|
2018-03-01 14:59:28 +00:00
|
|
|
|
|
|
|
em28xx_set_xclk_i2c_speed(dev);
|
2013-03-05 09:55:27 +00:00
|
|
|
|
2013-03-05 09:55:28 +00:00
|
|
|
/* Should be initialized early, for I2C to work */
|
|
|
|
dev->def_i2c_bus = dev->board.def_i2c_bus;
|
2008-04-18 00:37:31 +00:00
|
|
|
}
|
|
|
|
|
2016-03-04 21:33:08 +00:00
|
|
|
/* Wait until AC97_RESET reports the expected value reliably before proceeding.
|
|
|
|
* We also check that two unrelated registers accesses don't return the same
|
|
|
|
* value to avoid premature return.
|
|
|
|
* This procedure helps ensuring AC97 register accesses are reliable.
|
|
|
|
*/
|
|
|
|
static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,
|
|
|
|
int expected_feat)
|
|
|
|
{
|
|
|
|
unsigned long timeout = jiffies + msecs_to_jiffies(2000);
|
|
|
|
int feat, powerdown;
|
|
|
|
|
|
|
|
while (time_is_after_jiffies(timeout)) {
|
|
|
|
feat = em28xx_read_ac97(dev, AC97_RESET);
|
|
|
|
if (feat < 0)
|
|
|
|
return feat;
|
|
|
|
|
|
|
|
powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);
|
|
|
|
if (powerdown < 0)
|
|
|
|
return powerdown;
|
|
|
|
|
|
|
|
if (feat == expected_feat && feat != powerdown)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
msleep(50);
|
|
|
|
}
|
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_warn(&dev->intf->dev, "AC97 registers access is not reliable !\n");
|
2016-03-04 21:33:08 +00:00
|
|
|
return -ETIMEDOUT;
|
|
|
|
}
|
|
|
|
|
2007-11-04 00:20:59 +00:00
|
|
|
/* Since em28xx_pre_card_setup() requires a proper dev->model,
|
|
|
|
* this won't work for boards with generic PCI IDs
|
|
|
|
*/
|
2012-04-28 12:57:01 +00:00
|
|
|
static void em28xx_pre_card_setup(struct em28xx *dev)
|
2006-01-23 19:11:10 +00:00
|
|
|
{
|
2008-12-30 01:27:30 +00:00
|
|
|
/* Set the initial XCLK and I2C clock values based on the board
|
|
|
|
definition */
|
2018-03-01 14:59:28 +00:00
|
|
|
em28xx_set_xclk_i2c_speed(dev);
|
2008-11-25 10:05:06 +00:00
|
|
|
|
2006-01-23 19:11:10 +00:00
|
|
|
/* request some modules */
|
2007-11-23 17:22:14 +00:00
|
|
|
switch (dev->model) {
|
2008-07-27 17:03:32 +00:00
|
|
|
case EM2861_BOARD_PLEXTOR_PX_TV100U:
|
2009-07-29 04:39:12 +00:00
|
|
|
/* Sets the msp34xx I2S speed */
|
|
|
|
dev->i2s_speed = 2048000;
|
2008-07-27 17:03:32 +00:00
|
|
|
break;
|
|
|
|
case EM2861_BOARD_KWORLD_PVRTV_300U:
|
|
|
|
case EM2880_BOARD_KWORLD_DVB_305U:
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
|
2008-07-27 17:03:32 +00:00
|
|
|
msleep(10);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
|
2008-07-27 17:03:32 +00:00
|
|
|
msleep(10);
|
|
|
|
break;
|
|
|
|
case EM2870_BOARD_COMPRO_VIDEOMATE:
|
|
|
|
/* TODO: someone can do some cleanup here...
|
|
|
|
not everything's needed */
|
2008-11-25 09:04:02 +00:00
|
|
|
em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
|
2008-07-27 17:03:32 +00:00
|
|
|
msleep(10);
|
2008-11-25 09:04:02 +00:00
|
|
|
em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
|
2008-07-27 17:03:32 +00:00
|
|
|
msleep(10);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
|
|
|
break;
|
|
|
|
case EM2870_BOARD_TERRATEC_XS_MT2060:
|
|
|
|
/* this device needs some gpio writes to get the DVB-T
|
|
|
|
demod work */
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
|
|
|
break;
|
|
|
|
case EM2870_BOARD_PINNACLE_PCTV_DVB:
|
|
|
|
/* this device needs some gpio writes to get the
|
|
|
|
DVB-T demod work */
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
|
2008-07-27 17:03:32 +00:00
|
|
|
mdelay(70);
|
|
|
|
break;
|
|
|
|
case EM2820_BOARD_GADMEI_UTV310:
|
|
|
|
case EM2820_BOARD_MSI_VOX_USB_2:
|
2008-11-25 10:05:06 +00:00
|
|
|
/* enables audio for that devices */
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
|
2008-04-18 00:40:45 +00:00
|
|
|
break;
|
2009-02-11 17:13:20 +00:00
|
|
|
|
2009-06-06 20:05:02 +00:00
|
|
|
case EM2882_BOARD_KWORLD_ATSC_315U:
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
|
2009-06-06 20:05:02 +00:00
|
|
|
msleep(10);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
|
2009-06-06 20:05:02 +00:00
|
|
|
msleep(10);
|
|
|
|
em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
|
|
|
|
msleep(10);
|
|
|
|
em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
|
|
|
|
msleep(10);
|
|
|
|
break;
|
|
|
|
|
2009-02-11 17:13:20 +00:00
|
|
|
case EM2860_BOARD_KAIOMY_TVNPC_U2:
|
|
|
|
em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
|
|
|
|
em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
|
|
|
|
em28xx_write_regs(dev, 0x0d, "\x42", 1);
|
|
|
|
em28xx_write_regs(dev, 0x08, "\xfd", 1);
|
|
|
|
msleep(10);
|
|
|
|
em28xx_write_regs(dev, 0x08, "\xff", 1);
|
|
|
|
msleep(10);
|
|
|
|
em28xx_write_regs(dev, 0x08, "\x7f", 1);
|
|
|
|
msleep(10);
|
|
|
|
em28xx_write_regs(dev, 0x08, "\x6b", 1);
|
|
|
|
|
|
|
|
break;
|
2009-02-11 17:18:36 +00:00
|
|
|
case EM2860_BOARD_EASYCAP:
|
|
|
|
em28xx_write_regs(dev, 0x08, "\xf8", 1);
|
|
|
|
break;
|
|
|
|
|
2009-02-11 14:13:05 +00:00
|
|
|
case EM2820_BOARD_IODATA_GVMVP_SZ:
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
|
2009-02-11 14:13:05 +00:00
|
|
|
msleep(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
|
2009-02-11 14:13:05 +00:00
|
|
|
msleep(10);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
|
2009-02-11 14:13:05 +00:00
|
|
|
msleep(70);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
|
2009-02-11 14:13:05 +00:00
|
|
|
msleep(70);
|
|
|
|
break;
|
2016-03-04 21:33:08 +00:00
|
|
|
|
|
|
|
case EM2860_BOARD_TERRATEC_GRABBY:
|
|
|
|
/* HACK?: Ensure AC97 register reading is reliable before
|
|
|
|
* proceeding. In practice, this will wait about 1.6 seconds.
|
|
|
|
*/
|
|
|
|
em28xx_wait_until_ac97_features_equals(dev, 0x6a90);
|
|
|
|
break;
|
2008-04-18 00:40:45 +00:00
|
|
|
}
|
2008-04-18 00:48:00 +00:00
|
|
|
|
2008-11-27 12:21:55 +00:00
|
|
|
em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
2008-04-18 00:48:00 +00:00
|
|
|
em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
|
|
|
|
|
|
|
|
/* Unlock device */
|
2008-11-27 12:10:40 +00:00
|
|
|
em28xx_set_mode(dev, EM28XX_SUSPEND);
|
2006-01-23 19:11:10 +00:00
|
|
|
}
|
|
|
|
|
2007-11-04 00:20:59 +00:00
|
|
|
static int em28xx_hint_board(struct em28xx *dev)
|
|
|
|
{
|
|
|
|
int i;
|
2007-10-29 14:33:18 +00:00
|
|
|
|
2018-03-01 15:08:42 +00:00
|
|
|
if (dev->is_webcam) {
|
2013-03-27 20:06:28 +00:00
|
|
|
if (dev->em28xx_sensor == EM28XX_MT9V011) {
|
|
|
|
dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
|
|
|
|
} else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
|
|
|
|
dev->em28xx_sensor == EM28XX_MT9M111) {
|
|
|
|
dev->model = EM2750_BOARD_UNKNOWN;
|
|
|
|
}
|
|
|
|
/* FIXME: IMPROVE ! */
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-11-04 11:32:42 +00:00
|
|
|
/* HINT method: EEPROM
|
|
|
|
*
|
|
|
|
* This method works only for boards with eeprom.
|
|
|
|
* Uses a hash of all eeprom bytes. The hash should be
|
|
|
|
* unique for a vendor/tuner pair.
|
|
|
|
* There are a high chance that tuners for different
|
|
|
|
* video standards produce different hashes.
|
|
|
|
*/
|
|
|
|
for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
|
|
|
|
if (dev->hash == em28xx_eeprom_hash[i].hash) {
|
|
|
|
dev->model = em28xx_eeprom_hash[i].model;
|
|
|
|
dev->tuner_type = em28xx_eeprom_hash[i].tuner;
|
2007-10-29 14:33:18 +00:00
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Your board has no unique USB ID.\n"
|
|
|
|
"A hint were successfully done, based on eeprom hash.\n"
|
|
|
|
"This method is not 100%% failproof.\n"
|
2017-05-22 08:13:25 +00:00
|
|
|
"If the board were misdetected, please email this log to:\n"
|
2016-10-20 10:42:03 +00:00
|
|
|
"\tV4L Mailing List <linux-media@vger.kernel.org>\n"
|
|
|
|
"Board detected as %s\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
em28xx_boards[dev->model].name);
|
2007-10-29 14:33:18 +00:00
|
|
|
|
2007-11-04 00:20:59 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
2007-11-04 11:06:48 +00:00
|
|
|
|
2007-11-04 11:32:42 +00:00
|
|
|
/* HINT method: I2C attached devices
|
|
|
|
*
|
|
|
|
* This method works for all boards.
|
|
|
|
* Uses a hash of i2c scanned devices.
|
|
|
|
* Devices with the same i2c attached chips will
|
|
|
|
* be considered equal.
|
|
|
|
* This method is less precise than the eeprom one.
|
|
|
|
*/
|
|
|
|
|
2007-11-04 11:06:48 +00:00
|
|
|
/* user did not request i2c scanning => do it now */
|
|
|
|
if (!dev->i2c_hash)
|
2013-03-05 09:55:28 +00:00
|
|
|
em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
|
2007-11-04 11:06:48 +00:00
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
|
|
|
|
if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
|
|
|
|
dev->model = em28xx_i2c_hash[i].model;
|
|
|
|
dev->tuner_type = em28xx_i2c_hash[i].tuner;
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Your board has no unique USB ID.\n"
|
|
|
|
"A hint were successfully done, based on i2c devicelist hash.\n"
|
|
|
|
"This method is not 100%% failproof.\n"
|
2017-05-22 08:13:25 +00:00
|
|
|
"If the board were misdetected, please email this log to:\n"
|
2016-10-20 10:42:03 +00:00
|
|
|
"\tV4L Mailing List <linux-media@vger.kernel.org>\n"
|
|
|
|
"Board detected as %s\n",
|
|
|
|
em28xx_boards[dev->model].name);
|
2007-11-04 11:06:48 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Your board has no unique USB ID and thus need a hint to be detected.\n"
|
|
|
|
"You may try to use card=<n> insmod option to workaround that.\n"
|
|
|
|
"Please send an email with this log to:\n"
|
|
|
|
"\tV4L Mailing List <linux-media@vger.kernel.org>\n"
|
|
|
|
"Board eeprom hash is 0x%08lx\n"
|
|
|
|
"Board i2c devicelist hash is 0x%08lx\n",
|
|
|
|
dev->hash, dev->i2c_hash);
|
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Here is a list of valid choices for the card=<n> insmod option:\n");
|
2007-11-04 00:20:59 +00:00
|
|
|
for (i = 0; i < em28xx_bcount; i++) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
" card=%d -> %s\n", i, em28xx_boards[i].name);
|
2007-11-04 00:20:59 +00:00
|
|
|
}
|
|
|
|
return -1;
|
2007-10-29 14:33:18 +00:00
|
|
|
}
|
|
|
|
|
2012-04-28 12:57:01 +00:00
|
|
|
static void em28xx_card_setup(struct em28xx *dev)
|
2005-11-09 05:37:07 +00:00
|
|
|
{
|
V4L/DVB (12411): em28xx: Fix artifacts with Silvercrest webcam
Silvercrest mt9v011 sensor produces a 640x480 image. However,
previously, the code were getting only half of the lines and merging two
consecutive frames to "produce" a 640x480 image.
With the addition of progressive mode, now em28xx is working with a full
image. However, when the number of lines is bigger than 240, the
beginning of some odd lines are filled with blank.
After lots of testing, and physically checking the device for a Xtal, it
was noticed experimentally that mt9v011 is using em28xx XCLK as its
clock. Due to that, changing XCLK value changes the maximum speed of the
stream.
At the tests, it were possible to produce up to 32 fps, using a 30 MHz
XCLK. However, at that rate, the artifacts happen even at 320x240. Lower
values of XCLK produces artifacts only at 640x480.
At some values of xclk (for example XCLKK = 6 MHz, 640x480), it is
possible to see an invalid sucession of artifacts with this pattern:
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(where the dots represent the blanked pixels)
So, it seems that a waveform in the format of a ramp is interferring at
the image.
The cause of this interference is currently unknown. Some possibilities
are:
- electrical interference (maybe this device is broken?);
- some issue at mt9v011 programming;
- some bug at em28xx chip.
So, for now, let's be conservative and use a value of XCLK that we know
for sure that it won't cause artifacts.
As I'm waiting for more of such devices with different em28xx chipset
revisions, I'll have the opportunity to double check the issue with
other pieces of hardware.
Later patches can vary XCLK depending on the vertical resolutions, if a
proper fix is not discovered.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2009-08-10 13:29:27 +00:00
|
|
|
/*
|
|
|
|
* If the device can be a webcam, seek for a sensor.
|
|
|
|
* If sensor is not found, then it isn't a webcam.
|
|
|
|
*/
|
2018-03-01 15:08:42 +00:00
|
|
|
if (dev->is_webcam) {
|
2017-04-15 10:05:02 +00:00
|
|
|
em28xx_detect_sensor(dev);
|
|
|
|
if (dev->em28xx_sensor == EM28XX_NOSENSOR)
|
|
|
|
/* NOTE: error/unknown sensor/no sensor */
|
2018-03-01 15:08:42 +00:00
|
|
|
dev->is_webcam = 0;
|
2010-09-10 20:29:14 +00:00
|
|
|
}
|
|
|
|
|
2013-03-27 20:06:28 +00:00
|
|
|
switch (dev->model) {
|
|
|
|
case EM2750_BOARD_UNKNOWN:
|
|
|
|
case EM2820_BOARD_UNKNOWN:
|
|
|
|
case EM2800_BOARD_UNKNOWN:
|
2010-09-10 20:29:14 +00:00
|
|
|
/*
|
|
|
|
* 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)
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev, "Board not discovered\n");
|
2010-09-10 20:29:14 +00:00
|
|
|
else {
|
|
|
|
em28xx_set_model(dev);
|
|
|
|
em28xx_pre_card_setup(dev);
|
|
|
|
}
|
|
|
|
break;
|
2013-03-27 20:06:28 +00:00
|
|
|
default:
|
|
|
|
em28xx_set_model(dev);
|
2010-09-10 20:29:14 +00:00
|
|
|
}
|
V4L/DVB (12411): em28xx: Fix artifacts with Silvercrest webcam
Silvercrest mt9v011 sensor produces a 640x480 image. However,
previously, the code were getting only half of the lines and merging two
consecutive frames to "produce" a 640x480 image.
With the addition of progressive mode, now em28xx is working with a full
image. However, when the number of lines is bigger than 240, the
beginning of some odd lines are filled with blank.
After lots of testing, and physically checking the device for a Xtal, it
was noticed experimentally that mt9v011 is using em28xx XCLK as its
clock. Due to that, changing XCLK value changes the maximum speed of the
stream.
At the tests, it were possible to produce up to 32 fps, using a 30 MHz
XCLK. However, at that rate, the artifacts happen even at 320x240. Lower
values of XCLK produces artifacts only at 640x480.
At some values of xclk (for example XCLKK = 6 MHz, 640x480), it is
possible to see an invalid sucession of artifacts with this pattern:
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
..xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
...xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
....xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(where the dots represent the blanked pixels)
So, it seems that a waveform in the format of a ramp is interferring at
the image.
The cause of this interference is currently unknown. Some possibilities
are:
- electrical interference (maybe this device is broken?);
- some issue at mt9v011 programming;
- some bug at em28xx chip.
So, for now, let's be conservative and use a value of XCLK that we know
for sure that it won't cause artifacts.
As I'm waiting for more of such devices with different em28xx chipset
revisions, I'll have the opportunity to double check the issue with
other pieces of hardware.
Later patches can vary XCLK depending on the vertical resolutions, if a
proper fix is not discovered.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2009-08-10 13:29:27 +00:00
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_info(&dev->intf->dev, "Identified as %s (card=%d)\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
dev->board.name, dev->model);
|
2007-11-05 11:42:55 +00:00
|
|
|
|
|
|
|
dev->tuner_type = em28xx_boards[dev->model].tuner_type;
|
|
|
|
|
2005-11-09 05:37:07 +00:00
|
|
|
/* request some modules */
|
2007-11-04 00:20:59 +00:00
|
|
|
switch (dev->model) {
|
|
|
|
case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
|
2007-11-05 12:30:39 +00:00
|
|
|
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
|
2008-06-08 13:22:03 +00:00
|
|
|
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
|
2008-12-02 00:01:04 +00:00
|
|
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
|
2008-07-27 17:58:58 +00:00
|
|
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
2013-03-03 18:37:44 +00:00
|
|
|
case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
|
2016-04-04 15:12:52 +00:00
|
|
|
case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:
|
2017-01-10 03:14:29 +00:00
|
|
|
case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595:
|
2007-11-04 00:20:59 +00:00
|
|
|
{
|
|
|
|
struct tveeprom tv;
|
2013-03-03 18:37:42 +00:00
|
|
|
|
|
|
|
if (dev->eedata == NULL)
|
|
|
|
break;
|
2009-09-08 17:04:41 +00:00
|
|
|
#if defined(CONFIG_MODULES) && defined(MODULE)
|
2007-11-04 00:20:59 +00:00
|
|
|
request_module("tveeprom");
|
2005-11-09 05:37:07 +00:00
|
|
|
#endif
|
2007-11-04 00:20:59 +00:00
|
|
|
/* Call first TVeeprom */
|
|
|
|
|
2017-03-03 10:28:29 +00:00
|
|
|
tveeprom_hauppauge_analog(&tv, dev->eedata);
|
2006-02-07 08:25:39 +00:00
|
|
|
|
2007-11-04 00:20:59 +00:00
|
|
|
dev->tuner_type = tv.tuner_type;
|
V4L/DVB (7060): em28xx: remove has_tuner
has_tuner flag doesn't make much sense, since tuner_type=TUNER_ABSENT
means the same thing.
Having two ways to say that a tuner is not present is
not nice, since it may lead to bad setups. In fact, with the previous
code, if a device were using has_tuner=0, but the user forces a tuner,
with modprobe option tuner=type, the modprobe option won't work.
Also, tveeprom returns TUNER_ABSENT, when tuner is unknown or absent.
So, with the previous logic, in this case, the driver should set
has_tuner=0, or has_tuner=1 otherwise.
Instead of adding several additional tests and setups, better just to
remove .has_tuner.
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
2008-01-24 09:59:20 +00:00
|
|
|
|
2013-05-29 09:59:45 +00:00
|
|
|
if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
|
2007-11-04 00:20:59 +00:00
|
|
|
dev->i2s_speed = 2048000;
|
2018-03-01 15:08:42 +00:00
|
|
|
dev->has_msp34xx = 1;
|
2007-11-04 00:20:59 +00:00
|
|
|
}
|
|
|
|
break;
|
2005-11-09 05:37:07 +00:00
|
|
|
}
|
2009-06-06 20:05:02 +00:00
|
|
|
case EM2882_BOARD_KWORLD_ATSC_315U:
|
|
|
|
em28xx_write_reg(dev, 0x0d, 0x42);
|
|
|
|
msleep(10);
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
|
2009-06-06 20:05:02 +00:00
|
|
|
msleep(10);
|
|
|
|
break;
|
2007-11-04 00:20:59 +00:00
|
|
|
case EM2820_BOARD_KWORLD_PVRTV2800RF:
|
|
|
|
/* GPIO enables sound on KWORLD PVR TV 2800RF */
|
2013-06-03 17:12:03 +00:00
|
|
|
em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
|
2007-11-04 00:20:59 +00:00
|
|
|
break;
|
|
|
|
case EM2820_BOARD_UNKNOWN:
|
|
|
|
case EM2800_BOARD_UNKNOWN:
|
2008-09-30 05:46:41 +00:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
case EM2880_BOARD_MSI_DIGIVOX_AD:
|
2007-11-05 11:42:55 +00:00
|
|
|
if (!em28xx_hint_board(dev))
|
|
|
|
em28xx_set_model(dev);
|
2009-06-19 03:20:28 +00:00
|
|
|
|
|
|
|
/* In cases where we had to use a board hint, the call to
|
2010-02-09 20:53:38 +00:00
|
|
|
em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
|
|
|
|
so make the call now so the analog GPIOs are set properly
|
|
|
|
before probing the i2c bus. */
|
|
|
|
em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
|
|
|
em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
|
|
|
|
break;
|
|
|
|
|
2013-03-03 18:37:42 +00:00
|
|
|
/*
|
2010-02-09 20:53:38 +00:00
|
|
|
* The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
|
|
|
|
*
|
|
|
|
* This occurs because they share identical USB vendor and
|
|
|
|
* product IDs.
|
|
|
|
*
|
|
|
|
* What we do here is look up the EEPROM hash of the Dikom
|
|
|
|
* and if it is found then we decide that we do not have
|
|
|
|
* a Kworld and reset the device to the Dikom instead.
|
|
|
|
*
|
|
|
|
* This solution is only valid if they do not share eeprom
|
|
|
|
* hash identities which has not been determined as yet.
|
|
|
|
*/
|
|
|
|
case EM2882_BOARD_KWORLD_VS_DVBT:
|
|
|
|
if (!em28xx_hint_board(dev))
|
|
|
|
em28xx_set_model(dev);
|
|
|
|
|
|
|
|
/* In cases where we had to use a board hint, the call to
|
2009-06-19 03:20:28 +00:00
|
|
|
em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
|
|
|
|
so make the call now so the analog GPIOs are set properly
|
|
|
|
before probing the i2c bus. */
|
2009-07-15 03:35:47 +00:00
|
|
|
em28xx_gpio_set(dev, dev->board.tuner_gpio);
|
2009-06-19 03:20:28 +00:00
|
|
|
em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
|
2008-07-27 17:03:32 +00:00
|
|
|
break;
|
2007-11-04 00:20:59 +00:00
|
|
|
}
|
|
|
|
|
2008-11-25 12:39:50 +00:00
|
|
|
if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"\n\n"
|
|
|
|
"The support for this board weren't valid yet.\n"
|
|
|
|
"Please send a report of having this working\n"
|
|
|
|
"not to V4L mailing list (and/or to other addresses)\n\n");
|
2008-07-27 17:03:32 +00:00
|
|
|
}
|
|
|
|
|
2013-03-03 18:37:42 +00:00
|
|
|
/* Free eeprom data memory */
|
|
|
|
kfree(dev->eedata);
|
|
|
|
dev->eedata = NULL;
|
|
|
|
|
2007-11-05 11:42:55 +00:00
|
|
|
/* Allow override tuner type by a module parameter */
|
2007-11-04 00:20:59 +00:00
|
|
|
if (tuner >= 0)
|
|
|
|
dev->tuner_type = tuner;
|
2005-11-09 05:37:07 +00:00
|
|
|
}
|
2008-11-25 16:10:14 +00:00
|
|
|
|
2014-01-12 14:08:22 +00:00
|
|
|
void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
|
|
|
|
{
|
|
|
|
memset(ctl, 0, sizeof(*ctl));
|
|
|
|
|
|
|
|
ctl->fname = XC2028_DEFAULT_FIRMWARE;
|
|
|
|
ctl->max_len = 64;
|
|
|
|
ctl->mts = em28xx_boards[dev->model].mts_firmware;
|
|
|
|
|
|
|
|
switch (dev->model) {
|
|
|
|
case EM2880_BOARD_EMPIRE_DUAL_TV:
|
|
|
|
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
|
|
|
|
case EM2882_BOARD_TERRATEC_HYBRID_XS:
|
|
|
|
ctl->demod = XC3028_FE_ZARLINK456;
|
|
|
|
break;
|
|
|
|
case EM2880_BOARD_TERRATEC_HYBRID_XS:
|
|
|
|
case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
|
|
|
|
case EM2881_BOARD_PINNACLE_HYBRID_PRO:
|
|
|
|
ctl->demod = XC3028_FE_ZARLINK456;
|
|
|
|
break;
|
|
|
|
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
|
|
|
|
case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
|
|
|
|
ctl->demod = XC3028_FE_DEFAULT;
|
|
|
|
break;
|
|
|
|
case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
|
|
|
|
ctl->demod = XC3028_FE_DEFAULT;
|
|
|
|
ctl->fname = XC3028L_DEFAULT_FIRMWARE;
|
|
|
|
break;
|
|
|
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
|
|
|
|
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
|
|
|
|
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
|
|
|
|
/* FIXME: Better to specify the needed IF */
|
|
|
|
ctl->demod = XC3028_FE_DEFAULT;
|
|
|
|
break;
|
|
|
|
case EM2883_BOARD_KWORLD_HYBRID_330U:
|
|
|
|
case EM2882_BOARD_DIKOM_DK300:
|
|
|
|
case EM2882_BOARD_KWORLD_VS_DVBT:
|
|
|
|
ctl->demod = XC3028_FE_CHINA;
|
|
|
|
ctl->fname = XC2028_DEFAULT_FIRMWARE;
|
|
|
|
break;
|
|
|
|
case EM2882_BOARD_EVGA_INDTUBE:
|
|
|
|
ctl->demod = XC3028_FE_CHINA;
|
|
|
|
ctl->fname = XC3028L_DEFAULT_FIRMWARE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
ctl->demod = XC3028_FE_OREN538;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
static void request_module_async(struct work_struct *work)
|
|
|
|
{
|
|
|
|
struct em28xx *dev = container_of(work,
|
|
|
|
struct em28xx, request_module_wk);
|
|
|
|
|
2012-10-02 18:35:27 +00:00
|
|
|
/*
|
|
|
|
* The em28xx extensions can be modules or builtin. If the
|
|
|
|
* modules are already loaded or are built in, those extensions
|
|
|
|
* can be initialised right now. Otherwise, the module init
|
|
|
|
* code will do it.
|
|
|
|
*/
|
2014-01-06 08:50:07 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Devicdes with an audio-only interface also have a V4L/DVB/RC
|
|
|
|
* interface. Don't register extensions twice on those devices.
|
|
|
|
*/
|
|
|
|
if (dev->is_audio_only) {
|
|
|
|
#if defined(CONFIG_MODULES) && defined(MODULE)
|
|
|
|
request_module("em28xx-alsa");
|
|
|
|
#endif
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-10-02 18:35:27 +00:00
|
|
|
em28xx_init_extension(dev);
|
|
|
|
|
|
|
|
#if defined(CONFIG_MODULES) && defined(MODULE)
|
2013-12-22 16:27:02 +00:00
|
|
|
if (dev->has_video)
|
|
|
|
request_module("em28xx-v4l");
|
2014-09-13 08:52:20 +00:00
|
|
|
if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
|
2008-12-29 01:18:14 +00:00
|
|
|
request_module("snd-usb-audio");
|
2014-09-13 08:52:20 +00:00
|
|
|
else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
|
2008-12-29 01:18:14 +00:00
|
|
|
request_module("em28xx-alsa");
|
|
|
|
if (dev->board.has_dvb)
|
|
|
|
request_module("em28xx-dvb");
|
2013-12-01 21:06:52 +00:00
|
|
|
if (dev->board.buttons ||
|
2013-04-11 18:56:01 +00:00
|
|
|
((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
|
2012-03-26 12:13:35 +00:00
|
|
|
request_module("em28xx-rc");
|
2012-10-02 18:35:27 +00:00
|
|
|
#endif /* CONFIG_MODULES */
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void request_modules(struct em28xx *dev)
|
|
|
|
{
|
|
|
|
INIT_WORK(&dev->request_module_wk, request_module_async);
|
|
|
|
schedule_work(&dev->request_module_wk);
|
|
|
|
}
|
2010-12-24 15:14:20 +00:00
|
|
|
|
|
|
|
static void flush_request_modules(struct em28xx *dev)
|
|
|
|
{
|
2012-08-20 21:51:24 +00:00
|
|
|
flush_work(&dev->request_module_wk);
|
2010-12-24 15:14:20 +00:00
|
|
|
}
|
2008-12-29 01:18:14 +00:00
|
|
|
|
2016-01-27 09:07:24 +00:00
|
|
|
static int em28xx_media_device_init(struct em28xx *dev,
|
|
|
|
struct usb_device *udev)
|
|
|
|
{
|
|
|
|
#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
|
struct media_device *mdev;
|
|
|
|
|
2016-02-22 15:10:49 +00:00
|
|
|
mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
|
2016-01-27 09:07:24 +00:00
|
|
|
if (!mdev)
|
|
|
|
return -ENOMEM;
|
|
|
|
|
2016-02-22 15:10:49 +00:00
|
|
|
if (udev->product)
|
|
|
|
media_device_usb_init(mdev, udev, udev->product);
|
|
|
|
else if (udev->manufacturer)
|
|
|
|
media_device_usb_init(mdev, udev, udev->manufacturer);
|
|
|
|
else
|
2016-12-07 15:48:10 +00:00
|
|
|
media_device_usb_init(mdev, udev, dev_name(&dev->intf->dev));
|
2016-02-22 15:10:49 +00:00
|
|
|
|
2016-01-27 09:07:24 +00:00
|
|
|
dev->media_dev = mdev;
|
|
|
|
#endif
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void em28xx_unregister_media_device(struct em28xx *dev)
|
|
|
|
{
|
|
|
|
|
|
|
|
#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
|
if (dev->media_dev) {
|
|
|
|
media_device_unregister(dev->media_dev);
|
|
|
|
media_device_cleanup(dev->media_dev);
|
|
|
|
kfree(dev->media_dev);
|
|
|
|
dev->media_dev = NULL;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
/*
|
2011-09-24 14:02:32 +00:00
|
|
|
* em28xx_release_resources()
|
2008-12-29 01:18:14 +00:00
|
|
|
* unregisters the v4l2,i2c and usb devices
|
2011-09-24 14:02:32 +00:00
|
|
|
* called when the device gets disconnected or at module unload
|
2008-12-29 01:18:14 +00:00
|
|
|
*/
|
2014-03-05 14:21:07 +00:00
|
|
|
static void em28xx_release_resources(struct em28xx *dev)
|
2008-12-29 01:18:14 +00:00
|
|
|
{
|
2016-12-07 16:34:22 +00:00
|
|
|
struct usb_device *udev = interface_to_usbdev(dev->intf);
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
/*FIXME: I2C IR should be disconnected */
|
|
|
|
|
2014-01-12 16:24:24 +00:00
|
|
|
mutex_lock(&dev->lock);
|
|
|
|
|
2016-01-27 09:07:24 +00:00
|
|
|
em28xx_unregister_media_device(dev);
|
|
|
|
|
2013-03-05 09:55:28 +00:00
|
|
|
if (dev->def_i2c_bus)
|
|
|
|
em28xx_i2c_unregister(dev, 1);
|
|
|
|
em28xx_i2c_unregister(dev, 0);
|
2009-03-31 20:10:58 +00:00
|
|
|
|
2018-01-05 00:04:11 +00:00
|
|
|
if (dev->ts == PRIMARY_TS)
|
|
|
|
usb_put_dev(udev);
|
2008-12-29 01:18:14 +00:00
|
|
|
|
|
|
|
/* Mark device as unused */
|
2014-01-14 20:35:15 +00:00
|
|
|
clear_bit(dev->devno, em28xx_devused);
|
2014-01-12 16:24:24 +00:00
|
|
|
|
|
|
|
mutex_unlock(&dev->lock);
|
2008-12-29 01:18:14 +00:00
|
|
|
};
|
2014-03-05 14:21:07 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* em28xx_free_device() - Free em28xx device
|
|
|
|
*
|
|
|
|
* @ref: struct kref for em28xx device
|
|
|
|
*
|
|
|
|
* This is called when all extensions and em28xx core unregisters a device
|
|
|
|
*/
|
|
|
|
void em28xx_free_device(struct kref *ref)
|
|
|
|
{
|
|
|
|
struct em28xx *dev = kref_to_dev(ref);
|
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_info(&dev->intf->dev, "Freeing device\n");
|
2014-03-05 14:21:07 +00:00
|
|
|
|
|
|
|
if (!dev->disconnected)
|
|
|
|
em28xx_release_resources(dev);
|
|
|
|
|
|
|
|
kfree(dev->alt_max_pkt_size_isoc);
|
|
|
|
kfree(dev);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(em28xx_free_device);
|
2008-12-29 01:18:14 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* em28xx_init_dev()
|
|
|
|
* allocates and inits the device structs, registers i2c bus and v4l device
|
|
|
|
*/
|
2012-01-07 13:18:45 +00:00
|
|
|
static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
|
2009-04-05 11:02:15 +00:00
|
|
|
struct usb_interface *interface,
|
2008-12-29 01:18:14 +00:00
|
|
|
int minor)
|
|
|
|
{
|
2009-08-10 05:57:57 +00:00
|
|
|
int retval;
|
2016-12-07 16:53:26 +00:00
|
|
|
const char *chip_name = NULL;
|
2008-12-29 01:18:14 +00:00
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev->intf = interface;
|
2008-12-29 01:18:14 +00:00
|
|
|
mutex_init(&dev->ctrl_urb_lock);
|
|
|
|
spin_lock_init(&dev->slock);
|
|
|
|
|
|
|
|
dev->em28xx_write_regs = em28xx_write_regs;
|
|
|
|
dev->em28xx_read_reg = em28xx_read_reg;
|
|
|
|
dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
|
|
|
|
dev->em28xx_write_regs_req = em28xx_write_regs_req;
|
|
|
|
dev->em28xx_read_reg_req = em28xx_read_reg_req;
|
|
|
|
dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
|
|
|
|
|
2009-08-10 05:57:57 +00:00
|
|
|
em28xx_set_model(dev);
|
|
|
|
|
|
|
|
dev->wait_after_write = 5;
|
|
|
|
|
|
|
|
/* Based on the Chip ID, set the device configuration */
|
|
|
|
retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
|
|
|
|
if (retval > 0) {
|
|
|
|
dev->chip_id = retval;
|
|
|
|
|
|
|
|
switch (dev->chip_id) {
|
2009-11-12 14:21:05 +00:00
|
|
|
case CHIP_ID_EM2800:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2800";
|
2009-11-12 14:21:05 +00:00
|
|
|
break;
|
2009-08-10 05:57:57 +00:00
|
|
|
case CHIP_ID_EM2710:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2710";
|
2009-08-10 05:57:57 +00:00
|
|
|
break;
|
|
|
|
case CHIP_ID_EM2750:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2750";
|
2009-08-10 05:57:57 +00:00
|
|
|
break;
|
2013-03-26 16:38:37 +00:00
|
|
|
case CHIP_ID_EM2765:
|
|
|
|
chip_name = "em2765";
|
|
|
|
dev->wait_after_write = 0;
|
|
|
|
dev->is_em25xx = 1;
|
|
|
|
dev->eeprom_addrwidth_16bit = 1;
|
|
|
|
break;
|
2009-08-10 05:57:57 +00:00
|
|
|
case CHIP_ID_EM2820:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2710/2820";
|
2016-12-07 16:34:22 +00:00
|
|
|
if (le16_to_cpu(udev->descriptor.idVendor) == 0xeb1a) {
|
|
|
|
__le16 idProd = udev->descriptor.idProduct;
|
2014-11-28 11:34:15 +00:00
|
|
|
|
2013-04-11 18:56:47 +00:00
|
|
|
if (le16_to_cpu(idProd) == 0x2710)
|
|
|
|
chip_name = "em2710";
|
|
|
|
else if (le16_to_cpu(idProd) == 0x2820)
|
|
|
|
chip_name = "em2820";
|
|
|
|
}
|
|
|
|
/* NOTE: the em2820 is used in webcams, too ! */
|
2009-08-10 05:57:57 +00:00
|
|
|
break;
|
|
|
|
case CHIP_ID_EM2840:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2840";
|
2009-08-10 05:57:57 +00:00
|
|
|
break;
|
|
|
|
case CHIP_ID_EM2860:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2860";
|
2009-08-10 05:57:57 +00:00
|
|
|
break;
|
|
|
|
case CHIP_ID_EM2870:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2870";
|
2009-08-10 05:57:57 +00:00
|
|
|
dev->wait_after_write = 0;
|
|
|
|
break;
|
|
|
|
case CHIP_ID_EM2874:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2874";
|
2009-08-10 05:57:57 +00:00
|
|
|
dev->wait_after_write = 0;
|
2013-03-03 18:37:40 +00:00
|
|
|
dev->eeprom_addrwidth_16bit = 1;
|
2009-08-10 05:57:57 +00:00
|
|
|
break;
|
2011-04-07 19:04:48 +00:00
|
|
|
case CHIP_ID_EM28174:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em28174";
|
2011-04-07 19:04:48 +00:00
|
|
|
dev->wait_after_write = 0;
|
2013-03-03 18:37:40 +00:00
|
|
|
dev->eeprom_addrwidth_16bit = 1;
|
2011-04-07 19:04:48 +00:00
|
|
|
break;
|
2013-02-25 11:19:04 +00:00
|
|
|
case CHIP_ID_EM28178:
|
|
|
|
chip_name = "em28178";
|
|
|
|
dev->wait_after_write = 0;
|
|
|
|
dev->eeprom_addrwidth_16bit = 1;
|
|
|
|
break;
|
2009-08-10 05:57:57 +00:00
|
|
|
case CHIP_ID_EM2883:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2882/3";
|
2009-08-10 05:57:57 +00:00
|
|
|
dev->wait_after_write = 0;
|
|
|
|
break;
|
2011-07-04 00:05:06 +00:00
|
|
|
case CHIP_ID_EM2884:
|
2012-12-23 18:32:03 +00:00
|
|
|
chip_name = "em2884";
|
2011-07-04 00:05:06 +00:00
|
|
|
dev->wait_after_write = 0;
|
2013-03-03 18:37:40 +00:00
|
|
|
dev->eeprom_addrwidth_16bit = 1;
|
2011-07-04 00:05:06 +00:00
|
|
|
break;
|
2009-08-10 05:57:57 +00:00
|
|
|
}
|
|
|
|
}
|
2016-12-07 16:53:26 +00:00
|
|
|
if (!chip_name)
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_info(&dev->intf->dev,
|
2016-12-07 16:53:26 +00:00
|
|
|
"unknown em28xx chip ID (%d)\n", dev->chip_id);
|
2016-10-20 10:42:03 +00:00
|
|
|
else
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_info(&dev->intf->dev, "chip ID is %s\n", chip_name);
|
2012-12-23 18:32:03 +00:00
|
|
|
|
2016-01-27 09:07:24 +00:00
|
|
|
em28xx_media_device_init(dev, udev);
|
|
|
|
|
2011-06-17 18:15:12 +00:00
|
|
|
if (dev->is_audio_only) {
|
2011-08-20 11:28:17 +00:00
|
|
|
retval = em28xx_audio_setup(dev);
|
|
|
|
if (retval)
|
2011-06-17 18:15:12 +00:00
|
|
|
return -ENODEV;
|
|
|
|
em28xx_init_extension(dev);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
em28xx_pre_card_setup(dev);
|
|
|
|
|
2013-03-05 09:55:28 +00:00
|
|
|
rt_mutex_init(&dev->i2c_bus_lock);
|
|
|
|
|
|
|
|
/* register i2c bus 0 */
|
2013-03-26 16:38:36 +00:00
|
|
|
if (dev->board.is_em2800)
|
|
|
|
retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
|
|
|
|
else
|
|
|
|
retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
|
2011-08-20 11:28:17 +00:00
|
|
|
if (retval < 0) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"%s: em28xx_i2c_register bus 0 - error [%d]!\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
__func__, retval);
|
2013-12-22 16:16:49 +00:00
|
|
|
return retval;
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
2013-03-26 16:38:36 +00:00
|
|
|
/* register i2c bus 1 */
|
2013-03-05 09:55:28 +00:00
|
|
|
if (dev->def_i2c_bus) {
|
2013-03-26 16:38:37 +00:00
|
|
|
if (dev->is_em25xx)
|
|
|
|
retval = em28xx_i2c_register(dev, 1,
|
2014-11-28 11:34:15 +00:00
|
|
|
EM28XX_I2C_ALGO_EM25XX_BUS_B);
|
2013-03-26 16:38:37 +00:00
|
|
|
else
|
|
|
|
retval = em28xx_i2c_register(dev, 1,
|
2014-11-28 11:34:15 +00:00
|
|
|
EM28XX_I2C_ALGO_EM28XX);
|
2013-03-05 09:55:28 +00:00
|
|
|
if (retval < 0) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&dev->intf->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"%s: em28xx_i2c_register bus 1 - error [%d]!\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
__func__, retval);
|
2014-01-05 11:43:40 +00:00
|
|
|
|
|
|
|
em28xx_i2c_unregister(dev, 0);
|
|
|
|
|
2013-12-22 16:16:49 +00:00
|
|
|
return retval;
|
2013-03-05 09:55:28 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
/* Do board specific init and eeprom reading */
|
|
|
|
em28xx_card_setup(dev);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-03-06 09:30:22 +00:00
|
|
|
static int em28xx_duplicate_dev(struct em28xx *dev)
|
2018-01-05 00:04:11 +00:00
|
|
|
{
|
|
|
|
int nr;
|
|
|
|
struct em28xx *sec_dev = kzalloc(sizeof(*sec_dev), GFP_KERNEL);
|
|
|
|
|
|
|
|
if (sec_dev == NULL) {
|
|
|
|
dev->dev_next = NULL;
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
memcpy(sec_dev, dev, sizeof(sizeof(*sec_dev)));
|
|
|
|
/* Check to see next free device and mark as used */
|
|
|
|
do {
|
|
|
|
nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
|
|
|
|
if (nr >= EM28XX_MAXBOARDS) {
|
|
|
|
/* No free device slots */
|
|
|
|
dev_warn(&dev->intf->dev, ": Supports only %i em28xx boards.\n",
|
|
|
|
EM28XX_MAXBOARDS);
|
|
|
|
kfree(sec_dev);
|
|
|
|
dev->dev_next = NULL;
|
|
|
|
return -ENOMEM;
|
|
|
|
}
|
|
|
|
} while (test_and_set_bit(nr, em28xx_devused));
|
|
|
|
sec_dev->devno = nr;
|
|
|
|
snprintf(sec_dev->name, 28, "em28xx #%d", nr);
|
|
|
|
sec_dev->dev_next = NULL;
|
|
|
|
dev->dev_next = sec_dev;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2011-06-17 18:15:12 +00:00
|
|
|
/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
|
|
|
|
#define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
/*
|
|
|
|
* em28xx_usb_probe()
|
|
|
|
* checks for supported devices
|
|
|
|
*/
|
|
|
|
static int em28xx_usb_probe(struct usb_interface *interface,
|
|
|
|
const struct usb_device_id *id)
|
|
|
|
{
|
|
|
|
struct usb_device *udev;
|
|
|
|
struct em28xx *dev = NULL;
|
2009-03-31 20:10:58 +00:00
|
|
|
int retval;
|
2014-09-13 08:52:20 +00:00
|
|
|
bool has_vendor_audio = false, has_video = false, has_dvb = false;
|
2012-12-23 15:25:38 +00:00
|
|
|
int i, nr, try_bulk;
|
2011-06-17 18:15:12 +00:00
|
|
|
const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
|
2008-12-29 01:18:14 +00:00
|
|
|
char *speed;
|
|
|
|
|
|
|
|
udev = usb_get_dev(interface_to_usbdev(interface));
|
|
|
|
|
|
|
|
/* Check to see next free device and mark as used */
|
2011-08-20 11:21:03 +00:00
|
|
|
do {
|
2014-01-14 20:35:15 +00:00
|
|
|
nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
|
2011-08-20 11:21:03 +00:00
|
|
|
if (nr >= EM28XX_MAXBOARDS) {
|
|
|
|
/* No free device slots */
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Driver supports up to %i em28xx boards.\n",
|
2014-11-28 11:34:15 +00:00
|
|
|
EM28XX_MAXBOARDS);
|
2011-08-20 11:21:03 +00:00
|
|
|
retval = -ENOMEM;
|
|
|
|
goto err_no_slot;
|
|
|
|
}
|
2014-01-14 20:35:15 +00:00
|
|
|
} while (test_and_set_bit(nr, em28xx_devused));
|
2008-12-29 01:18:14 +00:00
|
|
|
|
|
|
|
/* Don't register audio interfaces */
|
|
|
|
if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"audio device (%04x:%04x): interface %i, class %i\n",
|
2008-12-29 01:18:14 +00:00
|
|
|
le16_to_cpu(udev->descriptor.idVendor),
|
|
|
|
le16_to_cpu(udev->descriptor.idProduct),
|
|
|
|
ifnum,
|
|
|
|
interface->altsetting[0].desc.bInterfaceClass);
|
|
|
|
|
2009-03-31 20:10:58 +00:00
|
|
|
retval = -ENODEV;
|
|
|
|
goto err;
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
2011-12-28 21:55:41 +00:00
|
|
|
/* allocate memory for our device state and initialize it */
|
|
|
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
|
|
|
if (dev == NULL) {
|
|
|
|
retval = -ENOMEM;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* compute alternate max packet sizes */
|
2012-11-08 17:11:49 +00:00
|
|
|
dev->alt_max_pkt_size_isoc =
|
|
|
|
kmalloc(sizeof(dev->alt_max_pkt_size_isoc[0]) *
|
2011-12-28 21:55:41 +00:00
|
|
|
interface->num_altsetting, GFP_KERNEL);
|
2012-11-08 17:11:49 +00:00
|
|
|
if (dev->alt_max_pkt_size_isoc == NULL) {
|
2011-12-28 21:55:41 +00:00
|
|
|
kfree(dev);
|
|
|
|
retval = -ENOMEM;
|
|
|
|
goto err;
|
|
|
|
}
|
|
|
|
|
2011-06-17 18:15:12 +00:00
|
|
|
/* Get endpoints */
|
|
|
|
for (i = 0; i < interface->num_altsetting; i++) {
|
|
|
|
int ep;
|
|
|
|
|
|
|
|
for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) {
|
2011-12-28 21:55:41 +00:00
|
|
|
const struct usb_endpoint_descriptor *e;
|
|
|
|
int sizedescr, size;
|
|
|
|
|
|
|
|
e = &interface->altsetting[i].endpoint[ep].desc;
|
|
|
|
|
|
|
|
sizedescr = le16_to_cpu(e->wMaxPacketSize);
|
|
|
|
size = sizedescr & 0x7ff;
|
|
|
|
|
|
|
|
if (udev->speed == USB_SPEED_HIGH)
|
|
|
|
size = size * hb_mult(sizedescr);
|
|
|
|
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
if (usb_endpoint_dir_in(e)) {
|
2011-12-28 21:55:41 +00:00
|
|
|
switch (e->bEndpointAddress) {
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
case 0x82:
|
2011-12-28 21:55:41 +00:00
|
|
|
has_video = true;
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
if (usb_endpoint_xfer_isoc(e)) {
|
|
|
|
dev->analog_ep_isoc =
|
|
|
|
e->bEndpointAddress;
|
|
|
|
dev->alt_max_pkt_size_isoc[i] = size;
|
|
|
|
} else if (usb_endpoint_xfer_bulk(e)) {
|
|
|
|
dev->analog_ep_bulk =
|
|
|
|
e->bEndpointAddress;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 0x83:
|
|
|
|
if (usb_endpoint_xfer_isoc(e)) {
|
2014-09-13 08:52:20 +00:00
|
|
|
has_vendor_audio = true;
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
} else {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
}
|
2011-12-28 21:55:41 +00:00
|
|
|
break;
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
case 0x84:
|
|
|
|
if (has_video &&
|
|
|
|
(usb_endpoint_xfer_bulk(e))) {
|
|
|
|
dev->analog_ep_bulk =
|
|
|
|
e->bEndpointAddress;
|
|
|
|
} else {
|
|
|
|
if (usb_endpoint_xfer_isoc(e)) {
|
|
|
|
if (size > dev->dvb_max_pkt_size_isoc) {
|
2013-03-27 19:07:41 +00:00
|
|
|
has_dvb = true; /* see NOTE (~) */
|
2013-04-08 16:06:59 +00:00
|
|
|
dev->dvb_ep_isoc = e->bEndpointAddress;
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
dev->dvb_max_pkt_size_isoc = size;
|
|
|
|
dev->dvb_alt_isoc = i;
|
|
|
|
}
|
|
|
|
} else {
|
2013-03-27 19:07:41 +00:00
|
|
|
has_dvb = true;
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
dev->dvb_ep_bulk = e->bEndpointAddress;
|
|
|
|
}
|
2011-12-28 21:55:41 +00:00
|
|
|
}
|
|
|
|
break;
|
2018-01-05 00:04:11 +00:00
|
|
|
case 0x85:
|
|
|
|
if (usb_endpoint_xfer_isoc(e)) {
|
|
|
|
if (size > dev->dvb_max_pkt_size_isoc_ts2) {
|
|
|
|
dev->dvb_ep_isoc_ts2 = e->bEndpointAddress;
|
|
|
|
dev->dvb_max_pkt_size_isoc_ts2 = size;
|
|
|
|
dev->dvb_alt_isoc = i;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
dev->dvb_ep_bulk_ts2 = e->bEndpointAddress;
|
|
|
|
}
|
|
|
|
break;
|
2011-12-28 21:55:41 +00:00
|
|
|
}
|
|
|
|
}
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
/* NOTE:
|
|
|
|
* Old logic with support for isoc transfers only was:
|
|
|
|
* 0x82 isoc => analog
|
|
|
|
* 0x83 isoc => audio
|
|
|
|
* 0x84 isoc => digital
|
|
|
|
*
|
|
|
|
* New logic with support for bulk transfers
|
|
|
|
* 0x82 isoc => analog
|
|
|
|
* 0x82 bulk => analog
|
|
|
|
* 0x83 isoc* => audio
|
|
|
|
* 0x84 isoc => digital
|
|
|
|
* 0x84 bulk => analog or digital**
|
2018-01-05 00:04:11 +00:00
|
|
|
* 0x85 isoc => digital TS2
|
|
|
|
* 0x85 bulk => digital TS2
|
[media] em28xx: improve USB endpoint logic, also use bulk transfers
The current enpoint logic ignores all bulk endpoints and uses
a fixed mapping between endpint addresses and the supported
data stream types (analog/audio/DVB):
Ep 0x82, isoc => analog
Ep 0x83, isoc => audio
Ep 0x84, isoc => DVB
Now that the code can also do bulk transfers, the endpoint
logic has to be extended to also consider bulk endpoints.
The new logic preserves backwards compatibility and reflects
the endpoint configurations we have seen so far:
Ep 0x82, isoc => analog
Ep 0x82, bulk => analog
Ep 0x83, isoc* => audio
Ep 0x84, isoc => digital
Ep 0x84, bulk => analog or digital**
(*: audio should always be isoc)
(**: analog, if ep 0x82 is isoc, otherwise digital)
[mchehab@redhat.com: Fix a CodingStyle issue: don't break strings
into separate lines]
Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-11-08 17:11:52 +00:00
|
|
|
* (*: audio should always be isoc)
|
|
|
|
* (**: analog, if ep 0x82 is isoc, otherwise digital)
|
|
|
|
*
|
|
|
|
* The new logic preserves backwards compatibility and
|
|
|
|
* reflects the endpoint configurations we have seen
|
|
|
|
* so far. But there might be devices for which this
|
|
|
|
* logic is not sufficient...
|
|
|
|
*/
|
2013-03-27 19:07:41 +00:00
|
|
|
/*
|
|
|
|
* NOTE (~): some manufacturers (e.g. Terratec) disable
|
|
|
|
* endpoints by setting wMaxPacketSize to 0 bytes for
|
|
|
|
* all alt settings. So far, we've seen this for
|
|
|
|
* DVB isoc endpoints only.
|
|
|
|
*/
|
2011-06-17 18:15:12 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-13 08:52:20 +00:00
|
|
|
if (!(has_vendor_audio || has_video || has_dvb)) {
|
2011-12-28 21:55:41 +00:00
|
|
|
retval = -ENODEV;
|
|
|
|
goto err_free;
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (udev->speed) {
|
|
|
|
case USB_SPEED_LOW:
|
|
|
|
speed = "1.5";
|
|
|
|
break;
|
|
|
|
case USB_SPEED_UNKNOWN:
|
|
|
|
case USB_SPEED_FULL:
|
|
|
|
speed = "12";
|
|
|
|
break;
|
|
|
|
case USB_SPEED_HIGH:
|
|
|
|
speed = "480";
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
speed = "unknown";
|
|
|
|
}
|
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",
|
2012-03-13 13:27:09 +00:00
|
|
|
udev->manufacturer ? udev->manufacturer : "",
|
|
|
|
udev->product ? udev->product : "",
|
2008-12-29 01:18:14 +00:00
|
|
|
speed,
|
|
|
|
le16_to_cpu(udev->descriptor.idVendor),
|
|
|
|
le16_to_cpu(udev->descriptor.idProduct),
|
|
|
|
ifnum,
|
|
|
|
interface->altsetting->desc.bInterfaceNumber);
|
|
|
|
|
2009-05-28 02:23:37 +00:00
|
|
|
/*
|
|
|
|
* Make sure we have 480 Mbps of bandwidth, otherwise things like
|
|
|
|
* video stream wouldn't likely work, since 12 Mbps is generally
|
|
|
|
* not enough even for most Digital TV streams.
|
|
|
|
*/
|
2009-05-28 02:44:10 +00:00
|
|
|
if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev, "Device initialization failed.\n");
|
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Device must be connected to a high-speed USB 2.0 port.\n");
|
2009-05-28 02:23:37 +00:00
|
|
|
retval = -ENODEV;
|
2011-12-28 21:55:41 +00:00
|
|
|
goto err_free;
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dev->devno = nr;
|
|
|
|
dev->model = id->driver_info;
|
|
|
|
dev->alt = -1;
|
2014-09-13 08:52:20 +00:00
|
|
|
dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
|
2013-12-22 16:27:02 +00:00
|
|
|
dev->has_video = has_video;
|
2014-01-13 22:02:06 +00:00
|
|
|
dev->ifnum = ifnum;
|
2008-12-29 01:18:14 +00:00
|
|
|
|
2018-01-05 00:04:11 +00:00
|
|
|
dev->ts = PRIMARY_TS;
|
|
|
|
snprintf(dev->name, 28, "em28xx");
|
|
|
|
dev->dev_next = NULL;
|
|
|
|
|
2014-09-13 08:52:20 +00:00
|
|
|
if (has_vendor_audio) {
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Audio interface %i found (Vendor Class)\n", ifnum);
|
2014-09-13 08:52:20 +00:00
|
|
|
dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
|
|
|
|
}
|
|
|
|
/* Checks if audio is provided by a USB Audio Class interface */
|
2008-12-29 01:18:14 +00:00
|
|
|
for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
|
2011-06-17 18:15:12 +00:00
|
|
|
struct usb_interface *uif = udev->config->interface[i];
|
2014-11-28 11:34:15 +00:00
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
|
2014-09-13 08:52:20 +00:00
|
|
|
if (has_vendor_audio)
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"em28xx: device seems to have vendor AND usb audio class interfaces !\n"
|
2016-10-12 10:32:23 +00:00
|
|
|
"\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
|
2014-09-13 08:52:20 +00:00
|
|
|
dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
|
2008-12-29 01:18:14 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-12-23 15:15:47 +00:00
|
|
|
if (has_video)
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev, "Video interface %i found:%s%s\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
ifnum,
|
|
|
|
dev->analog_ep_bulk ? " bulk" : "",
|
|
|
|
dev->analog_ep_isoc ? " isoc" : "");
|
2012-12-23 15:15:47 +00:00
|
|
|
if (has_dvb)
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev, "DVB interface %i found:%s%s\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
ifnum,
|
|
|
|
dev->dvb_ep_bulk ? " bulk" : "",
|
|
|
|
dev->dvb_ep_isoc ? " isoc" : "");
|
2012-12-23 15:15:47 +00:00
|
|
|
|
2011-06-17 18:15:12 +00:00
|
|
|
dev->num_alt = interface->num_altsetting;
|
2008-12-29 01:18:14 +00:00
|
|
|
|
2012-10-27 19:29:20 +00:00
|
|
|
if ((unsigned)card[nr] < em28xx_bcount)
|
2008-12-29 01:18:14 +00:00
|
|
|
dev->model = card[nr];
|
|
|
|
|
2011-06-17 18:15:12 +00:00
|
|
|
/* save our data pointer in this interface device */
|
|
|
|
usb_set_intfdata(interface, dev);
|
|
|
|
|
2016-01-29 14:53:56 +00:00
|
|
|
/* allocate device struct and check if the device is a webcam */
|
2008-12-29 01:18:14 +00:00
|
|
|
mutex_init(&dev->lock);
|
2012-01-07 13:18:45 +00:00
|
|
|
retval = em28xx_init_dev(dev, udev, interface, nr);
|
2008-12-29 01:18:14 +00:00
|
|
|
if (retval) {
|
2013-12-22 16:27:02 +00:00
|
|
|
goto err_free;
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
2012-12-26 18:12:37 +00:00
|
|
|
if (usb_xfer_mode < 0) {
|
2018-03-01 15:08:42 +00:00
|
|
|
if (dev->is_webcam)
|
2012-12-23 15:25:38 +00:00
|
|
|
try_bulk = 1;
|
|
|
|
else
|
|
|
|
try_bulk = 0;
|
|
|
|
} else {
|
2012-12-26 18:12:37 +00:00
|
|
|
try_bulk = usb_xfer_mode > 0;
|
2012-12-23 15:25:38 +00:00
|
|
|
}
|
|
|
|
|
2017-04-15 10:05:02 +00:00
|
|
|
/* Disable V4L2 if the device doesn't have a decoder or image sensor */
|
2016-01-29 14:53:56 +00:00
|
|
|
if (has_video &&
|
2017-04-15 10:05:02 +00:00
|
|
|
dev->board.decoder == EM28XX_NODECODER &&
|
|
|
|
dev->em28xx_sensor == EM28XX_NOSENSOR) {
|
|
|
|
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev,
|
2016-10-20 10:42:03 +00:00
|
|
|
"Currently, V4L2 is not supported on this model\n");
|
2016-01-29 14:53:56 +00:00
|
|
|
has_video = false;
|
|
|
|
dev->has_video = false;
|
|
|
|
}
|
|
|
|
|
2012-12-23 15:25:38 +00:00
|
|
|
/* Select USB transfer types to use */
|
|
|
|
if (has_video) {
|
2014-03-22 13:00:59 +00:00
|
|
|
if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
|
|
|
|
dev->analog_xfer_bulk = 1;
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev, "analog set to %s mode.\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
dev->analog_xfer_bulk ? "bulk" : "isoc");
|
2012-12-23 15:25:38 +00:00
|
|
|
}
|
[media] em28xx: pre-allocate DVB isoc transfer buffers
On MIPS/ARM set-top-boxes, as well as old x86 PCs, memory allocation failures
in the em28xx driver are common, due to memory fragmentation over time, that
makes impossible to allocate large chunks of coherent memory.
A typical system with 256/512 MB of RAM fails after just 1 day of uptime (see
the old thread for detailed reports and crashlogs).
In fact, the em28xx driver allocates memory for USB isoc transfers at runtime,
as opposite to the dvb-usb drivers that allocates the USB buffers when the
device is initialized, and frees them when the device is disconnected.
Moreover, in digital mode the USB isoc transfer buffers are freed, allocated
and cleared every time the user selects a new channel, wasting time and
resources.
This patch solves both problems by allocating DVB isoc transfer buffers in
em28xx_usb_probe(), and freeing them in em28xx_usb_disconnect().
In fact, the buffers size and number depend only on the max USB packet size
that is parsed from the USB descriptors in em28xx_usb_probe(), so it can
never change for a given device.
This approach makes no sense in analog mode (as the buffer size depends on
the alternate mode selected at runtime), the patch creates two separate sets
of buffers for digital and analog modes.
For digital-only devices, USB buffers are created when the device is probed
and freed when the device is disconnected.
For analog-only devices, nothing changes: isoc buffers are created at runtime.
For hybrid devices, two sets of buffers are maintained: the digital-mode
buffers are created when the device is probed, and freed when the device is
disconnected; analog-mode buffers are created/destroyed at runtime as before.
So, in analog mode, digital and analog buffers coexists at the same time: this
can be justified by the fact that digital mode is by far more commonly used
nowadays, so it makes sense to optimize the driver for this use case scenario.
The patch has been tested in the last few days on a x86 PC and a MIPS
set-top-box, with the PCTV 290e (digital only) and the Terratec Hybrid XS
(hybrid device). With the latter, I switched several times between analog and
digital mode (Kaffeine/TvTime) with no issue at all.
I unplugged/plugged the devices several times with no problem.
Also, after over 3 days of normal usage in the MPIS set-top-box, the PCTV 290e
was still up and running.
Signed-off-by: Gianluca Gennari <gennarone@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-02-13 16:59:22 +00:00
|
|
|
if (has_dvb) {
|
2014-03-22 13:00:59 +00:00
|
|
|
if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
|
|
|
|
dev->dvb_xfer_bulk = 1;
|
2016-12-07 15:48:10 +00:00
|
|
|
dev_err(&interface->dev, "dvb set to %s mode.\n",
|
2016-10-12 10:32:23 +00:00
|
|
|
dev->dvb_xfer_bulk ? "bulk" : "isoc");
|
[media] em28xx: pre-allocate DVB isoc transfer buffers
On MIPS/ARM set-top-boxes, as well as old x86 PCs, memory allocation failures
in the em28xx driver are common, due to memory fragmentation over time, that
makes impossible to allocate large chunks of coherent memory.
A typical system with 256/512 MB of RAM fails after just 1 day of uptime (see
the old thread for detailed reports and crashlogs).
In fact, the em28xx driver allocates memory for USB isoc transfers at runtime,
as opposite to the dvb-usb drivers that allocates the USB buffers when the
device is initialized, and frees them when the device is disconnected.
Moreover, in digital mode the USB isoc transfer buffers are freed, allocated
and cleared every time the user selects a new channel, wasting time and
resources.
This patch solves both problems by allocating DVB isoc transfer buffers in
em28xx_usb_probe(), and freeing them in em28xx_usb_disconnect().
In fact, the buffers size and number depend only on the max USB packet size
that is parsed from the USB descriptors in em28xx_usb_probe(), so it can
never change for a given device.
This approach makes no sense in analog mode (as the buffer size depends on
the alternate mode selected at runtime), the patch creates two separate sets
of buffers for digital and analog modes.
For digital-only devices, USB buffers are created when the device is probed
and freed when the device is disconnected.
For analog-only devices, nothing changes: isoc buffers are created at runtime.
For hybrid devices, two sets of buffers are maintained: the digital-mode
buffers are created when the device is probed, and freed when the device is
disconnected; analog-mode buffers are created/destroyed at runtime as before.
So, in analog mode, digital and analog buffers coexists at the same time: this
can be justified by the fact that digital mode is by far more commonly used
nowadays, so it makes sense to optimize the driver for this use case scenario.
The patch has been tested in the last few days on a x86 PC and a MIPS
set-top-box, with the PCTV 290e (digital only) and the Terratec Hybrid XS
(hybrid device). With the latter, I switched several times between analog and
digital mode (Kaffeine/TvTime) with no issue at all.
I unplugged/plugged the devices several times with no problem.
Also, after over 3 days of normal usage in the MPIS set-top-box, the PCTV 290e
was still up and running.
Signed-off-by: Gianluca Gennari <gennarone@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
2012-02-13 16:59:22 +00:00
|
|
|
}
|
|
|
|
|
2018-01-05 00:04:11 +00:00
|
|
|
if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) {
|
|
|
|
dev->dev_next->ts = SECONDARY_TS;
|
|
|
|
dev->dev_next->alt = -1;
|
|
|
|
dev->dev_next->is_audio_only = has_vendor_audio &&
|
|
|
|
!(has_video || has_dvb);
|
|
|
|
dev->dev_next->has_video = false;
|
|
|
|
dev->dev_next->ifnum = ifnum;
|
|
|
|
dev->dev_next->model = id->driver_info;
|
|
|
|
|
|
|
|
mutex_init(&dev->dev_next->lock);
|
|
|
|
retval = em28xx_init_dev(dev->dev_next, udev, interface,
|
|
|
|
dev->dev_next->devno);
|
|
|
|
if (retval)
|
|
|
|
goto err_free;
|
|
|
|
|
|
|
|
dev->dev_next->board.ir_codes = NULL; /* No IR for 2nd tuner */
|
|
|
|
dev->dev_next->board.has_ir_i2c = 0; /* No IR for 2nd tuner */
|
|
|
|
|
|
|
|
if (usb_xfer_mode < 0) {
|
2018-03-01 15:08:42 +00:00
|
|
|
if (dev->dev_next->is_webcam)
|
2018-01-05 00:04:11 +00:00
|
|
|
try_bulk = 1;
|
|
|
|
else
|
|
|
|
try_bulk = 0;
|
|
|
|
} else {
|
|
|
|
try_bulk = usb_xfer_mode > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Select USB transfer types to use */
|
|
|
|
if (has_dvb) {
|
|
|
|
if (!dev->dvb_ep_isoc_ts2 ||
|
|
|
|
(try_bulk && dev->dvb_ep_bulk_ts2))
|
|
|
|
dev->dev_next->dvb_xfer_bulk = 1;
|
|
|
|
dev_info(&dev->intf->dev, "dvb ts2 set to %s mode.\n",
|
|
|
|
dev->dev_next->dvb_xfer_bulk ? "bulk" : "isoc");
|
|
|
|
}
|
|
|
|
|
|
|
|
dev->dev_next->dvb_ep_isoc = dev->dvb_ep_isoc_ts2;
|
|
|
|
dev->dev_next->dvb_ep_bulk = dev->dvb_ep_bulk_ts2;
|
|
|
|
dev->dev_next->dvb_max_pkt_size_isoc = dev->dvb_max_pkt_size_isoc_ts2;
|
|
|
|
dev->dev_next->dvb_alt_isoc = dev->dvb_alt_isoc;
|
|
|
|
|
|
|
|
/* Configuare hardware to support TS2*/
|
|
|
|
if (dev->dvb_xfer_bulk) {
|
|
|
|
/* The ep4 and ep5 are configuared for BULK */
|
|
|
|
em28xx_write_reg(dev, 0x0b, 0x96);
|
|
|
|
mdelay(100);
|
|
|
|
em28xx_write_reg(dev, 0x0b, 0x80);
|
|
|
|
mdelay(100);
|
|
|
|
} else {
|
|
|
|
/* The ep4 and ep5 are configuared for ISO */
|
|
|
|
em28xx_write_reg(dev, 0x0b, 0x96);
|
|
|
|
mdelay(100);
|
|
|
|
em28xx_write_reg(dev, 0x0b, 0x82);
|
|
|
|
mdelay(100);
|
|
|
|
}
|
|
|
|
|
|
|
|
kref_init(&dev->dev_next->ref);
|
|
|
|
}
|
|
|
|
|
2014-03-05 14:21:07 +00:00
|
|
|
kref_init(&dev->ref);
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
request_modules(dev);
|
|
|
|
|
2016-01-27 09:07:24 +00:00
|
|
|
/*
|
|
|
|
* Do it at the end, to reduce dynamic configuration changes during
|
|
|
|
* the device init. Yet, as request_modules() can be async, the
|
|
|
|
* topology will likely change after the load of the em28xx subdrivers.
|
2008-12-29 01:18:14 +00:00
|
|
|
*/
|
2016-01-27 09:07:24 +00:00
|
|
|
#ifdef CONFIG_MEDIA_CONTROLLER
|
|
|
|
retval = media_device_register(dev->media_dev);
|
|
|
|
#endif
|
2008-12-29 01:18:14 +00:00
|
|
|
|
|
|
|
return 0;
|
2009-03-31 20:10:58 +00:00
|
|
|
|
2011-12-28 21:55:41 +00:00
|
|
|
err_free:
|
2012-11-08 17:11:49 +00:00
|
|
|
kfree(dev->alt_max_pkt_size_isoc);
|
2011-12-28 21:55:41 +00:00
|
|
|
kfree(dev);
|
|
|
|
|
2009-03-31 20:10:58 +00:00
|
|
|
err:
|
2014-01-14 20:35:15 +00:00
|
|
|
clear_bit(nr, em28xx_devused);
|
2011-08-20 11:21:03 +00:00
|
|
|
|
|
|
|
err_no_slot:
|
|
|
|
usb_put_dev(udev);
|
2009-03-31 20:10:58 +00:00
|
|
|
return retval;
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* em28xx_usb_disconnect()
|
2011-09-24 14:02:32 +00:00
|
|
|
* called when the device gets disconnected
|
2008-12-29 01:18:14 +00:00
|
|
|
* video device will be unregistered on v4l2_close in case it is still open
|
|
|
|
*/
|
|
|
|
static void em28xx_usb_disconnect(struct usb_interface *interface)
|
|
|
|
{
|
|
|
|
struct em28xx *dev;
|
|
|
|
|
|
|
|
dev = usb_get_intfdata(interface);
|
|
|
|
usb_set_intfdata(interface, NULL);
|
|
|
|
|
|
|
|
if (!dev)
|
|
|
|
return;
|
|
|
|
|
2018-01-05 00:04:11 +00:00
|
|
|
if (dev->dev_next != NULL) {
|
|
|
|
dev->dev_next->disconnected = 1;
|
|
|
|
dev_info(&dev->intf->dev, "Disconnecting %s\n",
|
|
|
|
dev->dev_next->name);
|
|
|
|
flush_request_modules(dev->dev_next);
|
|
|
|
}
|
|
|
|
|
2012-12-27 22:02:44 +00:00
|
|
|
dev->disconnected = 1;
|
|
|
|
|
2018-01-05 00:04:11 +00:00
|
|
|
dev_err(&dev->intf->dev, "Disconnecting %s\n", dev->name);
|
2008-12-29 01:18:14 +00:00
|
|
|
|
2010-12-24 15:14:20 +00:00
|
|
|
flush_request_modules(dev);
|
|
|
|
|
2012-12-27 22:02:44 +00:00
|
|
|
em28xx_close_extension(dev);
|
2013-12-27 16:01:04 +00:00
|
|
|
|
2018-01-05 00:04:11 +00:00
|
|
|
if (dev->dev_next != NULL)
|
|
|
|
em28xx_release_resources(dev->dev_next);
|
2014-01-12 16:24:24 +00:00
|
|
|
em28xx_release_resources(dev);
|
2018-01-05 00:04:11 +00:00
|
|
|
|
|
|
|
if (dev->dev_next != NULL) {
|
|
|
|
kref_put(&dev->dev_next->ref, em28xx_free_device);
|
|
|
|
dev->dev_next = NULL;
|
|
|
|
}
|
2014-03-05 14:21:07 +00:00
|
|
|
kref_put(&dev->ref, em28xx_free_device);
|
2008-12-29 01:18:14 +00:00
|
|
|
}
|
|
|
|
|
2014-02-22 00:50:18 +00:00
|
|
|
static int em28xx_usb_suspend(struct usb_interface *interface,
|
2014-11-28 11:34:15 +00:00
|
|
|
pm_message_t message)
|
2014-02-22 00:50:18 +00:00
|
|
|
{
|
|
|
|
struct em28xx *dev;
|
|
|
|
|
|
|
|
dev = usb_get_intfdata(interface);
|
|
|
|
if (!dev)
|
|
|
|
return 0;
|
|
|
|
em28xx_suspend_extension(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int em28xx_usb_resume(struct usb_interface *interface)
|
|
|
|
{
|
|
|
|
struct em28xx *dev;
|
|
|
|
|
|
|
|
dev = usb_get_intfdata(interface);
|
|
|
|
if (!dev)
|
|
|
|
return 0;
|
|
|
|
em28xx_resume_extension(dev);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2008-12-29 01:18:14 +00:00
|
|
|
static struct usb_driver em28xx_usb_driver = {
|
|
|
|
.name = "em28xx",
|
|
|
|
.probe = em28xx_usb_probe,
|
|
|
|
.disconnect = em28xx_usb_disconnect,
|
2014-02-22 00:50:18 +00:00
|
|
|
.suspend = em28xx_usb_suspend,
|
|
|
|
.resume = em28xx_usb_resume,
|
2014-09-26 09:53:15 +00:00
|
|
|
.reset_resume = em28xx_usb_resume,
|
2008-12-29 01:18:14 +00:00
|
|
|
.id_table = em28xx_id_table,
|
|
|
|
};
|
|
|
|
|
2011-11-18 17:46:12 +00:00
|
|
|
module_usb_driver(em28xx_usb_driver);
|