at v2.6.27-rc2 424 lines 10 kB view raw
1/* 2 * class.c - basic device class management 3 * 4 * Copyright (c) 2002-3 Patrick Mochel 5 * Copyright (c) 2002-3 Open Source Development Labs 6 * Copyright (c) 2003-2004 Greg Kroah-Hartman 7 * Copyright (c) 2003-2004 IBM Corp. 8 * 9 * This file is released under the GPLv2 10 * 11 */ 12 13#include <linux/device.h> 14#include <linux/module.h> 15#include <linux/init.h> 16#include <linux/string.h> 17#include <linux/kdev_t.h> 18#include <linux/err.h> 19#include <linux/slab.h> 20#include <linux/genhd.h> 21#include <linux/mutex.h> 22#include "base.h" 23 24#define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr) 25 26static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr, 27 char *buf) 28{ 29 struct class_attribute *class_attr = to_class_attr(attr); 30 struct class_private *cp = to_class(kobj); 31 ssize_t ret = -EIO; 32 33 if (class_attr->show) 34 ret = class_attr->show(cp->class, buf); 35 return ret; 36} 37 38static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr, 39 const char *buf, size_t count) 40{ 41 struct class_attribute *class_attr = to_class_attr(attr); 42 struct class_private *cp = to_class(kobj); 43 ssize_t ret = -EIO; 44 45 if (class_attr->store) 46 ret = class_attr->store(cp->class, buf, count); 47 return ret; 48} 49 50static void class_release(struct kobject *kobj) 51{ 52 struct class_private *cp = to_class(kobj); 53 struct class *class = cp->class; 54 55 pr_debug("class '%s': release.\n", class->name); 56 57 if (class->class_release) 58 class->class_release(class); 59 else 60 pr_debug("class '%s' does not have a release() function, " 61 "be careful\n", class->name); 62} 63 64static struct sysfs_ops class_sysfs_ops = { 65 .show = class_attr_show, 66 .store = class_attr_store, 67}; 68 69static struct kobj_type class_ktype = { 70 .sysfs_ops = &class_sysfs_ops, 71 .release = class_release, 72}; 73 74/* Hotplug events for classes go to the class class_subsys */ 75static struct kset *class_kset; 76 77 78int class_create_file(struct class *cls, const struct class_attribute *attr) 79{ 80 int error; 81 if (cls) 82 error = sysfs_create_file(&cls->p->class_subsys.kobj, 83 &attr->attr); 84 else 85 error = -EINVAL; 86 return error; 87} 88 89void class_remove_file(struct class *cls, const struct class_attribute *attr) 90{ 91 if (cls) 92 sysfs_remove_file(&cls->p->class_subsys.kobj, &attr->attr); 93} 94 95static struct class *class_get(struct class *cls) 96{ 97 if (cls) 98 kset_get(&cls->p->class_subsys); 99 return cls; 100} 101 102static void class_put(struct class *cls) 103{ 104 if (cls) 105 kset_put(&cls->p->class_subsys); 106} 107 108static int add_class_attrs(struct class *cls) 109{ 110 int i; 111 int error = 0; 112 113 if (cls->class_attrs) { 114 for (i = 0; attr_name(cls->class_attrs[i]); i++) { 115 error = class_create_file(cls, &cls->class_attrs[i]); 116 if (error) 117 goto error; 118 } 119 } 120done: 121 return error; 122error: 123 while (--i >= 0) 124 class_remove_file(cls, &cls->class_attrs[i]); 125 goto done; 126} 127 128static void remove_class_attrs(struct class *cls) 129{ 130 int i; 131 132 if (cls->class_attrs) { 133 for (i = 0; attr_name(cls->class_attrs[i]); i++) 134 class_remove_file(cls, &cls->class_attrs[i]); 135 } 136} 137 138int __class_register(struct class *cls, struct lock_class_key *key) 139{ 140 struct class_private *cp; 141 int error; 142 143 pr_debug("device class '%s': registering\n", cls->name); 144 145 cp = kzalloc(sizeof(*cp), GFP_KERNEL); 146 if (!cp) 147 return -ENOMEM; 148 INIT_LIST_HEAD(&cp->class_devices); 149 INIT_LIST_HEAD(&cp->class_interfaces); 150 kset_init(&cp->class_dirs); 151 __mutex_init(&cp->class_mutex, "struct class mutex", key); 152 error = kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name); 153 if (error) { 154 kfree(cp); 155 return error; 156 } 157 158 /* set the default /sys/dev directory for devices of this class */ 159 if (!cls->dev_kobj) 160 cls->dev_kobj = sysfs_dev_char_kobj; 161 162#if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK) 163 /* let the block class directory show up in the root of sysfs */ 164 if (cls != &block_class) 165 cp->class_subsys.kobj.kset = class_kset; 166#else 167 cp->class_subsys.kobj.kset = class_kset; 168#endif 169 cp->class_subsys.kobj.ktype = &class_ktype; 170 cp->class = cls; 171 cls->p = cp; 172 173 error = kset_register(&cp->class_subsys); 174 if (error) { 175 kfree(cp); 176 return error; 177 } 178 error = add_class_attrs(class_get(cls)); 179 class_put(cls); 180 return error; 181} 182EXPORT_SYMBOL_GPL(__class_register); 183 184void class_unregister(struct class *cls) 185{ 186 pr_debug("device class '%s': unregistering\n", cls->name); 187 remove_class_attrs(cls); 188 kset_unregister(&cls->p->class_subsys); 189} 190 191static void class_create_release(struct class *cls) 192{ 193 pr_debug("%s called for %s\n", __func__, cls->name); 194 kfree(cls); 195} 196 197/** 198 * class_create - create a struct class structure 199 * @owner: pointer to the module that is to "own" this struct class 200 * @name: pointer to a string for the name of this class. 201 * @key: the lock_class_key for this class; used by mutex lock debugging 202 * 203 * This is used to create a struct class pointer that can then be used 204 * in calls to device_create(). 205 * 206 * Note, the pointer created here is to be destroyed when finished by 207 * making a call to class_destroy(). 208 */ 209struct class *__class_create(struct module *owner, const char *name, 210 struct lock_class_key *key) 211{ 212 struct class *cls; 213 int retval; 214 215 cls = kzalloc(sizeof(*cls), GFP_KERNEL); 216 if (!cls) { 217 retval = -ENOMEM; 218 goto error; 219 } 220 221 cls->name = name; 222 cls->owner = owner; 223 cls->class_release = class_create_release; 224 225 retval = __class_register(cls, key); 226 if (retval) 227 goto error; 228 229 return cls; 230 231error: 232 kfree(cls); 233 return ERR_PTR(retval); 234} 235EXPORT_SYMBOL_GPL(__class_create); 236 237/** 238 * class_destroy - destroys a struct class structure 239 * @cls: pointer to the struct class that is to be destroyed 240 * 241 * Note, the pointer to be destroyed must have been created with a call 242 * to class_create(). 243 */ 244void class_destroy(struct class *cls) 245{ 246 if ((cls == NULL) || (IS_ERR(cls))) 247 return; 248 249 class_unregister(cls); 250} 251 252#ifdef CONFIG_SYSFS_DEPRECATED 253char *make_class_name(const char *name, struct kobject *kobj) 254{ 255 char *class_name; 256 int size; 257 258 size = strlen(name) + strlen(kobject_name(kobj)) + 2; 259 260 class_name = kmalloc(size, GFP_KERNEL); 261 if (!class_name) 262 return NULL; 263 264 strcpy(class_name, name); 265 strcat(class_name, ":"); 266 strcat(class_name, kobject_name(kobj)); 267 return class_name; 268} 269#endif 270 271/** 272 * class_for_each_device - device iterator 273 * @class: the class we're iterating 274 * @start: the device to start with in the list, if any. 275 * @data: data for the callback 276 * @fn: function to be called for each device 277 * 278 * Iterate over @class's list of devices, and call @fn for each, 279 * passing it @data. If @start is set, the list iteration will start 280 * there, otherwise if it is NULL, the iteration starts at the 281 * beginning of the list. 282 * 283 * We check the return of @fn each time. If it returns anything 284 * other than 0, we break out and return that value. 285 * 286 * Note, we hold class->class_mutex in this function, so it can not be 287 * re-acquired in @fn, otherwise it will self-deadlocking. For 288 * example, calls to add or remove class members would be verboten. 289 */ 290int class_for_each_device(struct class *class, struct device *start, 291 void *data, int (*fn)(struct device *, void *)) 292{ 293 struct device *dev; 294 int error = 0; 295 296 if (!class) 297 return -EINVAL; 298 mutex_lock(&class->p->class_mutex); 299 list_for_each_entry(dev, &class->p->class_devices, node) { 300 if (start) { 301 if (start == dev) 302 start = NULL; 303 continue; 304 } 305 dev = get_device(dev); 306 error = fn(dev, data); 307 put_device(dev); 308 if (error) 309 break; 310 } 311 mutex_unlock(&class->p->class_mutex); 312 313 return error; 314} 315EXPORT_SYMBOL_GPL(class_for_each_device); 316 317/** 318 * class_find_device - device iterator for locating a particular device 319 * @class: the class we're iterating 320 * @start: Device to begin with 321 * @data: data for the match function 322 * @match: function to check device 323 * 324 * This is similar to the class_for_each_dev() function above, but it 325 * returns a reference to a device that is 'found' for later use, as 326 * determined by the @match callback. 327 * 328 * The callback should return 0 if the device doesn't match and non-zero 329 * if it does. If the callback returns non-zero, this function will 330 * return to the caller and not iterate over any more devices. 331 * 332 * Note, you will need to drop the reference with put_device() after use. 333 * 334 * We hold class->class_mutex in this function, so it can not be 335 * re-acquired in @match, otherwise it will self-deadlocking. For 336 * example, calls to add or remove class members would be verboten. 337 */ 338struct device *class_find_device(struct class *class, struct device *start, 339 void *data, 340 int (*match)(struct device *, void *)) 341{ 342 struct device *dev; 343 int found = 0; 344 345 if (!class) 346 return NULL; 347 348 mutex_lock(&class->p->class_mutex); 349 list_for_each_entry(dev, &class->p->class_devices, node) { 350 if (start) { 351 if (start == dev) 352 start = NULL; 353 continue; 354 } 355 dev = get_device(dev); 356 if (match(dev, data)) { 357 found = 1; 358 break; 359 } else 360 put_device(dev); 361 } 362 mutex_unlock(&class->p->class_mutex); 363 364 return found ? dev : NULL; 365} 366EXPORT_SYMBOL_GPL(class_find_device); 367 368int class_interface_register(struct class_interface *class_intf) 369{ 370 struct class *parent; 371 struct device *dev; 372 373 if (!class_intf || !class_intf->class) 374 return -ENODEV; 375 376 parent = class_get(class_intf->class); 377 if (!parent) 378 return -EINVAL; 379 380 mutex_lock(&parent->p->class_mutex); 381 list_add_tail(&class_intf->node, &parent->p->class_interfaces); 382 if (class_intf->add_dev) { 383 list_for_each_entry(dev, &parent->p->class_devices, node) 384 class_intf->add_dev(dev, class_intf); 385 } 386 mutex_unlock(&parent->p->class_mutex); 387 388 return 0; 389} 390 391void class_interface_unregister(struct class_interface *class_intf) 392{ 393 struct class *parent = class_intf->class; 394 struct device *dev; 395 396 if (!parent) 397 return; 398 399 mutex_lock(&parent->p->class_mutex); 400 list_del_init(&class_intf->node); 401 if (class_intf->remove_dev) { 402 list_for_each_entry(dev, &parent->p->class_devices, node) 403 class_intf->remove_dev(dev, class_intf); 404 } 405 mutex_unlock(&parent->p->class_mutex); 406 407 class_put(parent); 408} 409 410int __init classes_init(void) 411{ 412 class_kset = kset_create_and_add("class", NULL, NULL); 413 if (!class_kset) 414 return -ENOMEM; 415 return 0; 416} 417 418EXPORT_SYMBOL_GPL(class_create_file); 419EXPORT_SYMBOL_GPL(class_remove_file); 420EXPORT_SYMBOL_GPL(class_unregister); 421EXPORT_SYMBOL_GPL(class_destroy); 422 423EXPORT_SYMBOL_GPL(class_interface_register); 424EXPORT_SYMBOL_GPL(class_interface_unregister);