av7110 driver update
PATCH 6/6 av7110 driver update
- [DVB] av7110: fixed av7110_before_after_tune()/av7110_fe_lock_fix(): firmware >= 261d: wait for empty message queue, firmware <= 261c: wait 50ms
- [DVB] av7110: add __user and __iomem annotations, remove some unnecessary cast (patch by C.Y.M)
- [DVB] av7110: __av7110_send_fw_cmd(): added some sanity checks suggested by Werner Fin
- [DVB] av7110: added support for full-featured DVB-C cards: 13c2:0000 Siemens DVB-C (full-length card) VES1820/Philips CD1516 and 13c2:0003 Haupauge DVB-C 2.1 VES1820/ALPS TDBE2
- [DVB] av7110: follow saa7146 changes, remove superflous casts, and other misc. minor cleanups
- [DVB] av7110: Fixed race condition between driver and av7110 while accessing the COMMAND register in DPRAM. See http://www.linuxtv.org/mailinglists/vdr/2004/01-2004/msg00331.html
- [DVB] budget: various cleanups by Adrian bunk
drivers/media/dvb/ttpci/av7110.c +100 -66
@@ -77,7 +78,7 @@static int volume =255 ;module_param_named (debug, av7110_debug, int,0644 ); -MODULE_PARM_DESC (av7110_debug,"Turn on/off debugging (default:off)." ); +MODULE_PARM_DESC (debug,"debug level (bitmask, default 0)" );module_param (vidmode, int,0444 );MODULE_PARM_DESC (vidmode,"analog video out: 0 off, 1 CVBS+RGB (default), 2 CVBS+YC, 3 YC" );module_param (pids_off, int,0444 );
@@ -117,7 +118,7 @@/* handle different card types */ /* remaining inits according to card and frontend type */ - av7110->has_analog_tuner =0 ; + av7110->analog_tuner_flags =0 ; av7110->current_input =0 ;if (i2c_writereg (av7110,0x20 ,0x00 ,0x00 ) ==1 ) { printk ("dvb-ttpci: Crystal audio DAC @ card %d detected\n",
@@ -149,10 +150,12 @@// switch DVB SCART on av7110_fw_cmd (av7110,COMTYPE_AUDIODAC , MainSwitch,1 ,0 );av7110_fw_cmd (av7110,COMTYPE_AUDIODAC , ADSwitch,1 ,1 ); -if (rgb_on) +if (rgb_on && + (av7110->dev->pci->subsystem_vendor ==0x110a ) && (av7110->dev->pci->subsystem_device ==0x0000 )) {saa7146_setgpio (dev,1 ,SAA7146_GPIO_OUTHI );// RGB on, SCART pin 16 //saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8 } + }av7110_set_volume (av7110, av7110->mixer.volume_left, av7110->mixer.volume_right);av7110_setup_irc_config (av7110,0 );
@@ -192,9 +195,10 @@ av7110->arm_thread = current; -while (1 ) { - timeout =wait_event_interruptible_timeout (av7110->arm_wait,0 != av7110->arm_rmmod,5 *HZ ); -if (-ERESTARTSYS == timeout ||0 != av7110->arm_rmmod) { +for (;;) { + timeout =wait_event_interruptible_timeout (av7110->arm_wait, + av7110->arm_rmmod,5 *HZ ); +if (-ERESTARTSYS == timeout || av7110->arm_rmmod) {/* got signal or told to quit*/ break ; }
@@ -287,7 +291,7 @@* IRQ handling ****************************************************************************/ -static inline int DvbDmxFilterCallback(u8 * buffer1, size_t buffer1_len, +static int DvbDmxFilterCallback(u8 *buffer1, size_t buffer1_len, u8 * buffer2, size_t buffer2_len, struct dvb_demux_filter *dvbdmxfilter, enum dmx_success success,
@@ -355,9 +359,8 @@// dprintk(4, "%p\n",av7110); print_time ("debi" ); -saa7146_write (av7110->dev,IER , -saa7146_read (av7110->dev,IER ) & ~MASK_19 ); -saa7146_write (av7110->dev,ISR ,MASK_19 ); +SAA7146_IER_DISABLE (av7110->dev,MASK_19 ); +SAA7146_ISR_CLEAR (av7110->dev,MASK_19 );if (type==-1 ) { printk("DEBI irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",
@@ -493,9 +496,8 @@ARM_ClearIrq (av7110); -saa7146_write (av7110->dev,IER , -saa7146_read (av7110->dev,IER ) & ~MASK_19 ); -saa7146_write (av7110->dev,ISR ,MASK_19 ); +SAA7146_IER_DISABLE (av7110->dev,MASK_19 ); +SAA7146_ISR_CLEAR (av7110->dev,MASK_19 ); av7110->debitype =irdebi (av7110,DEBINOSWAP ,IRQ_STATE ,0 ,2 ); av7110->debilen =irdebi (av7110,DEBINOSWAP ,IRQ_STATE_EXT ,0 ,2 );
@@ -822,9 +824,13 @@ buf[3 ] = mode; ret =av7110_fw_request (av7110, buf,20 , &handle,1 ); -if (ret <0 ) { -dprintk (1 ,"StartHWFilter error\n" ); -return ret; +if (ret !=0 || handle >=32 ) { +printk ("dvb-ttpci: %s error buf %04x %04x %04x %04x " +"ret %x handle %04x\n" , + __FUNCTION__, buf[0 ], buf[1 ], buf[2 ], buf[3 ], + ret, handle); + dvbdmxfilter->hw_handle =0xffff ; +return -1 ; } av7110->handle2filter[handle] = dvbdmxfilter;
@@ -844,8 +850,9 @@dprintk (4 ,"%p\n" , av7110); handle = dvbdmxfilter->hw_handle; -if (handle >32 ) { -dprintk (1 ,"StopHWFilter tried to stop invalid filter %d, filter type = %d\n" , handle, dvbdmxfilter->type); +if (handle >=32 ) { +printk ("%s tried to stop invalid filter %04x, filter type = %x\n" , + __FUNCTION__, handle, dvbdmxfilter->type);return 0 ; }
@@ -855,11 +862,11 @@ buf[1 ] =1 ; buf[2 ] = handle; ret =av7110_fw_request (av7110, buf,3 , answ,2 ); -if (ret) -dprintk (1 ,"StopHWFilter error\n" ); - -if (answ[1 ] != handle) { -dprintk (2 ,"filter %d shutdown error :%d\n" , handle, answ[1 ]); +if (ret !=0 || answ[1 ] != handle) { +printk ("dvb-ttpci: %s error cmd %04x %04x %04x ret %x " +"resp %04x %04x pid %d\n" , + __FUNCTION__, buf[0 ], buf[1 ], buf[2 ], ret, + answ[0 ], answ[1 ], dvbdmxfilter->feed->pid); ret =-1 ; }return ret;
@@ -937,7 +944,7 @@static int av7110_start_feed (struct dvb_demux_feed *feed) {struct dvb_demux *demux = feed->demux; -struct av7110 *av7110 = (struct av7110 *) demux->priv; +struct av7110 *av7110 = demux->priv;dprintk (4 ,"%p\n" , av7110);
@@ -995,7 +1002,7 @@static int av7110_stop_feed (struct dvb_demux_feed *feed) {struct dvb_demux *demux = feed->demux; -struct av7110 *av7110 = (struct av7110 *) demux->priv; +struct av7110 *av7110 = demux->priv;dprintk (4 ,"%p\n" , av7110);
@@ -1119,18 +1127,20 @@return 0 ; } -static int av7110_diseqc_send_master_cmd (struct dvb_frontend * fe,struct dvb_diseqc_master_cmd * cmd) +static int av7110_diseqc_send_master_cmd (struct dvb_frontend * fe, +struct dvb_diseqc_master_cmd * cmd) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_diseqc_send (av7110, cmd->msg_len, cmd->msg,-1 );return 0 ; } -static int av7110_diseqc_send_burst (struct dvb_frontend * fe,fe_sec_mini_cmd_t minicmd) +static int av7110_diseqc_send_burst (struct dvb_frontend * fe, +fe_sec_mini_cmd_t minicmd) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_diseqc_send (av7110,0 ,NULL , minicmd);
@@ -1223,7 +1233,8 @@dvb_dmxdev_release (&av7110->dmxdev);dvb_dmx_release (&av7110->demux); -if (av7110->fe !=NULL )dvb_unregister_frontend (av7110->fe); +if (av7110->fe !=NULL ) +dvb_unregister_frontend (av7110->fe);dvb_unregister_device (av7110->osd_dev);av7110_av_unregister (av7110);av7110_ca_unregister (av7110);
@@ -1519,7 +1530,7 @@static int alps_tdbe2_pll_set (struct dvb_frontend * fe,struct dvb_frontend_parameters * params) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;u32 div;u8 data[4 ];struct i2c_msg msg = { .addr =0x62 , .flags =0 , .buf = data, .len =sizeof (data) };
@@ -1547,9 +1558,10 @@ -static int grundig_29504_451_pll_set (struct dvb_frontend * fe,struct dvb_frontend_parameters * params) +static int grundig_29504_451_pll_set (struct dvb_frontend * fe, +struct dvb_frontend_parameters * params) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;u32 div;u8 data[4 ];struct i2c_msg msg = { .addr =0x61 , .flags =0 , .buf = data, .len =sizeof (data) };
@@ -1572,9 +1584,10 @@ -static int philips_cd1516_pll_set (struct dvb_frontend * fe,struct dvb_frontend_parameters * params) +static int philips_cd1516_pll_set (struct dvb_frontend * fe, +struct dvb_frontend_parameters * params) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;u32 div;u32 f = params->frequency;u8 data[4 ];
@@ -1604,7 +1617,7 @@static int alps_tdlb7_pll_set (struct dvb_frontend * fe,struct dvb_frontend_parameters * params) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;u32 div, pwr;u8 data[4 ];struct i2c_msg msg = { .addr =0x60 , .flags =0 , .buf = data, .len =sizeof (data) };
@@ -1644,19 +1657,18 @@static int nexusca_stv0297_pll_set (struct dvb_frontend * fe,struct dvb_frontend_parameters * params) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;u32 div;u8 data[4 ];struct i2c_msg msg = { .addr =0x63 , .flags =0 , .buf = data, .len =sizeof (data) };struct i2c_msg readmsg = { .addr =0x63 , .flags =I2C_M_RD , .buf = data, .len =1 };int i; -// this calculation does not match the TDA6405TS datasheet! div = (params->frequency +36150000 +31250 ) /62500 ; data[0 ] = (div >>8 ) &0x7f ; data[1 ] = div &0xff ; - data[2 ] =0xce ;// this value does not match the TDA6405TS datasheet! + data[2 ] =0xce ;if (params->frequency <45000000 )return -EINVAL ;
@@ -1696,9 +1708,14 @@static void av7110_fe_lock_fix (struct av7110 * av7110,fe_status_t status) { -msleep (50 ); +int synced = (status &FE_HAS_LOCK ) ?1 :0 ; - av7110->fe_synced = (status &FE_HAS_LOCK ) ?1 :0 ; + av7110->fe_status = status; + +if (av7110->fe_synced == synced) +return ; + + av7110->fe_synced = synced;if (av7110->playing)return ;
@@ -1714,16 +1731,23 @@av7110_fw_cmd (av7110,COMTYPE_PIDFILTER , Scan,0 ); }else {SetPIDs (av7110,0 ,0 ,0 ,0 ,0 ); -av7110_fw_cmd (av7110,COMTYPE_PIDFILTER , FlushTSQueue,0 ); +av7110_fw_cmd (av7110,COMTYPE_PID_FILTER , FlushTSQueue,0 ); +av7110_wait_msgstate (av7110, GPMQBusy); } - av7110->fe_status = status;up (&av7110->pid_mutex); } +static int av7110_fe_set_frontend (struct dvb_frontend * fe,struct dvb_frontend_parameters * params) +{ +struct av7110 * av7110 = fe->dvb->priv; +av7110_fe_lock_fix (av7110,0 ); +return av7110->fe_set_frontend (fe, params); +} +static int av7110_fe_init (struct dvb_frontend * fe) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_init (fe);
@@ -1731,7 +1755,7 @@static int av7110_fe_read_status (struct dvb_frontend * fe,fe_status_t * status) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;int ret;/* call the real implementation */
@@ -1748,15 +1772,16 @@static int av7110_fe_diseqc_reset_overload (struct dvb_frontend * fe) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_diseqc_reset_overload (fe); } -static int av7110_fe_diseqc_send_master_cmd (struct dvb_frontend * fe,struct dvb_diseqc_master_cmd * cmd) +static int av7110_fe_diseqc_send_master_cmd (struct dvb_frontend * fe, +struct dvb_diseqc_master_cmd * cmd) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_diseqc_send_master_cmd (fe, cmd);
@@ -1764,7 +1789,7 @@static int av7110_fe_diseqc_send_burst (struct dvb_frontend * fe,fe_sec_mini_cmd_t minicmd) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_diseqc_send_burst (fe, minicmd);
@@ -1772,7 +1797,7 @@static int av7110_fe_set_tone (struct dvb_frontend * fe,fe_sec_tone_mode_t tone) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_set_tone (fe, tone);
@@ -1780,7 +1805,7 @@static int av7110_fe_set_voltage (struct dvb_frontend * fe,fe_sec_voltage_t voltage) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_set_voltage (fe, voltage);
@@ -1788,7 +1813,7 @@static int av7110_fe_dishnetwork_send_legacy_command (struct dvb_frontend * fe,unsigned int cmd) { -struct av7110 * av7110 = (struct av7110 *) fe->dvb->priv; +struct av7110 * av7110 = fe->dvb->priv;av7110_fe_lock_fix (av7110,0 );return av7110->fe_dishnetwork_send_legacy_command (fe, cmd);
@@ -1812,9 +1837,8 @@if (av7110->dev->pci->subsystem_vendor ==0x110a ) {switch (av7110->dev->pci->subsystem_device) {case 0x0000 :// Fujitsu/Siemens DVB-Cable (ves1820/Philips CD1516(??)) - av7110->fe =ves1820_attach (&philips_cd1516_config, &av7110->i2c_adap,read_pwm (av7110)); -if (av7110->fe) -break ; + av7110->fe =ves1820_attach (&philips_cd1516_config, + &av7110->i2c_adap,read_pwm (av7110));break ; }
@@ -1850,27 +1874,41 @@ av7110->fe->ops->set_tone = av7110_set_tone;break ; } + +/* Try DVB-C cards */ +switch (av7110->dev->pci->subsystem_device) { +case 0x0000 : +/* Siemens DVB-C (full-length card) VES1820/Philips CD1516 */ + av7110->fe =ves1820_attach (&philips_cd1516_config, &av7110->i2c_adap, +read_pwm (av7110)); +break ; +case 0x0003 : +/* Haupauge DVB-C 2.1 VES1820/ALPS TDBE2 */ + av7110->fe =ves1820_attach (&alps_tdbe2_config, &av7110->i2c_adap, +read_pwm (av7110)); +break ; + }break ;case 0x0001 :// Hauppauge/TT Nexus-T premium rev1.X // ALPS TDLB7 av7110->fe =sp8870_attach (&alps_tdlb7_config, &av7110->i2c_adap); -if (av7110->fe) -break ;break ;case 0x0002 :// Hauppauge/TT DVB-C premium rev2.X av7110->fe =ves1820_attach (&alps_tdbe2_config, &av7110->i2c_adap,read_pwm (av7110)); -if (av7110->fe) -break ;break ;case 0x000A :// Hauppauge/TT Nexus-CA rev1.X av7110->fe =stv0297_attach (&nexusca_stv0297_config, &av7110->i2c_adap,0x7b );if (av7110->fe) { +/* set TDA9819 into DVB mode */ +saa7146_setgpio (av7110->dev,1 ,SAA7146_GPIO_OUTHI );// TDA9198 pin9(STD) +saa7146_setgpio (av7110->dev,3 ,SAA7146_GPIO_OUTLO );// TDA9198 pin30(VIF) +/* tuner on this needs a slower i2c bus speed */ av7110->dev->i2c_bitrate =SAA7146_I2C_BUS_BIT_RATE_240 ;break ;
@@ -1893,6 +1931,8 @@FE_FUNC_OVERRIDE (av7110->fe->ops->set_tone, av7110->fe_set_tone, av7110_fe_set_tone); FE_FUNC_OVERRIDE(av7110->fe->ops->set_voltage, av7110->fe_set_voltage, av7110_fe_set_voltage;)FE_FUNC_OVERRIDE (av7110->fe->ops->dishnetwork_send_legacy_command, av7110->fe_dishnetwork_send_legacy_command, av7110_fe_dishnetwork_send_legacy_command); +FE_FUNC_OVERRIDE (av7110->fe->ops->set_frontend, av7110->fe_set_frontend, av7110_fe_set_frontend); +if (dvb_register_frontend (av7110->dvb_adapter, av7110->fe)) {printk ("av7110: Frontend registration failed!\n" );if (av7110->fe->ops->release)
@@ -1969,7 +2009,6 @@/* locks for data transfers from/to AV7110 */ spin_lock_init (&av7110->debilock);sema_init (&av7110->dcomlock,1 ); - av7110->debilock=SPIN_LOCK_UNLOCKED ; av7110->debitype=-1 ;/* default OSD window */
@@ -2086,11 +2125,8 @@dvb_unregister (av7110); -IER_DISABLE (saa, (MASK_19 |MASK_03 )); -// saa7146_write (av7110->dev, IER, -// saa7146_read(av7110->dev, IER) & ~(MASK_19 | MASK_03)); - -saa7146_write (av7110->dev,ISR ,(MASK_19 |MASK_03 )); +SAA7146_IER_DISABLE (saa,MASK_19 |MASK_03 ); +SAA7146_ISR_CLEAR (saa,MASK_19 |MASK_03 );av7110_ca_exit (av7110);av7110_av_exit (av7110);
@@ -2117,7 +2153,7 @@static void av7110_irq (struct saa7146_dev * dev,u32 *isr) { -struct av7110 *av7110 = (struct av7110 *)dev->ext_priv; +struct av7110 *av7110 = dev->ext_priv;if (*isr &MASK_19 )tasklet_schedule (&av7110->debi_tasklet);
drivers/media/dvb/ttpci/av7110.h +9 -3
@@ -34,6 +34,11 @@#include <media/saa7146_vv.h> + +#define ANALOG_TUNER_VES1820 1 +#define ANALOG_TUNER_STV0297 2 +#define ANALOG_TUNER_VBI 0x100 +extern int av7110_debug; #define dprintk(level,args...) \
@@ -82,7 +87,7 @@char *card_name;/* support for analog module of dvb-c */ -int has_analog_tuner; +int analog_tuner_flags;int current_input;u32 current_freq;
@@ -122,8 +127,8 @@spinlock_t debilock;struct semaphore dcomlock; -int debitype; -int debilen; +volatile int debitype; +volatile int debilen;/* Recording and playback flags */
@@ -235,6 +240,7 @@int (*fe_set_tone)(struct dvb_frontend * fe,fe_sec_tone_mode_t tone);int (*fe_set_voltage)(struct dvb_frontend * fe,fe_sec_voltage_t voltage);int (*fe_dishnetwork_send_legacy_command)(struct dvb_frontend * fe,unsigned int cmd); +int (*fe_set_frontend)(struct dvb_frontend * fe,struct dvb_frontend_parameters * params); };
drivers/media/dvb/ttpci/av7110_hw.c +77 -15
143 lines not on this page · raw message
drivers/media/dvb/ttpci/av7110_hw.h +4 -0
@@ -65,6 +65,9 @@#define HPQOver 0x0008#define OSDQFull 0x0010/* OSD Queue Full */ #define OSDQOver 0x0020 +#define GPMQBusy 0x0040/* Queue not empty, FW >= 261d */ +#define HPQBusy 0x0080 +#define OSDQBusy 0x0100/* hw section filter flags */ #define SECTION_EIT 0x01
@@ -368,6 +371,7 @@#define FW_4M_SDRAM (arm_app) ((arm_app) & 0x40000000)#define FW_VERSION (arm_app) ((arm_app) & 0x0000FFFF) +extern int av7110_wait_msgstate (struct av7110 *av7110,u16 flags);extern int av7110_fw_cmd (struct av7110 *av7110,int type,int com,int num, ...);extern int __av7110_send_fw_cmd (struct av7110 *av7110,u16 * buf,int length);extern int av7110_send_fw_cmd (struct av7110 *av7110,u16 * buf,int length);
drivers/media/dvb/ttpci/av7110_v4l.c +95 -29
249 lines not on this page · raw message
drivers/media/dvb/ttpci/budget-av.c +7 -19
@@ -563,23 +559,13 @@ {struct budget *budget = (struct budget *) fe->dvb->priv;static u8 tu1216_init[] = {0x0b ,0xf5 ,0x85 ,0xab }; -static u8 disable_mc44BC374c[] = {0x1d ,0x74 ,0xa0 ,0x68 }; -struct i2c_msg tuner_msg = {.addr =0x60 ,.flags =0 ,.buf = tu1216_init,.len = -sizeof (tu1216_init) }; +struct i2c_msg tuner_msg = {.addr =0x60 ,.flags =0 ,.buf = tu1216_init,.len =sizeof (tu1216_init) };// setup PLL configuration if (i2c_transfer (&budget->i2c_adap, &tuner_msg,1 ) !=1 )return -EIO ;msleep (1 ); -// disable the mc44BC374c (do not check for errors) - tuner_msg.addr =0x65 ; - tuner_msg.buf = disable_mc44BC374c; - tuner_msg.len =sizeof (disable_mc44BC374c); -if (i2c_transfer (&budget->i2c_adap, &tuner_msg,1 ) !=1 ) { -i2c_transfer (&budget->i2c_adap, &tuner_msg,1 ); - } -return 0 ; }
@@ -593,7 +579,7 @@u8 band, cp, filter;// determine charge pump - tuner_frequency = params->frequency +36130000 ; + tuner_frequency = params->frequency +36166000 ;if (tuner_frequency <87000000 )return -EINVAL ;else if (tuner_frequency <130000000 )
@@ -620,7 +606,7 @@// determine band if (params->frequency <49000000 )return -EINVAL ; -else if (params->frequency <159000000 ) +else if (params->frequency <161000000 ) band =1 ;else if (params->frequency <444000000 ) band =2 ;
@@ -632,17 +618,14 @@// setup PLL filter switch (params->u.ofdm.bandwidth) {case BANDWIDTH_6_MHZ : -tda1004x_write_byte (fe,0x0C ,0 ); filter =0 ;break ;case BANDWIDTH_7_MHZ : -tda1004x_write_byte (fe,0x0C ,0 ); filter =0 ;break ;case BANDWIDTH_8_MHZ : -tda1004x_write_byte (fe,0x0C ,0xFF ); filter =1 ;break ;
@@ -651,11 +634,11 @@ }// calculate divisor -// ((36130000+((1000000/6)/2)) + Finput)/(1000000/6) - tuner_frequency = (((params->frequency /1000 ) *6 ) +217280 ) /1000 ; +// ((36166000+((1000000/6)/2)) + Finput)/(1000000/6) + tuner_frequency = (((params->frequency /1000 ) *6 ) +217496 ) /1000 ;// setup tuner buffer - tuner_buf[0 ] = tuner_frequency >>8 ; + tuner_buf[0 ] = (tuner_frequency >>8 ) &0x7f ; tuner_buf[1 ] = tuner_frequency &0xff ; tuner_buf[2 ] =0xca ; tuner_buf[3 ] = (cp <<5 ) | (filter <<3 ) | band;
@@ -679,6 +662,7 @@ .demod_address = 0x8, .invert = 1, + .invert_oclk = 1, .pll_init = philips_tu1216_pll_init, .pll_set = philips_tu1216_pll_set, .request_firmware = philips_tu1216_request_firmware,
drivers/media/dvb/ttpci/budget-ci.c +1 -0
@@ -844,6 +837,7 @@ .demod_address = 0x8, .invert = 0, + .invert_oclk = 0, .pll_init = philips_tdm1316l_pll_init, .pll_set = philips_tdm1316l_pll_set, .request_firmware = philips_tdm1316l_request_firmware,
drivers/media/dvb/ttpci/budget-core.c +2 -2
@@ -56,7 +55,7 @@return budget->feeding;saa7146_write (budget->dev,MC1 ,MASK_20 );// DMA3 off -IER_DISABLE (budget->dev,MASK_10 ); +SAA7146_IER_DISABLE (budget->dev,MASK_10 );return 0 ; }
@@ -124,7 +122,7 @@saa7146_write (dev,MC2 , (MASK_04 |MASK_20 ));saa7146_write (dev,MC1 , (MASK_04 |MASK_20 ));// DMA3 on -IER_ENABLE (budget->dev,MASK_10 );// VPE +SAA7146_IER_ENABLE (budget->dev,MASK_10 );// VPE return ++budget->feeding; }
drivers/media/dvb/ttusb-budget/Kconfig +2 -0
@@ -3,6 +3,8 @@ depends on DVB_CORE && USB select DVB_CX22700 select DVB_TDA1004X + select DVB_TDA8083 + select DVB_STV0299 help Support for external USB adapters designed by Technotrend and produced by Hauppauge, shipped under the brand name 'Nova-USB'.
drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c +170 -6
228 lines not on this page · raw message
include/linux/dvb/frontend.h +1 -1
@@ -62,7 +62,7 @@FE_CAN_HIERARCHY_AUTO =0x100000 ,FE_CAN_8VSB =0x200000 ,FE_CAN_16VSB =0x400000 , -FE_NEEDS_BENDING =0x20000000 ,// frontend requires frequency bending +FE_NEEDS_BENDING =0x20000000 ,// not supported anymore, don't use (frontend requires frequency bending) FE_CAN_RECOVER =0x40000000 ,// frontend can recover from a cable unplug automatically FE_CAN_MUTE_TS = 0x80000000 // frontend can stop spurious TS data output } fe_caps_t;