11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
2ee959b00c335d7780136c5abda37809191fe52c3Tony Jones * attribute_container.h - a generic container for all classes
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This file is licensed under GPLv2
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _ATTRIBUTE_CONTAINER_H_
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _ATTRIBUTE_CONTAINER_H_
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/list.h>
1353c165e0a6c8a4ff7df316557528fa7a52d20711James Bottomley#include <linux/klist.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15313162d0b83836e2f57e51b9b8650fb4b9c396eaPaul Gortmakerstruct device;
16313162d0b83836e2f57e51b9b8650fb4b9c396eaPaul Gortmaker
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct attribute_container {
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct list_head	node;
1953c165e0a6c8a4ff7df316557528fa7a52d20711James Bottomley	struct klist		containers;
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct class		*class;
21a4dbd6740df0872cdf0a86841f75beec8381964dDavid Brownell	const struct attribute_group *grp;
22ee959b00c335d7780136c5abda37809191fe52c3Tony Jones	struct device_attribute **attrs;
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int (*match)(struct attribute_container *, struct device *);
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	ATTRIBUTE_CONTAINER_NO_CLASSDEVS	0x01
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long		flags;
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsattribute_container_no_classdevs(struct attribute_container *atc)
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return atc->flags & ATTRIBUTE_CONTAINER_NO_CLASSDEVS;
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsattribute_container_set_no_classdevs(struct attribute_container *atc)
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atc->flags |= ATTRIBUTE_CONTAINER_NO_CLASSDEVS;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint attribute_container_register(struct attribute_container *cont);
412f3edc6936e3f6be3f1df1e89c141ae028fa605eJames Bottomleyint __must_check attribute_container_unregister(struct attribute_container *cont);
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid attribute_container_create_device(struct device *dev,
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				       int (*fn)(struct attribute_container *,
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						 struct device *,
45ee959b00c335d7780136c5abda37809191fe52c3Tony Jones						 struct device *));
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid attribute_container_add_device(struct device *dev,
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				    int (*fn)(struct attribute_container *,
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					      struct device *,
49ee959b00c335d7780136c5abda37809191fe52c3Tony Jones					      struct device *));
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid attribute_container_remove_device(struct device *dev,
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				       void (*fn)(struct attribute_container *,
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						  struct device *,
53ee959b00c335d7780136c5abda37809191fe52c3Tony Jones						  struct device *));
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid attribute_container_device_trigger(struct device *dev,
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					int (*fn)(struct attribute_container *,
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						  struct device *,
57ee959b00c335d7780136c5abda37809191fe52c3Tony Jones						  struct device *));
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid attribute_container_trigger(struct device *dev,
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				 int (*fn)(struct attribute_container *,
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					   struct device *));
61ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesint attribute_container_add_attrs(struct device *classdev);
62ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesint attribute_container_add_class_device(struct device *classdev);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint attribute_container_add_class_device_adapter(struct attribute_container *cont,
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						 struct device *dev,
65ee959b00c335d7780136c5abda37809191fe52c3Tony Jones						 struct device *classdev);
66ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesvoid attribute_container_remove_attrs(struct device *classdev);
67ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesvoid attribute_container_class_device_del(struct device *classdev);
68ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesstruct attribute_container *attribute_container_classdev_to_container(struct device *);
69ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesstruct device *attribute_container_find_class_device(struct attribute_container *, struct device *);
70ee959b00c335d7780136c5abda37809191fe52c3Tony Jonesstruct device_attribute **attribute_container_classdev_to_attrs(const struct device *classdev);
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
73