diff -ur --new-file a/drivers/base/Makefile b/drivers/base/Makefile
--- a/drivers/base/Makefile    Sun Jul 28 20:28:33 2002
+++ b/drivers/base/Makefile    Sat Jul 27 21:09:41 2002
@@ -1,7 +1,7 @@
 # Makefile for the Linux device tree
-obj-y        := core.o sys.o interface.o fs.o power.o bus.o \
-            driver.o
+obj-y        := core.o sys.o fs.o power.o bus.o \
+            driver.o interfaces/
 export-objs    := core.o fs.o power.o sys.o bus.o driver.o
 
diff -ur --new-file a/drivers/base/core.c b/drivers/base/core.c
--- a/drivers/base/core.c    Fri Jun 21 09:15:52 2002
+++ b/drivers/base/core.c    Sun Jul 28 16:06:39 2002
@@ -199,6 +199,7 @@
     INIT_LIST_HEAD(&dev->node);
     INIT_LIST_HEAD(&dev->children);
     INIT_LIST_HEAD(&dev->g_list);
+    INIT_LIST_HEAD(&dev->devfs_handles);
     spin_lock_init(&dev->lock);
     atomic_set(&dev->refcount,2);
 
diff -ur --new-file a/drivers/base/interface.c b/drivers/base/interface.c
--- a/drivers/base/interface.c    Tue Jun  4 00:07:28 2002
+++ b/drivers/base/interface.c    Thu Jan  1 00:00:00 1970
@@ -1,103 +0,0 @@
-/*
- * drivers/base/interface.c - common driverfs interface that's exported to
- *     the world for all devices.
- * Copyright (c) 2002 Patrick Mochel
- *         2002 Open Source Development Lab
- */
-
-#include <linux/device.h>
-#include <linux/err.h>
-#include <linux/stat.h>
-
-static ssize_t device_read_name(struct device * dev, char * buf, size_t 
count, loff_t off)
-{
-    return off ? 0 : sprintf(buf,"%s\n",dev->name);
-}
-
-static struct driver_file_entry device_name_entry = {
-    name:    "name",
-    mode:    S_IRUGO,
-    show:    device_read_name,
-};
-
-static ssize_t
-device_read_power(struct device * dev, char * page, size_t count, 
loff_t off)
-{
-    return off ? 0 : sprintf(page,"%d\n",dev->current_state);
-}
-
-static ssize_t
-device_write_power(struct device * dev, const char * buf, size_t count, 
loff_t off)
-{
-    char    str_command[20];
-    char    str_level[20];
-    int    num_args;
-    u32    state;
-    u32    int_level;
-    int    error = 0;
-
-    if (off)
-        return 0;
-
-    if (!dev->driver)
-        goto done;
-
-    num_args = sscanf(buf,"%10s %10s %u",str_command,str_level,&state);
-
-    error = -EINVAL;
-
-    if (!num_args)
-        goto done;
-
-    if (!strnicmp(str_command,"suspend",7)) {
-        if (num_args != 3)
-            goto done;
-        if (!strnicmp(str_level,"notify",6))
-            int_level = SUSPEND_NOTIFY;
-        else if (!strnicmp(str_level,"save",4))
-            int_level = SUSPEND_SAVE_STATE;
-        else if (!strnicmp(str_level,"disable",7))
-            int_level = SUSPEND_DISABLE;
-        else if (!strnicmp(str_level,"powerdown",8))
-            int_level = SUSPEND_POWER_DOWN;
-        else
-            goto done;
-
-        if (dev->driver->suspend)
-            error = dev->driver->suspend(dev,state,int_level);
-        else
-            error = 0;
-    } else if (!strnicmp(str_command,"resume",6)) {
-        if (num_args != 2)
-            goto done;
-
-        if (!strnicmp(str_level,"poweron",7))
-            int_level = RESUME_POWER_ON;
-        else if (!strnicmp(str_level,"restore",7))
-            int_level = RESUME_RESTORE_STATE;
-        else if (!strnicmp(str_level,"enable",6))
-            int_level = RESUME_ENABLE;
-        else
-            goto done;
-
-        if (dev->driver->resume)
-            error = dev->driver->resume(dev,int_level);
-        else
-            error = 0;
-    }
- done:
-    return error < 0 ? error : count;
-}
-
-static struct driver_file_entry device_power_entry = {
-    name:        "power",
-    mode:        S_IWUSR | S_IRUGO,
-    show:        device_read_power,
-    store:        device_write_power,
-};
-
-struct driver_file_entry * device_default_files[] = {
-    &device_name_entry,
-    &device_power_entry,
-    NULL,
-};
diff -ur --new-file a/drivers/base/interfaces/Makefile 
b/drivers/base/interfaces/Makefile
--- a/drivers/base/interfaces/Makefile    Thu Jan  1 00:00:00 1970
+++ b/drivers/base/interfaces/Makefile    Sat Jul 27 12:56:29 2002
@@ -0,0 +1,7 @@
+# Makefile for the Linux device tree
+
+obj-y        := interface.o devfs.o
+
+export-objs    := devfs.o
+
+include $(TOPDIR)/Rules.make
diff -ur --new-file a/drivers/base/interfaces/devfs.c 
b/drivers/base/interfaces/devfs.c
--- a/drivers/base/interfaces/devfs.c    Thu Jan  1 00:00:00 1970
+++ b/drivers/base/interfaces/devfs.c    Sun Jul 28 19:52:30 2002
@@ -0,0 +1,65 @@
+/*
+ * drivers/base/interfaces/dev.c - integrates devfs
+ *     into the Driver Model and exports an
+ *     interface to all devices.
+ * Copyright (c) 2002 Adam Belay (ambx1@netscape.net)
+ * 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or (at
+ *  your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+ */
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/stat.h>
+#include <linux/module.h>
+#include <linux/devfs_fs_kernel.h>
+#include <linux/slab.h>
+
+/**
+ * register_devfs_handle - registers a device handle into the driverfs
+ * @dhandle    the devfs to register
+ * @dev        the dev to register the handle under
+ */
+
+ldm_devfs_t register_devfs_handle(devfs_handle_t dhandle, struct device 
* dev)
+{
+    struct dev_handle * entry;
+    entry = kmalloc(sizeof(*entry),GFP_KERNEL);
+    entry->handle = dhandle;
+    list_add_tail(&entry->device_list,&dev->devfs_handles);
+    return entry;
+}
+
+/**
+ * register_devfs_handle - an all in one package, this is identical to
+ *                devfs_register except it includes dev
+ * @dev        the dev to register the handle under
+ */
+
+ldm_devfs_t ldm_devfs_register (devfs_handle_t dir, const char *name,
+                   unsigned int flags,
+                   unsigned int major, unsigned int minor,
+                   umode_t mode, void *ops, void *info,
+                   struct device * dev)
+{
+    return register_devfs_handle(devfs_register(dir,name,flags,major,minor,
+                            mode,ops,info),dev);
+}
+
+EXPORT_SYMBOL(register_devfs_handle);
+EXPORT_SYMBOL(ldm_devfs_register);
diff -ur --new-file a/drivers/base/interfaces/interface.c 
b/drivers/base/interfaces/interface.c
--- a/drivers/base/interfaces/interface.c    Thu Jan  1 00:00:00 1970
+++ b/drivers/base/interfaces/interface.c    Sun Jul 28 19:54:24 2002
@@ -0,0 +1,137 @@
+/*
+ * drivers/base/interfaces/interface.c - common driverfs interface 
that's exported to
+ *     the world for all devices.
+ * Copyright (c) 2002 Patrick Mochel
+ *         2002 Open Source Development Lab
+ */
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/stat.h>
+
+static ssize_t device_read_name(struct device * dev, char * buf, size_t 
count, loff_t off)
+{
+    return off ? 0 : sprintf(buf,"%s\n",dev->name);
+}
+
+static struct driver_file_entry device_name_entry = {
+    name:    "name",
+    mode:    S_IRUGO,
+    show:    device_read_name,
+};
+
+static ssize_t
+device_read_power(struct device * dev, char * page, size_t count, 
loff_t off)
+{
+    return off ? 0 : sprintf(page,"%d\n",dev->current_state);
+}
+
+static ssize_t
+device_write_power(struct device * dev, const char * buf, size_t count, 
loff_t off)
+{
+    char    str_command[20];
+    char    str_level[20];
+    int    num_args;
+    u32    state;
+    u32    int_level;
+    int    error = 0;
+
+    if (off)
+        return 0;
+
+    if (!dev->driver)
+        goto done;
+
+    num_args = sscanf(buf,"%10s %10s %u",str_command,str_level,&state);
+
+    error = -EINVAL;
+
+    if (!num_args)
+        goto done;
+
+    if (!strnicmp(str_command,"suspend",7)) {
+        if (num_args != 3)
+            goto done;
+        if (!strnicmp(str_level,"notify",6))
+            int_level = SUSPEND_NOTIFY;
+        else if (!strnicmp(str_level,"save",4))
+            int_level = SUSPEND_SAVE_STATE;
+        else if (!strnicmp(str_level,"disable",7))
+            int_level = SUSPEND_DISABLE;
+        else if (!strnicmp(str_level,"powerdown",8))
+            int_level = SUSPEND_POWER_DOWN;
+        else
+            goto done;
+
+        if (dev->driver->suspend)
+            error = dev->driver->suspend(dev,state,int_level);
+        else
+            error = 0;
+    } else if (!strnicmp(str_command,"resume",6)) {
+        if (num_args != 2)
+            goto done;
+
+        if (!strnicmp(str_level,"poweron",7))
+            int_level = RESUME_POWER_ON;
+        else if (!strnicmp(str_level,"restore",7))
+            int_level = RESUME_RESTORE_STATE;
+        else if (!strnicmp(str_level,"enable",6))
+            int_level = RESUME_ENABLE;
+        else
+            goto done;
+
+        if (dev->driver->resume)
+            error = dev->driver->resume(dev,int_level);
+        else
+            error = 0;
+    }
+ done:
+    return error < 0 ? error : count;
+}
+
+static struct driver_file_entry device_power_entry = {
+    name:        "power",
+    mode:        S_IWUSR | S_IRUGO,
+    show:        device_read_power,
+    store:        device_write_power,
+};
+
+/* device_read_devfs - Adam Belay (ambx1@netscape.net)*/
+static ssize_t device_read_devfs(struct device * dev, char * buf, 
size_t count,
+                 loff_t off)
+{
+    int offset, major, minor;
+    char * str = buf;
+    char pathbuf[64];
+    struct list_head * pos;
+    struct dev_handle * devfs;
+    if (off)
+        return 0;
+    list_for_each_prev(pos, &dev->devfs_handles)
+    {
+        devfs = list_entry(pos,struct dev_handle,device_list);
+        offset = devfs_generate_path (devfs->handle, pathbuf, sizeof 
pathbuf);
+        if (offset >= 0 && (0 == 
devfs_get_maj_min(devfs->handle,&major,&minor)))
+        {
+            str += sprintf(str,"%d,%d %s\n",major,minor,
+                        (pathbuf+offset));
+        }
+        else
+            return 0;
+    }
+    return (str - buf);
+}
+
+
+static struct driver_file_entry device_devfs_entry = {
+    name:        "dev",
+    mode:        S_IRUGO,
+    show:        device_read_devfs,
+};
+
+struct driver_file_entry * device_default_files[] = {
+    &device_name_entry,
+    &device_power_entry,
+    &device_devfs_entry,
+    NULL,
+};
diff -ur --new-file a/drivers/block/floppy.c b/drivers/block/floppy.c
--- a/drivers/block/floppy.c    Wed Jul 24 18:37:14 2002
+++ b/drivers/block/floppy.c    Sat Jul 27 20:14:27 2002
@@ -3969,6 +3969,11 @@
     revalidate:        floppy_revalidate,
 };
 
