Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / media / video / arv.c
index 87fd3a7..dbe0251 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/init.h>
 #include <linux/devfs_fs_kernel.h>
 #include <linux/module.h>
-#include <linux/version.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
@@ -32,8 +31,8 @@
 #include <linux/mm.h>
 #include <linux/sched.h>
 #include <linux/videodev.h>
+#include <linux/mutex.h>
 
-#include <asm/semaphore.h>
 #include <asm/uaccess.h>
 #include <asm/m32r.h>
 #include <asm/io.h>
@@ -118,7 +117,7 @@ struct ar_device {
        int width, height;
        int frame_bytes, line_bytes;
        wait_queue_head_t wait;
-       struct semaphore lock;
+       struct mutex lock;
 };
 
 static int video_nr = -1;      /* video device number (first free) */
@@ -130,9 +129,9 @@ static unsigned char        yuv[MAX_AR_FRAME_BYTES];
 static int freq = DEFAULT_FREQ;        /* BCLK: available 50 or 70 (MHz) */
 static int vga = 0;            /* default mode(0:QVGA mode, other:VGA mode) */
 static int vga_interlace = 0;  /* 0 is normal mode for, else interlace mode */
-MODULE_PARM(freq, "i");
-MODULE_PARM(vga, "i");
-MODULE_PARM(vga_interlace, "i");
+module_param(freq, int, 0);
+module_param(vga, int, 0);
+module_param(vga_interlace, int, 0);
 
 static int ar_initialize(struct video_device *dev);
 
@@ -162,39 +161,39 @@ void iic(int n, unsigned long addr, unsigned long data1, unsigned long data2,
 {
        int i;
 
-       /* Slave Address */
-       ar_outl(addr, PLDI2CDATA);
+       /* Slave Address */
+       ar_outl(addr, PLDI2CDATA);
        wait_for_vsync();
 
-       /* Start */
-       ar_outl(1, PLDI2CCND);
+       /* Start */
+       ar_outl(1, PLDI2CCND);
        wait_acknowledge();
 
        /* Transfer data 1 */
-       ar_outl(data1, PLDI2CDATA);
+       ar_outl(data1, PLDI2CDATA);
        wait_for_vsync();
-       ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN);
+       ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN);
        wait_acknowledge();
 
        /* Transfer data 2 */
-       ar_outl(data2, PLDI2CDATA);
+       ar_outl(data2, PLDI2CDATA);
        wait_for_vsync();
-       ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN);
+       ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN);
        wait_acknowledge();
 
        if (n == 3) {
                /* Transfer data 3 */
-               ar_outl(data3, PLDI2CDATA);
+               ar_outl(data3, PLDI2CDATA);
                wait_for_vsync();
-               ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN);
+               ar_outl(PLDI2CSTEN_STEN, PLDI2CSTEN);
                wait_acknowledge();
-       }
+       }
 
-       /* Stop */
+       /* Stop */
        for (i = 0; i < 100; i++)
                cpu_relax();
-       ar_outl(2, PLDI2CCND);
-       ar_outl(2, PLDI2CCND);
+       ar_outl(2, PLDI2CCND);
+       ar_outl(2, PLDI2CCND);
 
        while (ar_inl(PLDI2CSTS) & PLDI2CSTS_BB)
                cpu_relax();
@@ -205,24 +204,24 @@ void init_iic(void)
 {
        DEBUG(1, "init_iic:\n");
 
-       /*
+       /*
         * ICU Setting (iic)
         */
-       /* I2C Setting */
-       ar_outl(0x0, PLDI2CCR);         /* I2CCR Disable                   */
-       ar_outl(0x0300, PLDI2CMOD);     /* I2CMOD ACK/8b-data/7b-addr/auto */
-       ar_outl(0x1, PLDI2CACK);        /* I2CACK ACK                      */
+       /* I2C Setting */
+       ar_outl(0x0, PLDI2CCR);         /* I2CCR Disable                   */
+       ar_outl(0x0300, PLDI2CMOD);     /* I2CMOD ACK/8b-data/7b-addr/auto */
+       ar_outl(0x1, PLDI2CACK);        /* I2CACK ACK                      */
 
        /* I2C CLK */
-       /* 50MH-100k */
+       /* 50MH-100k */
        if (freq == 75) {
-               ar_outl(369, PLDI2CFREQ);       /* BCLK = 75MHz */
+               ar_outl(369, PLDI2CFREQ);       /* BCLK = 75MHz */
        } else if (freq == 50) {
                ar_outl(244, PLDI2CFREQ);       /* BCLK = 50MHz */
        } else {
                ar_outl(244, PLDI2CFREQ);       /* default: BCLK = 50MHz */
        }
-       ar_outl(0x1, PLDI2CCR);         /* I2CCR Enable */
+       ar_outl(0x1, PLDI2CCR);         /* I2CCR Enable */
 }
 
 /**************************************************************************
@@ -254,7 +253,7 @@ static inline void wait_for_vertical_sync(int exp_line)
 
        /*
         * check HCOUNT because we cannot check vertical sync.
-        */
+        */
        for (; tmout >= 0; tmout--) {
                l = ar_inl(ARVHCOUNT);
                if (l == exp_line)
@@ -289,7 +288,7 @@ static ssize_t ar_read(struct file *file, char *buf, size_t count, loff_t *ppos)
        if (ar->mode == AR_MODE_NORMAL)
                arvcr1 |= ARVCR1_NORMAL;
 
-       down(&ar->lock);
+       mutex_lock(&ar->lock);
 
 #if USE_INT
        local_irq_save(flags);
@@ -393,7 +392,7 @@ static ssize_t ar_read(struct file *file, char *buf, size_t count, loff_t *ppos)
        }
        DEBUG(1, "ret = %d\n", ret);
 out_up:
