182664963SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
21da177e4SLinus Torvalds /*
3ee959b00STony Jones * attribute_container.h - a generic container for all classes
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Copyright (c) 2005 - James Bottomley <[email protected]>
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds
81da177e4SLinus Torvalds #ifndef _ATTRIBUTE_CONTAINER_H_
91da177e4SLinus Torvalds #define _ATTRIBUTE_CONTAINER_H_
101da177e4SLinus Torvalds
111da177e4SLinus Torvalds #include <linux/list.h>
1253c165e0SJames Bottomley #include <linux/klist.h>
131da177e4SLinus Torvalds
14313162d0SPaul Gortmaker struct device;
15313162d0SPaul Gortmaker
161da177e4SLinus Torvalds struct attribute_container {
171da177e4SLinus Torvalds struct list_head node;
1853c165e0SJames Bottomley struct klist containers;
191da177e4SLinus Torvalds struct class *class;
20a4dbd674SDavid Brownell const struct attribute_group *grp;
21ee959b00STony Jones struct device_attribute **attrs;
221da177e4SLinus Torvalds int (*match)(struct attribute_container *, struct device *);
231da177e4SLinus Torvalds #define ATTRIBUTE_CONTAINER_NO_CLASSDEVS 0x01
241da177e4SLinus Torvalds unsigned long flags;
251da177e4SLinus Torvalds };
261da177e4SLinus Torvalds
271da177e4SLinus Torvalds static inline int
attribute_container_no_classdevs(struct attribute_container * atc)281da177e4SLinus Torvalds attribute_container_no_classdevs(struct attribute_container *atc)
291da177e4SLinus Torvalds {
301da177e4SLinus Torvalds return atc->flags & ATTRIBUTE_CONTAINER_NO_CLASSDEVS;
311da177e4SLinus Torvalds }
321da177e4SLinus Torvalds
331da177e4SLinus Torvalds static inline void
attribute_container_set_no_classdevs(struct attribute_container * atc)341da177e4SLinus Torvalds attribute_container_set_no_classdevs(struct attribute_container *atc)
351da177e4SLinus Torvalds {
361da177e4SLinus Torvalds atc->flags |= ATTRIBUTE_CONTAINER_NO_CLASSDEVS;
371da177e4SLinus Torvalds }
381da177e4SLinus Torvalds
391da177e4SLinus Torvalds int attribute_container_register(struct attribute_container *cont);
402f3edc69SJames Bottomley int __must_check attribute_container_unregister(struct attribute_container *cont);
411da177e4SLinus Torvalds void attribute_container_create_device(struct device *dev,
421da177e4SLinus Torvalds int (*fn)(struct attribute_container *,
431da177e4SLinus Torvalds struct device *,
44ee959b00STony Jones struct device *));
451da177e4SLinus Torvalds void attribute_container_add_device(struct device *dev,
461da177e4SLinus Torvalds int (*fn)(struct attribute_container *,
471da177e4SLinus Torvalds struct device *,
48ee959b00STony Jones struct device *));
491da177e4SLinus Torvalds void attribute_container_remove_device(struct device *dev,
501da177e4SLinus Torvalds void (*fn)(struct attribute_container *,
511da177e4SLinus Torvalds struct device *,
52ee959b00STony Jones struct device *));
531da177e4SLinus Torvalds void attribute_container_device_trigger(struct device *dev,
541da177e4SLinus Torvalds int (*fn)(struct attribute_container *,
551da177e4SLinus Torvalds struct device *,
56ee959b00STony Jones struct device *));
57*7c1ef338SGabriel Krisman Bertazi int attribute_container_device_trigger_safe(struct device *dev,
58*7c1ef338SGabriel Krisman Bertazi int (*fn)(struct attribute_container *,
59*7c1ef338SGabriel Krisman Bertazi struct device *,
60*7c1ef338SGabriel Krisman Bertazi struct device *),
61*7c1ef338SGabriel Krisman Bertazi int (*undo)(struct attribute_container *,
62*7c1ef338SGabriel Krisman Bertazi struct device *,
63*7c1ef338SGabriel Krisman Bertazi struct device *));
64ee959b00STony Jones int attribute_container_add_attrs(struct device *classdev);
65ee959b00STony Jones int attribute_container_add_class_device(struct device *classdev);
66ee959b00STony Jones void attribute_container_remove_attrs(struct device *classdev);
67ee959b00STony Jones void attribute_container_class_device_del(struct device *classdev);
68ee959b00STony Jones struct attribute_container *attribute_container_classdev_to_container(struct device *);
69ee959b00STony Jones struct device *attribute_container_find_class_device(struct attribute_container *, struct device *);
70ee959b00STony Jones struct device_attribute **attribute_container_classdev_to_attrs(const struct device *classdev);
711da177e4SLinus Torvalds
721da177e4SLinus Torvalds #endif
73