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