On Wed, Sep 30, 2020 at 07:06:27PM +0300, Dmitry Osipenko wrote: > 30.09.2020 19:03, Thierry Reding пишет: > > On Wed, Sep 30, 2020 at 06:53:06PM +0300, Dmitry Osipenko wrote: > >> 30.09.2020 18:23, Thierry Reding пишет: > >>> On Wed, Sep 30, 2020 at 01:42:56AM -0700, Nicolin Chen wrote: > >>>> From: Dmitry Osipenko <[email protected]> > >>>> > >>>> Multiple Tegra drivers need to retrieve Memory Controller and hence there > >>>> is quite some duplication of the retrieval code among the drivers. Let's > >>>> add a new common helper for the retrieval of the MC. > >>>> > >>>> Signed-off-by: Dmitry Osipenko <[email protected]> > >>>> Signed-off-by: Nicolin Chen <[email protected]> > >>>> --- > >>>> > >>>> Changelog > >>>> v2->v3: > >>>> * Replaced with Dimtry's devm_tegra_get_memory_controller() > >>>> v1->v2: > >>>> * N/A > >>>> > >>>> drivers/memory/tegra/mc.c | 39 +++++++++++++++++++++++++++++++++++++++ > >>>> include/soc/tegra/mc.h | 17 +++++++++++++++++ > >>>> 2 files changed, 56 insertions(+) > >>> > >>> Let's not add this helper, please. If a device needs a reference to the > >>> memory controller, it should have a phandle to the memory controller in > >>> device tree so that it can be looked up explicitly. > >>> > >>> Adding this helper is officially sanctioning that it's okay not to have > >>> that reference and that's a bad idea. > >> > >> And please explain why it's a bad idea, I don't see anything bad here at > >> all. > > > > Well, you said yourself in a recent comment that we should avoid global > > variables. devm_tegra_get_memory_controller() is nothing but a glorified > > global variable. > > This is not a variable, but a common helper function which will remove > the duplicated code and will help to avoid common mistakes like a missed > put_device().
Yeah, you're right: this is actually much worse than a global variable.
It's a helper function that needs 50+ lines in order to effectively
access a global variable.
You could write this much simpler by doing something like this:
static struct tegra_mc *global_mc;
int tegra_mc_probe(...)
{
...
global_mc = mc;
...
}
struct tegra_mc *tegra_get_memory_controller(void)
{
return global_mc;
}
The result is *exactly* the same, except that this is actually more
honest. Nicolin's patch *pretends* that it isn't using a global variable
by wrapping a lot of complicated code around it.
But that doesn't change the fact that this accesses a singleton object
without actually being able to tie it to the device in the first place.
Thierry
signature.asc
Description: PGP signature

