| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * attribute_container.h - a generic container for all classes |
| * |
| * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com> |
| */ |
| |
| #ifndef _ATTRIBUTE_CONTAINER_H_ |
| #define _ATTRIBUTE_CONTAINER_H_ |
| |
| #include <linux/list.h> |
| #include <linux/klist.h> |
| |
| struct device; |
| |
| struct attribute_container { |
| struct list_head node; |
| struct klist containers; |
| struct class *class; |
| const struct attribute_group *grp; |
| struct device_attribute **attrs; |
| int (*match)(struct attribute_container *, struct device *); |
| #define ATTRIBUTE_CONTAINER_NO_CLASSDEVS 0x01 |
| unsigned long flags; |
| }; |
| |
| static inline int |
| attribute_container_no_classdevs(struct attribute_container *atc) |
| { |
| return atc->flags & ATTRIBUTE_CONTAINER_NO_CLASSDEVS; |
| } |
| |
| static inline void |
| attribute_container_set_no_classdevs(struct attribute_container *atc) |
| { |
| atc->flags |= ATTRIBUTE_CONTAINER_NO_CLASSDEVS; |
| } |
| |
| int attribute_container_register(struct attribute_container *cont); |
| int __must_check attribute_container_unregister(struct attribute_container *cont); |
| void attribute_container_create_device(struct device *dev, |
| int (*fn)(struct attribute_container *, |
| struct device *, |
| struct device *)); |
| void attribute_container_add_device(struct device *dev, |
| int (*fn)(struct attribute_container *, |
| struct device *, |
| struct device *)); |
| void attribute_container_remove_device(struct device *dev, |
| void (*fn)(struct attribute_container *, |
| struct device *, |
| struct device *)); |
| void attribute_container_device_trigger(struct device *dev, |
| int (*fn)(struct attribute_container *, |
| struct device *, |
| struct device *)); |
| int attribute_container_device_trigger_safe(struct device *dev, |
| int (*fn)(struct attribute_container *, |
| struct device *, |
| struct device *), |
| int (*undo)(struct attribute_container *, |
| struct device *, |
| struct device *)); |
| void attribute_container_trigger(struct device *dev, |
| int (*fn)(struct attribute_container *, |
| struct device *)); |
| int attribute_container_add_attrs(struct device *classdev); |
| int attribute_container_add_class_device(struct device *classdev); |
| int attribute_container_add_class_device_adapter(struct attribute_container *cont, |
| struct device *dev, |
| struct device *classdev); |
| void attribute_container_remove_attrs(struct device *classdev); |
| void attribute_container_class_device_del(struct device *classdev); |
| struct attribute_container *attribute_container_classdev_to_container(struct device *); |
| struct device *attribute_container_find_class_device(struct attribute_container *, struct device *); |
| struct device_attribute **attribute_container_classdev_to_attrs(const struct device *classdev); |
| |
| #endif |