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