-       up(&ar->lock);
+       mutex_unlock(&ar->lock);
        return ret;
 }
 
@@ -457,7 +456,7 @@ static int ar_do_ioctl(struct inode *inode, struct file *file,
                    (w->width != AR_WIDTH_QVGA || w->height != AR_HEIGHT_QVGA))
                                return -EINVAL;
 
-               down(&ar->lock);
+               mutex_lock(&ar->lock);
                ar->width = w->width;
                ar->height = w->height;
                if (ar->width == AR_WIDTH_VGA) {
@@ -474,7 +473,7 @@ static int ar_do_ioctl(struct inode *inode, struct file *file,
                        ar->line_bytes = AR_LINE_BYTES_QVGA;
                        ar->mode = AR_MODE_INTERLACE;
                }
-               up(&ar->lock);
+               mutex_unlock(&ar->lock);
                return 0;
        }
        case VIDIOCGFBUF:
@@ -563,8 +562,8 @@ static void ar_interrupt(int irq, void *dev, struct pt_regs *regs)
                /* operations for interlace mode */
                if ( line_count < (AR_HEIGHT_VGA/2) )   /* even line */
                        line_number = (line_count << 1);
-               else                                    /* odd line */
-                       line_number =
+               else                                    /* odd line */
+                       line_number =
                        (((line_count - (AR_HEIGHT_VGA/2)) << 1) + 1);
        } else {
                line_number = line_count;
@@ -652,7 +651,7 @@ static int ar_initialize(struct video_device *dev)
                cr |= ARVCR1_NORMAL;
        ar_outl(cr, ARVCR1);
 
-       /*
+       /*
         * Initialize IIC so that CPU can communicate with AR LSI,
         * and send boot commands to AR LSI.
         */
@@ -735,7 +734,7 @@ static int ar_initialize(struct video_device *dev)
 void ar_release(struct video_device *vfd)
 {
        struct ar_device *ar = vfd->priv;
-       down(&ar->lock);
+       mutex_lock(&ar->lock);
        video_device_release(vfd);
 }
 
@@ -750,6 +749,7 @@ static struct file_operations ar_fops = {
        .release        = video_exclusive_release,
        .read           = ar_read,
        .ioctl          = ar_ioctl,
+       .compat_ioctl   = v4l_compat_ioctl32,
        .llseek         = no_llseek,
 };
 
@@ -824,7 +824,7 @@ static int __init ar_init(void)
                ar->line_bytes  = AR_LINE_BYTES_QVGA;
                ar->mode        = AR_MODE_INTERLACE;
        }
-       init_MUTEX(&ar->lock);
+       mutex_init(&ar->lock);
        init_waitqueue_head(&ar->wait);
 
 #if USE_INT
@@ -846,7 +846,7 @@ static int __init ar_init(void)
         * so register video device as a frame grabber type.
         * device is named "video[0-64]".
         * video_register_device() initializes h/w using ar_initialize().
-        */
+        */
        if (video_register_device(ar->vdev, VFL_TYPE_GRABBER, video_nr) != 0) {
                /* return -1, -ENFILE(full) or others */
                printk("arv: register video (Colour AR) failed.\n");
@@ -865,10 +865,8 @@ out_dev:
 
 out_irq:
 #endif
-       for (i = 0; i < MAX_AR_HEIGHT; i++) {
-               if (ar->frame[i])
-                       kfree(ar->frame[i]);
-       }
+       for (i = 0; i < MAX_AR_HEIGHT; i++)
+               kfree(ar->frame[i]);
 
 out_line_buff:
 #if USE_INT
@@ -899,10 +897,8 @@ static void __exit ar_cleanup_module(void)
 #if USE_INT
        free_irq(M32R_IRQ_INT3, ar);
 #endif
-       for (i = 0; i < MAX_AR_HEIGHT; i++) {
-               if (ar->frame[i])
-                       kfree(ar->frame[i]);
-       }
+       for (i = 0; i < MAX_AR_HEIGHT; i++)
+               kfree(ar->frame[i]);
 #if USE_INT
        kfree(ar->line_buff);
 #endif