--- linux-2.6.6/drivers/base/class.c 2004-05-10 06:33:21.000000000 +0400 +++ linux-2.6.6-hh0/drivers/base/class.c 2004-05-25 15:17:57.000000000 +0400 @@ -359,7 +359,7 @@ class_device_put(class_dev); } -int class_device_rename(struct class_device *class_dev, char *new_name) +int class_device_rename(struct class_device *class_dev, const char *new_name) { class_dev = class_device_get(class_dev); if (!class_dev) @@ -377,6 +377,33 @@ return 0; } +/** + * class_device_find - find a struct class_device in a specific class + * @class: the class to search + * @class_id: the class_id to search for + * + * Iterates through the list of all class devices registered to a class. If + * the class_id is found, its reference count is incremented and returned to + * the caller. If the class_id does not match any existing struct class_device + * registered to this struct class, then NULL is returned. + */ +struct class_device * class_device_find(struct class *class, const char *class_id) +{ + struct class_device *class_dev; + struct class_device *found = NULL; + + down_read(&class->subsys.rwsem); + list_for_each_entry(class_dev, &class->children, node) { + if (strcmp(class_dev->class_id, class_id) == 0) { + found = class_device_get(class_dev); + break; + } + } + up_read(&class->subsys.rwsem); + + return found; +} + struct class_device * class_device_get(struct class_device *class_dev) { if (class_dev) @@ -389,7 +416,6 @@ kobject_put(&class_dev->kobj); } - int class_interface_register(struct class_interface *class_intf) { struct class * parent; @@ -468,6 +494,8 @@ EXPORT_SYMBOL(class_device_put); EXPORT_SYMBOL(class_device_create_file); EXPORT_SYMBOL(class_device_remove_file); +EXPORT_SYMBOL(class_device_rename); +EXPORT_SYMBOL(class_device_find); EXPORT_SYMBOL(class_interface_register); EXPORT_SYMBOL(class_interface_unregister); --- linux-2.6.6/include/linux/device.h 2004-05-10 06:33:19.000000000 +0400 +++ linux-2.6.6-hh0/include/linux/device.h 2004-05-25 01:54:30.000000000 +0400 @@ -212,8 +212,9 @@ extern int class_device_add(struct class_device *); extern void class_device_del(struct class_device *); -extern int class_device_rename(struct class_device *, char *); +extern int class_device_rename(struct class_device *, const char *); +extern struct class_device * class_device_find(struct class *class, const char *class_id); extern struct class_device * class_device_get(struct class_device *); extern void class_device_put(struct class_device *);