Blame view

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