Pull xpc-disengage into release branch
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / linux / raid_class.h
1 /*
2 */
3 #include <linux/transport_class.h>
4
5 struct raid_template {
6 struct transport_container raid_attrs;
7 };
8
9 struct raid_function_template {
10 void *cookie;
11 int (*is_raid)(struct device *);
12 void (*get_resync)(struct device *);
13 void (*get_state)(struct device *);
14 };
15
16 enum raid_state {
17 RAID_ACTIVE = 1,
18 RAID_DEGRADED,
19 RAID_RESYNCING,
20 RAID_OFFLINE,
21 };
22
23 struct raid_data {
24 struct list_head component_list;
25 int component_count;
26 int level;
27 enum raid_state state;
28 int resync;
29 };
30
31 #define DEFINE_RAID_ATTRIBUTE(type, attr) \
32 static inline void \
33 raid_set_##attr(struct raid_template *r, struct device *dev, type value) { \
34 struct class_device *cdev = \
35 attribute_container_find_class_device(&r->raid_attrs.ac, dev);\
36 struct raid_data *rd; \
37 BUG_ON(!cdev); \
38 rd = class_get_devdata(cdev); \
39 rd->attr = value; \
40 } \
41 static inline type \
42 raid_get_##attr(struct raid_template *r, struct device *dev) { \
43 struct class_device *cdev = \
44 attribute_container_find_class_device(&r->raid_attrs.ac, dev);\
45 struct raid_data *rd; \
46 BUG_ON(!cdev); \
47 rd = class_get_devdata(cdev); \
48 return rd->attr; \
49 }
50
51 DEFINE_RAID_ATTRIBUTE(int, level)
52 DEFINE_RAID_ATTRIBUTE(int, resync)
53 DEFINE_RAID_ATTRIBUTE(enum raid_state, state)
54
55 struct raid_template *raid_class_attach(struct raid_function_template *);
56 void raid_class_release(struct raid_template *);
57
58 void raid_component_add(struct raid_template *, struct device *,
59 struct device *);