public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH[[2.5][4-11] update the av7110 driver
@ 2003-05-06 16:09 Michael Hunold
  0 siblings, 0 replies; only message in thread
From: Michael Hunold @ 2003-05-06 16:09 UTC (permalink / raw)
  To: linux-kernel; +Cc: torvalds

[-- Attachment #1: Type: text/plain, Size: 563 bytes --]

Hello,

this patch updates the av7110 (full-featured DVB-S/C/T cards) and the 
budget (Transport-Stream (TS) only cards) driver.

Fixed problems for both:
- replaced ddelay() wait function with generic dvb_delay() implementation

Fixed stuff for av7110:
- new DATA_MPEG_VIDEO_EVENT for direct mpeg2 video playback
- added support for DVB-C cards with MSP3400 mixer and analog tuner
- fixed up the av7110_ir handler and especially the write_proc() 
function; this fixed the bug the Stanford Checker has found

Please review and apply.

Thanks
Michael Hunold.






[-- Attachment #2: 04-dvb-drivers-update.diff --]
[-- Type: text/plain, Size: 39978 bytes --]

diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/av7110.c linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110.c
--- linux-2.5.69/drivers/media/dvb/ttpci/av7110.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110.c	2003-05-06 16:45:30.000000000 +0200
@@ -75,6 +75,8 @@
 
 #include "dvb_i2c.h"
 #include "dvb_frontend.h"
+#include "dvb_functions.h"
+
 
 #if 1 
 	#define DEBUG_VARIABLE av7110_debug
@@ -94,6 +96,7 @@
 static inline u8 i2c_readreg(av7110_t *av7110, u8 id, u8 reg);
 static int  outcom(av7110_t *av7110, int type, int com, int num, ...);
 static void SetMode(av7110_t *av7110, int mode);
+static void dvb_video_add_event (av7110_t *av7110, struct video_event *event);
 
 void pes_to_ts(u8 const *buf, long int length, u16 pid, p2t_t *p);
 void p_to_t(u8 const *buf, long int length, u16 pid, u8 *counter, struct dvb_demux_feed *feed);
@@ -107,20 +110,7 @@
 
 int av7110_num = 0;
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        #define KBUILD_MODNAME av7110
-#endif
-
-/****************************************************************************
- * General helper functions
- ****************************************************************************/
-
-static inline void ddelay(int i) 
-{
-        current->state=TASK_INTERRUPTIBLE;
-        schedule_timeout((HZ*i)/100);
-}
-
+#define FW_CI_LL_SUPPORT(arm_app) (((arm_app) >> 16) & 0x8000)
 
 /****************************************************************************
  * DEBI functions
@@ -326,8 +316,10 @@
                 printk("OOPS, no current->files\n");
                 reset_arm(av7110);
         }
-        ddelay(10); 
+
+        dvb_delay(100); 
         restart_feeds(av7110);
+        outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, av7110->ir_config);
 }
 
 static void 
@@ -347,20 +339,8 @@
 
 	DEB_EE(("av7110: %p\n",av7110));
 	
-	lock_kernel();
-#if 0
-        daemonize();
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        reparent_to_init ();
-#endif
-#else
-        exit_mm(current);
-        current->session=current->pgrp=1;
-#endif
-	sigfillset(&current->blocked);
-	strcpy(current->comm, "arm_mon");
+	dvb_kernel_thread_setup ("arm_mon");
 	av7110->arm_thread = current;
-	unlock_kernel();
 
 	while (!av7110->arm_rmmod && !signal_pending(current)) {
                 interruptible_sleep_on_timeout(&av7110->arm_wait, 5*HZ);
@@ -559,8 +539,10 @@
 	else
 		last = av7110;
 
-	if (av7110)
+	if (av7110) {
 		outcom(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config);
+		av7110->ir_config = ir_config;
+	}
 }
 
 static void (*irc_handler)(u32);
@@ -731,8 +713,10 @@
 
         if (type==-1) {
                 printk("DEBI irq oops @ %ld, psr:0x%08x, ssr:0x%08x\n",jiffies,saa7146_read(av7110->dev,PSR),saa7146_read(av7110->dev,SSR));
+		spin_lock(&av7110->debilock);
                 ARM_ClearMailBox(av7110);
                 ARM_ClearIrq(av7110);
+		spin_unlock(&av7110->debilock);
                 return;
         }
         av7110->debitype=-1;
@@ -926,6 +910,47 @@
         case DATA_PES_PLAY:
                 break;
 
+	case DATA_MPEG_VIDEO_EVENT:
+	{
+		u32 h_ar;
+		struct video_event event;
+
+                av7110->video_size.w = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_WIDTH, 0, 2);
+                h_ar = irdebi(av7110, DEBINOSWAP, STATUS_MPEG_HEIGHT_AR, 0, 2);
+
+                iwdebi(av7110, DEBINOSWAP, IRQ_STATE_EXT, 0, 2);
+                iwdebi(av7110, DEBINOSWAP, RX_BUFF, 0, 2);
+
+		av7110->video_size.h = h_ar & 0xfff;
+		DEB_D(("GPIO0 irq: DATA_MPEG_VIDEO_EVENT: w/h/ar = %u/%u/%u\n",
+				av7110->video_size.w,
+				av7110->video_size.h,
+				av7110->video_size.aspect_ratio));
+
+		event.type = VIDEO_EVENT_SIZE_CHANGED;
+		event.u.size.w = av7110->video_size.w;
+		event.u.size.h = av7110->video_size.h;
+		switch ((h_ar >> 12) & 0xf)
+		{
+		case 3:
+			av7110->video_size.aspect_ratio = VIDEO_FORMAT_16_9;
+			event.u.size.aspect_ratio = VIDEO_FORMAT_16_9;
+			av7110->videostate.video_format = VIDEO_FORMAT_16_9;
+			break;
+		case 4:
+			av7110->video_size.aspect_ratio = VIDEO_FORMAT_221_1;
+			event.u.size.aspect_ratio = VIDEO_FORMAT_221_1;
+			av7110->videostate.video_format = VIDEO_FORMAT_221_1;
+			break;
+		default:
+			av7110->video_size.aspect_ratio = VIDEO_FORMAT_4_3;
+			event.u.size.aspect_ratio = VIDEO_FORMAT_4_3;
+			av7110->videostate.video_format = VIDEO_FORMAT_4_3;
+		}
+		dvb_video_add_event(av7110, &event);
+		break;
+	}
+
         case DATA_CI_PUT:
         {
                 int avail;
@@ -1095,7 +1120,7 @@
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
         {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_FREE) {
 			printk(KERN_ERR "%s: timeout waiting for COMMAND idle\n", __FUNCTION__);
                         return -1;
@@ -1106,7 +1131,7 @@
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) )
         {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_SHAKE) {
 			printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
                         return -1;
@@ -1117,7 +1142,7 @@
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2) & OSDQFull )
         {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_OSD) {
 			printk(KERN_ERR "%s: timeout waiting for !OSDQFull\n", __FUNCTION__);
 			return -1;
@@ -1137,7 +1162,7 @@
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 ) )
         {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_FREE) {
                         printk(KERN_ERR "%s: timeout waiting for COMMAND to complete\n", __FUNCTION__);
                         return -1;
@@ -1257,7 +1282,7 @@
         while ( rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) )
         {
 #ifdef _NOHANDSHAKE
-                ddelay(1);
+                dvb_delay(1);
 #endif
                 if ((jiffies - start) > ARM_WAIT_FREE) {
 			printk("%s: timeout waiting for COMMAND to complete\n", __FUNCTION__);
@@ -1269,7 +1294,7 @@
 #ifndef _NOHANDSHAKE
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_SHAKE) {
 			printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
                         up(&av7110->dcomlock);
@@ -1315,6 +1340,19 @@
  * Firmware commands 
  ****************************************************************************/
 
+static inline int
+msp_writereg(av7110_t *av7110, u8 dev, u16 reg, u16 val)
+{
+        u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; 
+        struct dvb_i2c_bus *i2c = av7110->i2c_bus;
+        struct i2c_msg msgs;
+
+        msgs.flags=0;
+        msgs.addr=0x40;
+        msgs.len=5;
+        msgs.buf=msg;
+        return i2c->xfer(i2c, &msgs, 1);
+}
 
 inline static int 
 SendDAC(av7110_t *av7110, u8 addr, u8 data)
@@ -1327,7 +1365,7 @@
 static int
 SetVolume(av7110_t *av7110, int volleft, int volright)
 {
-        int err;
+        int err, vol, val, balance = 0;
         
  	DEB_EE(("av7110: %p\n",av7110));
 
@@ -1349,6 +1387,17 @@
                 i2c_writereg(av7110, 0x20, 0x03, volleft);
                 i2c_writereg(av7110, 0x20, 0x04, volright);
                 return 0;
+
+        case DVB_ADAC_MSP:
+                vol  = (volleft > volright) ? volleft : volright;
+		val     = (vol * 0x73 / 255) << 8;
+		if (vol > 0) {
+		       balance = ((volright-volleft) * 127) / vol;
+		}
+		msp_writereg(av7110, 0x12, 0x0001, balance << 8);
+		msp_writereg(av7110, 0x12, 0x0000, val); /* loudspeaker */
+		msp_writereg(av7110, 0x12, 0x0006, val); /* headphonesr */
+		return 0;
         }
         return 0;
 }
@@ -1404,7 +1453,7 @@
 		return -ERESTARTSYS;
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
-                ddelay(1); 
+                dvb_delay(1); 
                 if ((jiffies - start) > ARM_WAIT_OSD) {
                         printk(KERN_ERR "%s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__);
                         up(&av7110->dcomlock);
@@ -1427,7 +1476,7 @@
 
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2 ) ) {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_OSD) {
                         printk(KERN_ERR "%s: timeout waiting for BUFF1_BASE == 0\n", __FUNCTION__);
                         up(&av7110->dcomlock);
@@ -1437,7 +1486,7 @@
 #ifndef _NOHANDSHAKE
         start = jiffies;
         while ( rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 ) ) {
-                ddelay(1);
+                dvb_delay(1);
                 if ((jiffies - start) > ARM_WAIT_SHAKE) {
                         printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__);
                         up(&av7110->dcomlock);
@@ -1533,7 +1582,7 @@
                                 break;
                         schedule();
                 }
-                current->state=TASK_RUNNING;
+                set_current_state(TASK_RUNNING);
                 remove_wait_queue(&av7110->bmpq, &wait);
         }
         if (av7110->bmp_state==BMP_LOADING)
@@ -1591,7 +1640,7 @@
                                 break;
                         schedule();
                 }
