diff options
| author | David Woodhouse <dwmw2@infradead.org> | 2006-05-24 09:22:21 +0100 | 
|---|---|---|
| committer | David Woodhouse <dwmw2@infradead.org> | 2006-05-24 09:22:21 +0100 | 
| commit | 66643de455c27973ac31ad6de9f859d399916842 (patch) | |
| tree | 7ebed7f051879007d4b11d6aaa9e65a1bcb0b08f /drivers/base/class.c | |
| parent | 2c23d62abb820e19c54012520f08a198c2233a85 (diff) | |
| parent | 387e2b0439026aa738a9edca15a57e5c0bcb4dfc (diff) | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
	include/asm-powerpc/unistd.h
	include/asm-sparc/unistd.h
	include/asm-sparc64/unistd.h
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'drivers/base/class.c')
| -rw-r--r-- | drivers/base/class.c | 32 | 
1 files changed, 32 insertions, 0 deletions
| diff --git a/drivers/base/class.c b/drivers/base/class.c index 0e71dff327c..b1ea4df85c7 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c @@ -456,6 +456,35 @@ static void class_device_remove_attrs(struct class_device * cd)  	}  } +static int class_device_add_groups(struct class_device * cd) +{ +	int i; +	int error = 0; + +	if (cd->groups) { +		for (i = 0; cd->groups[i]; i++) { +			error = sysfs_create_group(&cd->kobj, cd->groups[i]); +			if (error) { +				while (--i >= 0) +					sysfs_remove_group(&cd->kobj, cd->groups[i]); +				goto out; +			} +		} +	} +out: +	return error; +} + +static void class_device_remove_groups(struct class_device * cd) +{ +	int i; +	if (cd->groups) { +		for (i = 0; cd->groups[i]; i++) { +			sysfs_remove_group(&cd->kobj, cd->groups[i]); +		} +	} +} +  static ssize_t show_dev(struct class_device *class_dev, char *buf)  {  	return print_dev_t(buf, class_dev->devt); @@ -559,6 +588,8 @@ int class_device_add(struct class_device *class_dev)  				  class_name);  	} +	class_device_add_groups(class_dev); +  	kobject_uevent(&class_dev->kobj, KOBJ_ADD);  	/* notify any interfaces this device is now here */ @@ -672,6 +703,7 @@ void class_device_del(struct class_device *class_dev)  	if (class_dev->devt_attr)  		class_device_remove_file(class_dev, class_dev->devt_attr);  	class_device_remove_attrs(class_dev); +	class_device_remove_groups(class_dev);  	kobject_uevent(&class_dev->kobj, KOBJ_REMOVE);  	kobject_del(&class_dev->kobj); | 
