linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / telephony / phonedev.c
index e41f49a..3c987f4 100644 (file)
@@ -28,7 +28,7 @@
 
 #include <linux/kmod.h>
 #include <linux/sem.h>
-#include <linux/mutex.h>
+#include <linux/devfs_fs_kernel.h>
 
 #define PHONE_NUM_DEVICES      256
 
@@ -37,7 +37,7 @@
  */
 
 static struct phone_device *phone_device[PHONE_NUM_DEVICES];
-static DEFINE_MUTEX(phone_lock);
+static DECLARE_MUTEX(phone_lock);
 
 /*
  *    Open a phone device.
@@ -48,19 +48,19 @@ static int phone_open(struct inode *inode, struct file *file)
        unsigned int minor = iminor(inode);
        int err = 0;
        struct phone_device *p;
-       const struct file_operations *old_fops, *new_fops = NULL;
+       struct file_operations *old_fops, *new_fops = NULL;
 
        if (minor >= PHONE_NUM_DEVICES)
                return -ENODEV;
 
-       mutex_lock(&phone_lock);
+       down(&phone_lock);
        p = phone_device[minor];
        if (p)
                new_fops = fops_get(p->f_op);
        if (!new_fops) {
-               mutex_unlock(&phone_lock);
+               up(&phone_lock);
                request_module("char-major-%d-%d", PHONE_MAJOR, minor);
-               mutex_lock(&phone_lock);
+               down(&phone_lock);
                p = phone_device[minor];
                if (p == NULL || (new_fops = fops_get(p->f_op)) == NULL)
                {
@@ -78,7 +78,7 @@ static int phone_open(struct inode *inode, struct file *file)
        }
        fops_put(old_fops);
 end:
-       mutex_unlock(&phone_lock);
+       up(&phone_lock);
        return err;
 }
 
@@ -100,16 +100,18 @@ int phone_register_device(struct phone_device *p, int unit)
                end = unit + 1;  /* enter the loop at least one time */
        }
        
-       mutex_lock(&phone_lock);
+       down(&phone_lock);
        for (i = base; i < end; i++) {
                if (phone_device[i] == NULL) {
                        phone_device[i] = p;
                        p->minor = i;
-                       mutex_unlock(&phone_lock);
+                       devfs_mk_cdev(MKDEV(PHONE_MAJOR,i),
+                               S_IFCHR|S_IRUSR|S_IWUSR, "phone/%d", i);
+                       up(&phone_lock);
                        return 0;
                }
        }
-       mutex_unlock(&phone_lock);
+       up(&phone_lock);
        return -ENFILE;
 }
 
@@ -119,11 +121,12 @@ int phone_register_device(struct phone_device *p, int unit)
 
 void phone_unregister_device(struct phone_device *pfd)
 {
-       mutex_lock(&phone_lock);
+       down(&phone_lock);
        if (phone_device[pfd->minor] != pfd)
                panic("phone: bad unregister");
+       devfs_remove("phone/%d", pfd->minor);
        phone_device[pfd->minor] = NULL;
-       mutex_unlock(&phone_lock);
+       up(&phone_lock);
 }