-                current->state=TASK_RUNNING;
+                set_current_state(TASK_RUNNING);
                 remove_wait_queue(&av7110->bmpq, &wait);
         }
         if (av7110->bmp_state==BMP_LOADED)
@@ -1837,7 +1886,7 @@
                 av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
 
 	/* print firmware capabilities */
-	if ((av7110->arm_app >> 16) & 0x8000)
+	if (FW_CI_LL_SUPPORT(av7110->arm_app))
 		printk ("DVB: AV711%d(%d) - firmware supports CI link layer interface\n",
 				av7110->avtype, av7110->dvb_adapter->num);
 	else
@@ -1986,7 +2035,7 @@
         
         wait_for_debi_done(av7110);
         saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI);
-        current->state=TASK_INTERRUPTIBLE;
+        set_current_state(TASK_INTERRUPTIBLE);
         schedule_timeout(HZ);
         
         DEB_D(("bootarm: load dram code\n"));
@@ -2025,8 +2074,13 @@
  	DEB_EE(("av7110: %p\n",av7110));
 
 	if (vpid == 0x1fff || apid == 0x1fff ||
-	    ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff)
+	    ttpid == 0x1fff || subpid == 0x1fff || pcrpid == 0x1fff) {
 		vpid = apid = ttpid = subpid = pcrpid = 0;
+		av7110->pids[DMX_PES_VIDEO] = 0;
+		av7110->pids[DMX_PES_AUDIO] = 0;
+		av7110->pids[DMX_PES_TELETEXT] = 0;
+		av7110->pids[DMX_PES_PCR] = 0;
+	}
 
         return outcom(av7110, COMTYPE_PIDFILTER, MultiPID, 5, 
                       pcrpid, vpid, apid, ttpid, subpid);
