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-03-19 12:35:57 -03:00
# include <media/audiochip.h>
2006-01-09 15:25:37 -02:00
# include <media/v4l2-common.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
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 " ) ;
2007-11-03 21:20:59 -03:00
struct em28xx_hash_table {
unsigned long hash ;
unsigned int model ;
unsigned int tuner ;
} ;
2005-11-08 21:38:27 -08:00
struct em28xx_board em28xx_boards [ ] = {
2005-11-08 21:37:24 -08:00
[ EM2800_BOARD_UNKNOWN ] = {
. name = " Unknown EM2800 video grabber " ,
. is_em2800 = 1 ,
. vchannels = 2 ,
. tda9887_conf = TDA9887_PRESENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
[ EM2820_BOARD_UNKNOWN ] = {
2007-11-03 08:07:07 -03:00
. name = " Unknown EM2750/28xx video grabber " ,
2005-11-08 21:37:24 -08:00
. is_em2800 = 0 ,
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_ABSENT ,
2005-11-08 21:37:24 -08: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 " ,
2006-02-07 06:25:39 -02:00
. is_em2800 = 0 ,
. vchannels = 2 ,
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 ,
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2006-02-07 06:25:39 -02:00
. amux = 1 ,
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 ,
2006-02-07 06:25:39 -02:00
. amux = 1 ,
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 " ,
. vchannels = 3 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2006-02-27 00:07:34 -03:00
. amux = 1 ,
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 ,
2005-11-08 21:37:07 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:37:07 -08:00
. amux = 1 ,
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 " ,
. vchannels = 3 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2005-11-08 21:37:07 -08:00
. amux = 0 ,
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 ,
2005-11-08 21:37:07 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:37:07 -08:00
. amux = 1 ,
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 " ,
. vchannels = 3 ,
. 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 ,
/*FIXME: S-Video not tested */
2007-11-23 14:22:14 -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
} ,
2007-10-24 11:08:20 -03:00
[ EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 ] = {
2007-11-20 15:25:08 -03:00
. name = " Hauppauge WinTV HVR 900 " ,
. vchannels = 3 ,
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_XC2028 ,
2007-11-22 12:08:53 -03:00
. mts_firmware = 1 ,
2007-11-20 15:25:08 -03:00
. decoder = EM28XX_TVP5150 ,
2007-11-23 14:22:14 -03:00
. input = { {
2007-11-20 15:25:08 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
. amux = 0 ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-20 15:25:08 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-20 15:25:08 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2008-04-17 21:40:03 -03:00
. analog_gpio = {
{ /* xc3028 reset seq */
. reg = 0x08 ,
. val = 0x2d ,
. rst = 0x3d ,
. t1 = 5 ,
. t2 = 10 ,
. t3 = 5 ,
} ,
} ,
. digital_gpio = {
{ /* xc3028 reset seq */
. reg = 0x08 ,
. val = 0x2e ,
. rst = 0x3e ,
. t1 = 6 ,
. t2 = 6 ,
. t3 = 6 ,
}
} ,
2007-11-20 15:25:08 -03:00
} ,
[ EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 ] = {
2008-01-05 17:01:41 -03:00
. name = " Hauppauge WinTV HVR 950 " ,
. vchannels = 3 ,
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_XC2028 ,
. mts_firmware = 1 ,
. has_12mhz_i2s = 1 ,
2008-04-17 21:37:40 -03:00
. has_dvb = 1 ,
2008-01-05 17:01:41 -03:00
. decoder = EM28XX_TVP5150 ,
2007-11-23 14:22:14 -03:00
. input = { {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
. amux = 0 ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-01 21:52:58 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2008-04-17 21:37:40 -03:00
. analog_gpio = {
{ /* xc3028 reset seq */
. reg = 0x08 ,
2008-04-17 21:38:27 -03:00
. val = 0x2d ,
. rst = 0x3d ,
2008-04-17 21:37:40 -03:00
. t1 = 5 ,
. t2 = 10 ,
. t3 = 5 ,
} ,
} ,
. digital_gpio = {
{ /* xc3028 reset seq */
. reg = 0x08 ,
2008-04-17 21:38:27 -03:00
. val = 0x2e ,
. rst = 0x3e ,
2008-04-17 21:37:40 -03:00
. t1 = 6 ,
. t2 = 6 ,
. t3 = 6 ,
} , { /* demod reset seq */
. reg = 0x04 ,
2008-04-17 21:38:27 -03:00
. val = 0x04 ,
. rst = 0x0c ,
2008-04-17 21:37:40 -03:00
. t2 = 10 ,
. t3 = 10 ,
}
} ,
2007-10-24 11:08:20 -03:00
} ,
[ EM2880_BOARD_TERRATEC_HYBRID_XS ] = {
. name = " Terratec Hybrid XS " ,
. vchannels = 3 ,
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_XC2028 ,
. decoder = EM28XX_TVP5150 ,
2007-11-23 14:22:14 -03:00
. input = { {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
. amux = 0 ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2007-10-24 11:08:20 -03:00
} ,
2007-11-23 14:22:14 -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 */
2007-10-24 11:08:20 -03:00
[ EM2880_BOARD_TERRATEC_PRODIGY_XS ] = {
. name = " Terratec Prodigy XS " ,
. vchannels = 3 ,
. tda9887_conf = TDA9887_PRESENT ,
. tuner_type = TUNER_XC2028 ,
. decoder = EM28XX_TVP5150 ,
2007-11-23 14:22:14 -03:00
. input = { {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = TVP5150_COMPOSITE0 ,
. amux = 0 ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = TVP5150_COMPOSITE1 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} , {
2007-10-24 11:08:20 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = TVP5150_SVIDEO ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2007-10-24 11:08:20 -03:00
} ,
2005-11-08 21:37:07 -08:00
[ EM2820_BOARD_MSI_VOX_USB_2 ] = {
2008-01-13 15:42:17 -03:00
. name = " MSI VOX USB 2.0 " ,
. vchannels = 3 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT |
TDA9887_PORT1_ACTIVE |
TDA9887_PORT2_ACTIVE ,
. max_range_640_480 = 1 ,
. decoder = EM28XX_SAA7114 ,
. input = { {
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE4 ,
. amux = 0 ,
2007-11-23 14:22:14 -03:00
} , {
2008-01-13 15:42:17 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} , {
2008-01-13 15:42:17 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:07 -08:00
} ,
2005-11-08 21:37:24 -08:00
[ EM2800_BOARD_TERRATEC_CINERGY_200 ] = {
. name = " Terratec Cinergy 200 USB " ,
. is_em2800 = 1 ,
. vchannels = 3 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2005-11-08 21:37:24 -08:00
. amux = 0 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
[ EM2800_BOARD_LEADTEK_WINFAST_USBII ] = {
. name = " Leadtek Winfast USB II " ,
. is_em2800 = 1 ,
. vchannels = 3 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2005-11-08 21:37:24 -08:00
. amux = 0 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
[ EM2800_BOARD_KWORLD_USB2800 ] = {
. name = " Kworld USB2800 " ,
. is_em2800 = 1 ,
. vchannels = 3 ,
2008-04-22 14:46:05 -03:00
. tuner_type = TUNER_PHILIPS_FCV1236D ,
2005-11-08 21:37:24 -08:00
. tda9887_conf = TDA9887_PRESENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2005-11-08 21:37:24 -08:00
. amux = 0 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:37:24 -08:00
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:37:24 -08:00
} ,
2005-11-08 21:38:15 -08:00
[ EM2820_BOARD_PINNACLE_DVC_90 ] = {
2007-12-17 13:49:17 -03:00
. name = " Pinnacle Dazzle DVC 90/DVC 100 " ,
2005-11-08 21:38:15 -08:00
. vchannels = 3 ,
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_ABSENT ,
2005-11-08 21:38:27 -08:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -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 ,
2005-11-08 21:38:15 -08:00
. amux = 1 ,
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 ,
2005-11-08 21:38:15 -08:00
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2005-11-08 21:38:15 -08:00
} ,
2007-11-03 15:05:07 -03:00
[ EM2800_BOARD_VGEAR_POCKETTV ] = {
. name = " V-Gear PocketTV " ,
. is_em2800 = 1 ,
. vchannels = 3 ,
. tuner_type = TUNER_LG_PAL_NEW_TAPC ,
. tda9887_conf = TDA9887_PRESENT ,
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -03:00
. input = { {
2007-11-03 15:05:07 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
. amux = 0 ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-03 15:05:07 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-03 15:05:07 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
. amux = 1 ,
2007-11-23 14:22:14 -03:00
} } ,
2007-11-03 15:05:07 -03:00
} ,
2007-11-03 21:21:57 -03:00
[ EM2820_BOARD_PROLINK_PLAYTV_USB2 ] = {
. name = " Pixelview Prolink PlayTV USB 2.0 " ,
. vchannels = 3 ,
. tda9887_conf = TDA9887_PRESENT ,
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_YMEC_TVF_5533MF ,
2007-11-03 21:21:57 -03:00
. decoder = EM28XX_SAA7113 ,
2007-11-23 14:22:14 -03:00
. input = { {
2007-11-03 21:21:57 -03:00
. type = EM28XX_VMUX_TELEVISION ,
. vmux = SAA7115_COMPOSITE2 ,
2008-02-05 22:29:26 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-03 21:21:57 -03:00
. type = EM28XX_VMUX_COMPOSITE1 ,
. vmux = SAA7115_COMPOSITE0 ,
2008-02-05 22:29:26 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} , {
2007-11-03 21:21:57 -03:00
. type = EM28XX_VMUX_SVIDEO ,
. vmux = SAA7115_SVIDEO3 ,
2008-02-05 22:29:26 -03:00
. amux = EM28XX_AMUX_LINE_IN ,
2007-11-23 14:22:14 -03:00
} } ,
2007-11-03 21:21:57 -03:00
} ,
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 ) ,
. driver_info = EM2820_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2800 ) ,
. driver_info = EM2800_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2820 ) ,
. driver_info = EM2820_BOARD_UNKNOWN } ,
{ USB_DEVICE ( 0xeb1a , 0x2821 ) ,
. driver_info = EM2820_BOARD_UNKNOWN } ,
{ 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 } ,
{ USB_DEVICE ( 0x0ccd , 0x0036 ) ,
. driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 } ,
{ USB_DEVICE ( 0x2304 , 0x0208 ) ,
. driver_info = EM2820_BOARD_PINNACLE_USB_2 } ,
{ 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 ( 0x2304 , 0x0207 ) ,
. driver_info = EM2820_BOARD_PINNACLE_DVC_90 } ,
2007-12-17 13:49:17 -03:00
{ USB_DEVICE ( 0x2304 , 0x021a ) ,
. driver_info = EM2820_BOARD_PINNACLE_DVC_90 } ,
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 ) ,
. driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 } ,
2007-11-23 14:22:14 -03:00
{ USB_DEVICE ( 0x2040 , 0x6513 ) ,
. driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 } ,
{ USB_DEVICE ( 0x0ccd , 0x0042 ) ,
. driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS } ,
{ USB_DEVICE ( 0x0ccd , 0x0047 ) ,
. driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS } ,
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
2007-11-04 08:32:42 -03:00
/* EEPROM hash table for devices with generic USB IDs */
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 } ,
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 } ,
2007-11-04 08:06:48 -03:00
} ;
2008-04-17 21:37:31 -03:00
int em28xx_tuner_callback ( void * ptr , int command , int arg )
{
int rc = 0 , i ;
struct em28xx * dev = ptr ;
2008-04-17 21:38:27 -03:00
struct gpio_ctl * gpio_ctl ;
2008-04-17 21:37:31 -03:00
if ( dev - > tuner_type ! = TUNER_XC2028 )
return 0 ;
if ( command ! = XC2028_TUNER_RESET )
return 0 ;
if ( dev - > mode = = EM28XX_ANALOG_MODE )
gpio_ctl = dev - > analog_gpio ;
else
gpio_ctl = dev - > digital_gpio ;
2008-04-17 21:38:27 -03:00
/* djh - Not sure if these are still required */
if ( dev - > mode = = EM28XX_ANALOG_MODE ) {
dev - > em28xx_write_regs_req ( dev , 0x00 , 0x48 , " \x00 " , 1 ) ;
dev - > em28xx_write_regs_req ( dev , 0x00 , 0x12 , " \x67 " , 1 ) ;
msleep ( 6 ) ;
} else {
dev - > em28xx_write_regs_req ( dev , 0x00 , 0x48 , " \x00 " , 1 ) ;
dev - > em28xx_write_regs_req ( dev , 0x00 , 0x12 , " \x37 " , 1 ) ;
msleep ( 6 ) ;
}
2008-04-17 21:37:31 -03:00
/* Send GPIO reset sequences specified at board entry */
for ( i = 0 ; i < MAX_GPIO ; i + + ) {
2008-04-17 21:38:27 -03:00
if ( ! gpio_ctl - > val )
2008-04-17 21:37:31 -03:00
break ;
dev - > em28xx_write_regs ( dev ,
2008-04-17 21:38:27 -03:00
gpio_ctl - > reg ,
& gpio_ctl - > val , 1 ) ;
if ( gpio_ctl - > t1 )
msleep ( gpio_ctl - > t1 ) ;
2008-04-17 21:37:31 -03:00
2008-04-17 21:38:27 -03:00
if ( ! gpio_ctl - > rst ) {
gpio_ctl + + ;
2008-04-17 21:37:31 -03:00
continue ;
2008-04-17 21:38:27 -03:00
}
2008-04-17 21:37:31 -03:00
dev - > em28xx_write_regs ( dev ,
2008-04-17 21:38:27 -03:00
gpio_ctl - > reg ,
& gpio_ctl - > rst , 1 ) ;
if ( gpio_ctl - > t2 )
msleep ( gpio_ctl - > t2 ) ;
gpio_ctl + + ;
2008-04-17 21:37:31 -03:00
}
return rc ;
}
EXPORT_SYMBOL_GPL ( em28xx_tuner_callback ) ;
static void em28xx_set_model ( struct em28xx * dev )
{
dev - > is_em2800 = em28xx_boards [ dev - > model ] . is_em2800 ;
dev - > has_msp34xx = em28xx_boards [ dev - > model ] . has_msp34xx ;
dev - > tda9887_conf = em28xx_boards [ dev - > model ] . tda9887_conf ;
dev - > decoder = em28xx_boards [ dev - > model ] . decoder ;
dev - > video_inputs = em28xx_boards [ dev - > model ] . vchannels ;
dev - > has_12mhz_i2s = em28xx_boards [ dev - > model ] . has_12mhz_i2s ;
dev - > max_range_640_480 = em28xx_boards [ dev - > model ] . max_range_640_480 ;
dev - > has_dvb = em28xx_boards [ dev - > model ] . has_dvb ;
2008-04-17 21:38:27 -03:00
dev - > analog_gpio = em28xx_boards [ dev - > model ] . analog_gpio ;
dev - > digital_gpio = em28xx_boards [ dev - > model ] . digital_gpio ;
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:37:31 -03:00
em28xx_set_model ( dev ) ;
2006-01-23 17:11:10 -02:00
/* request some modules */
2007-11-23 14:22:14 -03:00
switch ( dev - > model ) {
2007-11-03 21:20:59 -03:00
case EM2880_BOARD_TERRATEC_PRODIGY_XS :
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 :
case EM2880_BOARD_TERRATEC_HYBRID_XS :
2008-04-17 21:37:31 -03:00
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 :
2008-01-05 09:54:58 -03:00
em28xx_write_regs ( dev , XCLK_REG , " \x27 " , 1 ) ;
em28xx_write_regs ( dev , I2C_CLK_REG , " \x40 " , 1 ) ;
2007-11-03 21:20:59 -03:00
}
2008-01-05 09:54:58 -03:00
2008-04-17 21:37:31 -03:00
/* Put xc2028 tuners and demods into a sane state */
if ( dev - > tuner_type = = TUNER_XC2028 ) {
2008-04-17 21:37:40 -03:00
dev - > mode = EM28XX_ANALOG_MODE ;
2008-04-17 21:37:31 -03:00
em28xx_tuner_callback ( dev , XC2028_TUNER_RESET , 0 ) ;
} ;
2006-01-23 17:11:10 -02:00
}
2008-04-17 21:37:53 -03: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 ) {
/* Add card-specific parameters for xc3028 here */
2008-04-17 21:38:27 -03:00
case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 :
ctl - > demod = XC3028_FE_DEFAULT ;
break ;
2008-04-17 21:37:53 -03:00
default :
ctl - > demod = XC3028_FE_OREN538 ;
}
}
EXPORT_SYMBOL_GPL ( em28xx_setup_xc3028 ) ;
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 ;
}
}
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 ;
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 :
2007-11-20 15:25:08 -03:00
case EM2880_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
2007-11-03 21:20:59 -03:00
if ( tv . audio_processor = = AUDIO_CHIP_MSP34XX ) {
dev - > i2s_speed = 2048000 ;
dev - > has_msp34xx = 1 ;
}
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 */
em28xx_write_regs_req ( dev , 0x00 , 0x08 , " \xf9 " , 1 ) ;
break ;
case EM2820_BOARD_UNKNOWN :
case EM2800_BOARD_UNKNOWN :
2007-11-05 08:42:55 -03:00
if ( ! em28xx_hint_board ( dev ) )
em28xx_set_model ( dev ) ;
2007-11-03 21:20:59 -03:00
}
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 */
if ( dev - > has_msp34xx )
request_module ( " msp3400 " ) ;
if ( dev - > decoder = = EM28XX_SAA7113 | | dev - > decoder = = EM28XX_SAA7114 )
request_module ( " saa7115 " ) ;
if ( dev - > decoder = = EM28XX_TVP5150 )
request_module ( " tvp5150 " ) ;
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
request_module ( " tuner " ) ;
# endif
2007-11-23 14:22:14 -03:00
em28xx_config_tuner ( dev ) ;
2005-11-08 21:37:07 -08:00
}