2007-03-11 20:44:05 -03:00
/*
* Driver for the Conexant CX23885 PCIe bridge
*
2008-09-03 17:12:12 -03:00
* Copyright ( c ) 2006 Steven Toth < stoth @ linuxtv . org >
2007-03-11 20:44:05 -03: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/module.h>
# include <linux/init.h>
# include <linux/device.h>
# include <linux/fs.h>
# include <linux/kthread.h>
# include <linux/file.h>
# include <linux/suspend.h>
# include "cx23885.h"
# include <media/v4l2-common.h>
2009-03-03 12:06:09 -03:00
# include "dvb_ca_en50221.h"
2007-03-11 20:44:05 -03:00
# include "s5h1409.h"
2008-07-09 02:18:49 -03:00
# include "s5h1411.h"
2007-03-11 20:44:05 -03:00
# include "mt2131.h"
2007-12-07 01:40:36 -03:00
# include "tda8290.h"
2007-12-24 04:52:08 -03:00
# include "tda18271.h"
2007-09-08 15:17:13 -03:00
# include "lgdt330x.h"
2007-12-18 01:57:06 -03:00
# include "xc5000.h"
2009-10-26 08:54:04 -03:00
# include "max2165.h"
2008-04-19 01:14:19 -03:00
# include "tda10048.h"
2007-12-18 01:09:11 -03:00
# include "tuner-xc2028.h"
2008-04-22 14:46:16 -03:00
# include "tuner-simple.h"
2008-04-22 15:38:26 -03:00
# include "dib7000p.h"
# include "dibx000_common.h"
2008-08-04 21:39:53 -03:00
# include "zl10353.h"
2009-03-03 12:06:09 -03:00
# include "stv0900.h"
2009-06-19 05:45:23 -03:00
# include "stv0900_reg.h"
2009-03-03 12:06:09 -03:00
# include "stv6110.h"
# include "lnbh24.h"
2009-01-17 12:11:20 -03:00
# include "cx24116.h"
2009-03-03 12:06:09 -03:00
# include "cimax2.h"
2009-05-18 05:25:49 -03:00
# include "lgs8gxx.h"
2009-03-03 12:06:09 -03:00
# include "netup-eeprom.h"
# include "netup-init.h"
2009-05-03 23:27:02 -03:00
# include "lgdt3305.h"
2009-10-26 08:54:04 -03:00
# include "atbm8830.h"
2009-11-24 20:16:04 -03:00
# include "ds3000.h"
# include "cx23885-f300.h"
2007-03-11 20:44:05 -03:00
2008-01-12 11:36:36 -03:00
static unsigned int debug ;
2007-03-11 20:44:05 -03:00
2008-01-12 11:36:36 -03:00
# define dprintk(level, fmt, arg...)\
do { if ( debug > = level ) \
printk ( KERN_DEBUG " %s/0: " fmt , dev - > name , # # arg ) ; \
} while ( 0 )
2007-03-11 20:44:05 -03:00
/* ------------------------------------------------------------------ */
2007-12-07 01:40:36 -03:00
static unsigned int alt_tuner ;
module_param ( alt_tuner , int , 0644 ) ;
MODULE_PARM_DESC ( alt_tuner , " Enable alternate tuner configuration " ) ;
2008-04-09 19:13:13 -03:00
DVB_DEFINE_MOD_OPT_ADAPTER_NR ( adapter_nr ) ;
2007-12-07 01:40:36 -03:00
/* ------------------------------------------------------------------ */
2007-03-11 20:44:05 -03:00
static int dvb_buf_setup ( struct videobuf_queue * q ,
unsigned int * count , unsigned int * size )
{
struct cx23885_tsport * port = q - > priv_data ;
port - > ts_packet_size = 188 * 4 ;
port - > ts_packet_count = 32 ;
* size = port - > ts_packet_size * port - > ts_packet_count ;
* count = 32 ;
return 0 ;
}
2007-03-20 23:00:18 -03:00
static int dvb_buf_prepare ( struct videobuf_queue * q ,
struct videobuf_buffer * vb , enum v4l2_field field )
2007-03-11 20:44:05 -03:00
{
struct cx23885_tsport * port = q - > priv_data ;
2008-10-16 20:18:44 -03:00
return cx23885_buf_prepare ( q , port , ( struct cx23885_buffer * ) vb , field ) ;
2007-03-11 20:44:05 -03:00
}
static void dvb_buf_queue ( struct videobuf_queue * q , struct videobuf_buffer * vb )
{
struct cx23885_tsport * port = q - > priv_data ;
2008-10-16 20:18:44 -03:00
cx23885_buf_queue ( port , ( struct cx23885_buffer * ) vb ) ;
2007-03-11 20:44:05 -03:00
}
2007-03-20 23:00:18 -03:00
static void dvb_buf_release ( struct videobuf_queue * q ,
struct videobuf_buffer * vb )
2007-03-11 20:44:05 -03:00
{
2008-10-16 20:18:44 -03:00
cx23885_free_buffer ( q , ( struct cx23885_buffer * ) vb ) ;
2007-03-11 20:44:05 -03:00
}
static struct videobuf_queue_ops dvb_qops = {
. buf_setup = dvb_buf_setup ,
. buf_prepare = dvb_buf_prepare ,
. buf_queue = dvb_buf_queue ,
. buf_release = dvb_buf_release ,
} ;
2007-09-04 21:40:47 -03:00
static struct s5h1409_config hauppauge_generic_config = {
2007-09-08 19:08:17 -03:00
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_ON ,
2007-12-13 10:04:10 -03:00
. qam_if = 44000 ,
2007-09-08 19:08:17 -03:00
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
. mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
2007-09-08 19:08:17 -03:00
} ;
2008-04-19 01:14:19 -03:00
static struct tda10048_config hauppauge_hvr1200_config = {
. demod_address = 0x10 > > 1 ,
. output_mode = TDA10048_SERIAL_OUTPUT ,
. fwbulkwritelen = TDA10048_BULKWRITE_200 ,
2009-05-02 11:08:23 -03:00
. inversion = TDA10048_INVERSION_ON ,
2009-05-15 21:04:18 -03:00
. dtv6_if_freq_khz = TDA10048_IF_3300 ,
. dtv7_if_freq_khz = TDA10048_IF_3800 ,
. dtv8_if_freq_khz = TDA10048_IF_4300 ,
2009-05-02 11:08:23 -03:00
. clk_freq_khz = TDA10048_CLK_16000 ,
2008-04-19 01:14:19 -03:00
} ;
2009-05-12 17:32:17 -03:00
static struct tda10048_config hauppauge_hvr1210_config = {
. demod_address = 0x10 > > 1 ,
. output_mode = TDA10048_SERIAL_OUTPUT ,
. fwbulkwritelen = TDA10048_BULKWRITE_200 ,
. inversion = TDA10048_INVERSION_ON ,
2009-05-16 11:00:23 -03:00
. dtv6_if_freq_khz = TDA10048_IF_3300 ,
. dtv7_if_freq_khz = TDA10048_IF_3500 ,
. dtv8_if_freq_khz = TDA10048_IF_4000 ,
2009-05-12 17:32:17 -03:00
. clk_freq_khz = TDA10048_CLK_16000 ,
} ;
2007-12-07 01:40:36 -03:00
static struct s5h1409_config hauppauge_ezqam_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
. qam_if = 4000 ,
. inversion = S5H1409_INVERSION_ON ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
. mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
2007-12-07 01:40:36 -03:00
} ;
2007-09-08 19:08:17 -03:00
static struct s5h1409_config hauppauge_hvr1800lp_config = {
2007-03-11 20:44:05 -03:00
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
2007-12-13 10:04:10 -03:00
. qam_if = 44000 ,
2007-03-20 15:27:53 -03:00
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
. mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
2007-03-11 20:44:05 -03:00
} ;
2007-12-18 01:09:11 -03:00
static struct s5h1409_config hauppauge_hvr1500_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_OFF ,
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
. mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
2007-12-18 01:09:11 -03:00
} ;
2007-09-04 21:40:47 -03:00
static struct mt2131_config hauppauge_generic_tunerconfig = {
2007-08-22 21:01:20 -03:00
0x61
} ;
2007-09-08 15:17:13 -03:00
static struct lgdt330x_config fusionhdtv_5_express = {
. demod_address = 0x0e ,
. demod_chip = LGDT3303 ,
. serial_mpeg = 0x40 ,
} ;
2007-12-18 01:57:06 -03:00
static struct s5h1409_config hauppauge_hvr1500q_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_ON ,
. qam_if = 44000 ,
. inversion = S5H1409_INVERSION_OFF ,
2008-01-15 21:35:22 -03:00
. status_mode = S5H1409_DEMODLOCKING ,
. mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
2007-12-18 01:57:06 -03:00
} ;
2008-05-07 01:43:10 -03:00
static struct s5h1409_config dvico_s5h1409_config = {
. demod_address = 0x32 > > 1 ,
. output_mode = S5H1409_SERIAL_OUTPUT ,
. gpio = S5H1409_GPIO_ON ,
. qam_if = 44000 ,
. inversion = S5H1409_INVERSION_OFF ,
. status_mode = S5H1409_DEMODLOCKING ,
. mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
} ;
2008-07-09 02:18:49 -03:00
static struct s5h1411_config dvico_s5h1411_config = {
. output_mode = S5H1411_SERIAL_OUTPUT ,
. gpio = S5H1411_GPIO_ON ,
. qam_if = S5H1411_IF_44000 ,
. vsb_if = S5H1411_IF_44000 ,
. inversion = S5H1411_INVERSION_OFF ,
. status_mode = S5H1411_DEMODLOCKING ,
. mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
} ;
2009-05-08 16:05:29 -03:00
static struct s5h1411_config hcw_s5h1411_config = {
. output_mode = S5H1411_SERIAL_OUTPUT ,
. gpio = S5H1411_GPIO_OFF ,
. vsb_if = S5H1411_IF_44000 ,
. qam_if = S5H1411_IF_4000 ,
. inversion = S5H1411_INVERSION_ON ,
. status_mode = S5H1411_DEMODLOCKING ,
. mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK ,
} ;
2007-12-18 01:57:06 -03:00
static struct xc5000_config hauppauge_hvr1500q_tunerconfig = {
2007-12-20 01:14:43 -03:00
. i2c_address = 0x61 ,
. if_khz = 5380 ,
2007-12-18 01:57:06 -03:00
} ;
2008-05-07 01:43:10 -03:00
static struct xc5000_config dvico_xc5000_tunerconfig = {
. i2c_address = 0x64 ,
. if_khz = 5380 ,
} ;
2007-12-24 04:52:08 -03:00
static struct tda829x_config tda829x_no_probe = {
. probe_tuner = TDA829X_DONT_PROBE ,
} ;
2008-01-02 03:01:54 -03:00
static struct tda18271_std_map hauppauge_tda18271_std_map = {
2008-04-22 14:46:22 -03:00
. atsc_6 = { . if_freq = 5380 , . agc_mode = 3 , . std = 3 ,
. if_lvl = 6 , . rfagc_top = 0x37 } ,
. qam_6 = { . if_freq = 4000 , . agc_mode = 3 , . std = 0 ,
. if_lvl = 6 , . rfagc_top = 0x37 } ,
2008-01-02 03:01:54 -03:00
} ;
2009-05-21 12:49:28 -03:00
static struct tda18271_std_map hauppauge_hvr1200_tda18271_std_map = {
. dvbt_6 = { . if_freq = 3300 , . agc_mode = 3 , . std = 4 ,
. if_lvl = 1 , . rfagc_top = 0x37 , } ,
. dvbt_7 = { . if_freq = 3800 , . agc_mode = 3 , . std = 5 ,
. if_lvl = 1 , . rfagc_top = 0x37 , } ,
. dvbt_8 = { . if_freq = 4300 , . agc_mode = 3 , . std = 6 ,
. if_lvl = 1 , . rfagc_top = 0x37 , } ,
} ;
2008-01-02 03:01:54 -03:00
static struct tda18271_config hauppauge_tda18271_config = {
. std_map = & hauppauge_tda18271_std_map ,
. gate = TDA18271_GATE_ANALOG ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2008-01-02 03:01:54 -03:00
} ;
2008-04-19 01:14:19 -03:00
static struct tda18271_config hauppauge_hvr1200_tuner_config = {
2009-05-21 12:49:28 -03:00
. std_map = & hauppauge_hvr1200_tda18271_std_map ,
2008-04-19 01:14:19 -03:00
. gate = TDA18271_GATE_ANALOG ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2008-04-19 01:14:19 -03:00
} ;
2009-05-12 17:32:17 -03:00
static struct tda18271_config hauppauge_hvr1210_tuner_config = {
. gate = TDA18271_GATE_DIGITAL ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2009-05-12 17:32:17 -03:00
} ;
2009-05-12 18:53:47 -03:00
static struct tda18271_std_map hauppauge_hvr127x_std_map = {
2009-05-03 23:27:02 -03:00
. atsc_6 = { . if_freq = 3250 , . agc_mode = 3 , . std = 4 ,
. if_lvl = 1 , . rfagc_top = 0x58 } ,
. qam_6 = { . if_freq = 4000 , . agc_mode = 3 , . std = 5 ,
. if_lvl = 1 , . rfagc_top = 0x58 } ,
} ;
2009-05-12 18:53:47 -03:00
static struct tda18271_config hauppauge_hvr127x_config = {
. std_map = & hauppauge_hvr127x_std_map ,
2009-09-06 14:11:09 -03:00
. output_opt = TDA18271_OUTPUT_LT_OFF ,
2009-05-03 23:27:02 -03:00
} ;
2009-05-12 18:53:47 -03:00
static struct lgdt3305_config hauppauge_lgdt3305_config = {
2009-05-03 23:27:02 -03:00
. i2c_addr = 0x0e ,
. mpeg_mode = LGDT3305_MPEG_SERIAL ,
. tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE ,
. tpvalid_polarity = LGDT3305_TP_VALID_HIGH ,
. deny_i2c_rptr = 1 ,
. spectral_inversion = 1 ,
. qam_if_khz = 4000 ,
. vsb_if_khz = 3250 ,
} ;
2008-04-25 19:03:08 -07:00
static struct dibx000_agc_config xc3028_agc_config = {
2008-04-22 15:38:26 -03:00
BAND_VHF | BAND_UHF , /* band_caps */
/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=0,
* P_agc_inv_pwm1 = 0 , P_agc_inv_pwm2 = 0 ,
* P_agc_inh_dc_rv_est = 0 , P_agc_time_est = 3 , P_agc_freeze = 0 ,
* P_agc_nb_est = 2 , P_agc_write = 0
*/
( 0 < < 15 ) | ( 0 < < 14 ) | ( 0 < < 11 ) | ( 0 < < 10 ) | ( 0 < < 9 ) | ( 0 < < 8 ) |
( 3 < < 5 ) | ( 0 < < 4 ) | ( 2 < < 1 ) | ( 0 < < 0 ) , /* setup */
712 , /* inv_gain */
21 , /* time_stabiliz */
0 , /* alpha_level */
118 , /* thlock */
0 , /* wbd_inv */
2867 , /* wbd_ref */
0 , /* wbd_sel */
2 , /* wbd_alpha */
0 , /* agc1_max */
0 , /* agc1_min */
39718 , /* agc2_max */
9930 , /* agc2_min */
0 , /* agc1_pt1 */
0 , /* agc1_pt2 */
0 , /* agc1_pt3 */
0 , /* agc1_slope1 */
0 , /* agc1_slope2 */
0 , /* agc2_pt1 */
128 , /* agc2_pt2 */
29 , /* agc2_slope1 */
29 , /* agc2_slope2 */
17 , /* alpha_mant */
27 , /* alpha_exp */
23 , /* beta_mant */
51 , /* beta_exp */
1 , /* perform_agc_softsplit */
} ;
/* PLL Configuration for COFDM BW_MHz = 8.000000
* With external clock = 30.000000 */
2008-04-25 19:03:08 -07:00
static struct dibx000_bandwidth_config xc3028_bw_config = {
2008-04-22 15:38:26 -03:00
60000 , /* internal */
30000 , /* sampling */
1 , /* pll_cfg: prediv */
8 , /* pll_cfg: ratio */
3 , /* pll_cfg: range */
1 , /* pll_cfg: reset */
0 , /* pll_cfg: bypass */
0 , /* misc: refdiv */
0 , /* misc: bypclk_div */
1 , /* misc: IO_CLK_en_core */
1 , /* misc: ADClkSrc */
0 , /* misc: modulo */
( 3 < < 14 ) | ( 1 < < 12 ) | ( 524 < < 0 ) , /* sad_cfg: refsel, sel, freq_15k */
( 1 < < 25 ) | 5816102 , /* ifreq = 5.200000 MHz */
20452225 , /* timf */
30000000 /* xtal_hz */
} ;
static struct dib7000p_config hauppauge_hvr1400_dib7000_config = {
. output_mpeg2_in_188_bytes = 1 ,
. hostbus_diversity = 1 ,
. tuner_is_baseband = 0 ,
. update_lna = NULL ,
. agc_config_count = 1 ,
. agc = & xc3028_agc_config ,
. bw = & xc3028_bw_config ,
. gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS ,
. gpio_val = DIB7000P_GPIO_DEFAULT_VALUES ,
. gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS ,
. pwm_freq_div = 0 ,
. agc_control = NULL ,
. spur_protect = 0 ,
. output_mode = OUTMODE_MPEG2_SERIAL ,
} ;
2008-08-04 21:39:53 -03:00
static struct zl10353_config dvico_fusionhdtv_xc3028 = {
. demod_address = 0x0f ,
. if2 = 45600 ,
. no_tuner = 1 ,
2009-04-27 11:27:04 -03:00
. disable_i2c_gate_ctrl = 1 ,
2008-08-04 21:39:53 -03:00
} ;
2009-06-19 05:45:23 -03:00
static struct stv0900_reg stv0900_ts_regs [ ] = {
{ R0900_TSGENERAL , 0x00 } ,
{ R0900_P1_TSSPEED , 0x40 } ,
{ R0900_P2_TSSPEED , 0x40 } ,
{ R0900_P1_TSCFGM , 0xc0 } ,
{ R0900_P2_TSCFGM , 0xc0 } ,
{ R0900_P1_TSCFGH , 0xe0 } ,
{ R0900_P2_TSCFGH , 0xe0 } ,
{ R0900_P1_TSCFGL , 0x20 } ,
{ R0900_P2_TSCFGL , 0x20 } ,
{ 0xffff , 0xff } , /* terminate */
} ;
2009-03-03 12:06:09 -03:00
static struct stv0900_config netup_stv0900_config = {
. demod_address = 0x68 ,
2009-10-17 08:58:26 -03:00
. demod_mode = 1 , /* dual */
2009-07-19 18:06:00 -03:00
. xtal = 8000000 ,
2009-03-03 12:06:09 -03:00
. clkmode = 3 , /* 0-CLKI, 2-XTALI, else AUTO */
. diseqc_mode = 2 , /* 2/3 PWM */
2009-06-19 05:45:23 -03:00
. ts_config_regs = stv0900_ts_regs ,
2009-03-03 12:06:09 -03:00
. tun1_maddress = 0 , /* 0x60 */
. tun2_maddress = 3 , /* 0x63 */
. tun1_adc = 1 , /* 1 Vpp */
. tun2_adc = 1 , /* 1 Vpp */
} ;
static struct stv6110_config netup_stv6110_tunerconfig_a = {
. i2c_address = 0x60 ,
2009-07-19 18:06:00 -03:00
. mclk = 16000000 ,
. clk_div = 1 ,
2009-10-17 08:23:00 -03:00
. gain = 8 , /* +16 dB - maximum gain */
2009-03-03 12:06:09 -03:00
} ;
static struct stv6110_config netup_stv6110_tunerconfig_b = {
. i2c_address = 0x63 ,
2009-07-19 18:06:00 -03:00
. mclk = 16000000 ,
. clk_div = 1 ,
2009-10-17 08:23:00 -03:00
. gain = 8 , /* +16 dB - maximum gain */
2009-03-03 12:06:09 -03:00
} ;
2009-01-17 12:11:20 -03:00
static struct cx24116_config tbs_cx24116_config = {
2009-11-24 20:16:04 -03:00
. demod_address = 0x55 ,
2009-01-17 12:11:20 -03:00
} ;
2009-11-24 20:16:04 -03:00
static struct ds3000_config tevii_ds3000_config = {
. demod_address = 0x68 ,
2009-01-17 12:18:26 -03:00
} ;
2009-01-17 12:23:31 -03:00
static struct cx24116_config dvbworld_cx24116_config = {
. demod_address = 0x05 ,
} ;
2009-05-18 05:25:49 -03:00
static struct lgs8gxx_config mygica_x8506_lgs8gl5_config = {
. prod = LGS8GXX_PROD_LGS8GL5 ,
. demod_address = 0x19 ,
. serial_ts = 0 ,
. ts_clk_pol = 1 ,
. ts_clk_gated = 1 ,
. if_clk_freq = 30400 , /* 30.4 MHz */
. if_freq = 5380 , /* 5.38 MHz */
. if_neg_center = 1 ,
. ext_adc = 0 ,
. adc_signed = 0 ,
. if_neg_edge = 0 ,
} ;
static struct xc5000_config mygica_x8506_xc5000_config = {
. i2c_address = 0x61 ,
. if_khz = 5380 ,
} ;
2009-05-08 22:39:24 -03:00
static int cx23885_dvb_set_frontend ( struct dvb_frontend * fe ,
struct dvb_frontend_parameters * param )
{
struct cx23885_tsport * port = fe - > dvb - > priv ;
struct cx23885_dev * dev = port - > dev ;
switch ( dev - > board ) {
case CX23885_BOARD_HAUPPAUGE_HVR1275 :
switch ( param - > u . vsb . modulation ) {
case VSB_8 :
cx23885_gpio_clear ( dev , GPIO_5 ) ;
break ;
case QAM_64 :
case QAM_256 :
default :
cx23885_gpio_set ( dev , GPIO_5 ) ;
break ;
}
break ;
2009-10-21 13:15:30 -03:00
case CX23885_BOARD_MYGICA_X8506 :
case CX23885_BOARD_MAGICPRO_PROHDTVE2 :
/* Select Digital TV */
cx23885_gpio_set ( dev , GPIO_0 ) ;
break ;
2009-05-08 22:39:24 -03:00
}
2009-05-08 22:39:24 -03:00
return 0 ;
2009-05-08 22:39:24 -03:00
}
2009-05-08 22:39:24 -03:00
static int cx23885_dvb_fe_ioctl_override ( struct dvb_frontend * fe ,
unsigned int cmd , void * parg ,
unsigned int stage )
{
int err = 0 ;
switch ( stage ) {
case DVB_FE_IOCTL_PRE :
switch ( cmd ) {
case FE_SET_FRONTEND :
err = cx23885_dvb_set_frontend ( fe ,
( struct dvb_frontend_parameters * ) parg ) ;
break ;
}
break ;
case DVB_FE_IOCTL_POST :
/* no post-ioctl handling required */
break ;
}
return err ;
} ;
2009-06-17 01:38:12 -03:00
static struct lgs8gxx_config magicpro_prohdtve2_lgs8g75_config = {
. prod = LGS8GXX_PROD_LGS8G75 ,
. demod_address = 0x19 ,
. serial_ts = 0 ,
. ts_clk_pol = 1 ,
. ts_clk_gated = 1 ,
. if_clk_freq = 30400 , /* 30.4 MHz */
. if_freq = 6500 , /* 6.50 MHz */
. if_neg_center = 1 ,
. ext_adc = 0 ,
. adc_signed = 1 ,
. adc_vpp = 2 , /* 1.6 Vpp */
. if_neg_edge = 1 ,
} ;
static struct xc5000_config magicpro_prohdtve2_xc5000_config = {
. i2c_address = 0x61 ,
. if_khz = 6500 ,
} ;
2009-10-26 08:54:04 -03:00
static struct atbm8830_config mygica_x8558pro_atbm8830_cfg1 = {
. prod = ATBM8830_PROD_8830 ,
. demod_address = 0x44 ,
. serial_ts = 0 ,
. ts_sampling_edge = 1 ,
. ts_clk_gated = 0 ,
. osc_clk_freq = 30400 , /* in kHz */
. if_freq = 0 , /* zero IF */
. zif_swap_iq = 1 ,
2009-11-28 08:36:31 -03:00
. agc_min = 0x2E ,
. agc_max = 0xFF ,
. agc_hold_loop = 0 ,
2009-10-26 08:54:04 -03:00
} ;
static struct max2165_config mygic_x8558pro_max2165_cfg1 = {
. i2c_address = 0x60 ,
. osc_clk = 20
} ;
static struct atbm8830_config mygica_x8558pro_atbm8830_cfg2 = {
. prod = ATBM8830_PROD_8830 ,
. demod_address = 0x44 ,
. serial_ts = 1 ,
. ts_sampling_edge = 1 ,
. ts_clk_gated = 0 ,
. osc_clk_freq = 30400 , /* in kHz */
. if_freq = 0 , /* zero IF */
. zif_swap_iq = 1 ,
2009-11-28 08:36:31 -03:00
. agc_min = 0x2E ,
. agc_max = 0xFF ,
. agc_hold_loop = 0 ,
2009-10-26 08:54:04 -03:00
} ;
static struct max2165_config mygic_x8558pro_max2165_cfg2 = {
. i2c_address = 0x60 ,
. osc_clk = 20
} ;
2007-03-11 20:44:05 -03:00
static int dvb_register ( struct cx23885_tsport * port )
{
struct cx23885_dev * dev = port - > dev ;
2009-05-18 05:25:49 -03:00
struct cx23885_i2c * i2c_bus = NULL , * i2c_bus2 = NULL ;
2008-10-11 11:05:50 -03:00
struct videobuf_dvb_frontend * fe0 ;
2009-03-03 12:06:09 -03:00
int ret ;
2008-10-11 11:05:50 -03:00
2008-10-11 11:24:30 -03:00
/* Get the first frontend */
2008-10-11 11:18:53 -03:00
fe0 = videobuf_dvb_get_frontend ( & port - > frontends , 1 ) ;
2008-10-11 11:05:50 -03:00
if ( ! fe0 )
return - EINVAL ;
2007-03-11 20:44:05 -03:00
/* init struct videobuf_dvb */
2008-10-11 11:05:50 -03:00
fe0 - > dvb . name = dev - > name ;
2007-03-11 20:44:05 -03:00
/* init frontend */
switch ( dev - > board ) {
2007-08-22 21:01:20 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1250 :
2007-09-09 03:55:34 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-09-04 21:40:47 -03:00
& hauppauge_generic_config ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( mt2131_attach , fe0 - > dvb . frontend ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ,
2007-09-04 21:40:47 -03:00
& hauppauge_generic_tunerconfig , 0 ) ;
2007-03-11 20:44:05 -03:00
}
break ;
2009-05-03 23:27:02 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1270 :
2009-05-08 22:39:24 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1275 :
2009-05-03 23:27:02 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgdt3305_attach ,
2009-05-12 18:53:47 -03:00
& hauppauge_lgdt3305_config ,
2009-05-03 23:27:02 -03:00
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
2009-05-12 18:53:47 -03:00
& hauppauge_hvr127x_config ) ;
2009-05-03 23:27:02 -03:00
}
break ;
2009-05-08 16:05:29 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1255 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
& hcw_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
}
break ;
2007-12-07 01:40:36 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:18:53 -03:00
switch ( alt_tuner ) {
2007-12-07 01:40:36 -03:00
case 1 :
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend =
2007-12-07 01:40:36 -03:00
dvb_attach ( s5h1409_attach ,
& hauppauge_ezqam_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( tda829x_attach , fe0 - > dvb . frontend ,
2007-12-07 01:40:36 -03:00
& dev - > i2c_bus [ 1 ] . i2c_adap , 0x42 ,
2007-12-24 04:52:08 -03:00
& tda829x_no_probe ) ;
2008-10-11 11:05:50 -03:00
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
2007-12-24 04:52:08 -03:00
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
2008-01-02 03:01:54 -03:00
& hauppauge_tda18271_config ) ;
2007-12-07 01:40:36 -03:00
}
break ;
case 0 :
default :
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend =
2007-12-07 01:40:36 -03:00
dvb_attach ( s5h1409_attach ,
& hauppauge_generic_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
dvb_attach ( mt2131_attach , fe0 - > dvb . frontend ,
2007-12-07 01:40:36 -03:00
& i2c_bus - > i2c_adap ,
& hauppauge_generic_tunerconfig , 0 ) ;
break ;
}
break ;
2007-09-08 19:08:17 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1800lp :
2007-09-09 03:55:34 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-09-08 19:08:17 -03:00
& hauppauge_hvr1800lp_config ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( mt2131_attach , fe0 - > dvb . frontend ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ,
2007-09-08 19:08:17 -03:00
& hauppauge_generic_tunerconfig , 0 ) ;
}
break ;
2007-09-08 15:17:13 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP :
2007-09-09 03:55:34 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( lgdt330x_attach ,
2007-09-08 15:17:13 -03:00
& fusionhdtv_5_express ,
2007-09-09 03:55:34 -03:00
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( simple_tuner_attach , fe0 - > dvb . frontend ,
2008-04-22 14:46:16 -03:00
& i2c_bus - > i2c_adap , 0x61 ,
TUNER_LG_TDVS_H06XF ) ;
2007-09-08 15:17:13 -03:00
}
break ;
2007-12-18 01:57:06 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500Q :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-12-18 01:57:06 -03:00
& hauppauge_hvr1500q_config ,
& dev - > i2c_bus [ 0 ] . i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
2008-09-06 14:56:58 -03:00
& i2c_bus - > i2c_adap ,
& hauppauge_hvr1500q_tunerconfig ) ;
2007-12-18 01:57:06 -03:00
break ;
2007-12-18 01:09:11 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1500 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2007-12-18 01:09:11 -03:00
& hauppauge_hvr1500_config ,
& dev - > i2c_bus [ 0 ] . i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2007-12-18 01:09:11 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & i2c_bus - > i2c_adap ,
. i2c_addr = 0x61 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC2028_DEFAULT_FIRMWARE ,
2007-12-18 01:09:11 -03:00
. max_len = 64 ,
2009-04-20 22:42:00 -03:00
. demod = XC3028_FE_OREN538 ,
2007-12-18 01:09:11 -03:00
} ;
fe = dvb_attach ( xc2028_attach ,
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend , & cfg ) ;
2007-12-18 01:09:11 -03:00
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
break ;
2008-04-19 01:14:19 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1200 :
2008-04-19 01:25:52 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1700 :
2008-04-19 01:14:19 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( tda10048_attach ,
2008-04-19 01:14:19 -03:00
& hauppauge_hvr1200_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( tda829x_attach , fe0 - > dvb . frontend ,
2008-04-19 01:14:19 -03:00
& dev - > i2c_bus [ 1 ] . i2c_adap , 0x42 ,
& tda829x_no_probe ) ;
2008-10-11 11:05:50 -03:00
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
2008-04-19 01:14:19 -03:00
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_hvr1200_tuner_config ) ;
2009-05-12 17:32:17 -03:00
}
break ;
case CX23885_BOARD_HAUPPAUGE_HVR1210 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( tda10048_attach ,
& hauppauge_hvr1210_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 1 ] . i2c_adap ,
& hauppauge_hvr1210_tuner_config ) ;
2008-04-19 01:14:19 -03:00
}
break ;
2008-04-22 15:38:26 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1400 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( dib7000p_attach ,
2008-04-22 15:38:26 -03:00
& i2c_bus - > i2c_adap ,
0x12 , & hauppauge_hvr1400_dib7000_config ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2008-04-22 15:38:26 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & dev - > i2c_bus [ 1 ] . i2c_adap ,
. i2c_addr = 0x64 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC3028L_DEFAULT_FIRMWARE ,
2008-04-22 15:38:26 -03:00
. max_len = 64 ,
. demod = 5000 ,
2008-10-16 20:18:44 -03:00
/* This is true for all demods with
v36 firmware ? */
2008-09-28 02:24:44 -03:00
. type = XC2028_D2633 ,
2008-04-22 15:38:26 -03:00
} ;
fe = dvb_attach ( xc2028_attach ,
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend , & cfg ) ;
2008-04-22 15:38:26 -03:00
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
break ;
2008-05-07 01:43:10 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP :
i2c_bus = & dev - > i2c_bus [ port - > nr - 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( s5h1409_attach ,
2008-05-07 01:43:10 -03:00
& dvico_s5h1409_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend = = NULL )
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
2008-07-09 02:18:49 -03:00
& dvico_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
dvb_attach ( xc5000_attach , fe0 - > dvb . frontend ,
2008-09-06 14:56:58 -03:00
& i2c_bus - > i2c_adap ,
& dvico_xc5000_tunerconfig ) ;
2008-05-07 01:43:10 -03:00
break ;
2008-08-04 21:39:53 -03:00
case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP : {
i2c_bus = & dev - > i2c_bus [ port - > nr - 1 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( zl10353_attach ,
2008-08-04 21:39:53 -03:00
& dvico_fusionhdtv_xc3028 ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2008-08-04 21:39:53 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & i2c_bus - > i2c_adap ,
. i2c_addr = 0x61 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC2028_DEFAULT_FIRMWARE ,
2008-08-04 21:39:53 -03:00
. max_len = 64 ,
. demod = XC3028_FE_ZARLINK456 ,
} ;
2008-10-11 11:05:50 -03:00
fe = dvb_attach ( xc2028_attach , fe0 - > dvb . frontend ,
2008-08-04 21:39:53 -03:00
& cfg ) ;
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
break ;
}
2008-08-12 13:30:03 -03:00
case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H :
2008-11-23 14:11:16 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E650F :
2009-09-18 18:55:47 -03:00
case CX23885_BOARD_COMPRO_VIDEOMATE_E800 :
2008-08-12 13:30:03 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend = dvb_attach ( zl10353_attach ,
2008-08-12 13:30:03 -03:00
& dvico_fusionhdtv_xc3028 ,
& i2c_bus - > i2c_adap ) ;
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend ! = NULL ) {
2008-08-12 13:30:03 -03:00
struct dvb_frontend * fe ;
struct xc2028_config cfg = {
. i2c_adap = & dev - > i2c_bus [ 1 ] . i2c_adap ,
. i2c_addr = 0x61 ,
} ;
static struct xc2028_ctrl ctl = {
2008-09-16 02:15:30 -03:00
. fname = XC2028_DEFAULT_FIRMWARE ,
2008-08-12 13:30:03 -03:00
. max_len = 64 ,
. demod = XC3028_FE_ZARLINK456 ,
} ;
2008-10-11 11:05:50 -03:00
fe = dvb_attach ( xc2028_attach , fe0 - > dvb . frontend ,
2008-08-12 13:30:03 -03:00
& cfg ) ;
if ( fe ! = NULL & & fe - > ops . tuner_ops . set_config ! = NULL )
fe - > ops . tuner_ops . set_config ( fe , & ctl ) ;
}
2009-01-17 12:11:20 -03:00
break ;
case CX23885_BOARD_TBS_6920 :
2009-11-24 20:16:04 -03:00
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2009-01-17 12:11:20 -03:00
fe0 - > dvb . frontend = dvb_attach ( cx24116_attach ,
2009-11-24 20:16:04 -03:00
& tbs_cx24116_config ,
& i2c_bus - > i2c_adap ) ;
2009-01-17 12:11:20 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
2009-11-24 20:16:04 -03:00
fe0 - > dvb . frontend - > ops . set_voltage = f300_set_voltage ;
2009-01-17 12:11:20 -03:00
2009-01-17 12:18:26 -03:00
break ;
case CX23885_BOARD_TEVII_S470 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
2009-11-24 20:16:04 -03:00
fe0 - > dvb . frontend = dvb_attach ( ds3000_attach ,
& tevii_ds3000_config ,
& i2c_bus - > i2c_adap ) ;
2009-01-17 12:18:26 -03:00
if ( fe0 - > dvb . frontend ! = NULL )
2009-11-24 20:16:04 -03:00
fe0 - > dvb . frontend - > ops . set_voltage = f300_set_voltage ;
2009-01-17 12:18:26 -03:00
2008-08-12 13:30:03 -03:00
break ;
2009-01-17 12:23:31 -03:00
case CX23885_BOARD_DVBWORLD_2005 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( cx24116_attach ,
& dvbworld_cx24116_config ,
& i2c_bus - > i2c_adap ) ;
break ;
2009-03-03 12:06:09 -03:00
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
switch ( port - > nr ) {
/* port B */
case 1 :
fe0 - > dvb . frontend = dvb_attach ( stv0900_attach ,
& netup_stv0900_config ,
& i2c_bus - > i2c_adap , 0 ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
if ( dvb_attach ( stv6110_attach ,
fe0 - > dvb . frontend ,
& netup_stv6110_tunerconfig_a ,
& i2c_bus - > i2c_adap ) ) {
if ( ! dvb_attach ( lnbh24_attach ,
fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
2009-10-17 08:38:45 -03:00
LNBH24_PCL | LNBH24_TTX ,
LNBH24_TEN , 0x09 ) )
2009-03-03 12:06:09 -03:00
printk ( KERN_ERR
" No LNBH24 found! \n " ) ;
}
}
break ;
/* port C */
case 2 :
fe0 - > dvb . frontend = dvb_attach ( stv0900_attach ,
& netup_stv0900_config ,
& i2c_bus - > i2c_adap , 1 ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
if ( dvb_attach ( stv6110_attach ,
fe0 - > dvb . frontend ,
& netup_stv6110_tunerconfig_b ,
& i2c_bus - > i2c_adap ) ) {
if ( ! dvb_attach ( lnbh24_attach ,
fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
2009-10-17 08:38:45 -03:00
LNBH24_PCL | LNBH24_TTX ,
LNBH24_TEN , 0x0a ) )
2009-03-03 12:06:09 -03:00
printk ( KERN_ERR
" No LNBH24 found! \n " ) ;
}
}
break ;
}
break ;
2009-05-18 05:25:49 -03:00
case CX23885_BOARD_MYGICA_X8506 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgs8gxx_attach ,
& mygica_x8506_lgs8gl5_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( xc5000_attach ,
fe0 - > dvb . frontend ,
& i2c_bus2 - > i2c_adap ,
& mygica_x8506_xc5000_config ) ;
}
break ;
2009-06-17 01:38:12 -03:00
case CX23885_BOARD_MAGICPRO_PROHDTVE2 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
i2c_bus2 = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( lgs8gxx_attach ,
& magicpro_prohdtve2_lgs8g75_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( xc5000_attach ,
fe0 - > dvb . frontend ,
& i2c_bus2 - > i2c_adap ,
& magicpro_prohdtve2_xc5000_config ) ;
}
break ;
2009-07-20 15:37:25 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1850 :
2009-11-11 01:52:45 -03:00
case CX23885_BOARD_HAUPPAUGE_HVR1290 :
2009-07-20 15:37:25 -03:00
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( s5h1411_attach ,
& hcw_s5h1411_config ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL )
dvb_attach ( tda18271_attach , fe0 - > dvb . frontend ,
0x60 , & dev - > i2c_bus [ 0 ] . i2c_adap ,
& hauppauge_tda18271_config ) ;
break ;
2009-10-26 08:54:04 -03:00
case CX23885_BOARD_MYGICA_X8558PRO :
switch ( port - > nr ) {
/* port B */
case 1 :
i2c_bus = & dev - > i2c_bus [ 0 ] ;
fe0 - > dvb . frontend = dvb_attach ( atbm8830_attach ,
& mygica_x8558pro_atbm8830_cfg1 ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( max2165_attach ,
fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& mygic_x8558pro_max2165_cfg1 ) ;
}
break ;
/* port C */
case 2 :
i2c_bus = & dev - > i2c_bus [ 1 ] ;
fe0 - > dvb . frontend = dvb_attach ( atbm8830_attach ,
& mygica_x8558pro_atbm8830_cfg2 ,
& i2c_bus - > i2c_adap ) ;
if ( fe0 - > dvb . frontend ! = NULL ) {
dvb_attach ( max2165_attach ,
fe0 - > dvb . frontend ,
& i2c_bus - > i2c_adap ,
& mygic_x8558pro_max2165_cfg2 ) ;
}
break ;
}
break ;
2009-07-20 15:37:25 -03:00
2007-03-11 20:44:05 -03:00
default :
2008-10-16 20:18:44 -03:00
printk ( KERN_INFO " %s: The frontend of your DVB/ATSC card "
" isn't supported yet \n " ,
2007-03-11 20:44:05 -03:00
dev - > name ) ;
break ;
}
2008-10-11 11:05:50 -03:00
if ( NULL = = fe0 - > dvb . frontend ) {
2008-10-16 20:18:44 -03:00
printk ( KERN_ERR " %s: frontend initialization failed \n " ,
dev - > name ) ;
2007-03-11 20:44:05 -03:00
return - 1 ;
}
2008-09-12 13:31:45 -03:00
/* define general-purpose callback pointer */
2008-10-11 11:05:50 -03:00
fe0 - > dvb . frontend - > callback = cx23885_tuner_callback ;
2007-03-11 20:44:05 -03:00
/* Put the analog decoder in standby to keep it quiet */
2009-10-05 10:48:17 -03:00
call_all ( dev , core , s_power , 0 ) ;
2007-03-11 20:44:05 -03:00
2008-10-11 11:05:50 -03:00
if ( fe0 - > dvb . frontend - > ops . analog_ops . standby )
fe0 - > dvb . frontend - > ops . analog_ops . standby ( fe0 - > dvb . frontend ) ;
2007-12-07 01:40:36 -03:00
2007-03-11 20:44:05 -03:00
/* register everything */
2009-03-03 12:06:09 -03:00
ret = videobuf_dvb_register_bus ( & port - > frontends , THIS_MODULE , port ,
2009-05-08 22:39:24 -03:00
& dev - > pci - > dev , adapter_nr , 0 ,
cx23885_dvb_fe_ioctl_override ) ;
2010-05-12 04:24:09 -03:00
if ( ! ret )
return ret ;
2008-10-11 11:05:50 -03:00
2009-03-03 12:06:09 -03:00
/* init CI & MAC */
switch ( dev - > board ) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI : {
static struct netup_card_info cinfo ;
netup_get_card_info ( & dev - > i2c_bus [ 0 ] . i2c_adap , & cinfo ) ;
memcpy ( port - > frontends . adapter . proposed_mac ,
cinfo . port [ port - > nr - 1 ] . mac , 6 ) ;
2009-12-30 16:08:57 -03:00
printk ( KERN_INFO " NetUP Dual DVB-S2 CI card port%d MAC=%pM \n " ,
port - > nr , port - > frontends . adapter . proposed_mac ) ;
2009-03-03 12:06:09 -03:00
netup_ci_init ( port ) ;
break ;
}
2010-04-26 13:26:29 -03:00
case CX23885_BOARD_TEVII_S470 : {
u8 eeprom [ 256 ] ; /* 24C02 i2c eeprom */
if ( port - > nr ! = 1 )
break ;
/* Read entire EEPROM */
dev - > i2c_bus [ 0 ] . i2c_client . addr = 0xa0 > > 1 ;
tveeprom_read ( & dev - > i2c_bus [ 0 ] . i2c_client , eeprom , sizeof ( eeprom ) ) ;
printk ( KERN_INFO " TeVii S470 MAC= "
" %02X:%02X:%02X:%02X:%02X:%02X \n " ,
eeprom [ 0xa0 ] , eeprom [ 0xa1 ] , eeprom [ 0xa2 ] ,
eeprom [ 0xa3 ] , eeprom [ 0xa4 ] , eeprom [ 0xa5 ] ) ;
memcpy ( port - > frontends . adapter . proposed_mac , eeprom + 0xa0 , 6 ) ;
break ;
}
2009-03-03 12:06:09 -03:00
}
return ret ;
2007-03-11 20:44:05 -03:00
}
int cx23885_dvb_register ( struct cx23885_tsport * port )
{
2008-10-11 11:05:50 -03:00
struct videobuf_dvb_frontend * fe0 ;
2007-03-11 20:44:05 -03:00
struct cx23885_dev * dev = port - > dev ;
2008-10-11 12:34:39 -03:00
int err , i ;
/* Here we need to allocate the correct number of frontends,
tree-wide: fix assorted typos all over the place
That is "success", "unknown", "through", "performance", "[re|un]mapping"
, "access", "default", "reasonable", "[con]currently", "temperature"
, "channel", "[un]used", "application", "example","hierarchy", "therefore"
, "[over|under]flow", "contiguous", "threshold", "enough" and others.
Signed-off-by: André Goddard Rosa <andre.goddard@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
2009-11-14 13:09:05 -02:00
* as reflected in the cards struct . The reality is that currently
2008-10-11 12:34:39 -03:00
* no cx23885 boards support this - yet . But , if we don ' t modify this
* code then the second frontend would never be allocated ( later )
* and fail with error before the attach in dvb_register ( ) .
* Without these changes we risk an OOPS later . The changes here
* are for safety , and should provide a good foundation for the
* future addition of any multi - frontend cx23885 based boards .
*/
printk ( KERN_INFO " %s() allocating %d frontend(s) \n " , __func__ ,
port - > num_frontends ) ;
2007-03-11 20:44:05 -03:00
2008-10-11 12:34:39 -03:00
for ( i = 1 ; i < = port - > num_frontends ; i + + ) {
2008-10-15 20:26:34 -03:00
if ( videobuf_dvb_alloc_frontend (
2008-10-16 20:18:44 -03:00
& port - > frontends , i ) = = NULL ) {
2008-10-11 12:34:39 -03:00
printk ( KERN_ERR " %s() failed to alloc \n " , __func__ ) ;
return - ENOMEM ;
}
fe0 = videobuf_dvb_get_frontend ( & port - > frontends , i ) ;
if ( ! fe0 )
err = - EINVAL ;
2008-10-11 11:05:50 -03:00
2008-10-11 12:34:39 -03:00
dprintk ( 1 , " %s \n " , __func__ ) ;
2008-10-16 20:18:44 -03:00
dprintk ( 1 , " ->probed by Card=%d Name=%s, PCI %02x:%02x \n " ,
2008-10-11 12:34:39 -03:00
dev - > board ,
dev - > name ,
dev - > pci_bus ,
dev - > pci_slot ) ;
2007-03-11 20:44:05 -03:00
2008-10-11 12:34:39 -03:00
err = - ENODEV ;
2007-03-11 20:44:05 -03:00
2008-10-11 12:34:39 -03:00
/* dvb stuff */
/* We have to init the queue for each frontend on a port. */
2008-10-16 20:18:44 -03:00
printk ( KERN_INFO " %s: cx23885 based dvb card \n " , dev - > name ) ;
videobuf_queue_sg_init ( & fe0 - > dvb . dvbq , & dvb_qops ,
& dev - > pci - > dev , & port - > slock ,
2007-03-20 23:00:18 -03:00
V4L2_BUF_TYPE_VIDEO_CAPTURE , V4L2_FIELD_TOP ,
sizeof ( struct cx23885_buffer ) , port ) ;
2008-10-11 12:34:39 -03:00
}
2007-03-11 20:44:05 -03:00
err = dvb_register ( port ) ;
if ( err ! = 0 )
2008-10-16 20:18:44 -03:00
printk ( KERN_ERR " %s() dvb_register failed err = %d \n " ,
__func__ , err ) ;
2007-03-11 20:44:05 -03:00
return err ;
}
int cx23885_dvb_unregister ( struct cx23885_tsport * port )
{
2008-10-11 11:05:50 -03:00
struct videobuf_dvb_frontend * fe0 ;
2008-10-11 12:34:39 -03:00
/* FIXME: in an error condition where the we have
* an expected number of frontends ( attach problem )
* then this might not clean up correctly , if 1
* is invalid .
* This comment only applies to future boards IF they
* implement MFE support .
*/
2008-10-11 11:18:53 -03:00
fe0 = videobuf_dvb_get_frontend ( & port - > frontends , 1 ) ;
2008-10-16 20:18:44 -03:00
if ( fe0 - > dvb . frontend )
2008-10-11 11:05:50 -03:00
videobuf_dvb_unregister_bus ( & port - > frontends ) ;
2007-03-11 20:44:05 -03:00
2009-03-13 13:24:19 -03:00
switch ( port - > dev - > board ) {
case CX23885_BOARD_NETUP_DUAL_DVBS2_CI :
netup_ci_exit ( port ) ;
break ;
}
2009-03-03 12:06:09 -03:00
2007-03-11 20:44:05 -03:00
return 0 ;
}
2007-03-20 23:00:18 -03:00