@@ -2048,8 +2102,10 @@
 
         av7110->pids[DMX_PES_SUBTITLE]=0;
 
-        if (av7110->fe_synced) 
+        if (av7110->fe_synced) {
+                pcrpid = av7110->pids[DMX_PES_PCR];
                 SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid);
+        }
 
         up(&av7110->pid_mutex);
 }
@@ -2158,20 +2214,6 @@
         return i2c->xfer (i2c, &msgs, 1);
 }
 
-static inline int
-msp_writereg(av7110_t *av7110, u8 dev, u16 reg, u16 val)
-{
-        u8 msg[5]={ dev, reg>>8, reg&0xff, val>>8 , val&0xff }; 
-        struct dvb_i2c_bus *i2c = av7110->i2c_bus;
-        struct i2c_msg msgs;
-
-        msgs.flags=0;
-        msgs.addr=0x40;
-        msgs.len=5;
-        msgs.buf=msg;
-        return i2c->xfer(i2c, &msgs, 1);
-}
-
 static inline u8
 i2c_readreg(av7110_t *av7110, u8 id, u8 reg)
 {
@@ -2809,7 +2851,7 @@
                 StartHWFilter(dvbdmxfeed->filter); 
                 return;
         }
-        if (dvbdmxfeed->pes_type<=2)
+        if (dvbdmxfeed->pes_type<=2 || dvbdmxfeed->pes_type==4)
                 ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]);
 
         if (dvbdmxfeed->pes_type<2 && npids[0])
@@ -2990,6 +3032,46 @@
                 AV_StartPlay(av7110, mode);
 }
 
+static int dvb_get_stc(dmx_demux_t *demux, unsigned int num,
+		uint64_t *stc, unsigned int *base)
+{
+	int ret;
+        u16 fwstc[4];
+        u16 tag = ((COMTYPE_REQUEST << 8) + ReqSTC);
+	struct dvb_demux *dvbdemux;
+	av7110_t *av7110;
+
+	/* pointer casting paranoia... */
+	if (!demux)
+		BUG();
+	dvbdemux = (struct dvb_demux *) demux->priv;
+	if (!dvbdemux)
+		BUG();
+	av7110 = (av7110_t *) dvbdemux->priv;
+
+	DEB_EE(("av7110: %p\n",av7110));
+
+	if (num != 0)
+		return -EINVAL;
+
+        ret = CommandRequest(av7110, &tag, 0, fwstc, 4);
+	if (ret) {
+		printk(KERN_ERR "%s: CommandRequest error\n", __FUNCTION__);
+		return -EIO;
+	}
+	DEB_EE(("av7110: fwstc = %04hx %04hx %04hx %04hx\n",
+			fwstc[0], fwstc[1], fwstc[2], fwstc[3]));
+
+	*stc =  (((uint64_t)fwstc[2] & 1) << 32) |
+		(((uint64_t)fwstc[1])     << 16) | ((uint64_t)fwstc[0]);
+	*base = 1;
+
+	DEB_EE(("av7110: stc = %llu\n", *stc));
+
+	return 0;
+}
+
+
 /******************************************************************************
  * SEC device file operations
  ******************************************************************************/
@@ -3018,8 +3100,7 @@
 	case FE_DISEQC_SEND_MASTER_CMD:
 	{
 		struct dvb_diseqc_master_cmd *cmd = arg;
-
-		SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, 0);
+		SendDiSEqCMsg (av7110, cmd->msg_len, cmd->msg, -1);
 		break;
 	}
 
@@ -3196,7 +3277,7 @@
                 
                 cap.slot_num=2;
 #ifdef NEW_CI
-                cap.slot_type=CA_CI_LINK|CA_DESCR;
+                cap.slot_type=(FW_CI_LL_SUPPORT(av7110->arm_app) ? CA_CI_LINK : CA_CI) | CA_DESCR;
 #else
                 cap.slot_type=CA_CI|CA_DESCR;
 #endif
@@ -3214,7 +3295,7 @@
                         return -EINVAL;
                 av7110->ci_slot[info->num].num = info->num;
 #ifdef NEW_CI
-                av7110->ci_slot[info->num].type = CA_CI_LINK;
+                av7110->ci_slot[info->num].type = FW_CI_LL_SUPPORT(av7110->arm_app) ? CA_CI_LINK : CA_CI;
 #else
                 av7110->ci_slot[info->num].type = CA_CI;
 #endif
@@ -3285,6 +3366,74 @@
 
 
 /******************************************************************************
+ * Video MPEG decoder events
+ ******************************************************************************/
+static
+void dvb_video_add_event (av7110_t *av7110, struct video_event *event)
+{
+	struct dvb_video_events *events = &av7110->video_events;
+	int wp;
+
+	DEB_D(("\n"));
+
+	spin_lock_bh(&events->lock);
+
+	wp = (events->eventw + 1) % MAX_VIDEO_EVENT;
+
+	if (wp == events->eventr) {
+		events->overflow = 1;
+		events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT;
+	}
+
+	//FIXME: timestamp?
+	memcpy(&events->events[events->eventw], event, sizeof(struct video_event));
+
+	events->eventw = wp;
+
+	spin_unlock_bh(&events->lock);
+
+	wake_up_interruptible (&events->wait_queue);
+}
+
+
+static
+int dvb_video_get_event (av7110_t *av7110, struct video_event *event, int flags)
+{
+	struct dvb_video_events *events = &av7110->video_events;
+
+	DEB_D(("\n"));
+
+	if (events->overflow) {
+                events->overflow = 0;
+                return -EOVERFLOW;
+        }
+
+        if (events->eventw == events->eventr) {
+		int ret;
+
+                if (flags & O_NONBLOCK)
+                        return -EWOULDBLOCK;
+
+                ret = wait_event_interruptible (events->wait_queue,
+                                                events->eventw != events->eventr);
+                if (ret < 0)
+                        return ret;
+        }
+
+	spin_lock_bh(&events->lock);
+
+	memcpy (event, &events->events[events->eventr],
+		sizeof(struct video_event));
+
+        events->eventr = (events->eventr + 1) % MAX_VIDEO_EVENT;
+
+	spin_unlock_bh(&events->lock);
+
+        return 0;
+}
+
+
+/******************************************************************************
  * DVB device file operations
  ******************************************************************************/
 
