fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / media / video / saa5246a.c
index c2fb64d..77bb940 100644 (file)
@@ -46,6 +46,9 @@
 #include <linux/i2c.h>
 #include <linux/videotext.h>
 #include <linux/videodev.h>
+#include <media/v4l2-common.h>
+#include <linux/mutex.h>
+
 #include "saa5246a.h"
 
 MODULE_AUTHOR("Michael Geng <linux@MichaelGeng.de>");
@@ -57,26 +60,14 @@ struct saa5246a_device
        u8     pgbuf[NUM_DAUS][VTX_VIRTUALSIZE];
        int    is_searching[NUM_DAUS];
        struct i2c_client *client;
-       struct semaphore lock;
+       struct mutex lock;
 };
 
 static struct video_device saa_template;       /* Declared near bottom */
 
 /* Addresses to scan */
 static unsigned short normal_i2c[]      = { I2C_ADDRESS, I2C_CLIENT_END };
-static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };
-static unsigned short probe[2]          = { I2C_CLIENT_END, I2C_CLIENT_END };
-static unsigned short probe_range[2]    = { I2C_CLIENT_END, I2C_CLIENT_END };
-static unsigned short ignore[2]                 = { I2C_CLIENT_END, I2C_CLIENT_END };
-static unsigned short ignore_range[2]   = { I2C_CLIENT_END, I2C_CLIENT_END };
-static unsigned short force[2]          = { I2C_CLIENT_END, I2C_CLIENT_END };
-
-static struct i2c_client_address_data addr_data = {
-       normal_i2c, normal_i2c_range,
-       probe, probe_range,
-       ignore, ignore_range,
-       force
-};
+I2C_CLIENT_INSMOD;
 
 static struct i2c_client client_template;
 
@@ -95,15 +86,14 @@ static int saa5246a_attach(struct i2c_adapter *adap, int addr, int kind)
        client_template.adapter = adap;
        client_template.addr = addr;
        memcpy(client, &client_template, sizeof(*client));
-       t = kmalloc(sizeof(*t), GFP_KERNEL);
+       t = kzalloc(sizeof(*t), GFP_KERNEL);
        if(t==NULL)
        {
                kfree(client);
                return -ENOMEM;
        }
-       memset(t, 0, sizeof(*t));
        strlcpy(client->name, IF_NAME, I2C_NAME_SIZE);
-       init_MUTEX(&t->lock);
+       mutex_init(&t->lock);
 
        /*
         *      Now create a video4linux device
@@ -163,29 +153,21 @@ static int saa5246a_detach(struct i2c_client *client)
        return 0;
 }
 
-static int saa5246a_command(struct i2c_client *device, unsigned int cmd,
-       void *arg)
-{
-       return -EINVAL;
-}
-
 /*
  *     I2C interfaces
  */
 
 static struct i2c_driver i2c_driver_videotext =
 {
-       .owner          = THIS_MODULE,
-       .name           = IF_NAME,              /* name */
+       .driver = {
+               .name   = IF_NAME,              /* name */
+       },
        .id             = I2C_DRIVERID_SAA5249, /* in i2c.h */
-       .flags          = I2C_DF_NOTIFY,
        .attach_adapter = saa5246a_probe,
        .detach_client  = saa5246a_detach,
-       .command        = saa5246a_command
 };
 
 static struct i2c_client client_template = {
-       .id             = -1,
        .driver         = &i2c_driver_videotext,
        .name           = "(unset)",
 };
@@ -681,6 +663,54 @@ static int do_saa5246a_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
  */
@@ -691,9 +721,10 @@ static int saa5246a_ioctl(struct inode *inode, struct file *file,
        struct saa5246a_device *t = vd->priv;
        int err;
 
-       down(&t->lock);
+       cmd = vtx_fix_command(cmd);
+       mutex_lock(&t->lock);
        err = video_usercopy(inode, file, cmd, arg, do_saa5246a_ioctl);
-       up(&t->lock);
+       mutex_unlock(&t->lock);
        return err;
 }
 
@@ -799,7 +830,6 @@ static struct video_device saa_template =
        .owner    = THIS_MODULE,
        .name     = IF_NAME,
        .type     = VID_TYPE_TELETEXT,
-       .hardware = VID_HARDWARE_SAA5249,
        .fops     = &saa_fops,
        .release  = video_device_release,
        .minor    = -1,