1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * class.c - basic device class management
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2002-3 Patrick Mochel
6*4882a593Smuzhiyun * Copyright (c) 2002-3 Open Source Development Labs
7*4882a593Smuzhiyun * Copyright (c) 2003-2004 Greg Kroah-Hartman
8*4882a593Smuzhiyun * Copyright (c) 2003-2004 IBM Corp.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/device/class.h>
12*4882a593Smuzhiyun #include <linux/device.h>
13*4882a593Smuzhiyun #include <linux/module.h>
14*4882a593Smuzhiyun #include <linux/init.h>
15*4882a593Smuzhiyun #include <linux/string.h>
16*4882a593Smuzhiyun #include <linux/kdev_t.h>
17*4882a593Smuzhiyun #include <linux/err.h>
18*4882a593Smuzhiyun #include <linux/slab.h>
19*4882a593Smuzhiyun #include <linux/genhd.h>
20*4882a593Smuzhiyun #include <linux/mutex.h>
21*4882a593Smuzhiyun #include "base.h"
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun #define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr)
24*4882a593Smuzhiyun
class_attr_show(struct kobject * kobj,struct attribute * attr,char * buf)25*4882a593Smuzhiyun static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr,
26*4882a593Smuzhiyun char *buf)
27*4882a593Smuzhiyun {
28*4882a593Smuzhiyun struct class_attribute *class_attr = to_class_attr(attr);
29*4882a593Smuzhiyun struct subsys_private *cp = to_subsys_private(kobj);
30*4882a593Smuzhiyun ssize_t ret = -EIO;
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun if (class_attr->show)
33*4882a593Smuzhiyun ret = class_attr->show(cp->class, class_attr, buf);
34*4882a593Smuzhiyun return ret;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
class_attr_store(struct kobject * kobj,struct attribute * attr,const char * buf,size_t count)37*4882a593Smuzhiyun static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr,
38*4882a593Smuzhiyun const char *buf, size_t count)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun struct class_attribute *class_attr = to_class_attr(attr);
41*4882a593Smuzhiyun struct subsys_private *cp = to_subsys_private(kobj);
42*4882a593Smuzhiyun ssize_t ret = -EIO;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun if (class_attr->store)
45*4882a593Smuzhiyun ret = class_attr->store(cp->class, class_attr, buf, count);
46*4882a593Smuzhiyun return ret;
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
class_release(struct kobject * kobj)49*4882a593Smuzhiyun static void class_release(struct kobject *kobj)
50*4882a593Smuzhiyun {
51*4882a593Smuzhiyun struct subsys_private *cp = to_subsys_private(kobj);
52*4882a593Smuzhiyun struct class *class = cp->class;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun pr_debug("class '%s': release.\n", class->name);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun if (class->class_release)
57*4882a593Smuzhiyun class->class_release(class);
58*4882a593Smuzhiyun else
59*4882a593Smuzhiyun pr_debug("class '%s' does not have a release() function, "
60*4882a593Smuzhiyun "be careful\n", class->name);
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun kfree(cp);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
class_child_ns_type(struct kobject * kobj)65*4882a593Smuzhiyun static const struct kobj_ns_type_operations *class_child_ns_type(struct kobject *kobj)
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun struct subsys_private *cp = to_subsys_private(kobj);
68*4882a593Smuzhiyun struct class *class = cp->class;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun return class->ns_type;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun static const struct sysfs_ops class_sysfs_ops = {
74*4882a593Smuzhiyun .show = class_attr_show,
75*4882a593Smuzhiyun .store = class_attr_store,
76*4882a593Smuzhiyun };
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun static struct kobj_type class_ktype = {
79*4882a593Smuzhiyun .sysfs_ops = &class_sysfs_ops,
80*4882a593Smuzhiyun .release = class_release,
81*4882a593Smuzhiyun .child_ns_type = class_child_ns_type,
82*4882a593Smuzhiyun };
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun /* Hotplug events for classes go to the class subsys */
85*4882a593Smuzhiyun static struct kset *class_kset;
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun
class_create_file_ns(struct class * cls,const struct class_attribute * attr,const void * ns)88*4882a593Smuzhiyun int class_create_file_ns(struct class *cls, const struct class_attribute *attr,
89*4882a593Smuzhiyun const void *ns)
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun int error;
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun if (cls)
94*4882a593Smuzhiyun error = sysfs_create_file_ns(&cls->p->subsys.kobj,
95*4882a593Smuzhiyun &attr->attr, ns);
96*4882a593Smuzhiyun else
97*4882a593Smuzhiyun error = -EINVAL;
98*4882a593Smuzhiyun return error;
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun
class_remove_file_ns(struct class * cls,const struct class_attribute * attr,const void * ns)101*4882a593Smuzhiyun void class_remove_file_ns(struct class *cls, const struct class_attribute *attr,
102*4882a593Smuzhiyun const void *ns)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun if (cls)
105*4882a593Smuzhiyun sysfs_remove_file_ns(&cls->p->subsys.kobj, &attr->attr, ns);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
class_get(struct class * cls)108*4882a593Smuzhiyun static struct class *class_get(struct class *cls)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun if (cls)
111*4882a593Smuzhiyun kset_get(&cls->p->subsys);
112*4882a593Smuzhiyun return cls;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
class_put(struct class * cls)115*4882a593Smuzhiyun static void class_put(struct class *cls)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun if (cls)
118*4882a593Smuzhiyun kset_put(&cls->p->subsys);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
klist_class_to_dev(struct klist_node * n)121*4882a593Smuzhiyun static struct device *klist_class_to_dev(struct klist_node *n)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun struct device_private *p = to_device_private_class(n);
124*4882a593Smuzhiyun return p->device;
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
klist_class_dev_get(struct klist_node * n)127*4882a593Smuzhiyun static void klist_class_dev_get(struct klist_node *n)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun struct device *dev = klist_class_to_dev(n);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun get_device(dev);
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
klist_class_dev_put(struct klist_node * n)134*4882a593Smuzhiyun static void klist_class_dev_put(struct klist_node *n)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun struct device *dev = klist_class_to_dev(n);
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun put_device(dev);
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
class_add_groups(struct class * cls,const struct attribute_group ** groups)141*4882a593Smuzhiyun static int class_add_groups(struct class *cls,
142*4882a593Smuzhiyun const struct attribute_group **groups)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun return sysfs_create_groups(&cls->p->subsys.kobj, groups);
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun
class_remove_groups(struct class * cls,const struct attribute_group ** groups)147*4882a593Smuzhiyun static void class_remove_groups(struct class *cls,
148*4882a593Smuzhiyun const struct attribute_group **groups)
149*4882a593Smuzhiyun {
150*4882a593Smuzhiyun return sysfs_remove_groups(&cls->p->subsys.kobj, groups);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
__class_register(struct class * cls,struct lock_class_key * key)153*4882a593Smuzhiyun int __class_register(struct class *cls, struct lock_class_key *key)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun struct subsys_private *cp;
156*4882a593Smuzhiyun int error;
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun pr_debug("device class '%s': registering\n", cls->name);
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun cp = kzalloc(sizeof(*cp), GFP_KERNEL);
161*4882a593Smuzhiyun if (!cp)
162*4882a593Smuzhiyun return -ENOMEM;
163*4882a593Smuzhiyun klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put);
164*4882a593Smuzhiyun INIT_LIST_HEAD(&cp->interfaces);
165*4882a593Smuzhiyun kset_init(&cp->glue_dirs);
166*4882a593Smuzhiyun __mutex_init(&cp->mutex, "subsys mutex", key);
167*4882a593Smuzhiyun error = kobject_set_name(&cp->subsys.kobj, "%s", cls->name);
168*4882a593Smuzhiyun if (error) {
169*4882a593Smuzhiyun kfree(cp);
170*4882a593Smuzhiyun return error;
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun /* set the default /sys/dev directory for devices of this class */
174*4882a593Smuzhiyun if (!cls->dev_kobj)
175*4882a593Smuzhiyun cls->dev_kobj = sysfs_dev_char_kobj;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun #if defined(CONFIG_BLOCK)
178*4882a593Smuzhiyun /* let the block class directory show up in the root of sysfs */
179*4882a593Smuzhiyun if (!sysfs_deprecated || cls != &block_class)
180*4882a593Smuzhiyun cp->subsys.kobj.kset = class_kset;
181*4882a593Smuzhiyun #else
182*4882a593Smuzhiyun cp->subsys.kobj.kset = class_kset;
183*4882a593Smuzhiyun #endif
184*4882a593Smuzhiyun cp->subsys.kobj.ktype = &class_ktype;
185*4882a593Smuzhiyun cp->class = cls;
186*4882a593Smuzhiyun cls->p = cp;
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun error = kset_register(&cp->subsys);
189*4882a593Smuzhiyun if (error) {
190*4882a593Smuzhiyun kfree(cp);
191*4882a593Smuzhiyun return error;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun error = class_add_groups(class_get(cls), cls->class_groups);
194*4882a593Smuzhiyun class_put(cls);
195*4882a593Smuzhiyun return error;
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__class_register);
198*4882a593Smuzhiyun
class_unregister(struct class * cls)199*4882a593Smuzhiyun void class_unregister(struct class *cls)
200*4882a593Smuzhiyun {
201*4882a593Smuzhiyun pr_debug("device class '%s': unregistering\n", cls->name);
202*4882a593Smuzhiyun class_remove_groups(cls, cls->class_groups);
203*4882a593Smuzhiyun kset_unregister(&cls->p->subsys);
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
class_create_release(struct class * cls)206*4882a593Smuzhiyun static void class_create_release(struct class *cls)
207*4882a593Smuzhiyun {
208*4882a593Smuzhiyun pr_debug("%s called for %s\n", __func__, cls->name);
209*4882a593Smuzhiyun kfree(cls);
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun /**
213*4882a593Smuzhiyun * class_create - create a struct class structure
214*4882a593Smuzhiyun * @owner: pointer to the module that is to "own" this struct class
215*4882a593Smuzhiyun * @name: pointer to a string for the name of this class.
216*4882a593Smuzhiyun * @key: the lock_class_key for this class; used by mutex lock debugging
217*4882a593Smuzhiyun *
218*4882a593Smuzhiyun * This is used to create a struct class pointer that can then be used
219*4882a593Smuzhiyun * in calls to device_create().
220*4882a593Smuzhiyun *
221*4882a593Smuzhiyun * Returns &struct class pointer on success, or ERR_PTR() on error.
222*4882a593Smuzhiyun *
223*4882a593Smuzhiyun * Note, the pointer created here is to be destroyed when finished by
224*4882a593Smuzhiyun * making a call to class_destroy().
225*4882a593Smuzhiyun */
__class_create(struct module * owner,const char * name,struct lock_class_key * key)226*4882a593Smuzhiyun struct class *__class_create(struct module *owner, const char *name,
227*4882a593Smuzhiyun struct lock_class_key *key)
228*4882a593Smuzhiyun {
229*4882a593Smuzhiyun struct class *cls;
230*4882a593Smuzhiyun int retval;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun cls = kzalloc(sizeof(*cls), GFP_KERNEL);
233*4882a593Smuzhiyun if (!cls) {
234*4882a593Smuzhiyun retval = -ENOMEM;
235*4882a593Smuzhiyun goto error;
236*4882a593Smuzhiyun }
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun cls->name = name;
239*4882a593Smuzhiyun cls->owner = owner;
240*4882a593Smuzhiyun cls->class_release = class_create_release;
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun retval = __class_register(cls, key);
243*4882a593Smuzhiyun if (retval)
244*4882a593Smuzhiyun goto error;
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun return cls;
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun error:
249*4882a593Smuzhiyun kfree(cls);
250*4882a593Smuzhiyun return ERR_PTR(retval);
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(__class_create);
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /**
255*4882a593Smuzhiyun * class_destroy - destroys a struct class structure
256*4882a593Smuzhiyun * @cls: pointer to the struct class that is to be destroyed
257*4882a593Smuzhiyun *
258*4882a593Smuzhiyun * Note, the pointer to be destroyed must have been created with a call
259*4882a593Smuzhiyun * to class_create().
260*4882a593Smuzhiyun */
class_destroy(struct class * cls)261*4882a593Smuzhiyun void class_destroy(struct class *cls)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun if ((cls == NULL) || (IS_ERR(cls)))
264*4882a593Smuzhiyun return;
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun class_unregister(cls);
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun
269*4882a593Smuzhiyun /**
270*4882a593Smuzhiyun * class_dev_iter_init - initialize class device iterator
271*4882a593Smuzhiyun * @iter: class iterator to initialize
272*4882a593Smuzhiyun * @class: the class we wanna iterate over
273*4882a593Smuzhiyun * @start: the device to start iterating from, if any
274*4882a593Smuzhiyun * @type: device_type of the devices to iterate over, NULL for all
275*4882a593Smuzhiyun *
276*4882a593Smuzhiyun * Initialize class iterator @iter such that it iterates over devices
277*4882a593Smuzhiyun * of @class. If @start is set, the list iteration will start there,
278*4882a593Smuzhiyun * otherwise if it is NULL, the iteration starts at the beginning of
279*4882a593Smuzhiyun * the list.
280*4882a593Smuzhiyun */
class_dev_iter_init(struct class_dev_iter * iter,struct class * class,struct device * start,const struct device_type * type)281*4882a593Smuzhiyun void class_dev_iter_init(struct class_dev_iter *iter, struct class *class,
282*4882a593Smuzhiyun struct device *start, const struct device_type *type)
283*4882a593Smuzhiyun {
284*4882a593Smuzhiyun struct klist_node *start_knode = NULL;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun if (start)
287*4882a593Smuzhiyun start_knode = &start->p->knode_class;
288*4882a593Smuzhiyun klist_iter_init_node(&class->p->klist_devices, &iter->ki, start_knode);
289*4882a593Smuzhiyun iter->type = type;
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_dev_iter_init);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun /**
294*4882a593Smuzhiyun * class_dev_iter_next - iterate to the next device
295*4882a593Smuzhiyun * @iter: class iterator to proceed
296*4882a593Smuzhiyun *
297*4882a593Smuzhiyun * Proceed @iter to the next device and return it. Returns NULL if
298*4882a593Smuzhiyun * iteration is complete.
299*4882a593Smuzhiyun *
300*4882a593Smuzhiyun * The returned device is referenced and won't be released till
301*4882a593Smuzhiyun * iterator is proceed to the next device or exited. The caller is
302*4882a593Smuzhiyun * free to do whatever it wants to do with the device including
303*4882a593Smuzhiyun * calling back into class code.
304*4882a593Smuzhiyun */
class_dev_iter_next(struct class_dev_iter * iter)305*4882a593Smuzhiyun struct device *class_dev_iter_next(struct class_dev_iter *iter)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun struct klist_node *knode;
308*4882a593Smuzhiyun struct device *dev;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun while (1) {
311*4882a593Smuzhiyun knode = klist_next(&iter->ki);
312*4882a593Smuzhiyun if (!knode)
313*4882a593Smuzhiyun return NULL;
314*4882a593Smuzhiyun dev = klist_class_to_dev(knode);
315*4882a593Smuzhiyun if (!iter->type || iter->type == dev->type)
316*4882a593Smuzhiyun return dev;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_dev_iter_next);
320*4882a593Smuzhiyun
321*4882a593Smuzhiyun /**
322*4882a593Smuzhiyun * class_dev_iter_exit - finish iteration
323*4882a593Smuzhiyun * @iter: class iterator to finish
324*4882a593Smuzhiyun *
325*4882a593Smuzhiyun * Finish an iteration. Always call this function after iteration is
326*4882a593Smuzhiyun * complete whether the iteration ran till the end or not.
327*4882a593Smuzhiyun */
class_dev_iter_exit(struct class_dev_iter * iter)328*4882a593Smuzhiyun void class_dev_iter_exit(struct class_dev_iter *iter)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun klist_iter_exit(&iter->ki);
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_dev_iter_exit);
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun /**
335*4882a593Smuzhiyun * class_for_each_device - device iterator
336*4882a593Smuzhiyun * @class: the class we're iterating
337*4882a593Smuzhiyun * @start: the device to start with in the list, if any.
338*4882a593Smuzhiyun * @data: data for the callback
339*4882a593Smuzhiyun * @fn: function to be called for each device
340*4882a593Smuzhiyun *
341*4882a593Smuzhiyun * Iterate over @class's list of devices, and call @fn for each,
342*4882a593Smuzhiyun * passing it @data. If @start is set, the list iteration will start
343*4882a593Smuzhiyun * there, otherwise if it is NULL, the iteration starts at the
344*4882a593Smuzhiyun * beginning of the list.
345*4882a593Smuzhiyun *
346*4882a593Smuzhiyun * We check the return of @fn each time. If it returns anything
347*4882a593Smuzhiyun * other than 0, we break out and return that value.
348*4882a593Smuzhiyun *
349*4882a593Smuzhiyun * @fn is allowed to do anything including calling back into class
350*4882a593Smuzhiyun * code. There's no locking restriction.
351*4882a593Smuzhiyun */
class_for_each_device(struct class * class,struct device * start,void * data,int (* fn)(struct device *,void *))352*4882a593Smuzhiyun int class_for_each_device(struct class *class, struct device *start,
353*4882a593Smuzhiyun void *data, int (*fn)(struct device *, void *))
354*4882a593Smuzhiyun {
355*4882a593Smuzhiyun struct class_dev_iter iter;
356*4882a593Smuzhiyun struct device *dev;
357*4882a593Smuzhiyun int error = 0;
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun if (!class)
360*4882a593Smuzhiyun return -EINVAL;
361*4882a593Smuzhiyun if (!class->p) {
362*4882a593Smuzhiyun WARN(1, "%s called for class '%s' before it was initialized",
363*4882a593Smuzhiyun __func__, class->name);
364*4882a593Smuzhiyun return -EINVAL;
365*4882a593Smuzhiyun }
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun class_dev_iter_init(&iter, class, start, NULL);
368*4882a593Smuzhiyun while ((dev = class_dev_iter_next(&iter))) {
369*4882a593Smuzhiyun error = fn(dev, data);
370*4882a593Smuzhiyun if (error)
371*4882a593Smuzhiyun break;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun class_dev_iter_exit(&iter);
374*4882a593Smuzhiyun
375*4882a593Smuzhiyun return error;
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_for_each_device);
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun /**
380*4882a593Smuzhiyun * class_find_device - device iterator for locating a particular device
381*4882a593Smuzhiyun * @class: the class we're iterating
382*4882a593Smuzhiyun * @start: Device to begin with
383*4882a593Smuzhiyun * @data: data for the match function
384*4882a593Smuzhiyun * @match: function to check device
385*4882a593Smuzhiyun *
386*4882a593Smuzhiyun * This is similar to the class_for_each_dev() function above, but it
387*4882a593Smuzhiyun * returns a reference to a device that is 'found' for later use, as
388*4882a593Smuzhiyun * determined by the @match callback.
389*4882a593Smuzhiyun *
390*4882a593Smuzhiyun * The callback should return 0 if the device doesn't match and non-zero
391*4882a593Smuzhiyun * if it does. If the callback returns non-zero, this function will
392*4882a593Smuzhiyun * return to the caller and not iterate over any more devices.
393*4882a593Smuzhiyun *
394*4882a593Smuzhiyun * Note, you will need to drop the reference with put_device() after use.
395*4882a593Smuzhiyun *
396*4882a593Smuzhiyun * @match is allowed to do anything including calling back into class
397*4882a593Smuzhiyun * code. There's no locking restriction.
398*4882a593Smuzhiyun */
class_find_device(struct class * class,struct device * start,const void * data,int (* match)(struct device *,const void *))399*4882a593Smuzhiyun struct device *class_find_device(struct class *class, struct device *start,
400*4882a593Smuzhiyun const void *data,
401*4882a593Smuzhiyun int (*match)(struct device *, const void *))
402*4882a593Smuzhiyun {
403*4882a593Smuzhiyun struct class_dev_iter iter;
404*4882a593Smuzhiyun struct device *dev;
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun if (!class)
407*4882a593Smuzhiyun return NULL;
408*4882a593Smuzhiyun if (!class->p) {
409*4882a593Smuzhiyun WARN(1, "%s called for class '%s' before it was initialized",
410*4882a593Smuzhiyun __func__, class->name);
411*4882a593Smuzhiyun return NULL;
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun
414*4882a593Smuzhiyun class_dev_iter_init(&iter, class, start, NULL);
415*4882a593Smuzhiyun while ((dev = class_dev_iter_next(&iter))) {
416*4882a593Smuzhiyun if (match(dev, data)) {
417*4882a593Smuzhiyun get_device(dev);
418*4882a593Smuzhiyun break;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun class_dev_iter_exit(&iter);
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun return dev;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_find_device);
426*4882a593Smuzhiyun
class_interface_register(struct class_interface * class_intf)427*4882a593Smuzhiyun int class_interface_register(struct class_interface *class_intf)
428*4882a593Smuzhiyun {
429*4882a593Smuzhiyun struct class *parent;
430*4882a593Smuzhiyun struct class_dev_iter iter;
431*4882a593Smuzhiyun struct device *dev;
432*4882a593Smuzhiyun
433*4882a593Smuzhiyun if (!class_intf || !class_intf->class)
434*4882a593Smuzhiyun return -ENODEV;
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun parent = class_get(class_intf->class);
437*4882a593Smuzhiyun if (!parent)
438*4882a593Smuzhiyun return -EINVAL;
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun mutex_lock(&parent->p->mutex);
441*4882a593Smuzhiyun list_add_tail(&class_intf->node, &parent->p->interfaces);
442*4882a593Smuzhiyun if (class_intf->add_dev) {
443*4882a593Smuzhiyun class_dev_iter_init(&iter, parent, NULL, NULL);
444*4882a593Smuzhiyun while ((dev = class_dev_iter_next(&iter)))
445*4882a593Smuzhiyun class_intf->add_dev(dev, class_intf);
446*4882a593Smuzhiyun class_dev_iter_exit(&iter);
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun mutex_unlock(&parent->p->mutex);
449*4882a593Smuzhiyun
450*4882a593Smuzhiyun return 0;
451*4882a593Smuzhiyun }
452*4882a593Smuzhiyun
class_interface_unregister(struct class_interface * class_intf)453*4882a593Smuzhiyun void class_interface_unregister(struct class_interface *class_intf)
454*4882a593Smuzhiyun {
455*4882a593Smuzhiyun struct class *parent = class_intf->class;
456*4882a593Smuzhiyun struct class_dev_iter iter;
457*4882a593Smuzhiyun struct device *dev;
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun if (!parent)
460*4882a593Smuzhiyun return;
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun mutex_lock(&parent->p->mutex);
463*4882a593Smuzhiyun list_del_init(&class_intf->node);
464*4882a593Smuzhiyun if (class_intf->remove_dev) {
465*4882a593Smuzhiyun class_dev_iter_init(&iter, parent, NULL, NULL);
466*4882a593Smuzhiyun while ((dev = class_dev_iter_next(&iter)))
467*4882a593Smuzhiyun class_intf->remove_dev(dev, class_intf);
468*4882a593Smuzhiyun class_dev_iter_exit(&iter);
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun mutex_unlock(&parent->p->mutex);
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun class_put(parent);
473*4882a593Smuzhiyun }
474*4882a593Smuzhiyun
show_class_attr_string(struct class * class,struct class_attribute * attr,char * buf)475*4882a593Smuzhiyun ssize_t show_class_attr_string(struct class *class,
476*4882a593Smuzhiyun struct class_attribute *attr, char *buf)
477*4882a593Smuzhiyun {
478*4882a593Smuzhiyun struct class_attribute_string *cs;
479*4882a593Smuzhiyun
480*4882a593Smuzhiyun cs = container_of(attr, struct class_attribute_string, attr);
481*4882a593Smuzhiyun return sysfs_emit(buf, "%s\n", cs->str);
482*4882a593Smuzhiyun }
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(show_class_attr_string);
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun struct class_compat {
487*4882a593Smuzhiyun struct kobject *kobj;
488*4882a593Smuzhiyun };
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun /**
491*4882a593Smuzhiyun * class_compat_register - register a compatibility class
492*4882a593Smuzhiyun * @name: the name of the class
493*4882a593Smuzhiyun *
494*4882a593Smuzhiyun * Compatibility class are meant as a temporary user-space compatibility
495*4882a593Smuzhiyun * workaround when converting a family of class devices to a bus devices.
496*4882a593Smuzhiyun */
class_compat_register(const char * name)497*4882a593Smuzhiyun struct class_compat *class_compat_register(const char *name)
498*4882a593Smuzhiyun {
499*4882a593Smuzhiyun struct class_compat *cls;
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun cls = kmalloc(sizeof(struct class_compat), GFP_KERNEL);
502*4882a593Smuzhiyun if (!cls)
503*4882a593Smuzhiyun return NULL;
504*4882a593Smuzhiyun cls->kobj = kobject_create_and_add(name, &class_kset->kobj);
505*4882a593Smuzhiyun if (!cls->kobj) {
506*4882a593Smuzhiyun kfree(cls);
507*4882a593Smuzhiyun return NULL;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun return cls;
510*4882a593Smuzhiyun }
511*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_compat_register);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun /**
514*4882a593Smuzhiyun * class_compat_unregister - unregister a compatibility class
515*4882a593Smuzhiyun * @cls: the class to unregister
516*4882a593Smuzhiyun */
class_compat_unregister(struct class_compat * cls)517*4882a593Smuzhiyun void class_compat_unregister(struct class_compat *cls)
518*4882a593Smuzhiyun {
519*4882a593Smuzhiyun kobject_put(cls->kobj);
520*4882a593Smuzhiyun kfree(cls);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_compat_unregister);
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun /**
525*4882a593Smuzhiyun * class_compat_create_link - create a compatibility class device link to
526*4882a593Smuzhiyun * a bus device
527*4882a593Smuzhiyun * @cls: the compatibility class
528*4882a593Smuzhiyun * @dev: the target bus device
529*4882a593Smuzhiyun * @device_link: an optional device to which a "device" link should be created
530*4882a593Smuzhiyun */
class_compat_create_link(struct class_compat * cls,struct device * dev,struct device * device_link)531*4882a593Smuzhiyun int class_compat_create_link(struct class_compat *cls, struct device *dev,
532*4882a593Smuzhiyun struct device *device_link)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun int error;
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun error = sysfs_create_link(cls->kobj, &dev->kobj, dev_name(dev));
537*4882a593Smuzhiyun if (error)
538*4882a593Smuzhiyun return error;
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun /*
541*4882a593Smuzhiyun * Optionally add a "device" link (typically to the parent), as a
542*4882a593Smuzhiyun * class device would have one and we want to provide as much
543*4882a593Smuzhiyun * backwards compatibility as possible.
544*4882a593Smuzhiyun */
545*4882a593Smuzhiyun if (device_link) {
546*4882a593Smuzhiyun error = sysfs_create_link(&dev->kobj, &device_link->kobj,
547*4882a593Smuzhiyun "device");
548*4882a593Smuzhiyun if (error)
549*4882a593Smuzhiyun sysfs_remove_link(cls->kobj, dev_name(dev));
550*4882a593Smuzhiyun }
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun return error;
553*4882a593Smuzhiyun }
554*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_compat_create_link);
555*4882a593Smuzhiyun
556*4882a593Smuzhiyun /**
557*4882a593Smuzhiyun * class_compat_remove_link - remove a compatibility class device link to
558*4882a593Smuzhiyun * a bus device
559*4882a593Smuzhiyun * @cls: the compatibility class
560*4882a593Smuzhiyun * @dev: the target bus device
561*4882a593Smuzhiyun * @device_link: an optional device to which a "device" link was previously
562*4882a593Smuzhiyun * created
563*4882a593Smuzhiyun */
class_compat_remove_link(struct class_compat * cls,struct device * dev,struct device * device_link)564*4882a593Smuzhiyun void class_compat_remove_link(struct class_compat *cls, struct device *dev,
565*4882a593Smuzhiyun struct device *device_link)
566*4882a593Smuzhiyun {
567*4882a593Smuzhiyun if (device_link)
568*4882a593Smuzhiyun sysfs_remove_link(&dev->kobj, "device");
569*4882a593Smuzhiyun sysfs_remove_link(cls->kobj, dev_name(dev));
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_compat_remove_link);
572*4882a593Smuzhiyun
classes_init(void)573*4882a593Smuzhiyun int __init classes_init(void)
574*4882a593Smuzhiyun {
575*4882a593Smuzhiyun class_kset = kset_create_and_add("class", NULL, NULL);
576*4882a593Smuzhiyun if (!class_kset)
577*4882a593Smuzhiyun return -ENOMEM;
578*4882a593Smuzhiyun return 0;
579*4882a593Smuzhiyun }
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_create_file_ns);
582*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_remove_file_ns);
583*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_unregister);
584*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_destroy);
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_interface_register);
587*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(class_interface_unregister);
588