Merge branch 'stable-4.10' of git://git.infradead.org/users/pcmoore/audit
[sfrench/cifs-2.6.git] / include / linux / property.h
1 /*
2  * property.h - Unified device property interface.
3  *
4  * Copyright (C) 2014, Intel Corporation
5  * Authors: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
6  *          Mika Westerberg <mika.westerberg@linux.intel.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12
13 #ifndef _LINUX_PROPERTY_H_
14 #define _LINUX_PROPERTY_H_
15
16 #include <linux/fwnode.h>
17 #include <linux/types.h>
18
19 struct device;
20
21 enum dev_prop_type {
22         DEV_PROP_U8,
23         DEV_PROP_U16,
24         DEV_PROP_U32,
25         DEV_PROP_U64,
26         DEV_PROP_STRING,
27         DEV_PROP_MAX,
28 };
29
30 enum dev_dma_attr {
31         DEV_DMA_NOT_SUPPORTED,
32         DEV_DMA_NON_COHERENT,
33         DEV_DMA_COHERENT,
34 };
35
36 bool device_property_present(struct device *dev, const char *propname);
37 int device_property_read_u8_array(struct device *dev, const char *propname,
38                                   u8 *val, size_t nval);
39 int device_property_read_u16_array(struct device *dev, const char *propname,
40                                    u16 *val, size_t nval);
41 int device_property_read_u32_array(struct device *dev, const char *propname,
42                                    u32 *val, size_t nval);
43 int device_property_read_u64_array(struct device *dev, const char *propname,
44                                    u64 *val, size_t nval);
45 int device_property_read_string_array(struct device *dev, const char *propname,
46                                       const char **val, size_t nval);
47 int device_property_read_string(struct device *dev, const char *propname,
48                                 const char **val);
49 int device_property_match_string(struct device *dev,
50                                  const char *propname, const char *string);
51
52 bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname);
53 int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
54                                   const char *propname, u8 *val,
55                                   size_t nval);
56 int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
57                                    const char *propname, u16 *val,
58                                    size_t nval);
59 int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
60                                    const char *propname, u32 *val,
61                                    size_t nval);
62 int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
63                                    const char *propname, u64 *val,
64                                    size_t nval);
65 int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
66                                       const char *propname, const char **val,
67                                       size_t nval);
68 int fwnode_property_read_string(struct fwnode_handle *fwnode,
69                                 const char *propname, const char **val);
70 int fwnode_property_match_string(struct fwnode_handle *fwnode,
71                                  const char *propname, const char *string);
72
73 struct fwnode_handle *device_get_next_child_node(struct device *dev,
74                                                  struct fwnode_handle *child);
75
76 #define device_for_each_child_node(dev, child)                          \
77         for (child = device_get_next_child_node(dev, NULL); child;      \
78              child = device_get_next_child_node(dev, child))
79
80 struct fwnode_handle *device_get_named_child_node(struct device *dev,
81                                                   const char *childname);
82
83 void fwnode_handle_put(struct fwnode_handle *fwnode);
84
85 unsigned int device_get_child_node_count(struct device *dev);
86
87 static inline bool device_property_read_bool(struct device *dev,
88                                              const char *propname)
89 {
90         return device_property_present(dev, propname);
91 }
92
93 static inline int device_property_read_u8(struct device *dev,
94                                           const char *propname, u8 *val)
95 {
96         return device_property_read_u8_array(dev, propname, val, 1);
97 }
98
99 static inline int device_property_read_u16(struct device *dev,
100                                            const char *propname, u16 *val)
101 {
102         return device_property_read_u16_array(dev, propname, val, 1);
103 }
104
105 static inline int device_property_read_u32(struct device *dev,
106                                            const char *propname, u32 *val)
107 {
108         return device_property_read_u32_array(dev, propname, val, 1);
109 }
110
111 static inline int device_property_read_u64(struct device *dev,
112                                            const char *propname, u64 *val)
113 {
114         return device_property_read_u64_array(dev, propname, val, 1);
115 }
116
117 static inline bool fwnode_property_read_bool(struct fwnode_handle *fwnode,
118                                              const char *propname)
119 {
120         return fwnode_property_present(fwnode, propname);
121 }
122
123 static inline int fwnode_property_read_u8(struct fwnode_handle *fwnode,
124                                           const char *propname, u8 *val)
125 {
126         return fwnode_property_read_u8_array(fwnode, propname, val, 1);
127 }
128
129 static inline int fwnode_property_read_u16(struct fwnode_handle *fwnode,
130                                            const char *propname, u16 *val)
131 {
132         return fwnode_property_read_u16_array(fwnode, propname, val, 1);
133 }
134
135 static inline int fwnode_property_read_u32(struct fwnode_handle *fwnode,
136                                            const char *propname, u32 *val)
137 {
138         return fwnode_property_read_u32_array(fwnode, propname, val, 1);
139 }
140
141 static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
142                                            const char *propname, u64 *val)
143 {
144         return fwnode_property_read_u64_array(fwnode, propname, val, 1);
145 }
146
147 /**
148  * struct property_entry - "Built-in" device property representation.
149  * @name: Name of the property.
150  * @length: Length of data making up the value.
151  * @is_array: True when the property is an array.
152  * @is_string: True when property is a string.
153  * @pointer: Pointer to the property (an array of items of the given type).
154  * @value: Value of the property (when it is a single item of the given type).
155  */
156 struct property_entry {
157         const char *name;
158         size_t length;
159         bool is_array;
160         bool is_string;
161         union {
162                 union {
163                         void *raw_data;
164                         u8 *u8_data;
165                         u16 *u16_data;
166                         u32 *u32_data;
167                         u64 *u64_data;
168                         const char **str;
169                 } pointer;
170                 union {
171                         unsigned long long raw_data;
172                         u8 u8_data;
173                         u16 u16_data;
174                         u32 u32_data;
175                         u64 u64_data;
176                         const char *str;
177                 } value;
178         };
179 };
180
181 /*
182  * Note: the below four initializers for the anonymous union are carefully
183  * crafted to avoid gcc-4.4.4's problems with initialization of anon unions
184  * and structs.
185  */
186
187 #define PROPERTY_ENTRY_INTEGER_ARRAY(_name_, _type_, _val_)     \
188 {                                                               \
189         .name = _name_,                                         \
190         .length = ARRAY_SIZE(_val_) * sizeof(_type_),           \
191         .is_array = true,                                       \
192         .is_string = false,                                     \
193         { .pointer = { ._type_##_data = _val_ } },              \
194 }
195
196 #define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)                  \
197         PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u8, _val_)
198 #define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_)                 \
199         PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u16, _val_)
200 #define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_)                 \
201         PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u32, _val_)
202 #define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_)                 \
203         PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u64, _val_)
204
205 #define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_)              \
206 {                                                               \
207         .name = _name_,                                         \
208         .length = ARRAY_SIZE(_val_) * sizeof(const char *),     \
209         .is_array = true,                                       \
210         .is_string = true,                                      \
211         { .pointer = { .str = _val_ } },                        \
212 }
213
214 #define PROPERTY_ENTRY_INTEGER(_name_, _type_, _val_)   \
215 {                                                       \
216         .name = _name_,                                 \
217         .length = sizeof(_type_),                       \
218         .is_string = false,                             \
219         { .value = { ._type_##_data = _val_ } },        \
220 }
221
222 #define PROPERTY_ENTRY_U8(_name_, _val_)                \
223         PROPERTY_ENTRY_INTEGER(_name_, u8, _val_)
224 #define PROPERTY_ENTRY_U16(_name_, _val_)               \
225         PROPERTY_ENTRY_INTEGER(_name_, u16, _val_)
226 #define PROPERTY_ENTRY_U32(_name_, _val_)               \
227         PROPERTY_ENTRY_INTEGER(_name_, u32, _val_)
228 #define PROPERTY_ENTRY_U64(_name_, _val_)               \
229         PROPERTY_ENTRY_INTEGER(_name_, u64, _val_)
230
231 #define PROPERTY_ENTRY_STRING(_name_, _val_)            \
232 {                                                       \
233         .name = _name_,                                 \
234         .length = sizeof(_val_),                        \
235         .is_string = true,                              \
236         { .value = { .str = _val_ } },                  \
237 }
238
239 #define PROPERTY_ENTRY_BOOL(_name_)             \
240 {                                               \
241         .name = _name_,                         \
242 }
243
244 int device_add_properties(struct device *dev,
245                           struct property_entry *properties);
246 void device_remove_properties(struct device *dev);
247
248 bool device_dma_supported(struct device *dev);
249
250 enum dev_dma_attr device_get_dma_attr(struct device *dev);
251
252 int device_get_phy_mode(struct device *dev);
253
254 void *device_get_mac_address(struct device *dev, char *addr, int alen);
255
256 #endif /* _LINUX_PROPERTY_H_ */