Commit abd9f1b4 authored by Johan Hovold's avatar Johan Hovold Committed by Georgi Djakov

memory: tegra124-emc: 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: 380def2d ("memory: tegra124: Support interconnect framework")
Cc: stable@vger.kernel.org      # 5.12
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-19-johan+linaro@kernel.orgSigned-off-by: default avatarGeorgi Djakov <djakov@kernel.org>
parent 5553055c
...@@ -1351,15 +1351,13 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc) ...@@ -1351,15 +1351,13 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
emc->provider.aggregate = soc->icc_ops->aggregate; emc->provider.aggregate = soc->icc_ops->aggregate;
emc->provider.xlate_extended = emc_of_icc_xlate_extended; emc->provider.xlate_extended = emc_of_icc_xlate_extended;
err = icc_provider_add(&emc->provider); icc_provider_init(&emc->provider);
if (err)
goto err_msg;
/* create External Memory Controller node */ /* create External Memory Controller node */
node = icc_node_create(TEGRA_ICC_EMC); node = icc_node_create(TEGRA_ICC_EMC);
if (IS_ERR(node)) { if (IS_ERR(node)) {
err = PTR_ERR(node); err = PTR_ERR(node);
goto del_provider; goto err_msg;
} }
node->name = "External Memory Controller"; node->name = "External Memory Controller";
...@@ -1380,12 +1378,14 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc) ...@@ -1380,12 +1378,14 @@ static int tegra_emc_interconnect_init(struct tegra_emc *emc)
node->name = "External Memory (DRAM)"; node->name = "External Memory (DRAM)";
icc_node_add(node, &emc->provider); icc_node_add(node, &emc->provider);
err = icc_provider_register(&emc->provider);
if (err)
goto remove_nodes;
return 0; return 0;
remove_nodes: remove_nodes:
icc_nodes_remove(&emc->provider); icc_nodes_remove(&emc->provider);
del_provider:
icc_provider_del(&emc->provider);
err_msg: err_msg:
dev_err(emc->dev, "failed to initialize ICC: %d\n", err); dev_err(emc->dev, "failed to initialize ICC: %d\n", 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