diff -Nru a/drivers/base/class.c b/drivers/base/class.c --- a/drivers/base/class.c Fri Mar 19 11:36:26 2004 +++ b/drivers/base/class.c Fri Mar 19 11:36:26 2004 @@ -379,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) @@ -470,6 +495,7 @@ EXPORT_SYMBOL(class_device_put); EXPORT_SYMBOL(class_device_create_file); EXPORT_SYMBOL(class_device_remove_file); +EXPORT_SYMBOL(class_device_find); EXPORT_SYMBOL(class_interface_register); EXPORT_SYMBOL(class_interface_unregister); diff -Nru a/include/linux/device.h b/include/linux/device.h --- a/include/linux/device.h Fri Mar 19 11:36:21 2004 +++ b/include/linux/device.h Fri Mar 19 11:36:21 2004 @@ -214,6 +214,7 @@ extern void class_device_del(struct class_device *); extern int class_device_rename(struct class_device *, 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 *);