blob: d373c6b3173be53b4c300ad19954e835f2272092 [file] [log] [blame]
From foo@baz Sun Jan 25 21:05:55 PST 2009
Date: Sun, 25 Jan 2009 21:05:55 -0800
To: Greg KH <greg@kroah.com>
From: Greg Kroah-Hartman <gregkh@suse.de>
Subject: Driver core: add dev_init_and_add()
Lots of times code calls device_initialize() and then device_add(), so
put the two together to make it easier for people to remember what needs
to be set up to do this properly. It also handles all of the error
handling in one convenient place.
Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
drivers/base/core.c | 30 ++++++++++++++++++++++++++++++
include/linux/device.h | 6 ++++++
2 files changed, 36 insertions(+)
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -1370,6 +1370,36 @@ void root_device_unregister(struct devic
}
EXPORT_SYMBOL_GPL(root_device_unregister);
+int device_init_and_add(struct device *dev, struct device *parent,
+ struct bus_type *bus,
+ void (*release)(struct device *dev),
+ const char *name, ...)
+{
+ va_list vargs;
+ int err;
+
+ if (release == NULL) {
+ printk(KERN_ERR "%s must have a valid release function\n",
+ __func__);
+ WARN_ON(1);
+ return -EINVAL;
+ }
+
+ dev->parent = parent;
+ dev->bus = bus;
+ dev->release = release;
+
+ device_initialize(dev);
+
+ va_start(vargs, name);
+ err = kobject_set_name_vargs(&dev->kobj, name, vargs);
+ va_end(vargs);
+ if (err)
+ return err;
+
+ return device_add(dev);
+}
+EXPORT_SYMBOL_GPL(device_init_and_add);
static void device_create_release(struct device *dev)
{
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -547,6 +547,12 @@ extern int __must_check device_register(
extern void device_unregister(struct device *dev);
extern void device_initialize(struct device *dev);
extern int __must_check device_add(struct device *dev);
+extern int __must_check device_init_and_add(struct device *dev,
+ struct device *parent,
+ struct bus_type *bus,
+ void (*release)(struct device *dev),
+ const char *name, ...)
+ __attribute__((format(printf, 5, 6)));
extern void device_del(struct device *dev);
extern int device_for_each_child(struct device *dev, void *data,
int (*fn)(struct device *dev, void *data));