summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinctrl-keembay.c
diff options
context:
space:
mode:
authorRafał Miłecki <rafal@milecki.pl>2021-12-16 17:22:04 +0100
committerLinus Walleij <linus.walleij@linaro.org>2021-12-22 02:57:27 +0100
commit5d0674999cc5caec72130ad8ff3a211d153bcef5 (patch)
treee2ccf7c15bee4cacb53688de26ff67b0433fad7e /drivers/pinctrl/pinctrl-keembay.c
parentpinctrl: imx: prepare for making "group_names" in "function_desc" const (diff)
downloadlinux-5d0674999cc5caec72130ad8ff3a211d153bcef5.tar.xz
linux-5d0674999cc5caec72130ad8ff3a211d153bcef5.zip
pinctrl: keembay: comment process of building functions a bit
This should make code a bit easier to follow. While at it use some "for" loops to simplify array iteration loops. Signed-off-by: Rafał Miłecki <rafal@milecki.pl> Link: https://lore.kernel.org/r/20211216162206.8027-2-zajec5@gmail.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinctrl-keembay.c')
-rw-r--r--drivers/pinctrl/pinctrl-keembay.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/pinctrl/pinctrl-keembay.c b/drivers/pinctrl/pinctrl-keembay.c
index 2bce563d5b8b..9a602abad8df 100644
--- a/drivers/pinctrl/pinctrl-keembay.c
+++ b/drivers/pinctrl/pinctrl-keembay.c
@@ -1617,37 +1617,38 @@ static int keembay_build_functions(struct keembay_pinctrl *kpc)
struct function_desc *keembay_funcs, *new_funcs;
int i;
- /* Allocate total number of functions */
+ /*
+ * Allocate maximum possible number of functions. Assume every pin
+ * being part of 8 (hw maximum) globally unique muxes.
+ */
kpc->nfuncs = 0;
keembay_funcs = kcalloc(kpc->npins * 8, sizeof(*keembay_funcs), GFP_KERNEL);
if (!keembay_funcs)
return -ENOMEM;
- /* Find total number of functions and each's properties */
+ /* Setup 1 function for each unique mux */
for (i = 0; i < kpc->npins; i++) {
const struct pinctrl_pin_desc *pdesc = keembay_pins + i;
- struct keembay_mux_desc *mux = pdesc->drv_data;
+ struct keembay_mux_desc *mux;
- while (mux->name) {
- struct function_desc *fdesc = keembay_funcs;
+ for (mux = pdesc->drv_data; mux->name; mux++) {
+ struct function_desc *fdesc;
- while (fdesc->name) {
+ /* Check if we already have function for this mux */
+ for (fdesc = keembay_funcs; fdesc->name; fdesc++) {
if (!strcmp(mux->name, fdesc->name)) {
fdesc->num_group_names++;
break;
}
-
- fdesc++;
}
+ /* Setup new function for this mux we didn't see before */
if (!fdesc->name) {
fdesc->name = mux->name;
fdesc->num_group_names = 1;
fdesc->data = &mux->mode;
kpc->nfuncs++;
}
-
- mux++;
}
}