1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * transport_class.h - a generic container for all transport classes
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This file is licensed under GPLv2
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _TRANSPORT_CLASS_H_
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _TRANSPORT_CLASS_H_
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/device.h>
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/attribute_container.h>
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct transport_container;
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct transport_class {
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct class class;
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*setup)(struct transport_container *, struct device *,
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		     struct class_device *);
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*configure)(struct transport_container *, struct device *,
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			 struct class_device *);
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*remove)(struct transport_container *, struct device *,
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		      struct class_device *);
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DECLARE_TRANSPORT_CLASS(cls, nm, su, rm, cfg)			\
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct transport_class cls = {						\
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.class = {							\
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.name = nm,						\
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	},								\
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.setup = su,							\
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.remove = rm,							\
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.configure = cfg,						\
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct anon_transport_class {
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct transport_class tclass;
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct attribute_container container;
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define DECLARE_ANON_TRANSPORT_CLASS(cls, mtch, cfg)		\
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct anon_transport_class cls = {				\
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.tclass = {						\
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.configure = cfg,				\
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	},							\
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	. container = {						\
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru		.match = mtch,					\
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	},							\
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define class_to_transport_class(x) \
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	container_of(x, struct transport_class, class)
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct transport_container {
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct attribute_container ac;
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	struct attribute_group *statistics;
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define attribute_container_to_transport_container(x) \
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	container_of(x, struct transport_container, ac)
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid transport_remove_device(struct device *);
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid transport_add_device(struct device *);
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid transport_setup_device(struct device *);
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid transport_configure_device(struct device *);
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid transport_destroy_device(struct device *);
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutransport_register_device(struct device *dev)
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	transport_setup_device(dev);
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	transport_add_device(dev);
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querutransport_unregister_device(struct device *dev)
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	transport_remove_device(dev);
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	transport_destroy_device(dev);
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int transport_container_register(struct transport_container *tc)
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return attribute_container_register(&tc->ac);
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline int transport_container_unregister(struct transport_container *tc)
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	return attribute_container_unregister(&tc->ac);
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru}
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint transport_class_register(struct transport_class *);
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruint anon_transport_class_register(struct anon_transport_class *);
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid transport_class_unregister(struct transport_class *);
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruvoid anon_transport_class_unregister(struct anon_transport_class *);
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
101