pmdomain: mtk-pm-domains: Fix spinlock recursion fix in probe

Remove scpsys_get_legacy_regmap(), replacing its usage with
of_find_node_with_property(). Explicitly call of_node_get(np) before each
of_find_node_with_property() to maintain correct node reference counting.

The of_find_node_with_property() function "consumes" its input by calling
of_node_put() internally, whether or not it finds a match. Currently,
dev->of_node (np) is passed multiple times in sequence without incrementing
its reference count, causing it to be decremented multiple times and
risking early memory release.

Adding of_node_get(np) before each call balances the reference count,
preventing premature node release.

Fixes: c1bac49fe91f ("pmdomains: mtk-pm-domains: Fix spinlock recursion in probe")
Cc: stable@vger.kernel.org
Signed-off-by: Macpaul Lin <macpaul.lin@mediatek.com>
Tested-by: Louis-Alexis Eyraud <louisalexis.eyraud@collabora.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>

authored by Macpaul Lin and committed by Ulf Hansson 305f2547 f8f9c1f4

Changed files
+6 -15
drivers
pmdomain
mediatek
+6 -15
drivers/pmdomain/mediatek/mtk-pm-domains.c
··· 984 984 } 985 985 } 986 986 987 - static struct device_node *scpsys_get_legacy_regmap(struct device_node *np, const char *pn) 988 - { 989 - struct device_node *local_node; 990 - 991 - for_each_child_of_node(np, local_node) { 992 - if (of_property_present(local_node, pn)) 993 - return local_node; 994 - } 995 - 996 - return NULL; 997 - } 998 - 999 987 static int scpsys_get_bus_protection_legacy(struct device *dev, struct scpsys *scpsys) 1000 988 { 1001 989 const u8 bp_blocks[3] = { ··· 1005 1017 * this makes it then possible to allocate the array of bus_prot 1006 1018 * regmaps and convert all to the new style handling. 1007 1019 */ 1008 - node = scpsys_get_legacy_regmap(np, "mediatek,infracfg"); 1020 + of_node_get(np); 1021 + node = of_find_node_with_property(np, "mediatek,infracfg"); 1009 1022 if (node) { 1010 1023 regmap[0] = syscon_regmap_lookup_by_phandle(node, "mediatek,infracfg"); 1011 1024 of_node_put(node); ··· 1019 1030 regmap[0] = NULL; 1020 1031 } 1021 1032 1022 - node = scpsys_get_legacy_regmap(np, "mediatek,smi"); 1033 + of_node_get(np); 1034 + node = of_find_node_with_property(np, "mediatek,smi"); 1023 1035 if (node) { 1024 1036 smi_np = of_parse_phandle(node, "mediatek,smi", 0); 1025 1037 of_node_put(node); ··· 1038 1048 regmap[1] = NULL; 1039 1049 } 1040 1050 1041 - node = scpsys_get_legacy_regmap(np, "mediatek,infracfg-nao"); 1051 + of_node_get(np); 1052 + node = of_find_node_with_property(np, "mediatek,infracfg-nao"); 1042 1053 if (node) { 1043 1054 regmap[2] = syscon_regmap_lookup_by_phandle(node, "mediatek,infracfg-nao"); 1044 1055 num_regmaps++;