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: [email protected] # 5.8 Cc: Alexandre Bailon <[email protected]> Reviewed-by: Konrad Dybcio <[email protected]> Signed-off-by: Johan Hovold <[email protected]> Tested-by: Luca Ceresoli <[email protected]> # i.MX8MP MSC SM2-MB-EP1 Board Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Georgi Djakov <[email protected]>
1 parent eb59eca commit 9fbd355

File tree

1 file changed

+10
-10
lines changed
  • drivers/interconnect/imx

1 file changed

+10
-10
lines changed

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)