Add changes from the Linux-2.6 tree.
[linux-2.6.git] / drivers / char / dtlk.c
index e6ad246..d4005e9 100644 (file)
@@ -52,7 +52,7 @@
 #define KERNEL
 #include <linux/types.h>
 #include <linux/fs.h>
-#include <linux/mm.h>          /* for verify_area */
+#include <linux/mm.h>
 #include <linux/errno.h>       /* for -EBUSY */
 #include <linux/ioport.h>      /* for request_region */
 #include <linux/delay.h>       /* for loops_per_jiffy */
@@ -62,7 +62,6 @@
 #include <linux/init.h>                /* for __init, module_{init,exit} */
 #include <linux/poll.h>                /* for POLLIN, etc. */
 #include <linux/dtlk.h>                /* local header file for DoubleTalk values */
-#include <linux/devfs_fs_kernel.h>
 #include <linux/smp_lock.h>
 
 #ifdef TRACING
@@ -95,7 +94,7 @@ static int dtlk_release(struct inode *, struct file *);
 static int dtlk_ioctl(struct inode *inode, struct file *file,
                      unsigned int cmd, unsigned long arg);
 
-static struct file_operations dtlk_fops =
+static const struct file_operations dtlk_fops =
 {
        .owner          = THIS_MODULE,
        .read           = dtlk_read,
@@ -107,7 +106,6 @@ static struct file_operations dtlk_fops =
 };
 
 /* local prototypes */
-static void dtlk_delay(int ms);
 static int dtlk_dev_probe(void);
 static struct dtlk_settings *dtlk_interrogate(void);
 static int dtlk_readable(void);
@@ -124,14 +122,10 @@ static void dtlk_timer_tick(unsigned long data);
 static ssize_t dtlk_read(struct file *file, char __user *buf,
                         size_t count, loff_t * ppos)
 {
-       unsigned int minor = iminor(file->f_dentry->d_inode);
+       unsigned int minor = iminor(file->f_path.dentry->d_inode);
        char ch;
        int i = 0, retries;
 
-       /* Can't seek (pread) on the DoubleTalk.  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
        TRACE_TEXT("(dtlk_read");
        /*  printk("DoubleTalk PC - dtlk_read()\n"); */
 
@@ -150,7 +144,7 @@ static ssize_t dtlk_read(struct file *file, char __user *buf,
                        return i;
                if (file->f_flags & O_NONBLOCK)
                        break;
-               dtlk_delay(100);
+               msleep_interruptible(100);
        }
        if (retries == loops_per_jiffy)
                printk(KERN_ERR "dtlk_read times out\n");
@@ -180,11 +174,7 @@ static ssize_t dtlk_write(struct file *file, const char __user *buf,
        }
 #endif
 
-       /* Can't seek (pwrite) on the DoubleTalk.  */
-       if (ppos != &file->f_pos)
-               return -ESPIPE;
-
-       if (iminor(file->f_dentry->d_inode) != DTLK_MINOR)
+       if (iminor(file->f_path.dentry->d_inode) != DTLK_MINOR)
                return -EINVAL;
 
        while (1) {
@@ -199,7 +189,7 @@ static ssize_t dtlk_write(struct file *file, const char __user *buf,
                                   rate to 500 bytes/sec, but that's
                                   still enough to keep up with the
                                   speech synthesizer. */
-                               dtlk_delay(1);
+                               msleep_interruptible(1);
                        else {
                                /* the RDY bit goes zero 2-3 usec
                                   after writing, and goes 1 again
@@ -220,7 +210,7 @@ static ssize_t dtlk_write(struct file *file, const char __user *buf,
                if (file->f_flags & O_NONBLOCK)
                        break;
 
-               dtlk_delay(1);
+               msleep_interruptible(1);
 
                if (++retries > 10 * HZ) { /* wait no more than 10 sec
                                              from last write */
@@ -303,11 +293,12 @@ static int dtlk_open(struct inode *inode, struct file *file)
 {
        TRACE_TEXT("(dtlk_open");
 
+       nonseekable_open(inode, file);
        switch (iminor(inode)) {
        case DTLK_MINOR:
                if (dtlk_busy)
                        return -EBUSY;
-               return 0;
+               return nonseekable_open(inode, file);
 
        default:
                return -ENXIO;
@@ -345,9 +336,6 @@ static int __init dtlk_init(void)
        if (dtlk_dev_probe() == 0)
                printk(", MAJOR %d\n", dtlk_major);
 
-       devfs_mk_cdev(MKDEV(dtlk_major, DTLK_MINOR),
-                      S_IFCHR | S_IRUSR | S_IWUSR, "dtlk");
-
        init_timer(&dtlk_timer);
        dtlk_timer.function = dtlk_timer_tick;
        init_waitqueue_head(&dtlk_process_list);
@@ -358,15 +346,13 @@ static int __init dtlk_init(void)
 static void __exit dtlk_cleanup (void)
 {
        dtlk_write_bytes("goodbye", 8);
-       current->state = TASK_INTERRUPTIBLE;
-       schedule_timeout(5 * HZ / 10);          /* nap 0.50 sec but
+       msleep_interruptible(500);              /* nap 0.50 sec but
                                                   could be awakened
                                                   earlier by
                                                   signals... */
 
        dtlk_write_tts(DTLK_CLEAR);
        unregister_chrdev(dtlk_major, "dtlk");
-       devfs_remove("dtlk");
        release_region(dtlk_port_lpc, DTLK_IO_EXTENT);
 }
 
@@ -375,13 +361,6 @@ module_exit(dtlk_cleanup);
 
 /* ------------------------------------------------------------------------ */
 
-/* sleep for ms milliseconds */
-static void dtlk_delay(int ms)
-{
-       current->state = TASK_INTERRUPTIBLE;
-       schedule_timeout((ms * HZ + 1000 - HZ) / 1000);
-}
-
 static int dtlk_readable(void)
 {
 #ifdef TRACING
@@ -438,7 +417,7 @@ static int __init dtlk_dev_probe(void)
                        /* posting an index takes 18 msec.  Here, we
                           wait up to 100 msec to see whether it
                           appears. */
-                       dtlk_delay(100);
+                       msleep_interruptible(100);
                        dtlk_has_indexing = dtlk_readable();
 #ifdef TRACING
                        printk(", indexing %d\n", dtlk_has_indexing);
@@ -506,7 +485,7 @@ for (i = 0; i < 10; i++)                    \
                release_region(dtlk_portlist[i], DTLK_IO_EXTENT);
        }
 
-       printk(KERN_INFO "\nDoubleTalk PC - not found\n");
+       printk(KERN_INFO "DoubleTalk PC - not found\n");
        return -ENODEV;
 }