linux/drivers/base/class.c
<<
>>
Prefs
   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
 138static void klist_class_dev_get(struct klist_node *n)
 139{
 140        struct device *dev = container_of(n, struct device, knode_class);
 141
 142        get_device(dev);
 143}
 144
 145static void klist_class_dev_put(struct klist_node *n)
 146{
 147        struct device *dev = container_of(n, struct device, knode_class);
 148
 149        put_device(dev);
 150}
 151
 152int __class_register(struct class *cls, struct lock_class_key *key)
 153{
 154        struct class_private *cp;
 155        int error;
 156
 157        pr_debug("device class '%s': registering\n", cls->name);
 158
 159        cp = kzalloc(sizeof(*cp), GFP_KERNEL);
 160        if (!cp)
 161                return -ENOMEM;
 162        klist_init(&cp->class_devices, klist_class_dev_get, klist_class_dev_put);
 163        INIT_LIST_HEAD(&cp->class_interfaces);
 164        kset_init(&cp->class_dirs);
 165        __mutex_init(&cp->class_mutex, "struct class mutex", key);
 166        error = kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name);
 167        if (error) {
 168                kfree(cp);
 169                return error;
 170        }
 171
 172        /* set the default /sys/dev directory for devices of this class */
 173        if (!cls->dev_kobj)
 174                cls->dev_kobj = sysfs_dev_char_kobj;
 175
 176#if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK)
 177        /* let the block class directory show up in the root of sysfs */
 178        if (cls != &block_class)
 179                cp->class_subsys.kobj.kset = class_kset;
 180#else
 181        cp->class_subsys.kobj.kset = class_kset;
 182#endif
 183        cp->class_subsys.kobj.ktype = &class_ktype;
 184        cp->class = cls;
 185        cls->p = cp;
 186
 187        error = kset_register(&cp->class_subsys);
 188        if (error) {
 189                kfree(cp);
 190                return error;
 191        }
 192        error = add_class_attrs(class_get(cls));
 193        class_put(cls);
 194        return error;
 195}
 196EXPORT_SYMBOL_GPL(__class_register);
 197
 198void class_unregister(struct class *cls)
 199{
 200        pr_debug("device class '%s': unregistering\n", cls->name);
 201        remove_class_attrs(cls);
 202        kset_unregister(&cls->p->class_subsys);
 203}
 204
 205static void class_create_release(struct class *cls)
 206{
 207        pr_debug("%s called for %s\n", __func__, cls->name);
 208        kfree(cls);
 209}
 210
 211/**
 212 * class_create - create a struct class structure
 213 * @owner: pointer to the module that is to "own" this struct class
 214 * @name: pointer to a string for the name of this class.
 215 * @key: the lock_class_key for this class; used by mutex lock debugging
 216 *
 217 * This is used to create a struct class pointer that can then be used
 218 * in calls to device_create().
 219 *
 220 * Note, the pointer created here is to be destroyed when finished by
 221 * making a call to class_destroy().
 222 */
 223struct class *__class_create(struct module *owner, const char *name,
 224                             struct lock_class_key *key)
 225{
 226        struct class *cls;
 227        int retval;
 228
 229        cls = kzalloc(sizeof(*cls), GFP_KERNEL);
 230        if (!cls) {
 231                retval = -ENOMEM;
 232                goto error;
 233        }
 234
 235        cls->name = name;
 236        cls->owner = owner;
 237        cls->class_release = class_create_release;
 238
 239        retval = __class_register(cls, key);
 240        if (retval)
 241                goto error;
 242
 243        return cls;
 244
 245error:
 246        kfree(cls);
 247        return ERR_PTR(retval);
 248}
 249EXPORT_SYMBOL_GPL(__class_create);
 250
 251/**
 252 * class_destroy - destroys a struct class structure
 253 * @cls: pointer to the struct class that is to be destroyed
 254 *
 255 * Note, the pointer to be destroyed must have been created with a call
 256 * to class_create().
 257 */
 258void class_destroy(struct class *cls)
 259{
 260        if ((cls == NULL) || (IS_ERR(cls)))
 261                return;
 262
 263        class_unregister(cls);
 264}
 265
 266#ifdef CONFIG_SYSFS_DEPRECATED
 267char *make_class_name(const char *name, struct kobject *kobj)
 268{
 269        char *class_name;
 270        int size;
 271
 272        size = strlen(name) + strlen(kobject_name(kobj)) + 2;
 273
 274        class_name = kmalloc(size, GFP_KERNEL);
 275        if (!class_name)
 276                return NULL;
 277
 278        strcpy(class_name, name);
 279        strcat(class_name, ":");
 280        strcat(class_name, kobject_name(kobj));
 281        return class_name;
 282}
 283#endif
 284
 285/**
 286 * class_dev_iter_init - initialize class device iterator
 287 * @iter: class iterator to initialize
 288 * @class: the class we wanna iterate over
 289 * @start: the device to start iterating from, if any
 290 * @type: device_type of the devices to iterate over, NULL for all
 291 *
 292 * Initialize class iterator @iter such that it iterates over devices
 293 * of @class.  If @start is set, the list iteration will start there,
 294 * otherwise if it is NULL, the iteration starts at the beginning of
 295 * the list.
 296 */
 297void class_dev_iter_init(struct class_dev_iter *iter, struct class *class,
 298                         struct device *start, const struct device_type *type)
 299{
 300        struct klist_node *start_knode = NULL;
 301
 302        if (start)
 303                start_knode = &start->knode_class;
 304        klist_iter_init_node(&class->p->class_devices, &iter->ki, start_knode);
 305        iter->type = type;
 306}
 307EXPORT_SYMBOL_GPL(class_dev_iter_init);
 308
 309/**
 310 * class_dev_iter_next - iterate to the next device
 311 * @iter: class iterator to proceed
 312 *
 313 * Proceed @iter to the next device and return it.  Returns NULL if
 314 * iteration is complete.
 315 *
 316 * The returned device is referenced and won't be released till
 317 * iterator is proceed to the next device or exited.  The caller is
 318 * free to do whatever it wants to do with the device including
 319 * calling back into class code.
 320 */
 321struct device *class_dev_iter_next(struct class_dev_iter *iter)
 322{
 323        struct klist_node *knode;
 324        struct device *dev;
 325
 326        while (1) {
 327                knode = klist_next(&iter->ki);
 328                if (!knode)
 329                        return NULL;
 330                dev = container_of(knode, struct device, knode_class);
 331                if (!iter->type || iter->type == dev->type)
 332                        return dev;
 333        }
 334}
 335EXPORT_SYMBOL_GPL(class_dev_iter_next);
 336
 337/**
 338 * class_dev_iter_exit - finish iteration
 339 * @iter: class iterator to finish
 340 *
 341 * Finish an iteration.  Always call this function after iteration is
 342 * complete whether the iteration ran till the end or not.
 343 */
 344void class_dev_iter_exit(struct class_dev_iter *iter)
 345{
 346        klist_iter_exit(&iter->ki);
 347}
 348EXPORT_SYMBOL_GPL(class_dev_iter_exit);
 349
 350/**
 351 * class_for_each_device - device iterator
 352 * @class: the class we're iterating
 353 * @start: the device to start with in the list, if any.
 354 * @data: data for the callback
 355 * @fn: function to be called for each device
 356 *
 357 * Iterate over @class's list of devices, and call @fn for each,
 358 * passing it @data.  If @start is set, the list iteration will start
 359 * there, otherwise if it is NULL, the iteration starts at the
 360 * beginning of the list.
 361 *
 362 * We check the return of @fn each time. If it returns anything
 363 * other than 0, we break out and return that value.
 364 *
 365 * @fn is allowed to do anything including calling back into class
 366 * code.  There's no locking restriction.
 367 */
 368int class_for_each_device(struct class *class, struct device *start,
 369                          void *data, int (*fn)(struct device *, void *))
 370{
 371        struct class_dev_iter iter;
 372        struct device *dev;
 373        int error = 0;
 374
 375        if (!class)
 376                return -EINVAL;
 377        if (!class->p) {
 378                WARN(1, "%s called for class '%s' before it was initialized",
 379                     __func__, class->name);
 380                return -EINVAL;
 381        }
 382
 383        class_dev_iter_init(&iter, class, start, NULL);
 384        while ((dev = class_dev_iter_next(&iter))) {
 385                error = fn(dev, data);
 386                if (error)
 387                        break;
 388        }
 389        class_dev_iter_exit(&iter);
 390
 391        return error;
 392}
 393EXPORT_SYMBOL_GPL(class_for_each_device);
 394
 395/**
 396 * class_find_device - device iterator for locating a particular device
 397 * @class: the class we're iterating
 398 * @start: Device to begin with
 399 * @data: data for the match function
 400 * @match: function to check device
 401 *
 402 * This is similar to the class_for_each_dev() function above, but it
 403 * returns a reference to a device that is 'found' for later use, as
 404 * determined by the @match callback.
 405 *
 406 * The callback should return 0 if the device doesn't match and non-zero
 407 * if it does.  If the callback returns non-zero, this function will
 408 * return to the caller and not iterate over any more devices.
 409 *
 410 * Note, you will need to drop the reference with put_device() after use.
 411 *
 412 * @fn is allowed to do anything including calling back into class
 413 * code.  There's no locking restriction.
 414 */
 415struct device *class_find_device(struct class *class, struct device *start,
 416                                 void *data,
 417                                 int (*match)(struct device *, void *))
 418{
 419        struct class_dev_iter iter;
 420        struct device *dev;
 421
 422        if (!class)
 423                return NULL;
 424        if (!class->p) {
 425                WARN(1, "%s called for class '%s' before it was initialized",
 426                     __func__, class->name);
 427                return NULL;
 428        }
 429
 430        class_dev_iter_init(&iter, class, start, NULL);
 431        while ((dev = class_dev_iter_next(&iter))) {
 432                if (match(dev, data)) {
 433                        get_device(dev);
 434                        break;
 435                }
 436        }
 437        class_dev_iter_exit(&iter);
 438
 439        return dev;
 440}
 441EXPORT_SYMBOL_GPL(class_find_device);
 442
 443int class_interface_register(struct class_interface *class_intf)
 444{
 445        struct class *parent;
 446        struct class_dev_iter iter;
 447        struct device *dev;
 448
 449        if (!class_intf || !class_intf->class)
 450                return -ENODEV;
 451
 452        parent = class_get(class_intf->class);
 453        if (!parent)
 454                return -EINVAL;
 455
 456        mutex_lock(&parent->p->class_mutex);
 457        list_add_tail(&class_intf->node, &parent->p->class_interfaces);
 458        if (class_intf->add_dev) {
 459                class_dev_iter_init(&iter, parent, NULL, NULL);
 460                while ((dev = class_dev_iter_next(&iter)))
 461                        class_intf->add_dev(dev, class_intf);
 462                class_dev_iter_exit(&iter);
 463        }
 464        mutex_unlock(&parent->p->class_mutex);
 465
 466        return 0;
 467}
 468
 469void class_interface_unregister(struct class_interface *class_intf)
 470{
 471        struct class *parent = class_intf->class;
 472        struct class_dev_iter iter;
 473        struct device *dev;
 474
 475        if (!parent)
 476                return;
 477
 478        mutex_lock(&parent->p->class_mutex);
 479        list_del_init(&class_intf->node);
 480        if (class_intf->remove_dev) {
 481                class_dev_iter_init(&iter, parent, NULL, NULL);
 482                while ((dev = class_dev_iter_next(&iter)))
 483                        class_intf->remove_dev(dev, class_intf);
 484                class_dev_iter_exit(&iter);
 485        }
 486        mutex_unlock(&parent->p->class_mutex);
 487
 488        class_put(parent);
 489}
 490
 491struct class_compat {
 492        struct kobject *kobj;
 493};
 494
 495/**
 496 * class_compat_register - register a compatibility class
 497 * @name: the name of the class
 498 *
 499 * Compatibility class are meant as a temporary user-space compatibility
 500 * workaround when converting a family of class devices to a bus devices.
 501 */
 502struct class_compat *class_compat_register(const char *name)
 503{
 504        struct class_compat *cls;
 505
 506        cls = kmalloc(sizeof(struct class_compat), GFP_KERNEL);
 507        if (!cls)
 508                return NULL;
 509        cls->kobj = kobject_create_and_add(name, &class_kset->kobj);
 510        if (!cls->kobj) {
 511                kfree(cls);
 512                return NULL;
 513        }
 514        return cls;
 515}
 516EXPORT_SYMBOL_GPL(class_compat_register);
 517
 518/**
 519 * class_compat_unregister - unregister a compatibility class
 520 * @cls: the class to unregister
 521 */
 522void class_compat_unregister(struct class_compat *cls)
 523{
 524        kobject_put(cls->kobj);
 525        kfree(cls);
 526}
 527EXPORT_SYMBOL_GPL(class_compat_unregister);
 528
 529/**
 530 * class_compat_create_link - create a compatibility class device link to
 531 *                            a bus device
 532 * @cls: the compatibility class
 533 * @dev: the target bus device
 534 * @device_link: an optional device to which a "device" link should be created
 535 */
 536int class_compat_create_link(struct class_compat *cls, struct device *dev,
 537                             struct device *device_link)
 538{
 539        int error;
 540
 541        error = sysfs_create_link(cls->kobj, &dev->kobj, dev_name(dev));
 542        if (error)
 543                return error;
 544
 545        /*
 546         * Optionally add a "device" link (typically to the parent), as a
 547         * class device would have one and we want to provide as much
 548         * backwards compatibility as possible.
 549         */
 550        if (device_link) {
 551                error = sysfs_create_link(&dev->kobj, &device_link->kobj,
 552                                          "device");
 553                if (error)
 554                        sysfs_remove_link(cls->kobj, dev_name(dev));
 555        }
 556
 557        return error;
 558}
 559EXPORT_SYMBOL_GPL(class_compat_create_link);
 560
 561/**
 562 * class_compat_remove_link - remove a compatibility class device link to
 563 *                            a bus device
 564 * @cls: the compatibility class
 565 * @dev: the target bus device
 566 * @device_link: an optional device to which a "device" link was previously
 567 *               created
 568 */
 569void class_compat_remove_link(struct class_compat *cls, struct device *dev,
 570                              struct device *device_link)
 571{
 572        if (device_link)
 573                sysfs_remove_link(&dev->kobj, "device");
 574        sysfs_remove_link(cls->kobj, dev_name(dev));
 575}
 576EXPORT_SYMBOL_GPL(class_compat_remove_link);
 577
 578int __init classes_init(void)
 579{
 580        class_kset = kset_create_and_add("class", NULL, NULL);
 581        if (!class_kset)
 582                return -ENOMEM;
 583        return 0;
 584}
 585
 586EXPORT_SYMBOL_GPL(class_create_file);
 587EXPORT_SYMBOL_GPL(class_remove_file);
 588EXPORT_SYMBOL_GPL(class_unregister);
 589EXPORT_SYMBOL_GPL(class_destroy);
 590
 591EXPORT_SYMBOL_GPL(class_interface_register);
 592EXPORT_SYMBOL_GPL(class_interface_unregister);
 593