@@ -3298,12 +3447,16 @@
 	DEB_EE(("av7110: %p\n",av7110));
 
 	poll_wait(file, &av7110->avout.queue, wait);
+	poll_wait(file, &av7110->video_events.wait_queue, wait);
+
+	if (av7110->video_events.eventw != av7110->video_events.eventr)
+		mask = POLLPRI;
 
 	if (av7110->playing) {
                 if (FREE_COND)
                         mask |= (POLLOUT | POLLWRNORM);
         } else /* if not playing: may play if asked for */
-                mask = (POLLOUT | POLLWRNORM);
+                mask |= (POLLOUT | POLLWRNORM);
 
         return mask;
 }
@@ -3441,8 +3594,12 @@
                 break;
                 
         case VIDEO_GET_EVENT:
-                //FIXME: write firmware support for this
-                ret=-EOPNOTSUPP;
+                ret=dvb_video_get_event(av7110, parg, file->f_flags);
+		break;
+
+	case VIDEO_GET_SIZE:
+                memcpy(parg, &av7110->video_size, sizeof(video_size_t));
+		break;
                 
         case VIDEO_SET_DISPLAY_FORMAT:
         {
@@ -3488,6 +3645,7 @@
         { 
                 struct video_still_picture *pic=
                         (struct video_still_picture *) parg;
+                av7110->videostate.stream_source = VIDEO_SOURCE_MEMORY;
                 dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout);
                 play_iframe(av7110, pic->iFrame, pic->size, 
                             file->f_flags&O_NONBLOCK);
@@ -3692,6 +3850,11 @@
         av7110->video_blank=1;
         av7110->audiostate.AV_sync_state=1;
         av7110->videostate.stream_source=VIDEO_SOURCE_DEMUX;
+
+	if ((file->f_flags & O_ACCMODE) != O_RDONLY)
+		/*  empty event queue */
+		av7110->video_events.eventr = av7110->video_events.eventw = 0;
+
         return 0;
 }
 
@@ -3823,7 +3986,6 @@
 int av7110_register(av7110_t *av7110)
 {
         int ret, i;
-        dmx_frontend_t *dvbfront=&av7110->hw_frontend;
         struct dvb_demux *dvbdemux=&av7110->demux;
 
 	DEB_EE(("av7110: %p\n",av7110));
@@ -3856,8 +4018,6 @@
 	av7110->videostate.display_format=VIDEO_CENTER_CUT_OUT;
         av7110->display_ar=VIDEO_FORMAT_4_3;
 
-        memcpy(av7110->demux_id, "demux0_0", 9);
-        av7110->demux_id[5] = av7110->dvb_adapter->num + '0';
         dvbdemux->priv = (void *) av7110;
 
 	for (i=0; i<32; i++)
@@ -3868,18 +4028,11 @@
 	dvbdemux->start_feed = av7110_start_feed;
 	dvbdemux->stop_feed = av7110_stop_feed;
 	dvbdemux->write_to_decoder = av7110_write_to_decoder;
-	dvbdemux->dmx.vendor = "TI";
-	dvbdemux->dmx.model = "AV7110";
-	dvbdemux->dmx.id = av7110->demux_id;
 	dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
 				      DMX_MEMORY_BASED_FILTERING);
 
 	dvb_dmx_init(&av7110->demux);
-
-	dvbfront->id = "hw_frontend";
-	dvbfront->vendor = "VLSI";
-	dvbfront->model = "DVB Frontend";
-	dvbfront->source = DMX_FRONTEND_0;
+	av7110->demux.dmx.get_stc = dvb_get_stc;
 
 	av7110->dmxdev.filternum = 32;
 	av7110->dmxdev.demux = &dvbdemux->dmx;
@@ -3887,14 +4040,13 @@
         
 	dvb_dmxdev_init(&av7110->dmxdev, av7110->dvb_adapter);
 
-        ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, 
-					 &av7110->hw_frontend);
+        av7110->hw_frontend.source = DMX_FRONTEND_0;
+
+        ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->hw_frontend);
+
         if (ret < 0)
                 return ret;
         
-        av7110->mem_frontend.id = "mem_frontend";
-        av7110->mem_frontend.vendor = "memory";
-        av7110->mem_frontend.model = "sw";
         av7110->mem_frontend.source = DMX_MEMORY_FE;
 
 	ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &av7110->mem_frontend);
@@ -3907,6 +4059,12 @@
         if (ret < 0)
                 return ret;
 
+	init_waitqueue_head(&av7110->video_events.wait_queue);
+	spin_lock_init(&av7110->video_events.lock);
+	av7110->video_events.eventw = av7110->video_events.eventr = 0;
+	av7110->video_events.overflow = 0;
+	memset(&av7110->video_size, 0, sizeof (video_size_t));
+
 	dvb_register_device(av7110->dvb_adapter, &av7110->video_dev,
 			    &dvbdev_video, av7110, DVB_DEVICE_VIDEO);
           
@@ -4132,18 +4290,19 @@
 		i2c_writereg(av7110, 0x20, 0x02, 0x49);
 		i2c_writereg(av7110, 0x20, 0x03, 0x00);
 		i2c_writereg(av7110, 0x20, 0x04, 0x00);
-	}
-                
 	
 	/**
-	 * some special handling for the Siemens DVB-C card...
+	 * some special handling for the Siemens DVB-C cards...
 	 */
