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