--- /dev/null
+diff -ur linux/drivers/media/dvb/ttpci/av7110_ca.c linux/drivers/media/dvb/ttpci/av7110_ca.c
+--- linux/drivers/media/dvb/ttpci/av7110_ca.c 2008-01-27 22:48:52.000000000 +0100
++++ linux/drivers/media/dvb/ttpci/av7110_ca.c 2008-01-31 16:54:44.000000000 +0100
+@@ -34,7 +34,9 @@
+ #include <linux/fs.h>
+ #include <linux/timer.h>
+ #include <linux/poll.h>
+-
++#ifndef LINUX_VERSION_CODE
++#include <linux/version.h>
++#endif
+ #include "av7110.h"
+ #include "av7110_hw.h"
+ #include "av7110_ca.h"
+@@ -287,10 +289,31 @@
+ }
+
+ case CA_GET_MSG:
+- break;
++ {
++ ca_pid_t *arg = (ca_pid_t*) parg;
++ u16 buf[4], res[2];
++ buf[0]=0x0745;
++ buf[1]=2;
++ buf[2]=arg->pid >> 16;
++ buf[3]=arg->pid & 0xFFFF;
++ av7110_fw_request(av7110,buf,sizeof(buf),res,2);
++ arg->index=(res[0]<<16) + res[1];
++ break;
++ }
+
+ case CA_SEND_MSG:
+- break;
++ {
++ ca_pid_t *arg = (ca_pid_t*) parg;
++ u16 buf[6], res[2];
++ buf[0]=0x0746;
++ buf[1]=4;
++ buf[2]=arg->pid >> 16;
++ buf[3]=arg->pid & 0xFFFF;
++ buf[4]=arg->index >> 16;
++ buf[5]=arg->index & 0xFFFF;
++ av7110_fw_request(av7110,buf,sizeof(buf),res,2);
++ break;
++ }
+
+ case CA_GET_DESCR_INFO:
+ {
+@@ -319,6 +342,45 @@
+ break;
+ }
+
++ case CA_SET_PID:
++ {
++ int handle;
++ ca_pid_t *pid = (ca_pid_t*) parg;
++
++ if (pid->pid >= 0x1fff)
++ return -EINVAL;
++ if (pid->index < 0 || pid->index >= 16)
++ return -EINVAL;
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
++ if (down_interruptible (&av7110->demux.mutex))
++#else
++ if (mutex_lock_interruptible (&av7110->demux.mutex))
++#endif
++ return -ERESTARTSYS;
++
++ for(handle=0; handle<32; handle++) {
++ struct dvb_demux_filter *dvbdmxfilter=av7110->handle2filter[handle];
++ if(dvbdmxfilter) {
++ struct dvb_demux_feed *feed=dvbdmxfilter->feed;
++ if(feed && feed->state==DMX_STATE_GO && feed->pid==pid->pid) {
++ /* we map the new cmd to CacheError as it's not
++ implemented anyways, i.e. free. */
++ av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, CacheError, 1,
++ (handle<<8)|pid->index); /* hw handle / cw index*/
++ break;
++ }
++ }
++ }
++
++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
++ up(&av7110->demux.mutex);
++#else
++ mutex_unlock(&av7110->demux.mutex);
++#endif
++ break;
++ }
++
+ default:
+ return -EINVAL;
+ }