-	if (dev->pci->subsystem_vendor == 0x110a) {
+	} else if ((dev->pci->subsystem_vendor == 0x110a) ||
+	    ((dev->pci->subsystem_vendor == 0x13c2) &&
+	     (dev->pci->subsystem_device == 0x1004))) {
 		if (i2c_writereg(av7110, 0x80, 0x0, 0x80)==1) {
 			i2c_writereg(av7110, 0x80, 0x0, 0);
 			printk ("av7110: DVB-C analog module detected, "
 				"initializing MSP3400\n");
-			ddelay(10);
+                        av7110->adac_type = DVB_ADAC_MSP;
+			dvb_delay(100);
 			msp_writereg(av7110, 0x12, 0x0013, 0x0c00);
 			msp_writereg(av7110, 0x12, 0x0000, 0x7f00); // loudspeaker + headphone
 			msp_writereg(av7110, 0x12, 0x0008, 0x0220); // loudspeaker source
@@ -4151,17 +4310,18 @@
 			msp_writereg(av7110, 0x12, 0x000a, 0x0220); // SCART 1 source
 			msp_writereg(av7110, 0x12, 0x0007, 0x7f00); // SCART 1 volume
 			msp_writereg(av7110, 0x12, 0x000d, 0x4800); // prescale SCART
-		}
-
+		} else
+		        av7110->adac_type = DVB_ADAC_NONE;
 
 		// switch DVB SCART on
 		outcom(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0);
 		outcom(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1);
 		//saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16
 		//saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO); // SCARTpin 8
-		av7110->adac_type = DVB_ADAC_NONE;
 	}
 	
+	SetVolume(av7110, 0xff, 0xff);
+
 	av7110_setup_irc_config (av7110, 0);
 	av7110_register(av7110);
 	
@@ -4197,7 +4357,7 @@
 	wake_up_interruptible(&av7110->arm_wait);
 
 	while (av7110->arm_thread)
-		ddelay(1);
+		dvb_delay(1);
 
 	dvb_unregister(av7110);
 	
@@ -4288,6 +4448,8 @@
 	}
 };
 
+MODULE_DEVICE_TABLE(pci, pci_tbl);
+
 static int std_callback(struct saa7146_dev* dev, struct saa7146_standard *std)
 {
 	av7110_t *av7110 = (av7110_t*)dev->ext_priv;
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/av7110.h linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110.h
--- linux-2.5.69/drivers/media/dvb/ttpci/av7110.h	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110.h	2003-04-24 09:38:18.000000000 +0200
@@ -127,9 +127,9 @@
 #define	SECTION_CYCLE		0x02
 #define	SECTION_CONTINUOS	0x04
 #define	SECTION_MODE		0x06
-#define SECTION_IPMPE		0x0C	// bis zu 4k gro_
-#define SECTION_HIGH_SPEED	0x1C	// vergrv_erter Puffer f|r High Speed Filter
-#define DATA_PIPING_FLAG	0x20	// f|r Data Piping Filter
+#define SECTION_IPMPE		0x0C	// bis zu 4k groß
+#define SECTION_HIGH_SPEED	0x1C	// vergrößerter Puffer für High Speed Filter
+#define DATA_PIPING_FLAG	0x20	// für Data Piping Filter
 
 #define	PBUFSIZE_NONE 0x0000
 #define	PBUFSIZE_1P   0x0100
@@ -203,7 +203,9 @@
 	CrashCounter,
 	ReqVersion,
 	ReqVCXO,
-	ReqRegister
+	ReqRegister,
+	ReqSecFilterError,
+	ReqSTC
 } REQCOM;
 
 typedef enum  {
@@ -275,6 +277,7 @@
 #define DATA_STREAMING           0x0a
 #define DATA_CI_GET              0x0b
 #define DATA_CI_PUT              0x0c
+#define DATA_MPEG_VIDEO_EVENT    0x0d
 
 #define DATA_PES_RECORD          0x10
 #define DATA_PES_PLAY            0x11
@@ -444,6 +447,19 @@
         struct dvb_demux_feed *feed;
 } p2t_t;
 
+/* video MPEG decoder events: */
+/* (code copied from dvb_frontend.c, should maybe be factored out...) */
+#define MAX_VIDEO_EVENT 8
+struct dvb_video_events {
+	struct video_event        events[MAX_VIDEO_EVENT];
+	int                       eventw;
+	int                       eventr;
+	int                       overflow;
+	wait_queue_head_t         wait_queue;
+	spinlock_t                lock;
+};
+
+
 /* place to store all the necessary device information */
 typedef struct av7110_s {
 
@@ -464,6 +480,7 @@
         int adac_type;         /* audio DAC type */
 #define DVB_ADAC_TI       0
 #define DVB_ADAC_CRYSTAL  1
+#define DVB_ADAC_MSP      2
 #define DVB_ADAC_NONE    -1
 
 
@@ -524,7 +541,6 @@
         int                     vidmode;
         dmxdev_t                dmxdev;
         struct dvb_demux             demux;
-        char                    demux_id[16];
 
         dmx_frontend_t          hw_frontend;
         dmx_frontend_t          mem_frontend;
@@ -583,7 +599,12 @@
         struct dvb_device        *ca_dev;
         struct dvb_device        *osd_dev;
 
+	struct dvb_video_events  video_events;
+	video_size_t             video_size;
+
         int                 dsp_dev;
+
+        u32                 ir_config;
 } av7110_t;
 
 
@@ -623,26 +644,15 @@
 #define Reserved	(DPRAM_BASE + 0x1E00)
 #define Reserved_SIZE	0x1C0
 
