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/config.h> 14 #include <linux/device.h> 15 #include <linux/module.h> 16 #include <linux/init.h> 17 #include <linux/string.h> 18 #include <linux/kdev_t.h> 19 #include <linux/err.h> 20 #include <linux/slab.h> 21 #include "base.h" 22 23 #define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr) 24 #define to_class(obj) container_of(obj, struct class, subsys.kset.kobj) 25 26 static ssize_t 27 class_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) 28 { 29 struct class_attribute * class_attr = to_class_attr(attr); 30 struct class * dc = to_class(kobj); 31 ssize_t ret = -EIO; 32 33 if (class_attr->show) 34 ret = class_attr->show(dc, buf); 35 return ret; 36 } 37 38 static ssize_t 39 class_attr_store(struct kobject * kobj, struct attribute * attr, 40 const char * buf, size_t count) 41 { 42 struct class_attribute * class_attr = to_class_attr(attr); 43 struct class * dc = to_class(kobj); 44 ssize_t ret = -EIO; 45 46 if (class_attr->store) 47 ret = class_attr->store(dc, buf, count); 48 return ret; 49 } 50 51 static void class_release(struct kobject * kobj) 52 { 53 struct class *class = to_class(kobj); 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 64 static struct sysfs_ops class_sysfs_ops = { 65 .show = class_attr_show, 66 .store = class_attr_store, 67 }; 68 69 static struct kobj_type ktype_class = { 70 .sysfs_ops = &class_sysfs_ops, 71 .release = class_release, 72 }; 73 74 /* Hotplug events for classes go to the class_obj subsys */ 75 static decl_subsys(class, &ktype_class, NULL); 76 77 78 int class_create_file(struct class * cls, const struct class_attribute * attr) 79 { 80 int error; 81 if (cls) { 82 error = sysfs_create_file(&cls->subsys.kset.kobj, &attr->attr); 83 } else 84 error = -EINVAL; 85 return error; 86 } 87 88 void class_remove_file(struct class * cls, const struct class_attribute * attr) 89 { 90 if (cls) 91 sysfs_remove_file(&cls->subsys.kset.kobj, &attr->attr); 92 } 93 94 static struct class *class_get(struct class *cls) 95 { 96 if (cls) 97 return container_of(subsys_get(&cls->subsys), struct class, subsys); 98 return NULL; 99 } 100 101 static void class_put(struct class * cls) 102 { 103 if (cls) 104 subsys_put(&cls->subsys); 105 } 106 107 108 static 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 Err; 118 } 119 } 120 Done: 121 return error; 122 Err: 123 while (--i >= 0) 124 class_remove_file(cls,&cls->class_attrs[i]); 125 goto Done; 126 } 127 128 static 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 138 int class_register(struct class * cls) 139 { 140 int error; 141 142 pr_debug("device class '%s': registering\n", cls->name); 143 144 INIT_LIST_HEAD(&cls->children); 145 INIT_LIST_HEAD(&cls->devices); 146 INIT_LIST_HEAD(&cls->interfaces); 147 init_MUTEX(&cls->sem); 148 error = kobject_set_name(&cls->subsys.kset.kobj, "%s", cls->name); 149 if (error) 150 return error; 151 152 subsys_set_kset(cls, class_subsys); 153 154 error = subsystem_register(&cls->subsys); 155 if (!error) { 156 error = add_class_attrs(class_get(cls)); 157 class_put(cls); 158 } 159 return error; 160 } 161 162 void class_unregister(struct class * cls) 163 { 164 pr_debug("device class '%s': unregistering\n", cls->name); 165 remove_class_attrs(cls); 166 subsystem_unregister(&cls->subsys); 167 } 168 169 static void class_create_release(struct class *cls) 170 { 171 pr_debug("%s called for %s\n", __FUNCTION__, cls->name); 172 kfree(cls); 173 } 174 175 static void class_device_create_release(struct class_device *class_dev) 176 { 177 pr_debug("%s called for %s\n", __FUNCTION__, class_dev->class_id); 178 kfree(class_dev); 179 } 180 181 /* needed to allow these devices to have parent class devices */ 182 static int class_device_create_uevent(struct class_device *class_dev, 183 char **envp, int num_envp, 184 char *buffer, int buffer_size) 185 { 186 pr_debug("%s called for %s\n", __FUNCTION__, class_dev->class_id); 187 return 0; 188 } 189 190 /** 191 * class_create - create a struct class structure 192 * @owner: pointer to the module that is to "own" this struct class 193 * @name: pointer to a string for the name of this class. 194 * 195 * This is used to create a struct class pointer that can then be used 196 * in calls to class_device_create(). 197 * 198 * Note, the pointer created here is to be destroyed when finished by 199 * making a call to class_destroy(). 200 */ 201 struct class *class_create(struct module *owner, char *name) 202 { 203 struct class *cls; 204 int retval; 205 206 cls = kzalloc(sizeof(*cls), GFP_KERNEL); 207 if (!cls) { 208 retval = -ENOMEM; 209 goto error; 210 } 211 212 cls->name = name; 213 cls->owner = owner; 214 cls->class_release = class_create_release; 215 cls->release = class_device_create_release; 216 217 retval = class_register(cls); 218 if (retval) 219 goto error; 220 221 return cls; 222 223 error: 224 kfree(cls); 225 return ERR_PTR(retval); 226 } 227 228 /** 229 * class_destroy - destroys a struct class structure 230 * @cs: pointer to the struct class that is to be destroyed 231 * 232 * Note, the pointer to be destroyed must have been created with a call 233 * to class_create(). 234 */ 235 void class_destroy(struct class *cls) 236 { 237 if ((cls == NULL) || (IS_ERR(cls))) 238 return; 239 240 class_unregister(cls); 241 } 242 243 /* Class Device Stuff */ 244 245 int class_device_create_file(struct class_device * class_dev, 246 const struct class_device_attribute * attr) 247 { 248 int error = -EINVAL; 249 if (class_dev) 250 error = sysfs_create_file(&class_dev->kobj, &attr->attr); 251 return error; 252 } 253 254 void class_device_remove_file(struct class_device * class_dev, 255 const struct class_device_attribute * attr) 256 { 257 if (class_dev) 258 sysfs_remove_file(&class_dev->kobj, &attr->attr); 259 } 260 261 int class_device_create_bin_file(struct class_device *class_dev, 262 struct bin_attribute *attr) 263 { 264 int error = -EINVAL; 265 if (class_dev) 266 error = sysfs_create_bin_file(&class_dev->kobj, attr); 267 return error; 268 } 269 270 void class_device_remove_bin_file(struct class_device *class_dev, 271 struct bin_attribute *attr) 272 { 273 if (class_dev) 274 sysfs_remove_bin_file(&class_dev->kobj, attr); 275 } 276 277 static ssize_t 278 class_device_attr_show(struct kobject * kobj, struct attribute * attr, 279 char * buf) 280 { 281 struct class_device_attribute * class_dev_attr = to_class_dev_attr(attr); 282 struct class_device * cd = to_class_dev(kobj); 283 ssize_t ret = 0; 284 285 if (class_dev_attr->show) 286 ret = class_dev_attr->show(cd, buf); 287 return ret; 288 } 289 290 static ssize_t 291 class_device_attr_store(struct kobject * kobj, struct attribute * attr, 292 const char * buf, size_t count) 293 { 294 struct class_device_attribute * class_dev_attr = to_class_dev_attr(attr); 295 struct class_device * cd = to_class_dev(kobj); 296 ssize_t ret = 0; 297 298 if (class_dev_attr->store) 299 ret = class_dev_attr->store(cd, buf, count); 300 return ret; 301 } 302 303 static struct sysfs_ops class_dev_sysfs_ops = { 304 .show = class_device_attr_show, 305 .store = class_device_attr_store, 306 }; 307 308 static void class_dev_release(struct kobject * kobj) 309 { 310 struct class_device *cd = to_class_dev(kobj); 311 struct class * cls = cd->class; 312 313 pr_debug("device class '%s': release.\n", cd->class_id); 314 315 kfree(cd->devt_attr); 316 cd->devt_attr = NULL; 317 318 if (cd->release) 319 cd->release(cd); 320 else if (cls->release) 321 cls->release(cd); 322 else { 323 printk(KERN_ERR "Class Device '%s' does not have a release() function, " 324 "it is broken and must be fixed.\n", 325 cd->class_id); 326 WARN_ON(1); 327 } 328 } 329 330 static struct kobj_type ktype_class_device = { 331 .sysfs_ops = &class_dev_sysfs_ops, 332 .release = class_dev_release, 333 }; 334 335 static int class_uevent_filter(struct kset *kset, struct kobject *kobj) 336 { 337 struct kobj_type *ktype = get_ktype(kobj); 338 339 if (ktype == &ktype_class_device) { 340 struct class_device *class_dev = to_class_dev(kobj); 341 if (class_dev->class) 342 return 1; 343 } 344 return 0; 345 } 346 347 static const char *class_uevent_name(struct kset *kset, struct kobject *kobj) 348 { 349 struct class_device *class_dev = to_class_dev(kobj); 350 351 return class_dev->class->name; 352 } 353 354 static int class_uevent(struct kset *kset, struct kobject *kobj, char **envp, 355 int num_envp, char *buffer, int buffer_size) 356 { 357 struct class_device *class_dev = to_class_dev(kobj); 358 int i = 0; 359 int length = 0; 360 int retval = 0; 361 362 pr_debug("%s - name = %s\n", __FUNCTION__, class_dev->class_id); 363 364 if (class_dev->dev) { 365 /* add physical device, backing this device */ 366 struct device *dev = class_dev->dev; 367 char *path = kobject_get_path(&dev->kobj, GFP_KERNEL); 368 369 add_uevent_var(envp, num_envp, &i, buffer, buffer_size, 370 &length, "PHYSDEVPATH=%s", path); 371 kfree(path); 372 373 if (dev->bus) 374 add_uevent_var(envp, num_envp, &i, 375 buffer, buffer_size, &length, 376 "PHYSDEVBUS=%s", dev->bus->name); 377 378 if (dev->driver) 379 add_uevent_var(envp, num_envp, &i, 380 buffer, buffer_size, &length, 381 "PHYSDEVDRIVER=%s", dev->driver->name); 382 } 383 384 if (MAJOR(class_dev->devt)) { 385 add_uevent_var(envp, num_envp, &i, 386 buffer, buffer_size, &length, 387 "MAJOR=%u", MAJOR(class_dev->devt)); 388 389 add_uevent_var(envp, num_envp, &i, 390 buffer, buffer_size, &length, 391 "MINOR=%u", MINOR(class_dev->devt)); 392 } 393 394 /* terminate, set to next free slot, shrink available space */ 395 envp[i] = NULL; 396 envp = &envp[i]; 397 num_envp -= i; 398 buffer = &buffer[length]; 399 buffer_size -= length; 400 401 if (class_dev->uevent) { 402 /* have the class device specific function add its stuff */ 403 retval = class_dev->uevent(class_dev, envp, num_envp, 404 buffer, buffer_size); 405 if (retval) 406 pr_debug("class_dev->uevent() returned %d\n", retval); 407 } else if (class_dev->class->uevent) { 408 /* have the class specific function add its stuff */ 409 retval = class_dev->class->uevent(class_dev, envp, num_envp, 410 buffer, buffer_size); 411 if (retval) 412 pr_debug("class->uevent() returned %d\n", retval); 413 } 414 415 return retval; 416 } 417 418 static struct kset_uevent_ops class_uevent_ops = { 419 .filter = class_uevent_filter, 420 .name = class_uevent_name, 421 .uevent = class_uevent, 422 }; 423 424 static decl_subsys(class_obj, &ktype_class_device, &class_uevent_ops); 425 426 427 static int class_device_add_attrs(struct class_device * cd) 428 { 429 int i; 430 int error = 0; 431 struct class * cls = cd->class; 432 433 if (cls->class_dev_attrs) { 434 for (i = 0; attr_name(cls->class_dev_attrs[i]); i++) { 435 error = class_device_create_file(cd, 436 &cls->class_dev_attrs[i]); 437 if (error) 438 goto Err; 439 } 440 } 441 Done: 442 return error; 443 Err: 444 while (--i >= 0) 445 class_device_remove_file(cd,&cls->class_dev_attrs[i]); 446 goto Done; 447 } 448 449 static void class_device_remove_attrs(struct class_device * cd) 450 { 451 int i; 452 struct class * cls = cd->class; 453 454 if (cls->class_dev_attrs) { 455 for (i = 0; attr_name(cls->class_dev_attrs[i]); i++) 456 class_device_remove_file(cd,&cls->class_dev_attrs[i]); 457 } 458 } 459 460 static int class_device_add_groups(struct class_device * cd) 461 { 462 int i; 463 int error = 0; 464 465 if (cd->groups) { 466 for (i = 0; cd->groups[i]; i++) { 467 error = sysfs_create_group(&cd->kobj, cd->groups[i]); 468 if (error) { 469 while (--i >= 0) 470 sysfs_remove_group(&cd->kobj, cd->groups[i]); 471 goto out; 472 } 473 } 474 } 475 out: 476 return error; 477 } 478 479 static void class_device_remove_groups(struct class_device * cd) 480 { 481 int i; 482 if (cd->groups) { 483 for (i = 0; cd->groups[i]; i++) { 484 sysfs_remove_group(&cd->kobj, cd->groups[i]); 485 } 486 } 487 } 488 489 static ssize_t show_dev(struct class_device *class_dev, char *buf) 490 { 491 return print_dev_t(buf, class_dev->devt); 492 } 493 494 static ssize_t store_uevent(struct class_device *class_dev, 495 const char *buf, size_t count) 496 { 497 kobject_uevent(&class_dev->kobj, KOBJ_ADD); 498 return count; 499 } 500 501 void class_device_initialize(struct class_device *class_dev) 502 { 503 kobj_set_kset_s(class_dev, class_obj_subsys); 504 kobject_init(&class_dev->kobj); 505 INIT_LIST_HEAD(&class_dev->node); 506 } 507 508 char *make_class_name(const char *name, struct kobject *kobj) 509 { 510 char *class_name; 511 int size; 512 513 size = strlen(name) + strlen(kobject_name(kobj)) + 2; 514 515 class_name = kmalloc(size, GFP_KERNEL); 516 if (!class_name) 517 return ERR_PTR(-ENOMEM); 518 519 strcpy(class_name, name); 520 strcat(class_name, ":"); 521 strcat(class_name, kobject_name(kobj)); 522 return class_name; 523 } 524 525 int class_device_add(struct class_device *class_dev) 526 { 527 struct class *parent_class = NULL; 528 struct class_device *parent_class_dev = NULL; 529 struct class_interface *class_intf; 530 char *class_name = NULL; 531 int error = -EINVAL; 532 533 class_dev = class_device_get(class_dev); 534 if (!class_dev) 535 return -EINVAL; 536 537 if (!strlen(class_dev->class_id)) 538 goto out1; 539 540 parent_class = class_get(class_dev->class); 541 if (!parent_class) 542 goto out1; 543 544 parent_class_dev = class_device_get(class_dev->parent); 545 546 pr_debug("CLASS: registering class device: ID = '%s'\n", 547 class_dev->class_id); 548 549 /* first, register with generic layer. */ 550 error = kobject_set_name(&class_dev->kobj, "%s", class_dev->class_id); 551 if (error) 552 goto out2; 553 554 if (parent_class_dev) 555 class_dev->kobj.parent = &parent_class_dev->kobj; 556 else 557 class_dev->kobj.parent = &parent_class->subsys.kset.kobj; 558 559 error = kobject_add(&class_dev->kobj); 560 if (error) 561 goto out2; 562 563 /* add the needed attributes to this device */ 564 sysfs_create_link(&class_dev->kobj, &parent_class->subsys.kset.kobj, "subsystem"); 565 class_dev->uevent_attr.attr.name = "uevent"; 566 class_dev->uevent_attr.attr.mode = S_IWUSR; 567 class_dev->uevent_attr.attr.owner = parent_class->owner; 568 class_dev->uevent_attr.store = store_uevent; 569 error = class_device_create_file(class_dev, &class_dev->uevent_attr); 570 if (error) 571 goto out3; 572 573 if (MAJOR(class_dev->devt)) { 574 struct class_device_attribute *attr; 575 attr = kzalloc(sizeof(*attr), GFP_KERNEL); 576 if (!attr) { 577 error = -ENOMEM; 578 goto out4; 579 } 580 attr->attr.name = "dev"; 581 attr->attr.mode = S_IRUGO; 582 attr->attr.owner = parent_class->owner; 583 attr->show = show_dev; 584 error = class_device_create_file(class_dev, attr); 585 if (error) { 586 kfree(attr); 587 goto out4; 588 } 589 590 class_dev->devt_attr = attr; 591 } 592 593 error = class_device_add_attrs(class_dev); 594 if (error) 595 goto out5; 596 597 if (class_dev->dev) { 598 class_name = make_class_name(class_dev->class->name, 599 &class_dev->kobj); 600 error = sysfs_create_link(&class_dev->kobj, 601 &class_dev->dev->kobj, "device"); 602 if (error) 603 goto out6; 604 error = sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, 605 class_name); 606 if (error) 607 goto out7; 608 } 609 610 error = class_device_add_groups(class_dev); 611 if (error) 612 goto out8; 613 614 kobject_uevent(&class_dev->kobj, KOBJ_ADD); 615 616 /* notify any interfaces this device is now here */ 617 down(&parent_class->sem); 618 list_add_tail(&class_dev->node, &parent_class->children); 619 list_for_each_entry(class_intf, &parent_class->interfaces, node) { 620 if (class_intf->add) 621 class_intf->add(class_dev, class_intf); 622 } 623 up(&parent_class->sem); 624 625 goto out1; 626 627 out8: 628 if (class_dev->dev) 629 sysfs_remove_link(&class_dev->kobj, class_name); 630 out7: 631 if (class_dev->dev) 632 sysfs_remove_link(&class_dev->kobj, "device"); 633 out6: 634 class_device_remove_attrs(class_dev); 635 out5: 636 if (class_dev->devt_attr) 637 class_device_remove_file(class_dev, class_dev->devt_attr); 638 out4: 639 class_device_remove_file(class_dev, &class_dev->uevent_attr); 640 out3: 641 kobject_del(&class_dev->kobj); 642 out2: 643 if(parent_class_dev) 644 class_device_put(parent_class_dev); 645 class_put(parent_class); 646 out1: 647 class_device_put(class_dev); 648 kfree(class_name); 649 return error; 650 } 651 652 int class_device_register(struct class_device *class_dev) 653 { 654 class_device_initialize(class_dev); 655 return class_device_add(class_dev); 656 } 657 658 /** 659 * class_device_create - creates a class device and registers it with sysfs 660 * @cs: pointer to the struct class that this device should be registered to. 661 * @parent: pointer to the parent struct class_device of this new device, if any. 662 * @dev: the dev_t for the char device to be added. 663 * @device: a pointer to a struct device that is assiociated with this class device. 664 * @fmt: string for the class device's name 665 * 666 * This function can be used by char device classes. A struct 667 * class_device will be created in sysfs, registered to the specified 668 * class. 669 * A "dev" file will be created, showing the dev_t for the device, if 670 * the dev_t is not 0,0. 671 * If a pointer to a parent struct class_device is passed in, the newly 672 * created struct class_device will be a child of that device in sysfs. 673 * The pointer to the struct class_device will be returned from the 674 * call. Any further sysfs files that might be required can be created 675 * using this pointer. 676 * 677 * Note: the struct class passed to this function must have previously 678 * been created with a call to class_create(). 679 */ 680 struct class_device *class_device_create(struct class *cls, 681 struct class_device *parent, 682 dev_t devt, 683 struct device *device, char *fmt, ...) 684 { 685 va_list args; 686 struct class_device *class_dev = NULL; 687 int retval = -ENODEV; 688 689 if (cls == NULL || IS_ERR(cls)) 690 goto error; 691 692 class_dev = kzalloc(sizeof(*class_dev), GFP_KERNEL); 693 if (!class_dev) { 694 retval = -ENOMEM; 695 goto error; 696 } 697 698 class_dev->devt = devt; 699 class_dev->dev = device; 700 class_dev->class = cls; 701 class_dev->parent = parent; 702 class_dev->release = class_device_create_release; 703 class_dev->uevent = class_device_create_uevent; 704 705 va_start(args, fmt); 706 vsnprintf(class_dev->class_id, BUS_ID_SIZE, fmt, args); 707 va_end(args); 708 retval = class_device_register(class_dev); 709 if (retval) 710 goto error; 711 712 return class_dev; 713 714 error: 715 kfree(class_dev); 716 return ERR_PTR(retval); 717 } 718 719 void class_device_del(struct class_device *class_dev) 720 { 721 struct class *parent_class = class_dev->class; 722 struct class_device *parent_device = class_dev->parent; 723 struct class_interface *class_intf; 724 char *class_name = NULL; 725 726 if (parent_class) { 727 down(&parent_class->sem); 728 list_del_init(&class_dev->node); 729 list_for_each_entry(class_intf, &parent_class->interfaces, node) 730 if (class_intf->remove) 731 class_intf->remove(class_dev, class_intf); 732 up(&parent_class->sem); 733 } 734 735 if (class_dev->dev) { 736 class_name = make_class_name(class_dev->class->name, 737 &class_dev->kobj); 738 sysfs_remove_link(&class_dev->kobj, "device"); 739 sysfs_remove_link(&class_dev->dev->kobj, class_name); 740 } 741 sysfs_remove_link(&class_dev->kobj, "subsystem"); 742 class_device_remove_file(class_dev, &class_dev->uevent_attr); 743 if (class_dev->devt_attr) 744 class_device_remove_file(class_dev, class_dev->devt_attr); 745 class_device_remove_attrs(class_dev); 746 class_device_remove_groups(class_dev); 747 748 kobject_uevent(&class_dev->kobj, KOBJ_REMOVE); 749 kobject_del(&class_dev->kobj); 750 751 class_device_put(parent_device); 752 class_put(parent_class); 753 kfree(class_name); 754 } 755 756 void class_device_unregister(struct class_device *class_dev) 757 { 758 pr_debug("CLASS: Unregistering class device. ID = '%s'\n", 759 class_dev->class_id); 760 class_device_del(class_dev); 761 class_device_put(class_dev); 762 } 763 764 /** 765 * class_device_destroy - removes a class device that was created with class_device_create() 766 * @cls: the pointer to the struct class that this device was registered * with. 767 * @dev: the dev_t of the device that was previously registered. 768 * 769 * This call unregisters and cleans up a class device that was created with a 770 * call to class_device_create() 771 */ 772 void class_device_destroy(struct class *cls, dev_t devt) 773 { 774 struct class_device *class_dev = NULL; 775 struct class_device *class_dev_tmp; 776 777 down(&cls->sem); 778 list_for_each_entry(class_dev_tmp, &cls->children, node) { 779 if (class_dev_tmp->devt == devt) { 780 class_dev = class_dev_tmp; 781 break; 782 } 783 } 784 up(&cls->sem); 785 786 if (class_dev) 787 class_device_unregister(class_dev); 788 } 789 790 int class_device_rename(struct class_device *class_dev, char *new_name) 791 { 792 int error = 0; 793 char *old_class_name = NULL, *new_class_name = NULL; 794 795 class_dev = class_device_get(class_dev); 796 if (!class_dev) 797 return -EINVAL; 798 799 pr_debug("CLASS: renaming '%s' to '%s'\n", class_dev->class_id, 800 new_name); 801 802 if (class_dev->dev) 803 old_class_name = make_class_name(class_dev->class->name, 804 &class_dev->kobj); 805 806 strlcpy(class_dev->class_id, new_name, KOBJ_NAME_LEN); 807 808 error = kobject_rename(&class_dev->kobj, new_name); 809 810 if (class_dev->dev) { 811 new_class_name = make_class_name(class_dev->class->name, 812 &class_dev->kobj); 813 sysfs_create_link(&class_dev->dev->kobj, &class_dev->kobj, 814 new_class_name); 815 sysfs_remove_link(&class_dev->dev->kobj, old_class_name); 816 } 817 class_device_put(class_dev); 818 819 kfree(old_class_name); 820 kfree(new_class_name); 821 822 return error; 823 } 824 825 struct class_device * class_device_get(struct class_device *class_dev) 826 { 827 if (class_dev) 828 return to_class_dev(kobject_get(&class_dev->kobj)); 829 return NULL; 830 } 831 832 void class_device_put(struct class_device *class_dev) 833 { 834 if (class_dev) 835 kobject_put(&class_dev->kobj); 836 } 837 838 839 int class_interface_register(struct class_interface *class_intf) 840 { 841 struct class *parent; 842 struct class_device *class_dev; 843 844 if (!class_intf || !class_intf->class) 845 return -ENODEV; 846 847 parent = class_get(class_intf->class); 848 if (!parent) 849 return -EINVAL; 850 851 down(&parent->sem); 852 list_add_tail(&class_intf->node, &parent->interfaces); 853 if (class_intf->add) { 854 list_for_each_entry(class_dev, &parent->children, node) 855 class_intf->add(class_dev, class_intf); 856 } 857 up(&parent->sem); 858 859 return 0; 860 } 861 862 void class_interface_unregister(struct class_interface *class_intf) 863 { 864 struct class * parent = class_intf->class; 865 struct class_device *class_dev; 866 867 if (!parent) 868 return; 869 870 down(&parent->sem); 871 list_del_init(&class_intf->node); 872 if (class_intf->remove) { 873 list_for_each_entry(class_dev, &parent->children, node) 874 class_intf->remove(class_dev, class_intf); 875 } 876 up(&parent->sem); 877 878 class_put(parent); 879 } 880 881 882 883 int __init classes_init(void) 884 { 885 int retval; 886 887 retval = subsystem_register(&class_subsys); 888 if (retval) 889 return retval; 890 891 /* ick, this is ugly, the things we go through to keep from showing up 892 * in sysfs... */ 893 subsystem_init(&class_obj_subsys); 894 if (!class_obj_subsys.kset.subsys) 895 class_obj_subsys.kset.subsys = &class_obj_subsys; 896 return 0; 897 } 898 899 EXPORT_SYMBOL_GPL(class_create_file); 900 EXPORT_SYMBOL_GPL(class_remove_file); 901 EXPORT_SYMBOL_GPL(class_register); 902 EXPORT_SYMBOL_GPL(class_unregister); 903 EXPORT_SYMBOL_GPL(class_create); 904 EXPORT_SYMBOL_GPL(class_destroy); 905 906 EXPORT_SYMBOL_GPL(class_device_register); 907 EXPORT_SYMBOL_GPL(class_device_unregister); 908 EXPORT_SYMBOL_GPL(class_device_initialize); 909 EXPORT_SYMBOL_GPL(class_device_add); 910 EXPORT_SYMBOL_GPL(class_device_del); 911 EXPORT_SYMBOL_GPL(class_device_get); 912 EXPORT_SYMBOL_GPL(class_device_put); 913 EXPORT_SYMBOL_GPL(class_device_create); 914 EXPORT_SYMBOL_GPL(class_device_destroy); 915 EXPORT_SYMBOL_GPL(class_device_create_file); 916 EXPORT_SYMBOL_GPL(class_device_remove_file); 917 EXPORT_SYMBOL_GPL(class_device_create_bin_file); 918 EXPORT_SYMBOL_GPL(class_device_remove_bin_file); 919 920 EXPORT_SYMBOL_GPL(class_interface_register); 921 EXPORT_SYMBOL_GPL(class_interface_unregister); 922