media: tegra: enable a clock for VIP in APB MISC register
[linux-2.6.git] / drivers / char / viotape.c
index af03d27..ad6e64a 100644 (file)
@@ -6,7 +6,7 @@
  *  Authors: Dave Boutcher <boutcher@us.ibm.com>
  *           Ryan Arnold <ryanarn@us.ibm.com>
  *           Colin Devilbiss <devilbis@us.ibm.com>
- *           Stephen Rothwell <sfr@au1.ibm.com>
+ *           Stephen Rothwell
  *
  * (C) Copyright 2000-2004 IBM Corporation
  *
@@ -46,7 +46,8 @@
 #include <linux/completion.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
-#include <linux/smp_lock.h>
+#include <linux/mutex.h>
+#include <linux/slab.h>
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
@@ -63,6 +64,7 @@
 #define VIOTAPE_KERN_WARN      KERN_WARNING "viotape: "
 #define VIOTAPE_KERN_INFO      KERN_INFO "viotape: "
 
+static DEFINE_MUTEX(proc_viotape_mutex);
 static int viotape_numdev;
 
 /*
@@ -678,6 +680,17 @@ free_op:
        return ret;
 }
 
+static long viotap_unlocked_ioctl(struct file *file,
+               unsigned int cmd, unsigned long arg)
+{
+       long rc;
+
+       mutex_lock(&proc_viotape_mutex);
+       rc = viotap_ioctl(file->f_path.dentry->d_inode, file, cmd, arg);
+       mutex_unlock(&proc_viotape_mutex);
+       return rc;
+}
+
 static int viotap_open(struct inode *inode, struct file *file)
 {
        HvLpEvent_Rc hvrc;
@@ -688,7 +701,7 @@ static int viotap_open(struct inode *inode, struct file *file)
        if (op == NULL)
                return -ENOMEM;
 
-       lock_kernel()
+       mutex_lock(&proc_viotape_mutex);
        get_dev_info(file->f_path.dentry->d_inode, &devi);
 
        /* Note: We currently only support one mode! */
@@ -719,7 +732,7 @@ static int viotap_open(struct inode *inode, struct file *file)
 
 free_op:
        free_op_struct(op);
-       unlock_kernel();
+       mutex_unlock(&proc_viotape_mutex);
        return ret;
 }
 
@@ -786,12 +799,13 @@ free_op:
 }
 
 const struct file_operations viotap_fops = {
-       .owner =        THIS_MODULE,
-       .read =         viotap_read,
-       .write =        viotap_write,
-       .ioctl =        viotap_ioctl,
-       .open =         viotap_open,
-       .release =      viotap_release,
+       .owner =                THIS_MODULE,
+       .read =                 viotap_read,
+       .write =                viotap_write,
+       .unlocked_ioctl =       viotap_unlocked_ioctl,
+       .open =                 viotap_open,
+       .release =              viotap_release,
+       .llseek =               noop_llseek,
 };
 
 /* Handle interrupt events for tape */
@@ -854,9 +868,9 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
 {
        int i = vdev->unit_address;
        int j;
-       struct device_node *node = vdev->dev.archdata.of_node;
+       struct device_node *node = vdev->dev.of_node;
 
-       if (i > VIOTAPE_MAX_TAPE)
+       if (i >= VIOTAPE_MAX_TAPE)
                return -ENODEV;
        if (!node)
                return -ENODEV;
@@ -875,10 +889,10 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        state[i].cur_part = 0;
        for (j = 0; j < MAX_PARTITIONS; ++j)
                state[i].part_stat_rwi[j] = VIOT_IDLE;
-       device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i),
-                       "iseries!vt%d", i);
-       device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80),
-                       "iseries!nvt%d", i);
+       device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i), NULL,
+                     "iseries!vt%d", i);
+       device_create(tape_class, NULL, MKDEV(VIOTAPE_MAJOR, i | 0x80), NULL,
+                     "iseries!nvt%d", i);
        printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries "
                        "resource %10.10s type %4.4s, model %3.3s\n",
                        i, viotape_unitinfo[i].rsrcname,