-#define DEBUG_WINDOW	(DPRAM_BASE + 0x1FC0)
-#define	DBG_LOOP_CNT	(DEBUG_WINDOW + 0x00)
-#define DBG_SEC_CNT	(DEBUG_WINDOW + 0x02)
-#define DBG_AVRP_BUFF	(DEBUG_WINDOW + 0x04)
-#define DBG_AVRP_PEAK	(DEBUG_WINDOW + 0x06)
-#define DBG_MSG_CNT	(DEBUG_WINDOW + 0x08)
-#define DBG_CODE_REG	(DEBUG_WINDOW + 0x0a)
-#define DBG_TTX_Q	(DEBUG_WINDOW + 0x0c)
-#define DBG_AUD_EN	(DEBUG_WINDOW + 0x0e)
-#define DBG_WRONG_COM	(DEBUG_WINDOW + 0x10)
-#define DBG_ARR_OVFL	(DEBUG_WINDOW + 0x12)
-#define DBG_BUFF_OVFL	(DEBUG_WINDOW + 0x14)
-#define DBG_OVFL_CNT	(DEBUG_WINDOW + 0x16)
-#define DBG_SEC_OVFL	(DEBUG_WINDOW + 0x18)
-
 #define STATUS_BASE	(DPRAM_BASE + 0x1FC0)
 #define STATUS_SCR      (STATUS_BASE + 0x00)
 #define STATUS_MODES    (STATUS_BASE + 0x04)
 #define STATUS_LOOPS    (STATUS_BASE + 0x08)
 
+#define STATUS_MPEG_WIDTH     (STATUS_BASE + 0x0C)
+/* ((aspect_ratio & 0xf) << 12) | (height & 0xfff) */
+#define STATUS_MPEG_HEIGHT_AR (STATUS_BASE + 0x0E)
+
 #define RX_TYPE         (DPRAM_BASE + 0x1FE8)
 #define RX_LEN          (DPRAM_BASE + 0x1FEA)
 #define TX_TYPE         (DPRAM_BASE + 0x1FEC)
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/av7110_ipack.c linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110_ipack.c
--- linux-2.5.69/drivers/media/dvb/ttpci/av7110_ipack.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110_ipack.c	2003-03-24 15:37:09.000000000 +0100
@@ -1,6 +1,7 @@
 #include "dvb_filter.h"
 #include "av7110_ipack.h"
 #include <linux/string.h>	/* for memcpy() */
+#include <linux/vmalloc.h>
 
 
 void av7110_ipack_reset(ipack *p)
@@ -34,7 +35,8 @@
 
 void av7110_ipack_free(ipack * p)
 {
-	if (p->buf) vfree(p->buf);
+	if (p->buf)
+		vfree(p->buf);
 }
 
 
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/av7110_ir.c linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110_ir.c
--- linux-2.5.69/drivers/media/dvb/ttpci/av7110_ir.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/av7110_ir.c	2003-05-06 10:59:59.000000000 +0200
@@ -12,7 +12,7 @@
 #endif
 
 
-#define UP_TIMEOUT (HZ/2)
+#define UP_TIMEOUT (HZ/4)
 
 static int av7110_ir_debug = 0;
 
@@ -21,6 +21,7 @@
 
 static struct input_dev input_dev;
 
+static u32 ir_config;
 
 static
 u16 key_map [256] = {
@@ -64,32 +65,61 @@
 static
 void av7110_emit_key (u32 ircom)
 {
-	int down = ircom & (0x80000000);
-	u16 keycode = key_map[ircom & 0xff];
-
-	dprintk ("#########%08x######### key %02x %s (keycode %i)\n",
-		 ircom, ircom & 0xff, down ? "pressed" : "released", keycode);
+	u8 data;
+	u8 addr;
+	static u16 old_toggle = 0;
+	u16 new_toggle;
+	u16 keycode;
+
+	/* extract device address and data */
+	if (ir_config & 0x0001) {
+		/* TODO RCMM: ? bits device address, 8 bits data */
+		data = ircom & 0xff;
+		addr = (ircom >> 8) & 0xff;
+	} else {
+		/* RC5: 5 bits device address, 6 bits data */
+		data = ircom & 0x3f;
+		addr = (ircom >> 6) & 0x1f;
+	}
+
+	keycode = key_map[data];
+	
+	dprintk ("#########%08x######### addr %i data 0x%02x (keycode %i)\n",
+		 ircom, addr, data, keycode);
+
+	/* check device address (if selected) */
+	if (ir_config & 0x4000)
+		if (addr != ((ir_config >> 16) & 0xff))
+			return;
 
 	if (!keycode) {
 		printk ("%s: unknown key 0x%02x!!\n",
-			__FUNCTION__, ircom & 0xff);
+			__FUNCTION__, data);
 		return;
 	}
 
+	if (ir_config & 0x0001) 
+		new_toggle = 0; /* RCMM */
+	else
+		new_toggle = (ircom & 0x800); /* RC5 */
+
 	if (timer_pending (&keyup_timer)) {
 		del_timer (&keyup_timer);
-		if (keyup_timer.data != keycode)
+		if (keyup_timer.data != keycode || new_toggle != old_toggle) {
 			input_event (&input_dev, EV_KEY, keyup_timer.data, !!0);
-	}
-
-	clear_bit (keycode, input_dev.key);
+			input_event (&input_dev, EV_KEY, keycode, !0);
+		} else
+			input_event (&input_dev, EV_KEY, keycode, 2);
 
+	} else
 	input_event (&input_dev, EV_KEY, keycode, !0);
 
 	keyup_timer.expires = jiffies + UP_TIMEOUT;
 	keyup_timer.data = keycode;
 
 	add_timer (&keyup_timer);
+
+	old_toggle = new_toggle;
 }
 
 static
@@ -108,17 +138,36 @@
 }
 
 