+static struct device device_floppy = {
+    name:        "floppy",
+    bus_id:        "03?0",
+};
+
 static void __init register_devfs_entries (int drive)
 {
     int base_minor, i;
@@ -3992,10 +3997,10 @@
         char name[16];
 
         sprintf (name, "%d%s", drive, table[table_sup[UDP->cmos][i]]);
-        devfs_register (devfs_handle, name, DEVFS_FL_DEFAULT, MAJOR_NR,
+        ldm_devfs_register (devfs_handle, name, DEVFS_FL_DEFAULT, MAJOR_NR,
                 base_minor + (table_sup[UDP->cmos][i] << 2),
                 S_IFBLK | S_IRUSR | S_IWUSR | S_IRGRP |S_IWGRP,
-                &floppy_fops, NULL);
+                &floppy_fops, NULL, &device_floppy);
     } while (table_sup[UDP->cmos][i++]);
     }
 }
@@ -4219,10 +4224,6 @@
 
 static int have_no_fdc= -ENODEV;
 
-static struct device device_floppy = {
-    name:        "floppy",
-    bus_id:        "03?0",
-};
 int __init floppy_init(void)
 {
diff -ur --new-file a/include/linux/device.h b/include/linux/device.h
--- a/include/linux/device.h    Wed Jul 24 18:37:32 2002
+++ b/include/linux/device.h    Sat Jul 27 20:58:25 2002
@@ -29,12 +29,12 @@
 #include <linux/list.h>
 #include <linux/sched.h>
 #include <linux/driverfs_fs.h>
+#include <linux/devfs_fs_kernel.h>
 #define DEVICE_NAME_SIZE    80
 #define DEVICE_ID_SIZE        32
 #define BUS_ID_SIZE        16
 
-
 enum {
     SUSPEND_NOTIFY,
     SUSPEND_SAVE_STATE,
@@ -120,7 +120,7 @@
 extern void put_driver(struct device_driver * drv);
 extern void remove_driver(struct device_driver * drv);
 
-extern int driver_for_each_dev(struct device_driver * drv, void * data,
+extern int driver_for_each_dev(struct device_driver * drv, void * data,
                    int (*callback)(struct device * dev, void * data));
 
 
@@ -130,6 +130,7 @@
     struct list_head bus_list;    /* node in bus's list */
     struct list_head driver_list;
     struct list_head children;
+    struct list_head devfs_handles;   /* stores devfs entries */
     struct device     * parent;
 
     char    name[DEVICE_NAME_SIZE];    /* descriptive ascii string */
@@ -159,6 +160,21 @@
 
     void    (*release)(struct device * dev);
 };
+
+struct dev_handle {
+    devfs_handle_t handle;
+    struct list_head device_list;   /* node in device's list */
+};
+
+typedef struct dev_handle * ldm_devfs_t;
+
+extern ldm_devfs_t register_devfs_handle(devfs_handle_t dhandle, struct 
device * dev);
+extern ldm_devfs_t ldm_devfs_register (devfs_handle_t dir, const char 
*name,
+                   unsigned int flags,
+                   unsigned int major, unsigned int minor,
+                   umode_t mode, void *ops, void *info,
+                   struct device * dev);
+
 
 #define to_device(d) container_of(d, struct device, dir)
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/