52 lines
1.7 KiB
Diff
52 lines
1.7 KiB
Diff
|
From 88f01a1bd0e0dbd01b65907023dbe53cf524ea2a Mon Sep 17 00:00:00 2001
|
||
|
From: Chen-Yu Tsai <wens@csie.org>
|
||
|
Date: Fri, 11 Nov 2016 10:35:10 +0800
|
||
|
Subject: pinctrl: sunxi: Free configs in pinctrl_map only if it is a config
|
||
|
map
|
||
|
|
||
|
In the recently refactored sunxi pinctrl library, we are only allocating
|
||
|
one set of pin configs for each pinmux setting node. When the pinctrl_map
|
||
|
structure is freed, the pin configs should also be freed. However the
|
||
|
code assumed the first map would contain the configs, which actually
|
||
|
never happens, as the mux function map gets added first.
|
||
|
|
||
|
The proper way to do this is to look through all the maps and free the
|
||
|
first one whose type is actually PIN_MAP_TYPE_CONFIGS_GROUP.
|
||
|
|
||
|
Also slightly expand the comment explaining this.
|
||
|
|
||
|
Fixes: f233dbca6227 ("pinctrl: sunxi: Rework the pin config building code")
|
||
|
Signed-off-by: Chen-Yu Tsai <wens@csie.org>
|
||
|
Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com>
|
||
|
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||
|
---
|
||
|
drivers/pinctrl/sunxi/pinctrl-sunxi.c | 17 +++++++++++++++--
|
||
|
1 file changed, 15 insertions(+), 2 deletions(-)
|
||
|
|
||
|
--- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
|
||
|
+++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
|
||
|
@@ -408,8 +408,21 @@ static void sunxi_pctrl_dt_free_map(stru
|
||
|
struct pinctrl_map *map,
|
||
|
unsigned num_maps)
|
||
|
{
|
||
|
- /* All the maps have the same pin config, free only the first one */
|
||
|
- kfree(map[0].data.configs.configs);
|
||
|
+ int i;
|
||
|
+
|
||
|
+ /* pin config is never in the first map */
|
||
|
+ for (i = 1; i < num_maps; i++) {
|
||
|
+ if (map[i].type != PIN_MAP_TYPE_CONFIGS_GROUP)
|
||
|
+ continue;
|
||
|
+
|
||
|
+ /*
|
||
|
+ * All the maps share the same pin config,
|
||
|
+ * free only the first one we find.
|
||
|
+ */
|
||
|
+ kfree(map[i].data.configs.configs);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
kfree(map);
|
||
|
}
|
||
|
|