+static void input_repeat_key(unsigned long data)
+{
+       /* dummy routine to disable autorepeat in the input driver */
+}
+
+
 static
 int av7110_ir_write_proc (struct file *file, const char *buffer,
 	                  unsigned long count, void *data)
 {
-	u32 ir_config;
+	char *page;
+	int size = 4 + 256 * sizeof(u16);
 
-	if (count < 4 + 256 * sizeof(u16))
+	if (count < size)
 		return -EINVAL;
 	
-	memcpy (&ir_config, buffer, 4);
-	memcpy (&key_map, buffer + 4, 256 * sizeof(u16));
+	page = (char *)vmalloc(size);
+	if( NULL == page ) {
+		return -ENOMEM;
+	}
+	
+	if (copy_from_user(page, buffer, size)) {
+		vfree(page);
+		return -EFAULT;
+	}
+
+	memcpy (&ir_config, page, 4);
+	memcpy (&key_map, page + 4, 256 * sizeof(u16));
+
+	vfree(page);
 
 	av7110_setup_irc_config (NULL, ir_config);
 
@@ -141,10 +190,12 @@
          *  enable keys
          */
         set_bit (EV_KEY, input_dev.evbit);
+        set_bit (EV_REP, input_dev.evbit);
 
 	input_register_keys ();
 
 	input_register_device(&input_dev);
+	input_dev.timer.function = input_repeat_key;
 
 	av7110_setup_irc_config (NULL, 0x0001);
 	av7110_register_irc_handler (av7110_emit_key);
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/budget-av.c linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-av.c
--- linux-2.5.69/drivers/media/dvb/ttpci/budget-av.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-av.c	2003-04-30 12:03:34.000000000 +0200
@@ -30,13 +30,10 @@
  * the project's page is at http://www.linuxtv.org/dvb/
  */
 
-#include "budget.h"
 #include <media/saa7146_vv.h>
 
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        #define KBUILD_MODNAME budget_av
-#endif
-
+#include "budget.h"
+#include "dvb_functions.h"
 
 struct budget_av {
 	struct budget budget;
@@ -48,13 +45,6 @@
  * INITIALIZATION
  ****************************************************************************/
 
-static inline
-void ddelay(int i) 
-{
-        current->state=TASK_INTERRUPTIBLE;
-        schedule_timeout((HZ*i)/100);
-}
-
 
 static
 u8 i2c_readreg (struct dvb_i2c_bus *i2c, u8 id, u8 reg)
@@ -175,7 +165,7 @@
 
 	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);
 
-	ddelay(20);
+	dvb_delay(200);
 
 	saa7146_unregister_device (&budget_av->vd, dev);
 
@@ -221,7 +211,7 @@
 	//test_knc_ci(av7110);
 
 	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTHI);
-	ddelay(50);
+	dvb_delay(500);
 
 	if ((err = saa7113_init (budget_av))) {
 		budget_av_detach(dev);
@@ -245,9 +235,11 @@
 
 	/* what is this? since we don't support open()/close()
 	   notifications, we simply put this into the release handler... */
-//	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);
-	ddelay(20);
-
+/*
+	saa7146_setgpio(dev, 0, SAA7146_GPIO_OUTLO);
+	set_current_state(TASK_INTERRUPTIBLE);
+	schedule_timeout (20);
+*/
 	/* fixme: find some sane values here... */
 	saa7146_write(dev, PCI_BT_V1, 0x1c00101f);
 
@@ -348,7 +340,7 @@
 	}
 };
 
-
+MODULE_DEVICE_TABLE(pci, pci_tbl);
 
 static
 struct saa7146_extension budget_extension = {
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/budget-ci.c linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-ci.c
--- linux-2.5.69/drivers/media/dvb/ttpci/budget-ci.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-ci.c	2003-04-22 18:30:31.000000000 +0200
@@ -28,10 +28,6 @@
  */
 
 #include "budget.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        #define KBUILD_MODNAME budget
-#endif
-
 
 #include <linux/module.h>
 #include <linux/errno.h>
@@ -388,7 +384,7 @@
 	}
 };
 
-
+MODULE_DEVICE_TABLE(pci, pci_tbl);
 
 static
 struct saa7146_extension budget_extension = {
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/budget-core.c linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-core.c
--- linux-2.5.69/drivers/media/dvb/ttpci/budget-core.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-core.c	2003-04-22 18:30:31.000000000 +0200
@@ -1,21 +1,8 @@
 #include "budget.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        #define KBUILD_MODNAME budget
-#endif
 
 int budget_debug = 0;
 
 /****************************************************************************
- * General helper functions
- ****************************************************************************/
-
-static inline void ddelay(int i) 
-{
-        current->state=TASK_INTERRUPTIBLE;
-        schedule_timeout((HZ*i)/100);
-}
-
-/****************************************************************************
  * TT budget / WinTV Nova
  ****************************************************************************/
 
@@ -142,14 +129,11 @@
 static
 int budget_register(struct budget *budget)
 {
-        int ret;
-        dmx_frontend_t *dvbfront=&budget->hw_frontend;
         struct dvb_demux *dvbdemux=&budget->demux;
+        int ret;
 
 	DEB_EE(("budget: %p\n",budget));
 
-        memcpy(budget->demux_id, "demux0_0", 9);
-        budget->demux_id[5] = budget->dvb_adapter->num + '0';
         dvbdemux->priv = (void *) budget;
 
 	dvbdemux->filternum = 256;
@@ -158,33 +142,24 @@
         dvbdemux->stop_feed = budget_stop_feed;
         dvbdemux->write_to_decoder = NULL;
 
-        dvbdemux->dmx.vendor = "CIM";
-        dvbdemux->dmx.model = "sw";
-        dvbdemux->dmx.id = budget->demux_id;
         dvbdemux->dmx.capabilities = (DMX_TS_FILTERING | DMX_SECTION_FILTERING |
                                       DMX_MEMORY_BASED_FILTERING);
 
         dvb_dmx_init(&budget->demux);
 
-        dvbfront->id = "hw_frontend";
-        dvbfront->vendor = "VLSI";
-        dvbfront->model = "DVB Frontend";
-        dvbfront->source = DMX_FRONTEND_0;
-
         budget->dmxdev.filternum = 256;
         budget->dmxdev.demux = &dvbdemux->dmx;
         budget->dmxdev.capabilities = 0;
 
         dvb_dmxdev_init(&budget->dmxdev, budget->dvb_adapter);
 
-        ret=dvbdemux->dmx.add_frontend (&dvbdemux->dmx, 
-                                        &budget->hw_frontend);
+        budget->hw_frontend.source = DMX_FRONTEND_0;
+
+        ret = dvbdemux->dmx.add_frontend(&dvbdemux->dmx, &budget->hw_frontend);
+
         if (ret < 0)
                 return ret;
         
-        budget->mem_frontend.id = "mem_frontend";
-        budget->mem_frontend.vendor = "memory";
-        budget->mem_frontend.model = "sw";
         budget->mem_frontend.source = DMX_MEMORY_FE;
         ret=dvbdemux->dmx.add_frontend (&dvbdemux->dmx, 
                                         &budget->mem_frontend);
@@ -278,9 +253,9 @@
 
 	saa7146_setgpio(dev, 2, SAA7146_GPIO_OUTHI); /* frontend power on */
 
-        if (budget_register(budget) == 0)
+        if (budget_register(budget) == 0) {
 		return 0;
-
+	}
 err:
 	if (budget->grabbing)
 		vfree(budget->grabbing);
@@ -312,7 +287,6 @@
 	saa7146_pgtable_free (dev->pci, &budget->pt);
 
 	vfree (budget->grabbing);
-	kfree (budget);
 
 	return 0;
 }
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/budget-patch.c linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-patch.c
--- linux-2.5.69/drivers/media/dvb/ttpci/budget-patch.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/budget-patch.c	2003-04-22 18:30:31.000000000 +0200
@@ -31,9 +31,7 @@
  */
 
 #include "budget.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        #define KBUILD_MODNAME budget_patch
-#endif
+#include "av7110.h"
 
 #define budget_patch budget
 
@@ -49,45 +47,6 @@
         }
 };
 
