34a422794d
This backports multiple patches from kernel 4.10 which are adding missing support for the A64 and the pine64 board. These are the device tree files, the pinctlk and the clock driver. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
51 lines
1.7 KiB
Diff
51 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);
|
|
}
|
|
|