Skip to content

Commit 9fbd355

Browse files
jhovoldGeorgi Djakov
authored andcommitted
interconnect: imx: fix 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: f0d8048 ("interconnect: Add imx core driver") Cc: stable@vger.kernel.org # 5.8 Cc: Alexandre Bailon <abailon@baylibre.com> Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> Signed-off-by: Johan Hovold <johan+linaro@kernel.org> Tested-by: Luca Ceresoli <luca.ceresoli@bootlin.com> # i.MX8MP MSC SM2-MB-EP1 Board Link: https://lore.kernel.org/r/20230306075651.2449-5-johan+linaro@kernel.org Signed-off-by: Georgi Djakov <djakov@kernel.org>
1 parent eb59eca commit 9fbd355

1 file changed

Lines changed: 10 additions & 10 deletions

File tree

  • drivers/interconnect/imx

drivers/interconnect/imx/imx.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ int imx_icc_register(struct platform_device *pdev,
295295
provider->xlate = of_icc_xlate_onecell;
296296
provider->data = data;
297297
provider->dev = dev->parent;
298+
299+
icc_provider_init(provider);
300+
298301
platform_set_drvdata(pdev, imx_provider);
299302

300303
if (settings) {
@@ -306,20 +309,18 @@ int imx_icc_register(struct platform_device *pdev,
306309
}
307310
}
308311

309-
ret = icc_provider_add(provider);
310-
if (ret) {
311-
dev_err(dev, "error adding interconnect provider: %d\n", ret);
312+
ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings);
313+
if (ret)
312314
return ret;
313-
}
314315

315-
ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings);
316+
ret = icc_provider_register(provider);
316317
if (ret)
317-
goto provider_del;
318+
goto err_unregister_nodes;
318319

319320
return 0;
320321

321-
provider_del:
322-
icc_provider_del(provider);
322+
err_unregister_nodes:
323+
imx_icc_unregister_nodes(&imx_provider->provider);
323324
return ret;
324325
}
325326
EXPORT_SYMBOL_GPL(imx_icc_register);
@@ -328,9 +329,8 @@ void imx_icc_unregister(struct platform_device *pdev)
328329
{
329330
struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev);
330331

332+
icc_provider_deregister(&imx_provider->provider);
331333
imx_icc_unregister_nodes(&imx_provider->provider);
332-
333-
icc_provider_del(&imx_provider->provider);
334334
}
335335
EXPORT_SYMBOL_GPL(imx_icc_unregister);
336336

0 commit comments

Comments
 (0)