-
-#define COMMAND (DPRAM_BASE + 0x0FC)
-#define DPRAM_BASE 0x4000
-#define DEBINOSWAP 0x000e0000
-
-
-typedef enum  { 
-        AudioDAC,
-        CabADAC,
-        ON22K,
-        OFF22K,
-        MainSwitch,
-        ADSwitch,
-        SendDiSEqC,
-        SetRegister
-} AUDCOM;
-
-
-typedef enum  { 
-        COMTYPE_NOCOM,
-        COMTYPE_PIDFILTER,
-        COMTYPE_MPEGDECODER,
-        COMTYPE_OSD,
-        COMTYPE_BMP,
-        COMTYPE_ENCODER,
-        COMTYPE_AUDIODAC,
-        COMTYPE_REQUEST,
-        COMTYPE_SYSTEM,
-        COMTYPE_REC_PLAY,
-        COMTYPE_COMMON_IF,
-        COMTYPE_PID_FILTER,
-        COMTYPE_PES,
-        COMTYPE_TS,
-        COMTYPE_VIDEO,
-        COMTYPE_AUDIO,
-        COMTYPE_CI_LL,
-} COMTYPE;
-
-
 static
 int wdebi(struct budget_patch *budget, u32 config, int addr, u32 val, int count)
 {
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/budget.c linux-2.5.69.patch/drivers/media/dvb/ttpci/budget.c
--- linux-2.5.69/drivers/media/dvb/ttpci/budget.c	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/budget.c	2003-04-30 12:03:16.000000000 +0200
@@ -30,18 +30,7 @@
  */
 
 #include "budget.h"
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,51)
-        #define KBUILD_MODNAME budget
-#endif
-
-
-
-static inline void ddelay(int i)
-{
-	current->state=TASK_INTERRUPTIBLE;
-	schedule_timeout((HZ*i)/100);
-}
-
+#include "dvb_functions.h"
 
 static
 void Set22K (struct budget *budget, int state)
@@ -110,7 +99,7 @@
 			udelay(12500);
 			saa7146_setgpio(dev, 3, SAA7146_GPIO_OUTLO);
 		}
-		ddelay(2);
+		dvb_delay(20);
 	}
 
 	return 0;
@@ -160,15 +149,18 @@
 static
 int budget_attach (struct saa7146_dev* dev, struct saa7146_pci_extension_data *info)
 {
-	struct budget *budget;
+	struct budget *budget = NULL;
 	int err;
 
-	if (!(budget = kmalloc (sizeof(struct budget), GFP_KERNEL)))
+	budget = kmalloc(sizeof(struct budget), GFP_KERNEL);
+	if( NULL == budget ) {
 		return -ENOMEM;
+	}
 
-	DEB_EE(("budget: %p\n",budget));
+	DEB_EE(("dev:%p, info:%p, budget:%p\n",dev,info,budget));
 
 	if ((err = ttpci_budget_init (budget, dev, info))) {
+		printk("==> failed\n");
 		kfree (budget);
 		return err;
 	}
@@ -194,6 +186,7 @@
 	err = ttpci_budget_deinit (budget);
 
 	kfree (budget);
+	dev->ext_priv = NULL;
 
 	return err;
 }
@@ -222,7 +215,7 @@
 	}
 };
 
-
+MODULE_DEVICE_TABLE(pci, pci_tbl);
 
 static
 struct saa7146_extension budget_extension = {
diff -uNrwB -x '*.o' --new-file linux-2.5.69/drivers/media/dvb/ttpci/budget.h linux-2.5.69.patch/drivers/media/dvb/ttpci/budget.h
--- linux-2.5.69/drivers/media/dvb/ttpci/budget.h	2003-05-06 13:15:32.000000000 +0200
+++ linux-2.5.69.patch/drivers/media/dvb/ttpci/budget.h	2003-04-15 15:25:18.000000000 +0200
@@ -1,6 +1,8 @@
 #ifndef __BUDGET_DVB__
 #define __BUDGET_DVB__
 
+#include <media/saa7146.h>
+
 #include "dvb_i2c.h"
 #include "dvb_frontend.h"
 #include "dvbdev.h"
@@ -10,8 +12,6 @@
 #include "dvb_filter.h"
 #include "dvb_net.h"
 
-#include <media/saa7146.h>
-
 extern int budget_debug;
 
 struct budget_info {
@@ -39,7 +39,6 @@
 
         dmxdev_t                dmxdev;
         struct dvb_demux	demux;
-        char                    demux_id[16];
 
         dmx_frontend_t          hw_frontend;
         dmx_frontend_t          mem_frontend;

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-05-06 16:38 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-05-06 16:09 [PATCH[[2.5][4-11] update the av7110 driver Michael Hunold

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox