{
        struct proc_dir_entry *ent;
                
-       if (!driver->ops->read_proc || !driver->driver_name ||
-           driver->proc_entry)
+       if (!driver->driver_name || driver->proc_entry)
                return;
 
-       ent = create_proc_entry(driver->driver_name, 0, proc_tty_driver);
-       if (!ent)
+       if (driver->ops->proc_fops) {
+               ent = proc_create_data(driver->driver_name, 0, proc_tty_driver,
+                                      driver->ops->proc_fops, driver);
+               if (!ent)
+                       return;
+       } else if (driver->ops->read_proc) {
+               ent = create_proc_entry(driver->driver_name, 0, proc_tty_driver);
+               if (!ent)
+                       return;
+               ent->read_proc = driver->ops->read_proc;
+               ent->data = driver;
+       } else
                return;
-       ent->read_proc = driver->ops->read_proc;
-       ent->data = driver;
-
        driver->proc_entry = ent;
 }
 
 
        int (*poll_get_char)(struct tty_driver *driver, int line);
        void (*poll_put_char)(struct tty_driver *driver, int line, char ch);
 #endif
+       const struct file_operations *proc_fops;
 };
 
 struct tty_driver {