xref: /linux-6.15/include/linux/property.h (revision efe4a1ac)
1 /*
2  * property.h - Unified device property interface.
3  *
4  * Copyright (C) 2014, Intel Corporation
5  * Authors: Rafael J. Wysocki <[email protected]>
6  *          Mika Westerberg <[email protected]>
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 struct fwnode_handle *dev_fwnode(struct device *dev);
37 
38 bool device_property_present(struct device *dev, const char *propname);
39 int device_property_read_u8_array(struct device *dev, const char *propname,
40 				  u8 *val, size_t nval);
41 int device_property_read_u16_array(struct device *dev, const char *propname,
42 				   u16 *val, size_t nval);
43 int device_property_read_u32_array(struct device *dev, const char *propname,
44 				   u32 *val, size_t nval);
45 int device_property_read_u64_array(struct device *dev, const char *propname,
46 				   u64 *val, size_t nval);
47 int device_property_read_string_array(struct device *dev, const char *propname,
48 				      const char **val, size_t nval);
49 int device_property_read_string(struct device *dev, const char *propname,
50 				const char **val);
51 int device_property_match_string(struct device *dev,
52 				 const char *propname, const char *string);
53 
54 bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname);
55 int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
56 				  const char *propname, u8 *val,
57 				  size_t nval);
58 int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
59 				   const char *propname, u16 *val,
60 				   size_t nval);
61 int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
62 				   const char *propname, u32 *val,
63 				   size_t nval);
64 int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
65 				   const char *propname, u64 *val,
66 				   size_t nval);
67 int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
68 				      const char *propname, const char **val,
69 				      size_t nval);
70 int fwnode_property_read_string(struct fwnode_handle *fwnode,
71 				const char *propname, const char **val);
72 int fwnode_property_match_string(struct fwnode_handle *fwnode,
73 				 const char *propname, const char *string);
74 
75 struct fwnode_handle *fwnode_get_parent(struct fwnode_handle *fwnode);
76 struct fwnode_handle *fwnode_get_next_parent(struct fwnode_handle *fwnode);
77 struct fwnode_handle *fwnode_get_next_child_node(struct fwnode_handle *fwnode,
78 						 struct fwnode_handle *child);
79 
80 #define fwnode_for_each_child_node(fwnode, child)			\
81 	for (child = fwnode_get_next_child_node(fwnode, NULL); child;	\
82 	     child = fwnode_get_next_child_node(fwnode, child))
83 
84 struct fwnode_handle *device_get_next_child_node(struct device *dev,
85 						 struct fwnode_handle *child);
86 
87 #define device_for_each_child_node(dev, child)				\
88 	for (child = device_get_next_child_node(dev, NULL); child;	\
89 	     child = device_get_next_child_node(dev, child))
90 
91 struct fwnode_handle *fwnode_get_named_child_node(struct fwnode_handle *fwnode,
92 						  const char *childname);
93 struct fwnode_handle *device_get_named_child_node(struct device *dev,
94 						  const char *childname);
95 
96 void fwnode_handle_get(struct fwnode_handle *fwnode);
97 void fwnode_handle_put(struct fwnode_handle *fwnode);
98 
99 unsigned int device_get_child_node_count(struct device *dev);
100 
101 static inline bool device_property_read_bool(struct device *dev,
102 					     const char *propname)
103 {
104 	return device_property_present(dev, propname);
105 }
106 
107 static inline int device_property_read_u8(struct device *dev,
108 					  const char *propname, u8 *val)
109 {
110 	return device_property_read_u8_array(dev, propname, val, 1);
111 }
112 
113 static inline int device_property_read_u16(struct device *dev,
114 					   const char *propname, u16 *val)
115 {
116 	return device_property_read_u16_array(dev, propname, val, 1);
117 }
118 
119 static inline int device_property_read_u32(struct device *dev,
120 					   const char *propname, u32 *val)
121 {
122 	return device_property_read_u32_array(dev, propname, val, 1);
123 }
124 
125 static inline int device_property_read_u64(struct device *dev,
126 					   const char *propname, u64 *val)
127 {
128 	return device_property_read_u64_array(dev, propname, val, 1);
129 }
130 
131 static inline bool fwnode_property_read_bool(struct fwnode_handle *fwnode,
132 					     const char *propname)
133 {
134 	return fwnode_property_present(fwnode, propname);
135 }
136 
137 static inline int fwnode_property_read_u8(struct fwnode_handle *fwnode,
138 					  const char *propname, u8 *val)
139 {
140 	return fwnode_property_read_u8_array(fwnode, propname, val, 1);
141 }
142 
143 static inline int fwnode_property_read_u16(struct fwnode_handle *fwnode,
144 					   const char *propname, u16 *val)
145 {
146 	return fwnode_property_read_u16_array(fwnode, propname, val, 1);
147 }
148 
149 static inline int fwnode_property_read_u32(struct fwnode_handle *fwnode,
150 					   const char *propname, u32 *val)
151 {
152 	return fwnode_property_read_u32_array(fwnode, propname, val, 1);
153 }
154 
155 static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
156 					   const char *propname, u64 *val)
157 {
158 	return fwnode_property_read_u64_array(fwnode, propname, val, 1);
159 }
160 
161 /**
162  * struct property_entry - "Built-in" device property representation.
163  * @name: Name of the property.
164  * @length: Length of data making up the value.
165  * @is_array: True when the property is an array.
166  * @is_string: True when property is a string.
167  * @pointer: Pointer to the property (an array of items of the given type).
168  * @value: Value of the property (when it is a single item of the given type).
169  */
170 struct property_entry {
171 	const char *name;
172 	size_t length;
173 	bool is_array;
174 	bool is_string;
175 	union {
176 		union {
177 			const void *raw_data;
178 			const u8 *u8_data;
179 			const u16 *u16_data;
180 			const u32 *u32_data;
181 			const u64 *u64_data;
182 			const char * const *str;
183 		} pointer;
184 		union {
185 			unsigned long long raw_data;
186 			u8 u8_data;
187 			u16 u16_data;
188 			u32 u32_data;
189 			u64 u64_data;
190 			const char *str;
191 		} value;
192 	};
193 };
194 
195 /*
196  * Note: the below four initializers for the anonymous union are carefully
197  * crafted to avoid gcc-4.4.4's problems with initialization of anon unions
198  * and structs.
199  */
200 
201 #define PROPERTY_ENTRY_INTEGER_ARRAY(_name_, _type_, _val_)	\
202 {								\
203 	.name = _name_,						\
204 	.length = ARRAY_SIZE(_val_) * sizeof(_type_),		\
205 	.is_array = true,					\
206 	.is_string = false,					\
207 	{ .pointer = { ._type_##_data = _val_ } },		\
208 }
209 
210 #define PROPERTY_ENTRY_U8_ARRAY(_name_, _val_)			\
211 	PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u8, _val_)
212 #define PROPERTY_ENTRY_U16_ARRAY(_name_, _val_)			\
213 	PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u16, _val_)
214 #define PROPERTY_ENTRY_U32_ARRAY(_name_, _val_)			\
215 	PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u32, _val_)
216 #define PROPERTY_ENTRY_U64_ARRAY(_name_, _val_)			\
217 	PROPERTY_ENTRY_INTEGER_ARRAY(_name_, u64, _val_)
218 
219 #define PROPERTY_ENTRY_STRING_ARRAY(_name_, _val_)		\
220 {								\
221 	.name = _name_,						\
222 	.length = ARRAY_SIZE(_val_) * sizeof(const char *),	\
223 	.is_array = true,					\
224 	.is_string = true,					\
225 	{ .pointer = { .str = _val_ } },			\
226 }
227 
228 #define PROPERTY_ENTRY_INTEGER(_name_, _type_, _val_)	\
229 {							\
230 	.name = _name_,					\
231 	.length = sizeof(_type_),			\
232 	.is_string = false,				\
233 	{ .value = { ._type_##_data = _val_ } },	\
234 }
235 
236 #define PROPERTY_ENTRY_U8(_name_, _val_)		\
237 	PROPERTY_ENTRY_INTEGER(_name_, u8, _val_)
238 #define PROPERTY_ENTRY_U16(_name_, _val_)		\
239 	PROPERTY_ENTRY_INTEGER(_name_, u16, _val_)
240 #define PROPERTY_ENTRY_U32(_name_, _val_)		\
241 	PROPERTY_ENTRY_INTEGER(_name_, u32, _val_)
242 #define PROPERTY_ENTRY_U64(_name_, _val_)		\
243 	PROPERTY_ENTRY_INTEGER(_name_, u64, _val_)
244 
245 #define PROPERTY_ENTRY_STRING(_name_, _val_)		\
246 {							\
247 	.name = _name_,					\
248 	.length = sizeof(_val_),			\
249 	.is_string = true,				\
250 	{ .value = { .str = _val_ } },			\
251 }
252 
253 #define PROPERTY_ENTRY_BOOL(_name_)		\
254 {						\
255 	.name = _name_,				\
256 }
257 
258 struct property_entry *
259 property_entries_dup(const struct property_entry *properties);
260 
261 void property_entries_free(const struct property_entry *properties);
262 
263 int device_add_properties(struct device *dev,
264 			  const struct property_entry *properties);
265 void device_remove_properties(struct device *dev);
266 
267 bool device_dma_supported(struct device *dev);
268 
269 enum dev_dma_attr device_get_dma_attr(struct device *dev);
270 
271 int device_get_phy_mode(struct device *dev);
272 
273 void *device_get_mac_address(struct device *dev, char *addr, int alen);
274 
275 struct fwnode_handle *fwnode_graph_get_next_endpoint(
276 	struct fwnode_handle *fwnode, struct fwnode_handle *prev);
277 struct fwnode_handle *fwnode_graph_get_remote_port_parent(
278 	struct fwnode_handle *fwnode);
279 struct fwnode_handle *fwnode_graph_get_remote_port(
280 	struct fwnode_handle *fwnode);
281 struct fwnode_handle *fwnode_graph_get_remote_endpoint(
282 	struct fwnode_handle *fwnode);
283 
284 int fwnode_graph_parse_endpoint(struct fwnode_handle *fwnode,
285 				struct fwnode_endpoint *endpoint);
286 
287 #endif /* _LINUX_PROPERTY_H_ */
288