1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * attribute_container.h - a generic container for all classes 4 * 5 * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com> 6 */ 7 8 #ifndef _ATTRIBUTE_CONTAINER_H_ 9 #define _ATTRIBUTE_CONTAINER_H_ 10 11 #include <linux/list.h> 12 #include <linux/klist.h> 13 14 struct device; 15 16 struct attribute_container { 17 struct list_head node; 18 struct klist containers; 19 struct class *class; 20 const struct attribute_group *grp; 21 struct device_attribute **attrs; 22 int (*match)(struct attribute_container *, struct device *); 23 #define ATTRIBUTE_CONTAINER_NO_CLASSDEVS 0x01 24 unsigned long flags; 25 }; 26 27 static inline int 28 attribute_container_no_classdevs(struct attribute_container *atc) 29 { 30 return atc->flags & ATTRIBUTE_CONTAINER_NO_CLASSDEVS; 31 } 32 33 static inline void 34 attribute_container_set_no_classdevs(struct attribute_container *atc) 35 { 36 atc->flags |= ATTRIBUTE_CONTAINER_NO_CLASSDEVS; 37 } 38 39 int attribute_container_register(struct attribute_container *cont); 40 int __must_check attribute_container_unregister(struct attribute_container *cont); 41 void attribute_container_create_device(struct device *dev, 42 int (*fn)(struct attribute_container *, 43 struct device *, 44 struct device *)); 45 void attribute_container_add_device(struct device *dev, 46 int (*fn)(struct attribute_container *, 47 struct device *, 48 struct device *)); 49 void attribute_container_remove_device(struct device *dev, 50 void (*fn)(struct attribute_container *, 51 struct device *, 52 struct device *)); 53 void attribute_container_device_trigger(struct device *dev, 54 int (*fn)(struct attribute_container *, 55 struct device *, 56 struct device *)); 57 int attribute_container_device_trigger_safe(struct device *dev, 58 int (*fn)(struct attribute_container *, 59 struct device *, 60 struct device *), 61 int (*undo)(struct attribute_container *, 62 struct device *, 63 struct device *)); 64 void attribute_container_trigger(struct device *dev, 65 int (*fn)(struct attribute_container *, 66 struct device *)); 67 int attribute_container_add_attrs(struct device *classdev); 68 int attribute_container_add_class_device(struct device *classdev); 69 int attribute_container_add_class_device_adapter(struct attribute_container *cont, 70 struct device *dev, 71 struct device *classdev); 72 void attribute_container_remove_attrs(struct device *classdev); 73 void attribute_container_class_device_del(struct device *classdev); 74 struct attribute_container *attribute_container_classdev_to_container(struct device *); 75 struct device *attribute_container_find_class_device(struct attribute_container *, struct device *); 76 struct device_attribute **attribute_container_classdev_to_attrs(const struct device *classdev); 77 78 #endif 79