2005-11-08 21:37:07 -08:00
/*
2007-11-23 14:22:14 -03:00
em28xx - cards . c - driver for Empia EM2800 / EM2820 / 2840 USB
video capture devices
2005-11-08 21:37:07 -08:00
2005-11-08 21:38:25 -08:00
Copyright ( C ) 2005 Ludovico Cavedon < cavedon @ sssup . it >
Markus Rechberger < mrechberger @ gmail . com >
2006-04-03 07:53:40 -03:00
Mauro Carvalho Chehab < mchehab @ infradead . org >
2005-11-08 21:38:25 -08:00
Sascha Sommer < saschasommer @ freenet . de >
2005-11-08 21:37:07 -08: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 0213 9 , USA .
*/
# include <linux/init.h>
# include <linux/module.h>
# include <linux/delay.h>
# include <linux/i2c.h>
# include <linux/usb.h>
# include <media/tuner.h>
2006-03-19 12:35:57 -03:00
# include <media/msp3400.h>
2006-04-02 13:35:00 -03:00
# include <media/saa7115.h>
# include <media/tvp5150.h>
2005-11-08 21:37:16 -08:00
# include <media/tveeprom.h>
2006-01-09 15:25:37 -02:00
# include <media/v4l2-common.h>
2008-07-23 05:09:15 -03:00
# include <media/v4l2-chip-ident.h>
2005-11-08 21:37:07 -08:00
2005-11-08 21:38:25 -08:00
# include "em28xx.h"
2005-11-08 21:37:07 -08:00
2008-12-28 22:18:14 -03:00
# define DRIVER_NAME "em28xx"
2007-11-03 21:20:59 -03:00
static int tuner = - 1 ;
module_param ( tuner , int , 0444 ) ;
MODULE_PARM_DESC ( tuner , " tuner type " ) ;
2008-01-13 15:42:17 -03:00
static unsigned int disable_ir ;
module_param ( disable_ir , int , 0444 ) ;
MODULE_PARM_DESC ( disable_ir , " disable infrared remote support " ) ;
2008-12-28 22:18:14 -03:00
static unsigned int card [ ] = { [ 0 . . . ( EM28XX_MAXBOARDS - 1 ) ] = UNSET } ;
module_param_array ( card , int , NULL , 0444 ) ;
MODULE_PARM_DESC ( card , " card type " ) ;
/* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
static unsigned long em28xx_devused ;
2007-11-03 21:20:59 -03:00
struct em28xx_hash_table {
unsigned long hash ;
unsigned int model ;
unsigned int tuner ;
} ;
2008-11-25 13:16:13 -03:00
/*
* Reset sequences for analog / digital modes
*/
/* Reset for the most [analog] boards */
static struct em28xx_reg_seq default_analog [ ] = {
{ EM28XX_R08_GPIO , 0x6d , ~ EM_GPIO_4 , 10 } ,
{ - 1 , - 1 , - 1 , - 1 } ,
} ;
/* Reset for the most [digital] boards */
static struct em28xx_reg_seq default_digital [ ] = {
{ EM28XX_R08_GPIO , 0x6e , ~ EM_GPIO_4 , 10 } ,
{ - 1 , - 1 , - 1 , - 1 } ,
} ;
/* Board Hauppauge WinTV HVR 900 analog */
static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog [ ] = {
{ EM28XX_R08_GPIO , 0x2d , ~ EM_GPIO_4 , 10 } ,
{ 0x05 , 0xff , 0x10 , 10 } ,
{ - 1 , - 1 , - 1 , - 1 } ,
} ;
/* Board Hauppauge WinTV HVR 900 digital */
static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital [ ] = {
{ EM28XX_R08_GPIO , 0x2e , ~ EM_GPIO_4 , 10 } ,
{ EM2880_R04_GPO , 0x04 , 0x0f , 10 } ,
{ EM2880_R04_GPO , 0x0c , 0x0f , 10 } ,
{ - 1 , - 1 , - 1 , - 1 } ,
} ;
/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
static struct em28xx_reg_seq em2880_msi_digivox_ad_analog [ ] = {
{ EM28XX_R08_GPIO , 0x69 , ~ EM_GPIO_4 , 10 } ,
{ - 1 , - 1 , - 1 , - 1 } ,
} ;
/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
/* Board - EM2870 Kworld 355u
Analog - No input analog */
/* Callback for the most boards */
2008-11-27 09:21:55 -03:00
static struct em28xx_reg_seq default_tuner_gpio [ ] = {
2008-11-25 13:16:13 -03:00
{ EM28XX_R08_GPIO , EM_GPIO_4 , EM_GPIO_4 , 10 } ,
{ EM28XX_R08_GPIO , 0 , EM_GPIO_4 , 10 } ,
{ EM28XX_R08_GPIO , EM_GPIO_4 , EM_GPIO_4 , 10 } ,
{ - 1 , - 1 , - 1 , - 1 } ,
} ;
/*
* Board definitions
*/
2005-11-08 21:38:27 -08:00
struct em28xx_board em28xx_boards [ ] = {
2008-07-27 14:03:32 -03:00
[ EM2750_BOARD_UNKNOWN ] = {
. name = " Unknown EM2750/EM2751 webcam grabber " ,
2008-11-25 07:05:06 -03:00
. xclk = EM28XX_XCLK_FREQUENCY_48MHZ ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* This is a webcam */
2008-07-27 14:03:32 -03:00
. input = { {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = 0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
2005-11-08 21:37:24 -08:00
[ EM2800_BOARD_UNKNOWN ] = {
. name = " Unknown EM2800 video grabber " ,
. is_em2800 = 1 ,
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
[ EM2820_BOARD_UNKNOWN ] = {
2008-11-25 07:05:06 -03:00
. name = " Unknown EM2750/28xx video grabber " ,
. tuner_type = TUNER_ABSENT ,
2005-11-08 21:37:24 -08:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2750_BOARD_DLCW_130 ] = {
/* Beijing Huaqi Information Digital Technology Co., Ltd */
. name = " Huaqi DLCW-130 " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2008-11-25 07:05:06 -03:00
. xclk = EM28XX_XCLK_FREQUENCY_48MHZ ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* This is a webcam */
2008-07-27 14:03:32 -03:00
. input = { {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = 0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
2006-02-07 06:25:39 -02:00
[ EM2820_BOARD_KWORLD_PVRTV2800RF ] = {
2006-02-07 06:25:41 -02: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 06:59:20 -03:00
. tuner_type = TUNER_TEMIC_PAL ,
2006-02-07 06:25:39 -02:00
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2006-02-07 06:25:39 -02:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2006-02-07 06:25:39 -02:00
. type = EM28XX_VMUX_SVIDEO ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2006-02-07 06:25:39 -02:00
} ,
2005-11-08 21:37:07 -08:00
[ EM2820_BOARD_TERRATEC_CINERGY_250 ] = {
. name = " Terratec Cinergy 250 USB " ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_TELEVISION ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:07 -08:00
} ,
[ EM2820_BOARD_PINNACLE_USB_2 ] = {
. name = " Pinnacle PCTV USB 2 " ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_TELEVISION ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2006-04-02 13:35:00 -03:00
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:07 -08:00
} ,
[ EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 ] = {
. name = " Hauppauge WinTV USB 2 " ,
. tuner_type = TUNER_PHILIPS_FM1236_MK3 ,
2007-11-23 14:22:14 -03:00
. tda9887_conf = TDA9887_PRESENT |
TDA9887_PORT1_ACTIVE |
TDA9887_PORT2_ACTIVE ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_TVP5150 ,
2005-11-08 21:37:07 -08:00
. has_msp34xx = 1 ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_TELEVISION ,
2006-04-02 13:35:00 -03:00
. vmux = TVP5150_COMPOSITE0 ,
2006-03-19 12:35:57 -03:00
. amux = MSP_INPUT_DEFAULT ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2006-04-02 13:35:00 -03:00
. vmux = TVP5150_SVIDEO ,
2006-04-01 18:03:23 -03:00
. amux = MSP_INPUT ( MSP_IN_SCART1 , MSP_IN_TUNER1 ,
MSP_DSP_IN_SCART , MSP_DSP_IN_SCART ) ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:07 -08:00
} ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-07-27 14:03:32 -03:00
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE ] = {
. name = " Leadtek Winfast USB II Deluxe " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_PHILIPS_FM1216ME_MK3 ,
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
2008-11-27 07:44:00 -03:00
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-11-27 07:44:00 -03:00
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
2008-11-27 07:44:00 -03:00
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2820_BOARD_VIDEOLOGY_20K14XUSB ] = {
2008-11-25 09:10:25 -03:00
. name = " Videology 20K14XUSB USB2.0 " ,
2008-07-27 14:03:32 -03:00
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* This is a webcam */
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = 0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2821_BOARD_PROLINK_PLAYTV_USB2 ] = {
. name = " SIIG AVTuner-PVR/Prolink PlayTV USB 2.0 " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC , /* unknown? */
. tda9887_conf = TDA9887_PRESENT , /* unknown? */
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2821_BOARD_USBGEAR_VD204 ] = {
2008-11-25 09:10:25 -03:00
. name = " Usbgear VD204v9 " ,
2008-07-27 14:03:32 -03:00
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* Capture only device */
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2860_BOARD_NETGMBH_CAM ] = {
/* Beijing Huaqi Information Digital Technology Co., Ltd */
2008-11-25 09:10:25 -03:00
. name = " NetGMBH Cam " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* This is a webcam */
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = 0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2860_BOARD_TYPHOON_DVD_MAKER ] = {
2008-11-25 09:10:25 -03:00
. name = " Typhoon DVD Maker " ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* Capture only device */
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2860_BOARD_GADMEI_UTV330 ] = {
. name = " Gadmei UTV330 " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_TNF_5335MF ,
2007-11-20 15:25:08 -03:00
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2860_BOARD_TERRATEC_HYBRID_XS ] = {
. name = " Terratec Cinergy A Hybrid XS " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2007-11-20 15:25:08 -03:00
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2007-11-20 15:25:08 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-27 09:21:55 -03:00
2008-11-25 09:10:25 -03:00
. input = { {
2007-11-20 15:25:08 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-20 15:25:08 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-20 15:25:08 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} } ,
2007-11-20 15:25:08 -03:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2861_BOARD_KWORLD_PVRTV_300U ] = {
. name = " KWorld PVRTV 300U " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2008-06-08 10:22:03 -03:00
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-06-08 10:22:03 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-06-08 10:22:03 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-06-08 10:22:03 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-06-08 10:22:03 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-06-08 10:22:03 -03:00
} } ,
} ,
2008-07-27 14:03:32 -03:00
[ EM2861_BOARD_YAKUMO_MOVIE_MIXER ] = {
. name = " Yakumo MovieMixer " ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* Capture only device */
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
. input = { {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-01 21:52:58 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2007-10-24 11:08:20 -03:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2861_BOARD_PLEXTOR_PX_TV100U ] = {
. name = " Plextor ConvertX PX-TV100U " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_TNF_5335MF ,
. tda9887_conf = TDA9887_PRESENT ,
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-06-04 13:43:46 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-06-04 13:43:46 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-06-04 13:43:46 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-06-04 13:43:46 -03:00
} } ,
} ,
2008-11-27 07:46:59 -03:00
/* Those boards with em2870 are DVB Only*/
2008-07-27 14:03:32 -03:00
[ EM2870_BOARD_TERRATEC_XS ] = {
. name = " Terratec Cinergy T XS " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
} ,
[ EM2870_BOARD_TERRATEC_XS_MT2060 ] = {
. name = " Terratec Cinergy T XS (MT2060) " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_ABSENT , /* MT2060 */
} ,
[ EM2870_BOARD_KWORLD_350U ] = {
. name = " Kworld 350 U DVB-T " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
} ,
[ EM2870_BOARD_KWORLD_355U ] = {
. name = " Kworld 355 U DVB-T " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
} ,
[ EM2870_BOARD_PINNACLE_PCTV_DVB ] = {
. name = " Pinnacle PCTV DVB-T " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_ABSENT , /* MT2060 */
2008-11-25 07:05:06 -03:00
/* djh - I have serious doubts this is right... */
. xclk = EM28XX_XCLK_IR_RC5_MODE |
EM28XX_XCLK_FREQUENCY_10MHZ ,
2008-07-27 14:03:32 -03:00
} ,
[ EM2870_BOARD_COMPRO_VIDEOMATE ] = {
. name = " Compro, VideoMate U3 " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_ABSENT , /* MT2060 */
} ,
2008-11-27 07:46:59 -03:00
2008-07-27 14:03:32 -03:00
[ EM2880_BOARD_TERRATEC_HYBRID_XS_FR ] = {
. name = " Terratec Hybrid XS Secam " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. has_msp34xx = 1 ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-26 11:04:33 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-26 11:04:33 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-26 11:04:33 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-26 11:04:33 -03:00
} } ,
} ,
2008-07-27 14:03:32 -03:00
[ EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 ] = {
. name = " Hauppauge WinTV HVR 900 " ,
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. mts_firmware = 1 ,
2008-11-25 07:05:06 -03:00
. has_dvb = 1 ,
2008-11-27 07:42:26 -03:00
. dvb_gpio = hauppauge_wintv_hvr_900_digital ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03: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 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. mts_firmware = 1 ,
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-27 07:44:00 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
2008-12-01 21:01:04 -03: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 ,
. ir_codes = ir_codes_hauppauge_new ,
. decoder = EM28XX_TVP5150 ,
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
. amux = EM28XX_AMUX_VIDEO ,
. gpio = hauppauge_wintv_hvr_900_analog ,
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. 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 14:58:58 -03:00
[ EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 ] = {
2008-07-27 14:03:32 -03:00
. name = " Hauppauge WinTV HVR 950 " ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. mts_firmware = 1 ,
. has_dvb = 1 ,
2008-11-27 07:42:26 -03:00
. dvb_gpio = hauppauge_wintv_hvr_900_digital ,
2008-11-13 03:15:55 -03:00
. ir_codes = ir_codes_hauppauge_new ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2880_BOARD_PINNACLE_PCTV_HD_PRO ] = {
. name = " Pinnacle PCTV HD Pro Stick " ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. mts_firmware = 1 ,
. has_dvb = 1 ,
2008-11-27 07:42:26 -03:00
. dvb_gpio = hauppauge_wintv_hvr_900_digital ,
2008-11-13 03:15:55 -03:00
. ir_codes = ir_codes_pinnacle_pctv_hd ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 ] = {
. name = " AMD ATI TV Wonder HD 600 " ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. mts_firmware = 1 ,
. has_dvb = 1 ,
2008-11-27 07:42:26 -03:00
. dvb_gpio = hauppauge_wintv_hvr_900_digital ,
2008-11-16 08:03:53 -03:00
. ir_codes = ir_codes_ati_tv_wonder_hd_600 ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2880_BOARD_TERRATEC_HYBRID_XS ] = {
2008-11-25 09:10:25 -03:00
. name = " Terratec Hybrid XS " ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-11-25 09:10:25 -03:00
. decoder = EM28XX_TVP5150 ,
2008-07-27 14:03:32 -03:00
. has_dvb = 1 ,
2008-11-27 07:42:26 -03:00
. dvb_gpio = default_analog ,
2008-07-27 14:03:32 -03:00
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-27 14:03:32 -03: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 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-07-27 14:03:32 -03:00
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE4 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2800_BOARD_TERRATEC_CINERGY_200 ] = {
. name = " Terratec Cinergy 200 USB " ,
. is_em2800 = 1 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2800_BOARD_GRABBEEX_USB2800 ] = {
. name = " eMPIA Technology, Inc. GrabBeeX+ Video Encoder " ,
. is_em2800 = 1 ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* capture only board */
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2800_BOARD_KWORLD_USB2800 ] = {
. name = " Kworld USB2800 " ,
. is_em2800 = 1 ,
. tuner_type = TUNER_PHILIPS_FCV1236D ,
. tda9887_conf = TDA9887_PRESENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2820_BOARD_PINNACLE_DVC_90 ] = {
. name = " Pinnacle Dazzle DVC 90/DVC 100 " ,
2008-11-27 07:46:59 -03:00
. tuner_type = TUNER_ABSENT , /* capture only board */
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03: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 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
2008-12-27 21:38:14 -03: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 ,
. aout = EM28XX_AOUT_MONO | /* I2S */
EM28XX_AOUT_MASTER , /* Line out pin */
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
. amux = EM28XX_AMUX_LINE_IN ,
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
. amux = EM28XX_AMUX_LINE_IN ,
} } ,
} ,
2008-07-27 14:03:32 -03:00
[ EM2820_BOARD_PROLINK_PLAYTV_USB2 ] = {
. name = " Pixelview Prolink PlayTV USB 2.0 " ,
2008-12-27 21:39:35 -03:00
. has_snapshot_button = 1 ,
2008-07-27 14:03:32 -03:00
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_YMEC_TVF_5533MF ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-11-20 13:43:05 -03:00
. amux = EM28XX_AMUX_VIDEO ,
. aout = EM28XX_AOUT_MONO | /* I2S */
EM28XX_AOUT_MASTER , /* Line out pin */
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
. amux = EM28XX_AMUX_LINE_IN ,
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
. amux = EM28XX_AMUX_LINE_IN ,
} } ,
} ,
[ EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA ] = {
2008-11-25 09:10:25 -03:00
. name = " PointNix Intra-Oral Camera " ,
2008-07-27 14:03:32 -03:00
. has_snapshot_button = 1 ,
2008-11-25 09:10:25 -03:00
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_ABSENT ,
2008-11-25 09:43:29 -03:00
. decoder = EM28XX_SAA711X ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-07-27 14:03:32 -03:00
} } ,
} ,
[ EM2880_BOARD_MSI_DIGIVOX_AD ] = {
. name = " MSI DigiVox A/D " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = em2880_msi_digivox_ad_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = em2880_msi_digivox_ad_analog ,
2008-07-27 14:03:32 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = em2880_msi_digivox_ad_analog ,
2008-07-27 14:03:32 -03: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 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-26 11:04:33 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = em2880_msi_digivox_ad_analog ,
2008-07-26 11:04:33 -03:00
} , {
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = em2880_msi_digivox_ad_analog ,
2008-07-26 11:04:33 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = em2880_msi_digivox_ad_analog ,
2008-07-26 11:04:33 -03:00
} } ,
} ,
2008-07-27 14:03:32 -03:00
[ EM2880_BOARD_KWORLD_DVB_305U ] = {
. name = " KWorld DVB-T 305U " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
2007-10-24 11:08:20 -03:00
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2007-10-24 11:08:20 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2007-10-24 11:08:20 -03:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2880_BOARD_KWORLD_DVB_310U ] = {
. name = " KWorld DVB-T 310U " ,
2007-10-24 11:08:20 -03:00
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-09-30 02:46:41 -03:00
. has_dvb = 1 ,
2008-11-27 07:42:26 -03:00
. dvb_gpio = default_digital ,
2008-09-30 02:46:41 -03:00
. mts_firmware = 1 ,
2007-10-24 11:08:20 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-09-30 02:46:41 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:08:53 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-09-30 02:46:41 -03:00
} , { /* S-video has not been tested yet */
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:08:53 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2007-11-23 14:22:14 -03:00
} } ,
2007-10-24 11:08:20 -03:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2881_BOARD_DNT_DA2_HYBRID ] = {
. name = " DNT DA2 Hybrid " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_TELEVISION ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2881_BOARD_PINNACLE_HYBRID_PRO ] = {
. name = " Pinnacle Hybrid Pro " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-27 14:03:32 -03:00
} , {
2008-07-27 13:47:52 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-27 13:47:52 -03:00
} , {
. type = EM28XX_VMUX_SVIDEO ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = default_analog ,
2008-07-27 13:47:52 -03:00
} } ,
} ,
2008-07-27 14:03:32 -03:00
[ EM2882_BOARD_PINNACLE_HYBRID_PRO ] = {
. name = " Pinnacle Hybrid Pro (2) " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-08-01 08:23:41 -03:00
. mts_firmware = 1 ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_TELEVISION ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2882_BOARD_KWORLD_VS_DVBT ] = {
. name = " Kworld VS-DVB-T 323UR " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_TELEVISION ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2882_BOARD_TERRATEC_HYBRID_XS ] = {
. name = " Terratec Hybrid XS (em2882) " ,
. valid = EM28XX_BOARD_NOT_VALIDATED ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:03:32 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-07-27 14:03:32 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} , {
2005-11-08 21:38:27 -08:00
. type = EM28XX_VMUX_SVIDEO ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:38:15 -08:00
} ,
2008-07-27 14:03:32 -03:00
[ EM2883_BOARD_KWORLD_HYBRID_A316 ] = {
. name = " Kworld PlusTV HD Hybrid 330 " ,
. tuner_type = TUNER_XC2028 ,
2008-11-27 09:21:55 -03:00
. tuner_gpio = default_tuner_gpio ,
2008-07-27 14:03:32 -03:00
. decoder = EM28XX_TVP5150 ,
2008-12-09 15:43:10 -03:00
. mts_firmware = 1 ,
. has_dvb = 1 ,
. dvb_gpio = default_digital ,
2008-11-25 09:10:25 -03:00
. input = { {
2007-11-03 21:21:57 -03:00
. type = EM28XX_VMUX_TELEVISION ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE0 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_VIDEO ,
2008-12-09 15:43:10 -03:00
. gpio = default_analog ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-03 21:21:57 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_COMPOSITE1 ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-03 21:21:57 -03:00
. type = EM28XX_VMUX_SVIDEO ,
2008-07-27 14:03:32 -03:00
. vmux = TVP5150_SVIDEO ,
2008-11-19 11:10:50 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2008-11-27 07:42:26 -03:00
. gpio = hauppauge_wintv_hvr_900_analog ,
2008-06-28 08:57:06 -03:00
} } ,
} ,
2008-07-27 16:58:04 -03:00
[ EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU ] = {
2008-07-27 14:10:11 -03:00
. name = " Compro VideoMate ForYou/Stereo " ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
. decoder = EM28XX_TVP5150 ,
2008-11-25 09:10:25 -03:00
. input = { {
2008-07-27 14:10:11 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
. amux = EM28XX_AMUX_LINE_IN ,
} , {
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
. amux = EM28XX_AMUX_LINE_IN ,
} } ,
} ,
2005-11-08 21:37:07 -08:00
} ;
2005-11-08 21:38:27 -08:00
const unsigned int em28xx_bcount = ARRAY_SIZE ( em28xx_boards ) ;
2005-11-08 21:37:07 -08:00
/* table of devices that work with this driver */
2005-11-08 21:38:27 -08:00
struct usb_device_id em28xx_id_table [ ] = {
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0xeb1a , 0x2750 ) ,
2008-07-27 14:03:32 -03:00
. driver_info = EM2750_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2751 ) ,
. driver_info = EM2750_BOARD_UNKNOWN } ,
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0xeb1a , 0x2800 ) ,
. driver_info = EM2800_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2820 ) ,
. driver_info = EM2820_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2821 ) ,
2008-12-16 23:35:23 -03:00
. driver_info = EM2820_BOARD_UNKNOWN } ,
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0xeb1a , 0x2860 ) ,
. driver_info = EM2820_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2861 ) ,
. driver_info = EM2820_BOARD_UNKNOWN } ,
{ 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 } ,
2008-07-27 14:03:32 -03:00
{ USB_DEVICE ( 0xeb1a , 0xe300 ) ,
. driver_info = EM2861_BOARD_KWORLD_PVRTV_300U } ,
{ USB_DEVICE ( 0xeb1a , 0xe305 ) ,
. driver_info = EM2880_BOARD_KWORLD_DVB_305U } ,
{ USB_DEVICE ( 0xeb1a , 0xe310 ) ,
. driver_info = EM2880_BOARD_MSI_DIGIVOX_AD } ,
{ USB_DEVICE ( 0xeb1a , 0xa316 ) ,
. driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 } ,
{ 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 } ,
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0x0ccd , 0x0036 ) ,
. driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 } ,
2008-07-27 14:03:32 -03: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 ) ,
. driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS } ,
{ USB_DEVICE ( 0x0ccd , 0x0043 ) ,
. driver_info = EM2870_BOARD_TERRATEC_XS } ,
{ USB_DEVICE ( 0x0ccd , 0x0047 ) ,
. driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS } ,
{ USB_DEVICE ( 0x185b , 0x2870 ) ,
. driver_info = EM2870_BOARD_COMPRO_VIDEOMATE } ,
2008-07-27 14:10:11 -03:00
{ USB_DEVICE ( 0x185b , 0x2041 ) ,
2008-07-27 16:58:04 -03:00
. driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU } ,
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0x2040 , 0x4200 ) ,
. driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 } ,
2008-01-13 12:02:20 -03:00
{ USB_DEVICE ( 0x2040 , 0x4201 ) ,
. driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 } ,
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0x2040 , 0x6500 ) ,
. driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 } ,
2008-01-30 17:23:00 -03:00
{ USB_DEVICE ( 0x2040 , 0x6502 ) ,
2008-06-08 10:22:03 -03:00
. driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 } ,
2008-05-01 18:02:30 -03:00
{ USB_DEVICE ( 0x2040 , 0x6513 ) , /* HCW HVR-980 */
2008-07-27 14:58:58 -03:00
. driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 } ,
2008-05-01 18:02:30 -03:00
{ USB_DEVICE ( 0x2040 , 0x6517 ) , /* HP HVR-950 */
2008-07-27 14:58:58 -03:00
. driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 } ,
2008-05-01 18:02:30 -03:00
{ USB_DEVICE ( 0x2040 , 0x651b ) , /* RP HVR-950 */
2008-07-27 14:58:58 -03:00
. driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 } ,
2008-12-01 21:01:04 -03:00
{ USB_DEVICE ( 0x2040 , 0x651f ) ,
. driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 } ,
2008-07-26 11:04:33 -03:00
{ USB_DEVICE ( 0x0438 , 0xb002 ) ,
. driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 } ,
2008-07-27 14:03:32 -03: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 ) ,
. driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO } ,
{ USB_DEVICE ( 0x2304 , 0x0227 ) ,
. driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO } ,
{ USB_DEVICE ( 0x0413 , 0x6023 ) ,
. driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII } ,
{ USB_DEVICE ( 0x093b , 0xa005 ) ,
. driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U } ,
2005-11-08 21:37:07 -08:00
{ } ,
} ;
2007-11-23 14:22:14 -03:00
MODULE_DEVICE_TABLE ( usb , em28xx_id_table ) ;
2007-11-03 21:20:59 -03:00
2008-04-17 21:40:45 -03:00
/*
* EEPROM hash table for devices with generic USB IDs
*/
2007-11-04 08:32:42 -03:00
static struct em28xx_hash_table em28xx_eeprom_hash [ ] = {
2007-11-03 21:21:57 -03:00
/* P/N: SA 60002070465 Tuner: TVF7533-MF */
2007-11-23 14:22:14 -03:00
{ 0x6ce05a8f , EM2820_BOARD_PROLINK_PLAYTV_USB2 , TUNER_YMEC_TVF_5533MF } ,
2008-12-27 21:38:14 -03:00
{ 0x72cc5a8b , EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 , TUNER_YMEC_TVF_5533MF } ,
2008-09-30 02:46:41 -03:00
{ 0x966a0441 , EM2880_BOARD_KWORLD_DVB_310U , TUNER_XC2028 } ,
2007-11-03 21:20:59 -03:00
} ;
2005-11-08 21:37:07 -08:00
2007-11-04 08:32:42 -03:00
/* I2C devicelist hash table for devices with generic USB IDs */
2007-11-04 08:06:48 -03:00
static struct em28xx_hash_table em28xx_i2c_hash [ ] = {
2007-11-23 14:22:14 -03:00
{ 0xb06a32c3 , EM2800_BOARD_TERRATEC_CINERGY_200 , TUNER_LG_PAL_NEW_TAPC } ,
{ 0xf51200e3 , EM2800_BOARD_VGEAR_POCKETTV , TUNER_LG_PAL_NEW_TAPC } ,
2008-06-28 08:57:06 -03:00
{ 0x1ba50080 , EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA , TUNER_ABSENT } ,
2007-11-04 08:06:48 -03:00
} ;
2008-09-12 13:31:45 -03:00
int em28xx_tuner_callback ( void * ptr , int component , int command , int arg )
2008-04-17 21:37:31 -03:00
{
2008-04-17 21:40:45 -03:00
int rc = 0 ;
2008-04-17 21:37:31 -03:00
struct em28xx * dev = ptr ;
if ( dev - > tuner_type ! = TUNER_XC2028 )
return 0 ;
if ( command ! = XC2028_TUNER_RESET )
return 0 ;
2008-11-27 09:21:55 -03:00
rc = em28xx_gpio_set ( dev , dev - > board . tuner_gpio ) ;
2008-04-17 21:37:31 -03:00
return rc ;
}
EXPORT_SYMBOL_GPL ( em28xx_tuner_callback ) ;
2008-11-25 09:39:50 -03:00
static void inline em28xx_set_model ( struct em28xx * dev )
2008-04-17 21:37:31 -03:00
{
2008-11-25 09:39:50 -03:00
memcpy ( & dev - > board , & em28xx_boards [ dev - > model ] , sizeof ( dev - > board ) ) ;
2008-12-29 22:27:30 -03:00
/* Those are the default values for the majority of boards
Use those values if not specified otherwise at boards entry
*/
if ( ! dev - > board . xclk )
dev - > board . xclk = EM28XX_XCLK_IR_RC5_MODE |
EM28XX_XCLK_FREQUENCY_12MHZ ;
if ( ! dev - > board . i2c_speed )
dev - > board . i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
EM28XX_I2C_FREQ_100_KHZ ;
2008-04-17 21:37:31 -03:00
}
2007-11-03 21:20:59 -03:00
/* Since em28xx_pre_card_setup() requires a proper dev->model,
* this won ' t work for boards with generic PCI IDs
*/
2006-01-23 17:11:10 -02:00
void em28xx_pre_card_setup ( struct em28xx * dev )
{
2008-04-17 21:42:14 -03:00
int rc ;
2008-11-25 10:06:21 -03:00
em28xx_set_model ( dev ) ;
2008-11-28 23:46:43 -03:00
em28xx_info ( " Identified as %s (card=%d) \n " ,
dev - > board . name , dev - > model ) ;
2008-11-25 10:06:21 -03:00
2008-11-12 02:05:06 -03:00
/* Set the default GPO/GPIO for legacy devices */
dev - > reg_gpo_num = EM2880_R04_GPO ;
dev - > reg_gpio_num = EM28XX_R08_GPIO ;
2008-04-17 21:48:00 -03:00
2008-04-17 21:42:14 -03:00
dev - > wait_after_write = 5 ;
2008-11-12 02:05:06 -03:00
/* Based on the Chip ID, set the device configuration */
2008-04-17 21:44:58 -03:00
rc = em28xx_read_reg ( dev , EM28XX_R0A_CHIPID ) ;
2008-04-17 21:42:14 -03:00
if ( rc > 0 ) {
2008-11-12 02:05:02 -03:00
dev - > chip_id = rc ;
2008-11-25 10:06:21 -03:00
switch ( dev - > chip_id ) {
2008-11-18 05:05:46 -03:00
case CHIP_ID_EM2750 :
em28xx_info ( " chip ID is em2750 \n " ) ;
break ;
2008-11-16 10:40:21 -03:00
case CHIP_ID_EM2820 :
em28xx_info ( " chip ID is em2820 \n " ) ;
break ;
case CHIP_ID_EM2840 :
em28xx_info ( " chip ID is em2840 \n " ) ;
break ;
2008-06-10 12:35:42 -03:00
case CHIP_ID_EM2860 :
em28xx_info ( " chip ID is em2860 \n " ) ;
break ;
2008-12-16 23:15:33 -03:00
case CHIP_ID_EM2870 :
em28xx_info ( " chip ID is em2870 \n " ) ;
dev - > wait_after_write = 0 ;
break ;
2008-11-12 02:04:48 -03:00
case CHIP_ID_EM2874 :
em28xx_info ( " chip ID is em2874 \n " ) ;
2008-11-12 02:05:06 -03:00
dev - > reg_gpio_num = EM2874_R80_GPIO ;
2008-11-12 02:04:48 -03:00
dev - > wait_after_write = 0 ;
break ;
2008-04-17 21:42:58 -03:00
case CHIP_ID_EM2883 :
2008-04-17 21:42:14 -03:00
em28xx_info ( " chip ID is em2882/em2883 \n " ) ;
dev - > wait_after_write = 0 ;
break ;
default :
2008-11-25 10:06:21 -03:00
em28xx_info ( " em28xx chip ID = %d \n " , dev - > chip_id ) ;
2008-04-17 21:42:14 -03:00
}
}
2008-11-12 02:05:06 -03:00
/* Prepopulate cached GPO register content */
rc = em28xx_read_reg ( dev , dev - > reg_gpo_num ) ;
if ( rc > = 0 )
dev - > reg_gpo = rc ;
2008-12-29 22:27:30 -03:00
/* Set the initial XCLK and I2C clock values based on the board
definition */
2008-11-25 09:39:50 -03:00
em28xx_write_reg ( dev , EM28XX_R0F_XCLK , dev - > board . xclk & 0x7f ) ;
em28xx_write_reg ( dev , EM28XX_R06_I2C_CLK , dev - > board . i2c_speed ) ;
2008-11-25 07:05:06 -03:00
msleep ( 50 ) ;
2006-01-23 17:11:10 -02:00
/* request some modules */
2007-11-23 14:22:14 -03:00
switch ( dev - > model ) {
2008-07-27 14:03:32 -03:00
case EM2861_BOARD_PLEXTOR_PX_TV100U :
/* FIXME guess */
/* Turn on analog audio output */
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfd ) ;
2008-07-27 14:03:32 -03:00
break ;
case EM2861_BOARD_KWORLD_PVRTV_300U :
case EM2880_BOARD_KWORLD_DVB_305U :
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0x6d ) ;
2008-07-27 14:03:32 -03:00
msleep ( 10 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0x7d ) ;
2008-07-27 14:03:32 -03:00
msleep ( 10 ) ;
break ;
case EM2870_BOARD_COMPRO_VIDEOMATE :
/* TODO: someone can do some cleanup here...
not everything ' s needed */
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM2880_R04_GPO , 0x00 ) ;
2008-07-27 14:03:32 -03:00
msleep ( 10 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM2880_R04_GPO , 0x01 ) ;
2008-07-27 14:03:32 -03:00
msleep ( 10 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfd ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfc ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xdc ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfc ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
break ;
case EM2870_BOARD_TERRATEC_XS_MT2060 :
/* this device needs some gpio writes to get the DVB-T
demod work */
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfe ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xde ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfe ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
break ;
case EM2870_BOARD_PINNACLE_PCTV_DVB :
/* this device needs some gpio writes to get the
DVB - T demod work */
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfe ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xde ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfe ) ;
2008-07-27 14:03:32 -03:00
mdelay ( 70 ) ;
break ;
case EM2820_BOARD_GADMEI_UTV310 :
case EM2820_BOARD_MSI_VOX_USB_2 :
2008-11-25 07:05:06 -03:00
/* enables audio for that devices */
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xfd ) ;
2008-04-17 21:40:45 -03:00
break ;
}
2008-04-17 21:48:00 -03:00
2008-11-27 09:21:55 -03:00
em28xx_gpio_set ( dev , dev - > board . tuner_gpio ) ;
2008-04-17 21:48:00 -03:00
em28xx_set_mode ( dev , EM28XX_ANALOG_MODE ) ;
/* Unlock device */
2008-11-27 09:10:40 -03:00
em28xx_set_mode ( dev , EM28XX_SUSPEND ) ;
2006-01-23 17:11:10 -02:00
}
2008-04-18 18:34:31 -03:00
static void em28xx_setup_xc3028 ( struct em28xx * dev , struct xc2028_ctrl * ctl )
2008-04-17 21:37:53 -03:00
{
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 ) {
2008-04-18 18:37:25 -03:00
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 :
ctl - > demod = XC3028_FE_ZARLINK456 ;
break ;
2008-07-26 10:47:00 -03:00
case EM2880_BOARD_TERRATEC_HYBRID_XS :
ctl - > demod = XC3028_FE_ZARLINK456 ;
break ;
2008-06-08 10:22:03 -03:00
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 :
/* djh - Not sure which demod we need here */
ctl - > demod = XC3028_FE_DEFAULT ;
break ;
2008-09-16 02:02:12 -03:00
case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 :
ctl - > demod = XC3028_FE_DEFAULT ;
ctl - > fname = XC3028L_DEFAULT_FIRMWARE ;
break ;
2008-12-01 21:01:04 -03:00
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 :
2008-07-27 14:58:58 -03:00
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 :
2008-06-04 13:43:46 -03:00
case EM2880_BOARD_PINNACLE_PCTV_HD_PRO :
2008-04-18 18:37:25 -03:00
/* FIXME: Better to specify the needed IF */
2008-04-17 21:38:27 -03:00
ctl - > demod = XC3028_FE_DEFAULT ;
break ;
2008-04-17 21:37:53 -03:00
default :
ctl - > demod = XC3028_FE_OREN538 ;
}
}
2007-11-23 14:22:14 -03:00
static void em28xx_config_tuner ( struct em28xx * dev )
2007-10-29 11:33:18 -03:00
{
struct v4l2_priv_tun_config xc2028_cfg ;
2007-11-03 21:20:59 -03:00
struct tuner_setup tun_setup ;
struct v4l2_frequency f ;
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 06:59:20 -03:00
if ( dev - > tuner_type = = TUNER_ABSENT )
2007-11-03 21:20:59 -03:00
return ;
tun_setup . mode_mask = T_ANALOG_TV | T_RADIO ;
tun_setup . type = dev - > tuner_type ;
tun_setup . addr = dev - > tuner_addr ;
tun_setup . tuner_callback = em28xx_tuner_callback ;
em28xx_i2c_call_clients ( dev , TUNER_SET_TYPE_ADDR , & tun_setup ) ;
if ( dev - > tuner_type = = TUNER_XC2028 ) {
2008-04-17 21:37:53 -03:00
struct xc2028_ctrl ctl ;
2007-11-03 21:20:59 -03:00
2008-04-17 21:37:53 -03:00
em28xx_setup_xc3028 ( dev , & ctl ) ;
2007-11-03 21:20:59 -03:00
xc2028_cfg . tuner = TUNER_XC2028 ;
xc2028_cfg . priv = & ctl ;
2007-10-29 11:33:18 -03:00
2007-11-03 21:20:59 -03:00
em28xx_i2c_call_clients ( dev , TUNER_SET_CONFIG , & xc2028_cfg ) ;
}
/* configure tuner */
f . tuner = 0 ;
f . type = V4L2_TUNER_ANALOG_TV ;
f . frequency = 9076 ; /* just a magic number */
dev - > ctl_freq = f . frequency ;
em28xx_i2c_call_clients ( dev , VIDIOC_S_FREQUENCY , & f ) ;
}
static int em28xx_hint_board ( struct em28xx * dev )
{
int i ;
2007-10-29 11:33:18 -03:00
2007-11-04 08:32:42 -03: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 11:33:18 -03:00
2007-11-03 21:20:59 -03:00
em28xx_errdev ( " Your board has no unique USB ID. \n " ) ;
em28xx_errdev ( " A hint were successfully done, "
" based on eeprom hash. \n " ) ;
em28xx_errdev ( " This method is not 100%% failproof. \n " ) ;
em28xx_errdev ( " If the board were missdetected, "
" please email this log to: \n " ) ;
em28xx_errdev ( " \t V4L Mailing List "
" <video4linux-list@redhat.com> \n " ) ;
em28xx_errdev ( " Board detected as %s \n " ,
em28xx_boards [ dev - > model ] . name ) ;
2007-10-29 11:33:18 -03:00
2007-11-03 21:20:59 -03:00
return 0 ;
}
}
2007-11-04 08:06:48 -03:00
2007-11-04 08:32:42 -03: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 08:06:48 -03:00
/* user did not request i2c scanning => do it now */
if ( ! dev - > i2c_hash )
em28xx_do_i2c_scan ( dev ) ;
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 ;
em28xx_errdev ( " Your board has no unique USB ID. \n " ) ;
em28xx_errdev ( " A hint were successfully done, "
" based on i2c devicelist hash. \n " ) ;
em28xx_errdev ( " This method is not 100%% failproof. \n " ) ;
em28xx_errdev ( " If the board were missdetected, "
" please email this log to: \n " ) ;
em28xx_errdev ( " \t V4L Mailing List "
" <video4linux-list@redhat.com> \n " ) ;
em28xx_errdev ( " Board detected as %s \n " ,
em28xx_boards [ dev - > model ] . name ) ;
return 0 ;
}
}
2007-11-03 21:20:59 -03:00
em28xx_errdev ( " Your board has no unique USB ID and thus need a "
" hint to be detected. \n " ) ;
em28xx_errdev ( " You may try to use card=<n> insmod option to "
" workaround that. \n " ) ;
em28xx_errdev ( " Please send an email with this log to: \n " ) ;
em28xx_errdev ( " \t V4L Mailing List <video4linux-list@redhat.com> \n " ) ;
em28xx_errdev ( " Board eeprom hash is 0x%08lx \n " , dev - > hash ) ;
2007-11-04 08:06:48 -03:00
em28xx_errdev ( " Board i2c devicelist hash is 0x%08lx \n " , dev - > i2c_hash ) ;
2007-11-03 21:20:59 -03:00
em28xx_errdev ( " Here is a list of valid choices for the card=<n> "
" insmod option: \n " ) ;
for ( i = 0 ; i < em28xx_bcount ; i + + ) {
em28xx_errdev ( " card=%d -> %s \n " ,
i , em28xx_boards [ i ] . name ) ;
}
return - 1 ;
2007-10-29 11:33:18 -03:00
}
2008-01-13 15:42:17 -03:00
/* ----------------------------------------------------------------------- */
void em28xx_set_ir ( struct em28xx * dev , struct IR_i2c * ir )
{
if ( disable_ir ) {
ir - > get_key = NULL ;
return ;
}
/* detect & configure */
switch ( dev - > model ) {
case ( EM2800_BOARD_UNKNOWN ) :
break ;
case ( EM2820_BOARD_UNKNOWN ) :
break ;
case ( EM2800_BOARD_TERRATEC_CINERGY_200 ) :
case ( EM2820_BOARD_TERRATEC_CINERGY_250 ) :
ir - > ir_codes = ir_codes_em_terratec ;
ir - > get_key = em28xx_get_key_terratec ;
snprintf ( ir - > c . name , sizeof ( ir - > c . name ) ,
" i2c IR (EM28XX Terratec) " ) ;
break ;
case ( EM2820_BOARD_PINNACLE_USB_2 ) :
ir - > ir_codes = ir_codes_pinnacle_grey ;
ir - > get_key = em28xx_get_key_pinnacle_usb_grey ;
snprintf ( ir - > c . name , sizeof ( ir - > c . name ) ,
" i2c IR (EM28XX Pinnacle PCTV) " ) ;
break ;
case ( EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 ) :
ir - > ir_codes = ir_codes_hauppauge_new ;
ir - > get_key = em28xx_get_key_em_haup ;
snprintf ( ir - > c . name , sizeof ( ir - > c . name ) ,
" i2c IR (EM2840 Hauppauge) " ) ;
break ;
case ( EM2820_BOARD_MSI_VOX_USB_2 ) :
break ;
case ( EM2800_BOARD_LEADTEK_WINFAST_USBII ) :
break ;
case ( EM2800_BOARD_KWORLD_USB2800 ) :
break ;
2008-07-27 13:47:52 -03:00
case ( EM2800_BOARD_GRABBEEX_USB2800 ) :
break ;
2008-01-13 15:42:17 -03:00
}
}
2005-11-08 21:38:27 -08:00
void em28xx_card_setup ( struct em28xx * dev )
2005-11-08 21:37:07 -08:00
{
2007-11-05 08:42:55 -03:00
em28xx_set_model ( dev ) ;
dev - > tuner_type = em28xx_boards [ dev - > model ] . tuner_type ;
2008-11-20 18:47:37 -03:00
if ( em28xx_boards [ dev - > model ] . tuner_addr )
dev - > tuner_addr = em28xx_boards [ dev - > model ] . tuner_addr ;
2007-11-05 08:42:55 -03:00
2005-11-08 21:37:07 -08:00
/* request some modules */
2007-11-03 21:20:59 -03:00
switch ( dev - > model ) {
case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 :
2007-11-05 09:30:39 -03:00
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 :
2008-06-08 10:22:03 -03:00
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 :
2008-12-01 21:01:04 -03:00
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 :
2008-07-27 14:58:58 -03:00
case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 :
2007-11-03 21:20:59 -03:00
{
struct tveeprom tv ;
2005-11-08 21:37:07 -08:00
# ifdef CONFIG_MODULES
2007-11-03 21:20:59 -03:00
request_module ( " tveeprom " ) ;
2005-11-08 21:37:07 -08:00
# endif
2007-11-03 21:20:59 -03:00
/* Call first TVeeprom */
dev - > i2c_client . addr = 0xa0 > > 1 ;
tveeprom_hauppauge_analog ( & dev - > i2c_client , & tv , dev - > eedata ) ;
2006-02-07 06:25:39 -02:00
2007-11-03 21:20:59 -03: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 06:59:20 -03:00
2008-07-23 05:09:15 -03:00
if ( tv . audio_processor = = V4L2_IDENT_MSPX4XX ) {
2007-11-03 21:20:59 -03:00
dev - > i2s_speed = 2048000 ;
2008-11-25 09:39:50 -03:00
dev - > board . has_msp34xx = 1 ;
2007-11-03 21:20:59 -03:00
}
2007-11-05 09:30:39 -03:00
# ifdef CONFIG_MODULES
if ( tv . has_ir )
request_module ( " ir-kbd-i2c " ) ;
# endif
2007-11-03 21:20:59 -03:00
break ;
2005-11-08 21:37:07 -08:00
}
2007-11-03 21:20:59 -03:00
case EM2820_BOARD_KWORLD_PVRTV2800RF :
/* GPIO enables sound on KWORLD PVR TV 2800RF */
2008-11-25 06:04:02 -03:00
em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xf9 ) ;
2007-11-03 21:20:59 -03:00
break ;
case EM2820_BOARD_UNKNOWN :
case EM2800_BOARD_UNKNOWN :
2008-09-30 02:46:41 -03: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 08:42:55 -03:00
if ( ! em28xx_hint_board ( dev ) )
em28xx_set_model ( dev ) ;
2008-07-27 14:03:32 -03:00
break ;
2007-11-03 21:20:59 -03:00
}
2008-11-25 09:39:50 -03:00
if ( dev - > board . has_snapshot_button )
2008-06-28 08:57:06 -03:00
em28xx_register_snapshot_button ( dev ) ;
2008-11-25 09:39:50 -03:00
if ( dev - > board . valid = = EM28XX_BOARD_NOT_VALIDATED ) {
2008-07-27 14:03:32 -03:00
em28xx_errdev ( " \n \n " ) ;
em28xx_errdev ( " The support for this board weren't "
" valid yet. \n " ) ;
em28xx_errdev ( " Please send a report of having this working \n " ) ;
em28xx_errdev ( " not to V4L mailing list (and/or to other "
" addresses) \n \n " ) ;
}
2007-11-05 08:42:55 -03:00
/* Allow override tuner type by a module parameter */
2007-11-03 21:20:59 -03:00
if ( tuner > = 0 )
dev - > tuner_type = tuner ;
# ifdef CONFIG_MODULES
/* request some modules */
2008-11-25 09:39:50 -03:00
if ( dev - > board . has_msp34xx )
2007-11-03 21:20:59 -03:00
request_module ( " msp3400 " ) ;
2008-11-25 09:43:29 -03:00
if ( dev - > board . decoder = = EM28XX_SAA711X )
2007-11-03 21:20:59 -03:00
request_module ( " saa7115 " ) ;
2008-11-25 09:39:50 -03:00
if ( dev - > board . decoder = = EM28XX_TVP5150 )
2007-11-03 21:20:59 -03:00
request_module ( " tvp5150 " ) ;
2008-11-25 09:39:50 -03:00
if ( dev - > board . tuner_type ! = TUNER_ABSENT )
2007-11-03 21:20:59 -03:00
request_module ( " tuner " ) ;
# endif
2007-11-23 14:22:14 -03:00
em28xx_config_tuner ( dev ) ;
2008-11-12 08:41:29 -03:00
em28xx_ir_init ( dev ) ;
2005-11-08 21:37:07 -08:00
}
2008-11-25 13:10:14 -03:00
2008-12-28 22:18:14 -03:00
# if defined(CONFIG_MODULES) && defined(MODULE)
static void request_module_async ( struct work_struct * work )
{
struct em28xx * dev = container_of ( work ,
struct em28xx , request_module_wk ) ;
if ( dev - > has_audio_class )
request_module ( " snd-usb-audio " ) ;
else if ( dev - > has_alsa_audio )
request_module ( " em28xx-alsa " ) ;
if ( dev - > board . has_dvb )
request_module ( " em28xx-dvb " ) ;
}
static void request_modules ( struct em28xx * dev )
{
INIT_WORK ( & dev - > request_module_wk , request_module_async ) ;
schedule_work ( & dev - > request_module_wk ) ;
}
# else
# define request_modules(dev)
# endif /* CONFIG_MODULES */
/*
* em28xx_realease_resources ( )
* unregisters the v4l2 , i2c and usb devices
* called when the device gets disconected or at module unload
*/
void em28xx_release_resources ( struct em28xx * dev )
{
if ( dev - > sbutton_input_dev )
em28xx_deregister_snapshot_button ( dev ) ;
if ( dev - > ir )
em28xx_ir_fini ( dev ) ;
/*FIXME: I2C IR should be disconnected */
em28xx_release_analog_resources ( dev ) ;
em28xx_remove_from_devlist ( dev ) ;
em28xx_i2c_unregister ( dev ) ;
usb_put_dev ( dev - > udev ) ;
/* Mark device as unused */
em28xx_devused & = ~ ( 1 < < dev - > devno ) ;
} ;
/*
* em28xx_init_dev ( )
* allocates and inits the device structs , registers i2c bus and v4l device
*/
2009-01-05 01:00:40 -03:00
static int em28xx_init_dev ( struct em28xx * * devhandle , struct usb_device * udev ,
2008-12-28 22:18:14 -03:00
int minor )
{
struct em28xx * dev = * devhandle ;
int retval = - ENOMEM ;
int errCode ;
dev - > udev = udev ;
mutex_init ( & dev - > ctrl_urb_lock ) ;
spin_lock_init ( & dev - > slock ) ;
init_waitqueue_head ( & dev - > open ) ;
init_waitqueue_head ( & dev - > wait_frame ) ;
init_waitqueue_head ( & dev - > wait_stream ) ;
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 ;
em28xx_pre_card_setup ( dev ) ;
if ( ! dev - > board . is_em2800 ) {
/* Sets I2C speed to 100 KHz */
retval = em28xx_write_reg ( dev , EM28XX_R06_I2C_CLK , 0x40 ) ;
if ( retval < 0 ) {
em28xx_errdev ( " %s: em28xx_write_regs_req failed! "
" retval [%d] \n " ,
__func__ , retval ) ;
return retval ;
}
}
/* register i2c bus */
errCode = em28xx_i2c_register ( dev ) ;
if ( errCode < 0 ) {
em28xx_errdev ( " %s: em28xx_i2c_register - errCode [%d]! \n " ,
__func__ , errCode ) ;
return errCode ;
}
/* Do board specific init and eeprom reading */
em28xx_card_setup ( dev ) ;
/* Configure audio */
errCode = em28xx_audio_setup ( dev ) ;
if ( errCode < 0 ) {
em28xx_errdev ( " %s: Error while setting audio - errCode [%d]! \n " ,
__func__ , errCode ) ;
}
/* wake i2c devices */
em28xx_wake_i2c ( dev ) ;
/* init video dma queues */
INIT_LIST_HEAD ( & dev - > vidq . active ) ;
INIT_LIST_HEAD ( & dev - > vidq . queued ) ;
if ( dev - > board . has_msp34xx ) {
/* Send a reset to other chips via gpio */
errCode = em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xf7 ) ;
if ( errCode < 0 ) {
em28xx_errdev ( " %s: em28xx_write_regs_req - "
" msp34xx(1) failed! errCode [%d] \n " ,
__func__ , errCode ) ;
return errCode ;
}
msleep ( 3 ) ;
errCode = em28xx_write_reg ( dev , EM28XX_R08_GPIO , 0xff ) ;
if ( errCode < 0 ) {
em28xx_errdev ( " %s: em28xx_write_regs_req - "
" msp34xx(2) failed! errCode [%d] \n " ,
__func__ , errCode ) ;
return errCode ;
}
msleep ( 3 ) ;
}
em28xx_add_into_devlist ( dev ) ;
retval = em28xx_register_analog_devices ( dev ) ;
if ( retval < 0 ) {
em28xx_release_resources ( dev ) ;
goto fail_reg_devices ;
}
em28xx_init_extension ( dev ) ;
/* Save some power by putting tuner to sleep */
em28xx_i2c_call_clients ( dev , TUNER_SET_STANDBY , NULL ) ;
return 0 ;
fail_reg_devices :
return retval ;
}
/*
* em28xx_usb_probe ( )
* checks for supported devices
*/
static int em28xx_usb_probe ( struct usb_interface * interface ,
const struct usb_device_id * id )
{
const struct usb_endpoint_descriptor * endpoint ;
struct usb_device * udev ;
struct usb_interface * uif ;
struct em28xx * dev = NULL ;
int retval = - ENODEV ;
int i , nr , ifnum , isoc_pipe ;
char * speed ;
char descr [ 255 ] = " " ;
udev = usb_get_dev ( interface_to_usbdev ( interface ) ) ;
ifnum = interface - > altsetting [ 0 ] . desc . bInterfaceNumber ;
/* Check to see next free device and mark as used */
nr = find_first_zero_bit ( & em28xx_devused , EM28XX_MAXBOARDS ) ;
em28xx_devused | = 1 < < nr ;
/* Don't register audio interfaces */
if ( interface - > altsetting [ 0 ] . desc . bInterfaceClass = = USB_CLASS_AUDIO ) {
em28xx_err ( DRIVER_NAME " audio device (%04x:%04x): "
" interface %i, class %i \n " ,
le16_to_cpu ( udev - > descriptor . idVendor ) ,
le16_to_cpu ( udev - > descriptor . idProduct ) ,
ifnum ,
interface - > altsetting [ 0 ] . desc . bInterfaceClass ) ;
em28xx_devused & = ~ ( 1 < < nr ) ;
return - ENODEV ;
}
endpoint = & interface - > cur_altsetting - > endpoint [ 0 ] . desc ;
/* check if the device has the iso in endpoint at the correct place */
2008-12-29 21:49:22 -03:00
if ( usb_endpoint_xfer_isoc ( endpoint )
& &
2008-12-28 22:18:14 -03:00
( interface - > altsetting [ 1 ] . endpoint [ 0 ] . desc . wMaxPacketSize = = 940 ) ) {
/* It's a newer em2874/em2875 device */
isoc_pipe = 0 ;
} else {
int check_interface = 1 ;
isoc_pipe = 1 ;
endpoint = & interface - > cur_altsetting - > endpoint [ 1 ] . desc ;
2009-01-03 16:53:10 -03:00
if ( ! usb_endpoint_xfer_isoc ( endpoint ) )
2008-12-28 22:18:14 -03:00
check_interface = 0 ;
2008-12-29 21:49:22 -03:00
if ( usb_endpoint_dir_out ( endpoint ) )
2008-12-28 22:18:14 -03:00
check_interface = 0 ;
if ( ! check_interface ) {
em28xx_err ( DRIVER_NAME " video device (%04x:%04x): "
" interface %i, class %i found. \n " ,
le16_to_cpu ( udev - > descriptor . idVendor ) ,
le16_to_cpu ( udev - > descriptor . idProduct ) ,
ifnum ,
interface - > altsetting [ 0 ] . desc . bInterfaceClass ) ;
em28xx_err ( DRIVER_NAME " This is an anciliary "
" interface not used by the driver \n " ) ;
em28xx_devused & = ~ ( 1 < < nr ) ;
return - ENODEV ;
}
}
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 " ;
}
if ( udev - > manufacturer )
strlcpy ( descr , udev - > manufacturer , sizeof ( descr ) ) ;
if ( udev - > product ) {
if ( * descr )
strlcat ( descr , " " , sizeof ( descr ) ) ;
strlcat ( descr , udev - > product , sizeof ( descr ) ) ;
}
if ( * descr )
strlcat ( descr , " " , sizeof ( descr ) ) ;
printk ( DRIVER_NAME " : New device %s@ %s Mbps "
" (%04x:%04x, interface %d, class %d) \n " ,
descr ,
speed ,
le16_to_cpu ( udev - > descriptor . idVendor ) ,
le16_to_cpu ( udev - > descriptor . idProduct ) ,
ifnum ,
interface - > altsetting - > desc . bInterfaceNumber ) ;
if ( nr > = EM28XX_MAXBOARDS ) {
printk ( DRIVER_NAME " : Supports only %i em28xx boards. \n " ,
EM28XX_MAXBOARDS ) ;
em28xx_devused & = ~ ( 1 < < nr ) ;
return - ENOMEM ;
}
/* allocate memory for our device state and initialize it */
dev = kzalloc ( sizeof ( * dev ) , GFP_KERNEL ) ;
if ( dev = = NULL ) {
em28xx_err ( DRIVER_NAME " : out of memory! \n " ) ;
em28xx_devused & = ~ ( 1 < < nr ) ;
return - ENOMEM ;
}
snprintf ( dev - > name , 29 , " em28xx #%d " , nr ) ;
dev - > devno = nr ;
dev - > model = id - > driver_info ;
dev - > alt = - 1 ;
/* Checks if audio is provided by some interface */
for ( i = 0 ; i < udev - > config - > desc . bNumInterfaces ; i + + ) {
uif = udev - > config - > interface [ i ] ;
if ( uif - > altsetting [ 0 ] . desc . bInterfaceClass = = USB_CLASS_AUDIO ) {
dev - > has_audio_class = 1 ;
break ;
}
}
/* compute alternate max packet sizes */
uif = udev - > actconfig - > interface [ 0 ] ;
dev - > num_alt = uif - > num_altsetting ;
dev - > alt_max_pkt_size = kmalloc ( 32 * dev - > num_alt , GFP_KERNEL ) ;
if ( dev - > alt_max_pkt_size = = NULL ) {
em28xx_errdev ( " out of memory! \n " ) ;
em28xx_devused & = ~ ( 1 < < nr ) ;
kfree ( dev ) ;
return - ENOMEM ;
}
for ( i = 0 ; i < dev - > num_alt ; i + + ) {
u16 tmp = le16_to_cpu ( uif - > altsetting [ i ] . endpoint [ isoc_pipe ] . desc . wMaxPacketSize ) ;
dev - > alt_max_pkt_size [ i ] =
( tmp & 0x07ff ) * ( ( ( tmp & 0x1800 ) > > 11 ) + 1 ) ;
}
if ( ( card [ nr ] > = 0 ) & & ( card [ nr ] < em28xx_bcount ) )
dev - > model = card [ nr ] ;
/* allocate device struct */
mutex_init ( & dev - > lock ) ;
mutex_lock ( & dev - > lock ) ;
retval = em28xx_init_dev ( & dev , udev , nr ) ;
if ( retval ) {
em28xx_devused & = ~ ( 1 < < dev - > devno ) ;
kfree ( dev ) ;
return retval ;
}
/* save our data pointer in this interface device */
usb_set_intfdata ( interface , dev ) ;
request_modules ( dev ) ;
/* Should be the last thing to do, to avoid newer udev's to
open the device before fully initializing it
*/
mutex_unlock ( & dev - > lock ) ;
return 0 ;
}
/*
* em28xx_usb_disconnect ( )
* called when the device gets diconencted
* 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 ;
em28xx_info ( " disconnecting %s \n " , dev - > vdev - > name ) ;
/* wait until all current v4l2 io is finished then deallocate
resources */
mutex_lock ( & dev - > lock ) ;
wake_up_interruptible_all ( & dev - > open ) ;
if ( dev - > users ) {
em28xx_warn
( " device /dev/video%d is open! Deregistration and memory "
" deallocation are deferred on close. \n " ,
dev - > vdev - > num ) ;
dev - > state | = DEV_MISCONFIGURED ;
em28xx_uninit_isoc ( dev ) ;
dev - > state | = DEV_DISCONNECTED ;
wake_up_interruptible ( & dev - > wait_frame ) ;
wake_up_interruptible ( & dev - > wait_stream ) ;
} else {
dev - > state | = DEV_DISCONNECTED ;
em28xx_release_resources ( dev ) ;
}
em28xx_close_extension ( dev ) ;
mutex_unlock ( & dev - > lock ) ;
if ( ! dev - > users ) {
kfree ( dev - > alt_max_pkt_size ) ;
kfree ( dev ) ;
}
}
static struct usb_driver em28xx_usb_driver = {
. name = " em28xx " ,
. probe = em28xx_usb_probe ,
. disconnect = em28xx_usb_disconnect ,
. id_table = em28xx_id_table ,
} ;
static int __init em28xx_module_init ( void )
{
int result ;
/* register this driver with the USB subsystem */
result = usb_register ( & em28xx_usb_driver ) ;
if ( result )
em28xx_err ( DRIVER_NAME
" usb_register failed. Error number %d. \n " , result ) ;
printk ( KERN_INFO DRIVER_NAME " driver loaded \n " ) ;
return result ;
}
static void __exit em28xx_module_exit ( void )
{
/* deregister this driver with the USB subsystem */
usb_deregister ( & em28xx_usb_driver ) ;
}
module_init ( em28xx_module_init ) ;
module_exit ( em28xx_module_exit ) ;