• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Device tree integration for the pin control subsystem
3  *
4  * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include <linux/device.h>
20 #include <linux/of.h>
21 #include <linux/pinctrl/pinctrl.h>
22 #include <linux/slab.h>
23 
24 #include "core.h"
25 #include "devicetree.h"
26 
27 /**
28  * struct pinctrl_dt_map - mapping table chunk parsed from device tree
29  * @node: list node for struct pinctrl's @dt_maps field
30  * @pctldev: the pin controller that allocated this struct, and will free it
31  * @maps: the mapping table entries
32  */
33 struct pinctrl_dt_map {
34 	struct list_head node;
35 	struct pinctrl_dev *pctldev;
36 	struct pinctrl_map *map;
37 	unsigned num_maps;
38 };
39 
dt_free_map(struct pinctrl_dev * pctldev,struct pinctrl_map * map,unsigned num_maps)40 static void dt_free_map(struct pinctrl_dev *pctldev,
41 		     struct pinctrl_map *map, unsigned num_maps)
42 {
43 	int i;
44 
45 	for (i = 0; i < num_maps; ++i) {
46 		kfree_const(map[i].dev_name);
47 		map[i].dev_name = NULL;
48 	}
49 
50 	if (pctldev) {
51 		const struct pinctrl_ops *ops = pctldev->desc->pctlops;
52 		if (ops->dt_free_map)
53 			ops->dt_free_map(pctldev, map, num_maps);
54 	} else {
55 		/* There is no pctldev for PIN_MAP_TYPE_DUMMY_STATE */
56 		kfree(map);
57 	}
58 }
59 
pinctrl_dt_free_maps(struct pinctrl * p)60 void pinctrl_dt_free_maps(struct pinctrl *p)
61 {
62 	struct pinctrl_dt_map *dt_map, *n1;
63 
64 	list_for_each_entry_safe(dt_map, n1, &p->dt_maps, node) {
65 		pinctrl_unregister_map(dt_map->map);
66 		list_del(&dt_map->node);
67 		dt_free_map(dt_map->pctldev, dt_map->map,
68 			    dt_map->num_maps);
69 		kfree(dt_map);
70 	}
71 
72 	of_node_put(p->dev->of_node);
73 }
74 
dt_remember_or_free_map(struct pinctrl * p,const char * statename,struct pinctrl_dev * pctldev,struct pinctrl_map * map,unsigned num_maps)75 static int dt_remember_or_free_map(struct pinctrl *p, const char *statename,
76 				   struct pinctrl_dev *pctldev,
77 				   struct pinctrl_map *map, unsigned num_maps)
78 {
79 	int i;
80 	struct pinctrl_dt_map *dt_map;
81 
82 	/* Initialize common mapping table entry fields */
83 	for (i = 0; i < num_maps; i++) {
84 		const char *devname;
85 
86 		devname = kstrdup_const(dev_name(p->dev), GFP_KERNEL);
87 		if (!devname)
88 			goto err_free_map;
89 
90 		map[i].dev_name = devname;
91 		map[i].name = statename;
92 		if (pctldev)
93 			map[i].ctrl_dev_name = dev_name(pctldev->dev);
94 	}
95 
96 	/* Remember the converted mapping table entries */
97 	dt_map = kzalloc(sizeof(*dt_map), GFP_KERNEL);
98 	if (!dt_map)
99 		goto err_free_map;
100 
101 	dt_map->pctldev = pctldev;
102 	dt_map->map = map;
103 	dt_map->num_maps = num_maps;
104 	list_add_tail(&dt_map->node, &p->dt_maps);
105 
106 	return pinctrl_register_map(map, num_maps, false);
107 
108 err_free_map:
109 	dt_free_map(pctldev, map, num_maps);
110 	return -ENOMEM;
111 }
112 
of_pinctrl_get(struct device_node * np)113 struct pinctrl_dev *of_pinctrl_get(struct device_node *np)
114 {
115 	return get_pinctrl_dev_from_of_node(np);
116 }
117 
dt_to_map_one_config(struct pinctrl * p,struct pinctrl_dev * hog_pctldev,const char * statename,struct device_node * np_config)118 static int dt_to_map_one_config(struct pinctrl *p,
119 				struct pinctrl_dev *hog_pctldev,
120 				const char *statename,
121 				struct device_node *np_config)
122 {
123 	struct pinctrl_dev *pctldev = NULL;
124 	struct device_node *np_pctldev;
125 	const struct pinctrl_ops *ops;
126 	int ret;
127 	struct pinctrl_map *map;
128 	unsigned num_maps;
129 	bool allow_default = false;
130 
131 	/* Find the pin controller containing np_config */
132 	np_pctldev = of_node_get(np_config);
133 	for (;;) {
134 		if (!allow_default)
135 			allow_default = of_property_read_bool(np_pctldev,
136 							      "pinctrl-use-default");
137 
138 		np_pctldev = of_get_next_parent(np_pctldev);
139 		if (!np_pctldev || of_node_is_root(np_pctldev)) {
140 			of_node_put(np_pctldev);
141 			ret = driver_deferred_probe_check_state(p->dev);
142 			/* keep deferring if modules are enabled unless we've timed out */
143 			if (IS_ENABLED(CONFIG_MODULES) && !allow_default && ret == -ENODEV)
144 				ret = -EPROBE_DEFER;
145 
146 			return ret;
147 		}
148 		/* If we're creating a hog we can use the passed pctldev */
149 		if (hog_pctldev && (np_pctldev == p->dev->of_node)) {
150 			pctldev = hog_pctldev;
151 			break;
152 		}
153 		pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
154 		if (pctldev)
155 			break;
156 		/* Do not defer probing of hogs (circular loop) */
157 		if (np_pctldev == p->dev->of_node) {
158 			of_node_put(np_pctldev);
159 			return -ENODEV;
160 		}
161 	}
162 	of_node_put(np_pctldev);
163 
164 	/*
165 	 * Call pinctrl driver to parse device tree node, and
166 	 * generate mapping table entries
167 	 */
168 	ops = pctldev->desc->pctlops;
169 	if (!ops->dt_node_to_map) {
170 		dev_err(p->dev, "pctldev %s doesn't support DT\n",
171 			dev_name(pctldev->dev));
172 		return -ENODEV;
173 	}
174 	ret = ops->dt_node_to_map(pctldev, np_config, &map, &num_maps);
175 	if (ret < 0)
176 		return ret;
177 
178 	/* Stash the mapping table chunk away for later use */
179 	return dt_remember_or_free_map(p, statename, pctldev, map, num_maps);
180 }
181 
dt_remember_dummy_state(struct pinctrl * p,const char * statename)182 static int dt_remember_dummy_state(struct pinctrl *p, const char *statename)
183 {
184 	struct pinctrl_map *map;
185 
186 	map = kzalloc(sizeof(*map), GFP_KERNEL);
187 	if (!map)
188 		return -ENOMEM;
189 
190 	/* There is no pctldev for PIN_MAP_TYPE_DUMMY_STATE */
191 	map->type = PIN_MAP_TYPE_DUMMY_STATE;
192 
193 	return dt_remember_or_free_map(p, statename, NULL, map, 1);
194 }
195 
pinctrl_dt_has_hogs(struct pinctrl_dev * pctldev)196 bool pinctrl_dt_has_hogs(struct pinctrl_dev *pctldev)
197 {
198 	struct device_node *np;
199 	struct property *prop;
200 	int size;
201 
202 	np = pctldev->dev->of_node;
203 	if (!np)
204 		return false;
205 
206 	prop = of_find_property(np, "pinctrl-0", &size);
207 
208 	return prop ? true : false;
209 }
210 
pinctrl_dt_to_map(struct pinctrl * p,struct pinctrl_dev * pctldev)211 int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev)
212 {
213 	struct device_node *np = p->dev->of_node;
214 	int state, ret;
215 	char *propname;
216 	struct property *prop;
217 	const char *statename;
218 	const __be32 *list;
219 	int size, config;
220 	phandle phandle;
221 	struct device_node *np_config;
222 
223 	/* CONFIG_OF enabled, p->dev not instantiated from DT */
224 	if (!np) {
225 		if (of_have_populated_dt())
226 			dev_dbg(p->dev,
227 				"no of_node; not parsing pinctrl DT\n");
228 		return 0;
229 	}
230 
231 	/* We may store pointers to property names within the node */
232 	of_node_get(np);
233 
234 	/* For each defined state ID */
235 	for (state = 0; ; state++) {
236 		/* Retrieve the pinctrl-* property */
237 		propname = kasprintf(GFP_KERNEL, "pinctrl-%d", state);
238 		prop = of_find_property(np, propname, &size);
239 		kfree(propname);
240 		if (!prop) {
241 			if (state == 0) {
242 				of_node_put(np);
243 				return -ENODEV;
244 			}
245 			break;
246 		}
247 		list = prop->value;
248 		size /= sizeof(*list);
249 
250 		/* Determine whether pinctrl-names property names the state */
251 		ret = of_property_read_string_index(np, "pinctrl-names",
252 						    state, &statename);
253 		/*
254 		 * If not, statename is just the integer state ID. But rather
255 		 * than dynamically allocate it and have to free it later,
256 		 * just point part way into the property name for the string.
257 		 */
258 		if (ret < 0) {
259 			/* strlen("pinctrl-") == 8 */
260 			statename = prop->name + 8;
261 		}
262 
263 		/* For every referenced pin configuration node in it */
264 		for (config = 0; config < size; config++) {
265 			phandle = be32_to_cpup(list++);
266 
267 			/* Look up the pin configuration node */
268 			np_config = of_find_node_by_phandle(phandle);
269 			if (!np_config) {
270 				dev_err(p->dev,
271 					"prop %s index %i invalid phandle\n",
272 					prop->name, config);
273 				ret = -EINVAL;
274 				goto err;
275 			}
276 
277 			/* Parse the node */
278 			ret = dt_to_map_one_config(p, pctldev, statename,
279 						   np_config);
280 			of_node_put(np_config);
281 			if (ret < 0)
282 				goto err;
283 		}
284 
285 		/* No entries in DT? Generate a dummy state table entry */
286 		if (!size) {
287 			ret = dt_remember_dummy_state(p, statename);
288 			if (ret < 0)
289 				goto err;
290 		}
291 	}
292 
293 	return 0;
294 
295 err:
296 	pinctrl_dt_free_maps(p);
297 	return ret;
298 }
299 
300 /*
301  * For pinctrl binding, typically #pinctrl-cells is for the pin controller
302  * device, so either parent or grandparent. See pinctrl-bindings.txt.
303  */
pinctrl_find_cells_size(const struct device_node * np)304 static int pinctrl_find_cells_size(const struct device_node *np)
305 {
306 	const char *cells_name = "#pinctrl-cells";
307 	int cells_size, error;
308 
309 	error = of_property_read_u32(np->parent, cells_name, &cells_size);
310 	if (error) {
311 		error = of_property_read_u32(np->parent->parent,
312 					     cells_name, &cells_size);
313 		if (error)
314 			return -ENOENT;
315 	}
316 
317 	return cells_size;
318 }
319 
320 /**
321  * pinctrl_get_list_and_count - Gets the list and it's cell size and number
322  * @np: pointer to device node with the property
323  * @list_name: property that contains the list
324  * @list: pointer for the list found
325  * @cells_size: pointer for the cell size found
326  * @nr_elements: pointer for the number of elements found
327  *
328  * Typically np is a single pinctrl entry containing the list.
329  */
pinctrl_get_list_and_count(const struct device_node * np,const char * list_name,const __be32 ** list,int * cells_size,int * nr_elements)330 static int pinctrl_get_list_and_count(const struct device_node *np,
331 				      const char *list_name,
332 				      const __be32 **list,
333 				      int *cells_size,
334 				      int *nr_elements)
335 {
336 	int size;
337 
338 	*cells_size = 0;
339 	*nr_elements = 0;
340 
341 	*list = of_get_property(np, list_name, &size);
342 	if (!*list)
343 		return -ENOENT;
344 
345 	*cells_size = pinctrl_find_cells_size(np);
346 	if (*cells_size < 0)
347 		return -ENOENT;
348 
349 	/* First element is always the index within the pinctrl device */
350 	*nr_elements = (size / sizeof(**list)) / (*cells_size + 1);
351 
352 	return 0;
353 }
354 
355 /**
356  * pinctrl_count_index_with_args - Count number of elements in a pinctrl entry
357  * @np: pointer to device node with the property
358  * @list_name: property that contains the list
359  *
360  * Counts the number of elements in a pinctrl array consisting of an index
361  * within the controller and a number of u32 entries specified for each
362  * entry. Note that device_node is always for the parent pin controller device.
363  */
pinctrl_count_index_with_args(const struct device_node * np,const char * list_name)364 int pinctrl_count_index_with_args(const struct device_node *np,
365 				  const char *list_name)
366 {
367 	const __be32 *list;
368 	int size, nr_cells, error;
369 
370 	error = pinctrl_get_list_and_count(np, list_name, &list,
371 					   &nr_cells, &size);
372 	if (error)
373 		return error;
374 
375 	return size;
376 }
377 EXPORT_SYMBOL_GPL(pinctrl_count_index_with_args);
378 
379 /**
380  * pinctrl_copy_args - Populates of_phandle_args based on index
381  * @np: pointer to device node with the property
382  * @list: pointer to a list with the elements
383  * @index: entry within the list of elements
384  * @nr_cells: number of cells in the list
385  * @nr_elem: number of elements for each entry in the list
386  * @out_args: returned values
387  *
388  * Populates the of_phandle_args based on the index in the list.
389  */
pinctrl_copy_args(const struct device_node * np,const __be32 * list,int index,int nr_cells,int nr_elem,struct of_phandle_args * out_args)390 static int pinctrl_copy_args(const struct device_node *np,
391 			     const __be32 *list,
392 			     int index, int nr_cells, int nr_elem,
393 			     struct of_phandle_args *out_args)
394 {
395 	int i;
396 
397 	memset(out_args, 0, sizeof(*out_args));
398 	out_args->np = (struct device_node *)np;
399 	out_args->args_count = nr_cells + 1;
400 
401 	if (index >= nr_elem)
402 		return -EINVAL;
403 
404 	list += index * (nr_cells + 1);
405 
406 	for (i = 0; i < nr_cells + 1; i++)
407 		out_args->args[i] = be32_to_cpup(list++);
408 
409 	return 0;
410 }
411 
412 /**
413  * pinctrl_parse_index_with_args - Find a node pointed by index in a list
414  * @np: pointer to device node with the property
415  * @list_name: property that contains the list
416  * @index: index within the list
417  * @out_arts: entries in the list pointed by index
418  *
419  * Finds the selected element in a pinctrl array consisting of an index
420  * within the controller and a number of u32 entries specified for each
421  * entry. Note that device_node is always for the parent pin controller device.
422  */
pinctrl_parse_index_with_args(const struct device_node * np,const char * list_name,int index,struct of_phandle_args * out_args)423 int pinctrl_parse_index_with_args(const struct device_node *np,
424 				  const char *list_name, int index,
425 				  struct of_phandle_args *out_args)
426 {
427 	const __be32 *list;
428 	int nr_elem, nr_cells, error;
429 
430 	error = pinctrl_get_list_and_count(np, list_name, &list,
431 					   &nr_cells, &nr_elem);
432 	if (error || !nr_cells)
433 		return error;
434 
435 	error = pinctrl_copy_args(np, list, index, nr_cells, nr_elem,
436 				  out_args);
437 	if (error)
438 		return error;
439 
440 	return 0;
441 }
442 EXPORT_SYMBOL_GPL(pinctrl_parse_index_with_args);
443