Commit 5553055c authored by Johan Hovold's avatar Johan Hovold Committed by Georgi Djakov

memory: tegra: fix interconnect registration race

The current interconnect provider registration interface is inherently
racy as nodes are not added until the after adding the provider. This
can specifically cause racing DT lookups to fail.

Switch to using the new API where the provider is not registered until
after it has been fully initialised.

Fixes: 06f07981 ("memory: tegra-mc: Add interconnect framework")
Cc: stable@vger.kernel.org      # 5.11
Cc: Dmitry Osipenko <digetx@gmail.com>
Acked-by: default avatarKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
Link: https://lore.kernel.org/r/20230306075651.2449-18-johan+linaro@kernel.orgSigned-off-by: default avatarGeorgi Djakov <djakov@kernel.org>
parent 859ad5f1
...@@ -794,16 +794,12 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc) ...@@ -794,16 +794,12 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
mc->provider.aggregate = mc->soc->icc_ops->aggregate; mc->provider.aggregate = mc->soc->icc_ops->aggregate;
mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended; mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended;
err = icc_provider_add(&mc->provider); icc_provider_init(&mc->provider);
if (err)
return err;
/* create Memory Controller node */ /* create Memory Controller node */
node = icc_node_create(TEGRA_ICC_MC); node = icc_node_create(TEGRA_ICC_MC);
if (IS_ERR(node)) { if (IS_ERR(node))
err = PTR_ERR(node); return PTR_ERR(node);
goto del_provider;
}
node->name = "Memory Controller"; node->name = "Memory Controller";
icc_node_add(node, &mc->provider); icc_node_add(node, &mc->provider);
...@@ -830,12 +826,14 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc) ...@@ -830,12 +826,14 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
goto remove_nodes; goto remove_nodes;
} }
err = icc_provider_register(&mc->provider);
if (err)
goto remove_nodes;
return 0; return 0;
remove_nodes: remove_nodes:
icc_nodes_remove(&mc->provider); icc_nodes_remove(&mc->provider);
del_provider:
icc_provider_del(&mc->provider);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment