vserver 1.9.5.x5
[linux-2.6.git] / drivers / media / video / saa5249.c
index d486fb7..e984657 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Modified in order to keep it compatible both with new and old videotext IOCTLs by
+ * Michael Geng <linux@MichaelGeng.de>
+ *
  *     Cleaned up to use existing videodev interface and allow the idea
  *     of multiple teletext decoders on the video4linux iface. Changed i2c
  *     to cover addressing clashes on device busses. It's also rebuilt so
@@ -58,7 +61,7 @@
 #include <asm/uaccess.h>
 
 #define VTX_VER_MAJ 1
-#define VTX_VER_MIN 7
+#define VTX_VER_MIN 8
 
 
 
@@ -273,8 +276,7 @@ static void jdelay(unsigned long delay)
        sigfillset(&current->blocked);
        recalc_sigpending();
        spin_unlock_irq(&current->sighand->siglock);
-       current->state = TASK_INTERRUPTIBLE;
-       schedule_timeout(delay);
+       msleep_interruptible(jiffies_to_msecs(delay));
 
        spin_lock_irq(&current->sighand->siglock);
        current->blocked = oldblocked;
@@ -578,6 +580,54 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file,
        return -EINVAL;
 }
 
+/*
+ * Translates old vtx IOCTLs to new ones
+ *
+ * This keeps new kernel versions compatible with old userspace programs.
+ */
+static inline unsigned int vtx_fix_command(unsigned int cmd)
+{
+       switch (cmd) {
+       case VTXIOCGETINFO_OLD:
+               cmd = VTXIOCGETINFO;
+               break;
+       case VTXIOCCLRPAGE_OLD:
+               cmd = VTXIOCCLRPAGE;
+               break;
+       case VTXIOCCLRFOUND_OLD:
+               cmd = VTXIOCCLRFOUND;
+               break;
+       case VTXIOCPAGEREQ_OLD:
+               cmd = VTXIOCPAGEREQ;
+               break;
+       case VTXIOCGETSTAT_OLD:
+               cmd = VTXIOCGETSTAT;
+               break;
+       case VTXIOCGETPAGE_OLD:
+               cmd = VTXIOCGETPAGE;
+               break;
+       case VTXIOCSTOPDAU_OLD:
+               cmd = VTXIOCSTOPDAU;
+               break;
+       case VTXIOCPUTPAGE_OLD:
+               cmd = VTXIOCPUTPAGE;
+               break;
+       case VTXIOCSETDISP_OLD:
+               cmd = VTXIOCSETDISP;
+               break;
+       case VTXIOCPUTSTAT_OLD:
+               cmd = VTXIOCPUTSTAT;
+               break;
+       case VTXIOCCLRCACHE_OLD:
+               cmd = VTXIOCCLRCACHE;
+               break;
+       case VTXIOCSETVIRT_OLD:
+               cmd = VTXIOCSETVIRT;
+               break;
+       }
+       return cmd;
+}
+
 /*
  *     Handle the locking
  */
@@ -589,6 +639,7 @@ static int saa5249_ioctl(struct inode *inode, struct file *file,
        struct saa5249_device *t=vd->priv;
        int err;
        
+       cmd = vtx_fix_command(cmd);
        down(&t->lock);
        err = video_usercopy(inode,file,cmd,arg,do_saa5249_ioctl);
        up(&t->lock);