]> git.hungrycats.org Git - linux/commitdiff
deivce model: actually compile and use bus drivers
authorPatrick Mochel <mochel@geena.pdx.osdl.net>
Tue, 28 May 2002 02:58:58 +0000 (19:58 -0700)
committerPatrick Mochel <mochel@geena.pdx.osdl.net>
Tue, 28 May 2002 02:58:58 +0000 (19:58 -0700)
drivers/base/Makefile
drivers/base/base.h
drivers/base/bus.c
drivers/base/core.c
drivers/base/fs.c
include/linux/device.h

index 3ff40bf56fc651436b58f8e9bdd7b8ae10e02c8b..eae7bc965fcb57fe7851b7564e29d0aa6dd219fa 100644 (file)
@@ -1,7 +1,7 @@
 O_TARGET       := base.o
 
-obj-y          := core.o sys.o interface.o fs.o power.o
+obj-y          := core.o sys.o interface.o fs.o power.o bus.o 
 
-export-objs    := core.o fs.o power.o sys.o
+export-objs    := core.o fs.o power.o sys.o bus.o
 
 include $(TOPDIR)/Rules.make
index a8b3a708a2071f46f57b82330caa6ceb0edbdd52..6602cb7c4762235351c5035ad9f80603c2daf869 100644 (file)
@@ -9,6 +9,10 @@
 extern struct device device_root;
 extern spinlock_t device_lock;
 
+extern int bus_add_device(struct device * dev);
+extern void bus_remove_device(struct device * dev);
+
+extern int device_create_dir(struct driver_dir_entry * dir, struct driver_dir_entry * parent);
 extern int device_make_dir(struct device * dev);
 extern void device_remove_dir(struct device * dev);
 
index fedeb05973c9df3d97553d3b14555e3bd8c3ac64..2df0d1a9cf60930c350ab2ea5c188a59f7a7bccc 100644 (file)
@@ -10,7 +10,8 @@
 #include <linux/device.h>
 #include <linux/module.h>
 #include <linux/errno.h>
-
+#include <linux/stat.h>
+#include "base.h"
 
 static LIST_HEAD(bus_driver_list);
 
@@ -103,10 +104,6 @@ void put_bus(struct bus_type * bus)
        driverfs_remove_dir(&bus->driver_dir);
        driverfs_remove_dir(&bus->device_dir);
        driverfs_remove_dir(&bus->dir);
-
-       /* tell the driver it can go away now */
-       if (bus->release)
-               bus->release();
 }
 
 static int __init bus_init(void)
@@ -117,7 +114,6 @@ static int __init bus_init(void)
 
 subsys_initcall(bus_init);
 
-EXPORT_SYMBOL(bus_for_each_dev);
 EXPORT_SYMBOL(bus_add_device);
 EXPORT_SYMBOL(bus_remove_device);
 EXPORT_SYMBOL(bus_register);
index 391e0abefaa0fa0a1ca4d393565a67729bcd08bd..b163f48aaa5f756a25abc2541af4cae4cb4e330c 100644 (file)
@@ -70,6 +70,8 @@ int device_register(struct device *dev)
        if ((error = device_make_dir(dev)))
                goto register_done;
 
+       bus_add_device(dev);
+
        /* notify platform of device entry */
        if (platform_notify)
                platform_notify(dev);
@@ -102,6 +104,8 @@ void put_device(struct device * dev)
        if (platform_notify_remove)
                platform_notify_remove(dev);
 
+       bus_remove_device(dev);
+
        /* Tell the driver to clean up after itself.
         * Note that we likely didn't allocate the device,
         * so this is the driver's chance to free that up...
index 39cf1fb509f7eaf6a993032b393a65691fa21f96..4cdb9b588e1bdd57edf3dd6e74941b5f61ce02d8 100644 (file)
@@ -68,6 +68,13 @@ void device_remove_dir(struct device * dev)
                driverfs_remove_dir(&dev->dir);
 }
 
+int device_create_dir(struct driver_dir_entry * dir, struct driver_dir_entry * parent)
+{
+       INIT_LIST_HEAD(&dir->files);
+       dir->mode  = (S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO);
+       return driverfs_create_dir(dir,parent);
+}
+
 /**
  * device_make_dir - create a driverfs directory
  * @name:      name of directory
@@ -87,23 +94,20 @@ int device_make_dir(struct device * dev)
        int error;
        int i;
 
-       INIT_LIST_HEAD(&dev->dir.files);
-       dev->dir.mode = (S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO);
-       dev->dir.name = dev->bus_id;
-
        if (dev->parent)
                parent = &dev->parent->dir;
+       dev->dir.name = dev->bus_id;
 
-       if ((error = driverfs_create_dir(&dev->dir,parent)))
+       if ((error = device_create_dir(&dev->dir,parent)))
                return error;
 
        for (i = 0; (entry = *(device_default_files + i)); i++) {
                if ((error = device_create_file(dev,entry))) {
                        device_remove_dir(dev);
-                       return error;
+                       break;
                }
        }
-       return 0;
+       return error;
 }
 
 EXPORT_SYMBOL(device_create_file);
index 970b974918d6f31b9bcbb43c18b28201f17fe6df..078c65e02370dd83e64ed2b7a505a4c9bcc7058b 100644 (file)
@@ -63,6 +63,11 @@ struct bus_type {
 
        list_t                  node;
        list_t                  devices;
+       list_t                  drivers;
+
+       struct driver_dir_entry dir;
+       struct driver_dir_entry device_dir;
+       struct driver_dir_entry driver_dir;
 };
 
 
@@ -102,6 +107,7 @@ struct device {
        atomic_t        refcount;       /* refcount to make sure the device
                                         * persists for the right amount of time */
 
+       struct bus_type * bus;          /* type of bus device is on */
        struct driver_dir_entry dir;
 
        struct device_driver *driver;   /* which driver has allocated this