-
-
-static void device_create_release(struct device *dev)
-{
- pr_debug("%s called for %s\n", __FUNCTION__, dev->bus_id);
- kfree(dev);
-}
-
-/**
- * device_create - creates a device and registers it with sysfs
- * @class: pointer to the struct class that this device should be registered to
- * @parent: pointer to the parent struct device of this new device, if any
- * @devt: the dev_t for the char device to be added
- * @fmt: string for the device's name
- *
- * This function can be used by char device classes. A struct device
- * will be created in sysfs, registered to the specified class.
- *
- * A "dev" file will be created, showing the dev_t for the device, if
- * the dev_t is not 0,0.
- * If a pointer to a parent struct device is passed in, the newly created
- * struct device will be a child of that device in sysfs.
- * The pointer to the struct device will be returned from the call.
- * Any further sysfs files that might be required can be created using this
- * pointer.
- *
- * Note: the struct class passed to this function must have previously
- * been created with a call to class_create().
- */
-struct device *device_create(struct class *class, struct device *parent,
- dev_t devt, char *fmt, ...)
-{
- va_list args;
- struct device *dev = NULL;
- int retval = -ENODEV;
-
- if (class == NULL || IS_ERR(class))
- goto error;
- if (parent == NULL) {
- printk(KERN_WARNING "%s does not work yet for NULL parents\n", __FUNCTION__);
- goto error;
- }
-
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
- if (!dev) {
- retval = -ENOMEM;
- goto error;
- }
-
- dev->devt = devt;
- dev->class = class;
- dev->parent = parent;
- dev->release = device_create_release;
-
- va_start(args, fmt);
- vsnprintf(dev->bus_id, BUS_ID_SIZE, fmt, args);
- va_end(args);
- retval = device_register(dev);
- if (retval)
- goto error;
-
- return dev;
-
-error:
- kfree(dev);
- return ERR_PTR(retval);
-}
-EXPORT_SYMBOL_GPL(device_create);
-
-/**
- * device_destroy - removes a device that was created with device_create()
- * @class: pointer to the struct class that this device was registered with
- * @devt: the dev_t of the device that was previously registered
- *
- * This call unregisters and cleans up a device that was created with a
- * call to device_create().
- */
-void device_destroy(struct class *class, dev_t devt)
-{
- struct device *dev = NULL;
- struct device *dev_tmp;
-
- down(&class->sem);
- list_for_each_entry(dev_tmp, &class->devices, node) {
- if (dev_tmp->devt == devt) {
- dev = dev_tmp;
- break;
- }
- }
- up(&class->sem);
-
- if (dev)
- device_unregister(dev);
-}
-EXPORT_SYMBOL_GPL(device_destroy);