xref: /linux/drivers/pinctrl/sunxi/pinctrl-sunxi-dt.c (revision 55a42f78ffd386e01a5404419f8c5ded7db70a21)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2017-2025 Arm Ltd.
4  *
5  * Generic DT driven Allwinner pinctrl driver routines.
6  * Builds the pin tables from minimal driver information and pin groups
7  * described in the DT. Then hands those tables of to the traditional
8  * sunxi pinctrl driver.
9  * sunxi_pinctrl_init() expects a table like shown below, previously spelled
10  * out in a per-SoC .c file. This code generates this table, like so:
11  *
12  *  SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1),	// code iterates over every implemented
13  *				// pin, based on pins_per_bank[] array passed in
14  *
15  *    SUNXI_FUNCTION(0x0, "gpio_in"),	// always added, for every pin
16  *    SUNXI_FUNCTION(0x1, "gpio_out"),	// always added, for every pin
17  *
18  *    SUNXI_FUNCTION(0x2, "mmc0"),	// based on pingroup found in DT:
19  *				//   mmc0-pins {
20  *				//       pins = "PF0", "PF1", ...
21  *				//       function = "mmc0";
22  *				//       allwinner,pinmux = <2>;
23  *
24  *    SUNXI_FUNCTION_IRQ_BANK(0x6, 4, 1)),	// derived by irq_bank_muxes[]
25  *						// array passed in
26  */
27 
28 #include <linux/export.h>
29 #include <linux/of.h>
30 #include <linux/of_address.h>
31 #include <linux/of_device.h>
32 #include <linux/pinctrl/pinctrl.h>
33 #include <linux/platform_device.h>
34 #include <linux/slab.h>
35 
36 #include "pinctrl-sunxi.h"
37 
38 #define INVALID_MUX	0xff
39 
40 /*
41  * Return the "index"th element from the "allwinner,pinmux" property. If the
42  * property does not hold enough entries, return the last one instead.
43  * For almost every group the pinmux value is actually the same, so this
44  * allows to just list one value in the property.
45  */
46 static u8 sunxi_pinctrl_dt_read_pinmux(const struct device_node *node,
47 				       int index)
48 {
49 	int ret, num_elems;
50 	u32 value;
51 
52 	num_elems = of_property_count_u32_elems(node, "allwinner,pinmux");
53 	if (num_elems <= 0)
54 		return INVALID_MUX;
55 
56 	if (index >= num_elems)
57 		index = num_elems - 1;
58 
59 	ret = of_property_read_u32_index(node, "allwinner,pinmux", index,
60 					 &value);
61 	if (ret)
62 		return INVALID_MUX;
63 
64 	return value;
65 }
66 
67 /*
68  * Allocate a table with a sunxi_desc_pin structure for every pin needed.
69  * Fills in the respective pin names ("PA0") and their pin numbers.
70  * Returns the pins array. We cannot use the member in *desc yet, as this
71  * is marked as const, and we will need to change the array still.
72  */
73 static struct sunxi_desc_pin *init_pins_table(struct device *dev,
74 					      const u8 *pins_per_bank,
75 					      struct sunxi_pinctrl_desc *desc)
76 {
77 	struct sunxi_desc_pin *pins, *cur_pin;
78 	int name_size = 0;
79 	int port_base = desc->pin_base / PINS_PER_BANK;
80 	char *pin_names, *cur_name;
81 	int i, j;
82 
83 	/*
84 	 * Find the total number of pins.
85 	 * Also work out how much memory we need to store all the pin names.
86 	 */
87 	for (i = 0; i < SUNXI_PINCTRL_MAX_BANKS; i++) {
88 		desc->npins += pins_per_bank[i];
89 		if (pins_per_bank[i] < 10) {
90 			/* 4 bytes for "PXy\0" */
91 			name_size += pins_per_bank[i] * 4;
92 		} else {
93 			/* 4 bytes for each "PXy\0" */
94 			name_size += 10 * 4;
95 
96 			/* 5 bytes for each "PXyy\0" */
97 			name_size += (pins_per_bank[i] - 10) * 5;
98 		}
99 	}
100 
101 	if (desc->npins == 0) {
102 		dev_err(dev, "no ports defined\n");
103 		return ERR_PTR(-EINVAL);
104 	}
105 
106 	pins = devm_kcalloc(dev, desc->npins, sizeof(*pins), GFP_KERNEL);
107 	if (!pins)
108 		return ERR_PTR(-ENOMEM);
109 
110 	/* Allocate memory to store the name for every pin. */
111 	pin_names = devm_kmalloc(dev, name_size, GFP_KERNEL);
112 	if (!pin_names)
113 		return ERR_PTR(-ENOMEM);
114 
115 	/* Fill the pins array with the name and the number for each pin. */
116 	cur_name = pin_names;
117 	cur_pin = pins;
118 	for (i = 0; i < SUNXI_PINCTRL_MAX_BANKS; i++) {
119 		for (j = 0; j < pins_per_bank[i]; j++, cur_pin++) {
120 			int nchars = sprintf(cur_name, "P%c%d",
121 					     port_base + 'A' + i, j);
122 
123 			cur_pin->pin.number = (port_base + i) * PINS_PER_BANK + j;
124 			cur_pin->pin.name = cur_name;
125 			cur_name += nchars + 1;
126 		}
127 	}
128 
129 	return pins;
130 }
131 
132 /*
133  * Work out the number of functions for each pin. This will visit every
134  * child node of the pinctrl DT node to find all advertised functions.
135  * Provide memory to hold the per-function information and assign it to
136  * the pin table.
137  * Fill in the GPIO in/out functions already (that every pin has), also add
138  * an "irq" function at the end, for those pins in IRQ-capable ports.
139  * We do not fill in the extra functions (those describe in DT nodes) yet.
140  * We (ab)use the "variant" member in each pin to keep track of the number of
141  * extra functions needed. At the end this will get reset to 2, so that we
142  * can add extra function later, after the two GPIO functions.
143  */
144 static int prepare_function_table(struct device *dev, struct device_node *pnode,
145 				  struct sunxi_desc_pin *pins, int npins,
146 				  unsigned pin_base, const u8 *irq_bank_muxes)
147 {
148 	struct device_node *node;
149 	struct property *prop;
150 	struct sunxi_desc_function *func;
151 	int num_funcs, irq_bank, last_bank, i;
152 
153 	/*
154 	 * We need at least three functions per pin:
155 	 * - one for GPIO in
156 	 * - one for GPIO out
157 	 * - one for the sentinel signalling the end of the list
158 	 */
159 	num_funcs = 3 * npins;
160 
161 	/*
162 	 * Add a function for each pin in a bank supporting interrupts.
163 	 * We temporarily (ab)use the variant field to store the number of
164 	 * functions per pin. This will be cleaned back to 0 before we hand
165 	 * over the whole structure to the generic sunxi pinctrl setup code.
166 	 */
167 	for (i = 0; i < npins; i++) {
168 		struct sunxi_desc_pin *pin = &pins[i];
169 		int bank = (pin->pin.number - pin_base) / PINS_PER_BANK;
170 
171 		if (irq_bank_muxes[bank]) {
172 			pin->variant++;
173 			num_funcs++;
174 		}
175 	}
176 
177 	/*
178 	 * Go over each pin group (every child of the pinctrl DT node) and
179 	 * add the number of special functions each pins has. Also update the
180 	 * total number of functions required.
181 	 * We might slightly overshoot here in case of double definitions.
182 	 */
183 	for_each_child_of_node(pnode, node) {
184 		const char *name;
185 
186 		of_property_for_each_string(node, "pins", prop, name) {
187 			for (i = 0; i < npins; i++) {
188 				if (strcmp(pins[i].pin.name, name))
189 					continue;
190 
191 				pins[i].variant++;
192 				num_funcs++;
193 				break;
194 			}
195 		}
196 	}
197 
198 	/*
199 	 * Allocate the memory needed for the functions in one table.
200 	 * We later use pointers into this table to mark each pin.
201 	 */
202 	func = devm_kcalloc(dev, num_funcs, sizeof(*func), GFP_KERNEL);
203 	if (!func)
204 		return -ENOMEM;
205 
206 	/*
207 	 * Assign the function's memory and fill in GPIOs, IRQ and a sentinel.
208 	 * The extra functions will be filled in later.
209 	 */
210 	irq_bank = 0;
211 	last_bank = 0;
212 	for (i = 0; i < npins; i++) {
213 		struct sunxi_desc_pin *pin = &pins[i];
214 		int bank = (pin->pin.number - pin_base) / PINS_PER_BANK;
215 		int lastfunc = pin->variant + 1;
216 		int irq_mux = irq_bank_muxes[bank];
217 
218 		func[0].name = "gpio_in";
219 		func[0].muxval = 0;
220 		func[1].name = "gpio_out";
221 		func[1].muxval = 1;
222 
223 		if (irq_mux) {
224 			if (bank > last_bank)
225 				irq_bank++;
226 			func[lastfunc].muxval = irq_mux;
227 			func[lastfunc].irqbank = irq_bank;
228 			func[lastfunc].irqnum = pin->pin.number % PINS_PER_BANK;
229 			func[lastfunc].name = "irq";
230 		}
231 
232 		if (bank > last_bank)
233 			last_bank = bank;
234 
235 		pin->functions = func;
236 
237 		/* Skip over the other needed functions and the sentinel. */
238 		func += pin->variant + 3;
239 
240 		/*
241 		 * Reset the value for filling in the remaining functions
242 		 * behind the GPIOs later.
243 		 */
244 		pin->variant = 2;
245 	}
246 
247 	return 0;
248 }
249 
250 /*
251  * Iterate over all pins in a single group and add the function name and its
252  * mux value to the respective pin.
253  * The "variant" member is again used to temporarily track the number of
254  * already added functions.
255  */
256 static void fill_pin_function(struct device *dev, struct device_node *node,
257 			      struct sunxi_desc_pin *pins, int npins)
258 {
259 	const char *name, *funcname;
260 	struct sunxi_desc_function *func;
261 	struct property *prop;
262 	int pin, i, index;
263 	u8 muxval;
264 
265 	if (of_property_read_string(node, "function", &funcname)) {
266 		dev_warn(dev, "missing \"function\" property\n");
267 		return;
268 	}
269 
270 	index = 0;
271 	of_property_for_each_string(node, "pins", prop, name) {
272 		/* Find the index of this pin in our table. */
273 		for (pin = 0; pin < npins; pin++)
274 			if (!strcmp(pins[pin].pin.name, name))
275 				break;
276 		if (pin == npins) {
277 			dev_warn(dev, "%pOF: cannot find pin %s\n", node, name);
278 			index++;
279 			continue;
280 		}
281 
282 		/* Read the associated mux value. */
283 		muxval = sunxi_pinctrl_dt_read_pinmux(node, index);
284 		if (muxval == INVALID_MUX) {
285 			dev_warn(dev, "%pOF: invalid mux value for pin %s\n",
286 				 node, name);
287 			index++;
288 			continue;
289 		}
290 
291 		/*
292 		 * Check for double definitions by comparing the to-be-added
293 		 * function with already assigned ones.
294 		 * Ignore identical pairs (function name and mux value the
295 		 * same), but warn about conflicting assignments.
296 		 */
297 		for (i = 2; i < pins[pin].variant; i++) {
298 			func = &pins[pin].functions[i];
299 
300 			/* Skip over totally unrelated functions. */
301 			if (strcmp(func->name, funcname) &&
302 			    func->muxval != muxval)
303 				continue;
304 
305 			/* Ignore (but skip below) any identical functions. */
306 			if (!strcmp(func->name, funcname) &&
307 			    muxval == func->muxval)
308 				break;
309 
310 			dev_warn(dev,
311 				 "pin %s: function %s redefined to mux %d\n",
312 				 name, funcname, muxval);
313 			break;
314 		}
315 
316 		/* Skip any pins with that function already assigned. */
317 		if (i < pins[pin].variant) {
318 			index++;
319 			continue;
320 		}
321 
322 		/* Assign function and muxval to the next free slot. */
323 		func = &pins[pin].functions[pins[pin].variant];
324 		func->muxval = muxval;
325 		func->name = funcname;
326 
327 		pins[pin].variant++;
328 		index++;
329 	}
330 }
331 
332 /*
333  * Initialise the pinctrl table, by building it from driver provided
334  * information: the number of pins per bank, the IRQ capable banks and their
335  * IRQ mux value.
336  * Then iterate over all pinctrl DT node children to enter the function name
337  * and mux values for each mentioned pin.
338  * At the end hand over this structure to the actual sunxi pinctrl driver.
339  */
340 int sunxi_pinctrl_dt_table_init(struct platform_device *pdev,
341 				const u8 *pins_per_bank,
342 				const u8 *irq_bank_muxes,
343 				struct sunxi_pinctrl_desc *desc,
344 				unsigned long flags)
345 {
346 	struct device_node *pnode = pdev->dev.of_node, *node;
347 	struct sunxi_desc_pin *pins;
348 	int ret, i;
349 
350 	pins = init_pins_table(&pdev->dev, pins_per_bank, desc);
351 	if (IS_ERR(pins))
352 		return PTR_ERR(pins);
353 
354 	ret = prepare_function_table(&pdev->dev, pnode, pins, desc->npins,
355 				     desc->pin_base, irq_bank_muxes);
356 	if (ret)
357 		return ret;
358 
359 	/*
360 	 * Now iterate over all groups and add the respective function name
361 	 * and mux values to each pin listed within.
362 	 */
363 	for_each_child_of_node(pnode, node)
364 		fill_pin_function(&pdev->dev, node, pins, desc->npins);
365 
366 	/* Clear the temporary storage. */
367 	for (i = 0; i < desc->npins; i++)
368 		pins[i].variant = 0;
369 
370 	desc->pins = pins;
371 
372 	return sunxi_pinctrl_init_with_flags(pdev, desc, flags);
373 }
374