On 1.02.2023 11:15, Johan Hovold wrote: > 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: f0d8048525d7 ("interconnect: Add imx core driver") > Cc: stable@xxxxxxxxxxxxxxx # 5.8 > Cc: Leonard Crestez <leonard.crestez@xxxxxxx> > Cc: Alexandre Bailon <abailon@xxxxxxxxxxxx> > Signed-off-by: Johan Hovold <johan+linaro@xxxxxxxxxx> > --- Reviewed-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxx> Konrad > drivers/interconnect/imx/imx.c | 20 ++++++++++---------- > 1 file changed, 10 insertions(+), 10 deletions(-) > > diff --git a/drivers/interconnect/imx/imx.c b/drivers/interconnect/imx/imx.c > index 823d9be9771a..979ed610f704 100644 > --- a/drivers/interconnect/imx/imx.c > +++ b/drivers/interconnect/imx/imx.c > @@ -295,6 +295,9 @@ int imx_icc_register(struct platform_device *pdev, > provider->xlate = of_icc_xlate_onecell; > provider->data = data; > provider->dev = dev->parent; > + > + icc_provider_init(provider); > + > platform_set_drvdata(pdev, imx_provider); > > if (settings) { > @@ -306,20 +309,18 @@ int imx_icc_register(struct platform_device *pdev, > } > } > > - ret = icc_provider_add(provider); > - if (ret) { > - dev_err(dev, "error adding interconnect provider: %d\n", ret); > + ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); > + if (ret) > return ret; > - } > > - ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); > + ret = icc_provider_register(provider); > if (ret) > - goto provider_del; > + goto err_unregister_nodes; > > return 0; > > -provider_del: > - icc_provider_del(provider); > +err_unregister_nodes: > + imx_icc_unregister_nodes(&imx_provider->provider); > return ret; > } > EXPORT_SYMBOL_GPL(imx_icc_register); > @@ -328,9 +329,8 @@ void imx_icc_unregister(struct platform_device *pdev) > { > struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev); > > + icc_provider_deregister(&imx_provider->provider); > imx_icc_unregister_nodes(&imx_provider->provider); > - > - icc_provider_del(&imx_provider->provider); > } > EXPORT_SYMBOL_GPL(imx_icc_unregister); >