26.09.2020 11:07, Nicolin Chen пишет: ... > + /* NULL smmu pointer means that SMMU driver is not probed yet */ > + if (unlikely(!smmu)) > + return ERR_PTR(-EPROBE_DEFER); Hello, Nicolin! Please don't pollute code with likely/unlikely. This is not a performance-critical code. ... > -static struct platform_driver tegra_mc_driver = { > +struct platform_driver tegra_mc_driver = { > .driver = { > .name = "tegra-mc", > .of_match_table = tegra_mc_of_match, > diff --git a/include/soc/tegra/mc.h b/include/soc/tegra/mc.h > index 1238e35653d1..49a4cf64c4b9 100644 > --- a/include/soc/tegra/mc.h > +++ b/include/soc/tegra/mc.h > @@ -184,4 +184,6 @@ struct tegra_mc { > int tegra_mc_write_emem_configuration(struct tegra_mc *mc, unsigned long rate); > unsigned int tegra_mc_get_emem_device_count(struct tegra_mc *mc); > > +extern struct platform_driver tegra_mc_driver; No global variables, please. See for the example: https://elixir.bootlin.com/linux/v5.9-rc6/source/drivers/devfreq/tegra20-devfreq.c#L100 The tegra_get_memory_controller() is now needed by multiple Tegra drivers, I think it should be good to have it added into the MC driver and then make it globally available for all drivers by making use of of_find_matching_node_and_match(). diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c index e1db209fd2ea..ed1bd6d00aaf 100644 --- a/drivers/memory/tegra/mc.c +++ b/drivers/memory/tegra/mc.c @@ -43,6 +43,29 @@ static const struct of_device_id tegra_mc_of_match[] = { }; MODULE_DEVICE_TABLE(of, tegra_mc_of_match); +struct tegra_mc *tegra_get_memory_controller(void) +{ + struct platform_device *pdev; + struct device_node *np; + struct tegra_mc *mc; + + np = of_find_matching_node_and_match(NULL, tegra_mc_of_match, NULL); + if (!np) + return ERR_PTR(-ENOENT); + + pdev = of_find_device_by_node(np); + of_node_put(np); + if (!pdev) + return ERR_PTR(-ENODEV); + + mc = platform_get_drvdata(pdev); + if (!mc) + return ERR_PTR(-EPROBE_DEFER); + + return mc; +} +EXPORT_SYMBOL_GPL(tegra_get_memory_controller);