RE: [PATCH v2] mfd: syscon: Decouple syscon interface from platform devices

From: Pankaj Dubey
Date: Thu Sep 04 2014 - 00:37:35 EST


Hi Arnd,

On Tuesday, September 02, 2014 Arnd Bergmann wrote,
> To: Pankaj Dubey
> Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx;
linux-samsung-soc@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; lee.jones@xxxxxxxxxx; kgene.kim@xxxxxxxxxxx;
> linux@xxxxxxxxxxxxxxxx; vikas.sajjan@xxxxxxxxxxx; joshi@xxxxxxxxxxx;
> naushad@xxxxxxxxxxx; thomas.ab@xxxxxxxxxxx; chow.kim@xxxxxxxxxxx;
> tomasz.figa@xxxxxxxxx; Tomasz Figa; Alexander Shiyan; Michal Simek
> Subject: Re: [PATCH v2] mfd: syscon: Decouple syscon interface from
platform
> devices
>
> On Tuesday 02 September 2014 20:12:15 Pankaj Dubey wrote:
> > Currently a syscon entity can only be registered directly through a
> > platform device that binds to a dedicated syscon driver. However in
> > certain cases it is required to bind a device with it's dedicated
> > driver rather than binding with syscon driver.
> >
> > For example, certain SoCs (e.g. Exynos) contain system controller
> > blocks which perform various functions such as power domain control,
> > CPU power management, low power mode control, but in addition contain
> > certain IP integration glue, such as various signal masks, coprocessor
> > power control, etc. In such case, there is a need to have a dedicated
> > driver for such system controller but also share registers with other
> > drivers. The latter is where the syscon interface is helpful.
> >
> > This patch decouples syscon object from syscon platform driver, and
> > allows to create syscon objects first time when it is required by
> > calling of syscon_regmap_lookup_by APIs and keeps a list of such
> > syscon objects along with syscon provider device_nodes and regmap
handles.
> >
> > Signed-off-by: Pankaj Dubey <pankaj.dubey@xxxxxxxxxxx>
> > Signed-off-by: Tomasz Figa <t.figa@xxxxxxxxxxx>
> > ---
> > V1 of this patchset [1] and related discussion can be found here [1].
> >
> > Changes since v1:
> > - Removed of_syscon_unregister function.
> > - Modified of_syscon_register function and it will be used by syscon.c
> > to create syscon objects whenever required.
> > - Removed platform device support from syscon.
> > - Removed syscon_regmap_lookup_by_pdevname API support.
> > - As there are significant changes w.r.t patchset v1, I am taking over
> > author for this patchset from Tomasz Figa.
>
> Note that you got the Signed-off-by: list wrong, you should never have any
people
> listed as Signed-off-by after your own name, and they should be listed
before your
> name only when you are forwarding their patches.
>

Sorry, I was not aware of this. I will take care in future.

> > Note: Current kernel has clps711x user of
> > syscon_regmap_lookup_by_pdevname and will be broken after this patch.
> > As per discussion over here [1], patches for making these drivers DT
> > based are ready and once that is done they can use
> syscon_regmap_lookup_by_phandle or syscon_regmap_lookup_by_compatible.
> >
> > [1]: https://lkml.org/lkml/2014/8/22/81
>
> Adding Alexander Shiyan to Cc here, so we can make sure this is well
coordinated.
>
> I'm also adding Michal Simek, since here was involved in earlier
discussions about
> doing this.
>

Thanks.

> > drivers/mfd/syscon.c | 143
+++++++++++++-------------------------------
> > include/linux/mfd/syscon.h | 1 +
> > 2 files changed, 44 insertions(+), 100 deletions(-)
>
> I certainly like the diffstat ;-)
>
> > struct syscon {
> > + struct device_node *np;
> > struct regmap *regmap;
> > + struct list_head list;
> > };
>
> Right
>
> > @@ -68,27 +72,6 @@ struct regmap
> > *syscon_regmap_lookup_by_compatible(const char *s) }
> > EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_compatible);
> >
> > -static int syscon_match_pdevname(struct device *dev, void *data) -{
> > - return !strcmp(dev_name(dev), (const char *)data);
> > -}
> > -
> > -struct regmap *syscon_regmap_lookup_by_pdevname(const char *s) -{
> > - struct device *dev;
> > - struct syscon *syscon;
> > -
> > - dev = driver_find_device(&syscon_driver.driver, NULL, (void *)s,
> > - syscon_match_pdevname);
> > - if (!dev)
> > - return ERR_PTR(-EPROBE_DEFER);
> > -
> > - syscon = dev_get_drvdata(dev);
> > -
> > - return syscon->regmap;
> > -}
> > -EXPORT_SYMBOL_GPL(syscon_regmap_lookup_by_pdevname);
>
> I think this can actually be left intact if that helps with clps71xx.
> It could be done in a hacky way using bus_find_device_by_name() to keep it
simple,
> or in a somewhat nicer way by keeping the syscon platform_driver around
for the
> non-DT case.
>

Ok as per our last discussion you mentioned that clps71xx will be soon
migrating to DT.
So if that is not going to happen sooner, I would also prefer better keep
syscon_regmap_lookup_by_pdevname and syscon platform_driver for non-DT case,
so that this issue should not block this patch.

So please let's make final call to keep syscon platform_driver for non-DT
case which eventually
can be dropped once clps71xx driver migrates to DT based. So that I can
prepare next patchset
keeping syscon platform_driver support and syscon_regmap_lookup_by_pdevname
API support
for non-DT case and send across for review.


>
> > + regmap = regmap_init_mmio(NULL, base, &syscon_regmap_config);
> > + if (IS_ERR(regmap)) {
> > + pr_err("regmap init failed\n");
> > + return ERR_CAST(regmap);
> > + }
>
> The last time I looked over this code, I think it was not safe to
> call regmap_init_mmio() with a NULL device pointer, and we decided
> that should be fixed. Have you checked whether it is ok now?
>

At least we could not see any issues with this. We have tested it one
Exynos5250 board
where syscon object is getting created first time when other drivers (USB,
SATA Phy, Watchdog)
are calling helper function syscon_regmap_lookup_by_phandle and able to
access regmap handle
and able to use regmap_read/write APIs.

> Arnd

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/