On 20/04/2021 18:52, Thierry Reding wrote: > From: Thierry Reding <treding@xxxxxxxxxx> > > Continuing the scheme of unification, push suspend/resume callbacks into > per-SoC driver so that they can be properly parameterized. > > While at it, also move the ->init() callback into the new tegra_mc_ops > structure to keep things clean. Please split this part. This is just moving pointer from one structure to another, quite small change. The rest of the patchset is quite different - you now call tegra_mc_suspend() from a per-SoC driver and move the code around. > > Signed-off-by: Thierry Reding <treding@xxxxxxxxxx> > --- > drivers/memory/tegra/mc.c | 24 ++++++++--------------- > drivers/memory/tegra/tegra186.c | 27 ++++++++++++++++++++++---- > drivers/memory/tegra/tegra20.c | 34 ++++++++++++++++++++++++++++++++- > include/soc/tegra/mc.h | 9 +++++++-- > 4 files changed, 71 insertions(+), 23 deletions(-) > > diff --git a/drivers/memory/tegra/mc.c b/drivers/memory/tegra/mc.c > index b7e104bf6614..2b21131d779c 100644 > --- a/drivers/memory/tegra/mc.c > +++ b/drivers/memory/tegra/mc.c > @@ -829,8 +829,8 @@ static int tegra_mc_probe(struct platform_device *pdev) > > mc->debugfs.root = debugfs_create_dir("mc", NULL); > > - if (mc->soc->init) { > - err = mc->soc->init(mc); > + if (mc->soc->ops && mc->soc->ops->init) { > + err = mc->soc->ops->init(mc); > if (err < 0) > dev_err(&pdev->dev, "failed to initialize SoC driver: %d\n", > err); > @@ -867,30 +867,22 @@ static int tegra_mc_probe(struct platform_device *pdev) > return 0; > } > > -static int tegra_mc_suspend(struct device *dev) > +static int __maybe_unused tegra_mc_suspend(struct device *dev) > { > struct tegra_mc *mc = dev_get_drvdata(dev); > - int err; > > - if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) { > - err = tegra_gart_suspend(mc->gart); > - if (err) > - return err; > - } > + if (mc->soc->ops && mc->soc->ops->suspend) > + return mc->soc->ops->suspend(mc); > > return 0; > } > > -static int tegra_mc_resume(struct device *dev) > +static int __maybe_unused tegra_mc_resume(struct device *dev) > { > struct tegra_mc *mc = dev_get_drvdata(dev); > - int err; > > - if (IS_ENABLED(CONFIG_TEGRA_IOMMU_GART) && mc->gart) { > - err = tegra_gart_resume(mc->gart); > - if (err) > - return err; > - } > + if (mc->soc->ops && mc->soc->ops->resume) > + return mc->soc->ops->resume(mc); > > return 0; > } > diff --git a/drivers/memory/tegra/tegra186.c b/drivers/memory/tegra/tegra186.c > index 8e77567d1378..9d3fdb609d55 100644 > --- a/drivers/memory/tegra/tegra186.c > +++ b/drivers/memory/tegra/tegra186.c > @@ -45,6 +45,17 @@ static void tegra186_mc_program_sid(struct tegra_mc *mc) > } > } > > +static int tegra186_mc_resume(struct tegra_mc *mc) > +{ > + tegra186_mc_program_sid(mc); > + > + return 0; > +} > + > +static const struct tegra_mc_ops tegra186_mc_ops = { > + .resume = tegra186_mc_resume, > +}; > + > #if defined(CONFIG_ARCH_TEGRA_186_SOC) > static const struct tegra_mc_client tegra186_mc_clients[] = { > { > @@ -701,6 +712,7 @@ static const struct tegra_mc_client tegra186_mc_clients[] = { > static const struct tegra_mc_soc tegra186_mc_soc = { > .num_clients = ARRAY_SIZE(tegra186_mc_clients), > .clients = tegra186_mc_clients, > + .ops = &tegra186_mc_ops, > }; > #endif > > @@ -1909,6 +1921,7 @@ static const struct tegra_mc_client tegra194_mc_clients[] = { > static const struct tegra_mc_soc tegra194_mc_soc = { > .num_clients = ARRAY_SIZE(tegra194_mc_clients), > .clients = tegra194_mc_clients, > + .ops = &tegra186_mc_ops, > }; > #endif > > @@ -1961,22 +1974,28 @@ static const struct of_device_id tegra186_mc_of_match[] = { > }; > MODULE_DEVICE_TABLE(of, tegra186_mc_of_match); > > -static int __maybe_unused tegra186_mc_suspend(struct device *dev) > +static int __maybe_unused tegra_mc_suspend(struct device *dev) > { > + struct tegra_mc *mc = dev_get_drvdata(dev); > + > + if (mc->soc->ops && mc->soc->ops->suspend) > + return mc->soc->ops->suspend(mc); > + > return 0; > } > > -static int __maybe_unused tegra186_mc_resume(struct device *dev) > +static int __maybe_unused tegra_mc_resume(struct device *dev) > { > struct tegra_mc *mc = dev_get_drvdata(dev); > > - tegra186_mc_program_sid(mc); > + if (mc->soc->ops && mc->soc->ops->resume) > + return mc->soc->ops->resume(mc); > > return 0; > } > > static const struct dev_pm_ops tegra186_mc_pm_ops = { > - SET_SYSTEM_SLEEP_PM_OPS(tegra186_mc_suspend, tegra186_mc_resume) > + SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume) What's the benefit here? You basically define your own suspend-resume ops, on top of PM suspend-resume ops... Before it was quite obvious code - the Tegra186 MC driver had very simple suspend/resume which did simple job. Now it feels like trickier code to follow - Tegra186 driver calls it's resume (with the same name as others - another confusion) which is a simple wrapper calling somewhere else (need to jump to assinment of resume()). Best regards, Krzysztof