aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2006-06-27 00:59:20 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-27 00:59:20 -0700
commitb9d0f05d7111d750b0affa9209c1d3f713b829e5 (patch)
tree91b7ac3cc2c488e6b636e079f14700bff58fdede /driver
parent900965d1b18d871b56f7839c4f76ce7ee6a6df12 (diff)
downloadpatches-b9d0f05d7111d750b0affa9209c1d3f713b829e5.tar.gz
add device-groups patch
Diffstat (limited to 'driver')
-rw-r--r--driver/device-groups.patch90
1 files changed, 90 insertions, 0 deletions
diff --git a/driver/device-groups.patch b/driver/device-groups.patch
new file mode 100644
index 0000000000000..f2726ee0ff44a
--- /dev/null
+++ b/driver/device-groups.patch
@@ -0,0 +1,90 @@
+From foo@baz Tue Apr 9 12:12:43 2002
+Date: Tue, 27 Jun 2006 00:06:09 -0700
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Driver core: add groups support to struct device
+
+This is needed for the network class devices in order to be able to
+convert over to use struct device.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/base/core.c | 34 ++++++++++++++++++++++++++++++++++
+ include/linux/device.h | 1 +
+ 2 files changed, 35 insertions(+)
+
+--- gregkh-2.6.orig/drivers/base/core.c
++++ gregkh-2.6/drivers/base/core.c
+@@ -194,6 +194,35 @@ static ssize_t store_uevent(struct devic
+ return count;
+ }
+
++static int device_add_groups(struct device *dev)
++{
++ int i;
++ int error = 0;
++
++ if (dev->groups) {
++ for (i = 0; dev->groups[i]; i++) {
++ error = sysfs_create_group(&dev->kobj, dev->groups[i]);
++ if (error) {
++ while (--i >= 0)
++ sysfs_remove_group(&dev->kobj, dev->groups[i]);
++ goto out;
++ }
++ }
++ }
++out:
++ return error;
++}
++
++static void device_remove_groups(struct device *dev)
++{
++ int i;
++ if (dev->groups) {
++ for (i = 0; dev->groups[i]; i++) {
++ sysfs_remove_group(&dev->kobj, dev->groups[i]);
++ }
++ }
++}
++
+ static ssize_t show_dev(struct device *dev, struct device_attribute *attr,
+ char *buf)
+ {
+@@ -347,6 +376,8 @@ int device_add(struct device *dev)
+ sysfs_create_link(&dev->parent->kobj, &dev->kobj, class_name);
+ }
+
++ if ((error = device_add_groups(dev)))
++ goto GroupError;
+ if ((error = device_pm_add(dev)))
+ goto PMError;
+ if ((error = bus_add_device(dev)))
+@@ -373,6 +404,8 @@ int device_add(struct device *dev)
+ BusError:
+ device_pm_remove(dev);
+ PMError:
++ device_remove_groups(dev);
++ GroupError:
+ if (dev->devt_attr) {
+ device_remove_file(dev, dev->devt_attr);
+ kfree(dev->devt_attr);
+@@ -467,6 +500,7 @@ void device_del(struct device * dev)
+ up(&dev->class->sem);
+ }
+ device_remove_file(dev, &dev->uevent_attr);
++ device_remove_groups(dev);
+
+ /* Notify the platform of the removal, in case they
+ * need to do anything...
+--- gregkh-2.6.orig/include/linux/device.h
++++ gregkh-2.6/include/linux/device.h
+@@ -338,6 +338,7 @@ struct device {
+ struct list_head node;
+ struct class *class; /* optional*/
+ dev_t devt; /* dev_t, creates the sysfs "dev" */
++ struct attribute_group **groups; /* optional groups */
+
+ void (*release)(struct device * dev);
+ };