[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <48f9f4067cc44ad49297bb4b62c56c88@BY2PR0301MB0613.namprd03.prod.outlook.com>
Date: Fri, 19 Sep 2014 03:38:03 +0000
From: "Li.Xiubo@...escale.com" <Li.Xiubo@...escale.com>
To: "Aisheng.Dong@...escale.com" <Aisheng.Dong@...escale.com>,
Pankaj Dubey <pankaj.dubey@...sung.com>
CC: "arnd@...db.de" <arnd@...db.de>,
"linux-arm-kernel@...ts.infradead.org"
<linux-arm-kernel@...ts.infradead.org>,
"linux-samsung-soc@...r.kernel.org"
<linux-samsung-soc@...r.kernel.org>,
"linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>,
"kgene.kim@...sung.com" <kgene.kim@...sung.com>,
"linux@....linux.org.uk" <linux@....linux.org.uk>,
"naushad@...sung.com" <naushad@...sung.com>,
"tomasz.figa@...il.com" <tomasz.figa@...il.com>,
"joshi@...sung.com" <joshi@...sung.com>,
"thomas.ab@...sung.com" <thomas.ab@...sung.com>,
"vikas.sajjan@...sung.com" <vikas.sajjan@...sung.com>,
"chow.kim@...sung.com" <chow.kim@...sung.com>,
"lee.jones@...aro.org" <lee.jones@...aro.org>,
'Boris BREZILLON' <boris.brezillon@...e-electrons.com>,
'Geert Uytterhoeven' <geert+renesas@...der.be>,
'Stephen Warren' <swarren@...dia.com>
Subject: RE: [PATCH v3] mfd: syscon: Decouple syscon interface from platform
devices
> > Thanks for testing. In that case I will post this change, as I feel this
> > should be
> > fixed irrespective of my syscon patch.
> >
> > > But as Xiubo pointed in another mail, it may still cause other issues.
> > > Looking at regmap.c, there're still some other places using the device
> > pointer, e.g.
> > > dev_xxx debug information and some tracepoints also take device pointer as
> > > parameter(not sure if it will break if dev is NULL).
> > > Another thing is that if dev is NULL, we may not be able to use regmap
> > debugfs
> > > feature which seems also not as our expected.
> > >
> >
> > I would have preferred to check dev for NULL, as it's only at two places and
> > we could
> > still have debug prints for NULL dev, as normal pr_info instead of dev_info.
> >
> > But Xiubo also pointed out that his patch [1] which updates syscon binding
> > information
> > will be useless if we pass NULL dev in regmap_init_mmio, which he posted
> > today,
> > and it requires dev pointer in "regmap_get_val_endian" function to read DT
> > property.
> >
> > [1]: [PATCH] mfd: syscon: binding: Add syscon endianness support
> > https://lkml.org/lkml/2014/9/18/67
> >
> > So instead of adding dummy device or creating device structure, I would
> > prefer to get actual
> > device pointer corresponding to "np" passed in of_syscon_register function
> > as shown below:
> >
>
> I wonder this may not work at early stage before the devices are populated
> from device tree.
> My initial understanding that one important thing for your patch is
> to address this issue, isn't it?
> Many people have asked for this feature before.
>
My boot log:
...
of_platform_bus_create() - skipping /chosen, no compatible prop
of_platform_bus_create() - skipping /aliases, no compatible prop
of_platform_bus_create() - skipping /memory, no compatible prop
of_platform_bus_create() - skipping /cpus, no compatible prop
create child: /soc/smmu@...0000
create child: /soc/smmu@...0000
create child: /soc/smmu@...0000
create child: /soc/smmu@...0000
create child: /soc/interrupt-controller@...0000
create child: /soc/tzasc@...0000
of_platform_bus_create() - skipping /soc/tzasc@...0000, no compatible prop
create child: /soc/ifc@...0000
create child: /soc/ifc@...0000/nor@0,0
create child: /soc/ifc@...0000/board-control@2,0
create child: /soc/dcfg@...0000
syscon 1ee0000.dcfg: regmap [mem 0x01ee0000-0x01eeffff] registered
create child: /soc/quadspi@...0000
create child: /soc/esdhc@...0000
create child: /soc/scfg@...0000
create child: /soc/crypto@...0000
create child: /soc/sfp@...0000
of_platform_bus_create() - skipping /soc/sfp@...0000, no compatible prop
create child: /soc/snvs@...0000
of_platform_bus_create() - skipping /soc/snvs@...0000, no compatible prop
create child: /soc/serdes1@...0000
of_platform_bus_create() - skipping /soc/serdes1@...0000, no compatible prop
create child: /soc/clocking@...1000
create child: /soc/rcpm@...2000
create child: /soc/dspi@...0000
create child: /soc/dspi@...0000
create child: /soc/i2c@...0000
create child: /soc/i2c@...0000
create child: /soc/i2c@...0000
create child: /soc/serial@...0500
create child: /soc/serial@...0600
create child: /soc/serial@...0500
create child: /soc/serial@...0600
create child: /soc/gpio@...0000
create child: /soc/gpio@...0000
create child: /soc/gpio@...0000
create child: /soc/gpio@...0000
create child: /soc/uqe@...0000
create child: /soc/uqe@...0000/qeic@80
create child: /soc/uqe@...0000/ucc@...0
irq: no irq domain found for /soc/uqe@...0000/qeic@80 !
create child: /soc/uqe@...0000/ucc@...0
irq: no irq domain found for /soc/uqe@...0000/qeic@80 !
create child: /soc/uqe@...0000/muram@...00
create child: /soc/uqe@...0000/si@700
create child: /soc/uqe@...0000/siram@...0
create child: /soc/serial@...0000
create child: /soc/serial@...0000
create child: /soc/serial@...0000
create child: /soc/serial@...0000
create child: /soc/serial@...0000
create child: /soc/serial@...0000
create child: /soc/ftm0_1@...0000
create child: /soc/ftm@...0000
of_platform_bus_create() - skipping /soc/ftm@...0000, no compatible prop
create child: /soc/ftm@...0000
create child: /soc/ftm@...0000
of_platform_bus_create() - skipping /soc/ftm@...0000, no compatible prop
create child: /soc/ftm@...0000
of_platform_bus_create() - skipping /soc/ftm@...0000, no compatible prop
create child: /soc/ftm@...0000
create child: /soc/ftm@...0000
create child: /soc/wdog@...0000
create child: /soc/sai@...0000
create child: /soc/edma@...0000
create child: /soc/dcu@...0000
create child: /soc/mdio@...4000
create child: /soc/ptp_clock@...0e00
create child: /soc/ethernet@...0000
create child: /soc/ethernet@...0000
create child: /soc/ethernet@...0000
create child: /soc/usb@...0000
create child: /soc/usb3@...0000
create child: /soc/can@...0000
create child: /soc/can@...0000
create child: /soc/can@...0000
create child: /soc/can@...0000
create child: /soc/pcie@...0000
create child: /soc/pcie@...0000
create child: /dcsr@...00000/dcsr-epu@0
create child: /dcsr@...00000/dcsr-gdi@...000
create child: /dcsr@...00000/dcsr-dddi@...000
create child: /dcsr@...00000/dcsr-dcfg@...000
create child: /dcsr@...00000/dcsr-clock@...000
create child: /dcsr@...00000/dcsr-rcpm@...000
create child: /dcsr@...00000/dcsr-ccp@...000
create child: /dcsr@...00000/dcsr-fusectrl@...000
create child: /dcsr@...00000/dcsr-dap@...000
create child: /dcsr@...00000/dcsr-cstf@...000
create child: /dcsr@...00000/dcsr-a7rom@...000
create child: /dcsr@...00000/dcsr-a7cpu@...000
create child: /dcsr@...00000/dcsr-a7cti@...000
create child: /dcsr@...00000/dcsr-etm@...000
create child: /dcsr@...00000/dcsr-hugorom@...000
create child: /dcsr@...00000/dcsr-etf@...000
create child: /dcsr@...00000/dcsr-etr@...000
create child: /dcsr@...00000/dcsr-cti@...000
create child: /dcsr@...00000/dcsr-atbrepl@...000
create child: /dcsr@...00000/dcsr-tsgen-ctrl@...000
create child: /dcsr@...00000/dcsr-tsgen-read@...000
create child: /regulators/regulator@0
...
As default the Linux will create all the platform device for each DT node, which
Can be found from "drivers/of/platform.c".
So we can get the pdev node using the specified DT node, and feel safe to use
it as Pankaj's patch does.
And also we must make sure that the 'syscon' DT nodes has the compatible prop.
Thanks,
BRs
Xiubo
> Regards
> Dong Aisheng
>
> > ----
> > static struct syscon *of_syscon_register(struct device_node *np)
> > {
> > + struct platform_device *pdev;
> > struct syscon *syscon;
> > struct regmap *regmap;
> > void __iomem *base;
> > @@ -142,7 +144,11 @@ static struct syscon *of_syscon_register(struct
> > device_node *np)
> > if (!base)
> > return ERR_PTR(-ENOMEM);
> >
> > - regmap = regmap_init_mmio(NULL, base, &syscon_regmap_config);
> > + pdev = of_find_device_by_node(np);
> > + if (!(&pdev->dev))
> > + return ERR_PTR(-ENODEV);
> > +
> > + regmap = regmap_init_mmio(&pdev->dev, base, &syscon_regmap_config);
> > if (IS_ERR(regmap)) {
> > pr_err("regmap init failed\n");
> > return ERR_CAST(regmap);
> > -------
> >
> > I have tested this in linux-next and it works well. In this way there won't
> > be any issues of
> > dereferencing NULL pointer in regmap.c and at the same time, if DT has
> > {big,little}-endian
> > optional property in syscon device node, it will be taken care.
> >
> > So I would wait for Arnd's opinion about above mentioned changes and then
> > post a new
> > change after addressing Arnd's minor comment along with this fix in next
> > revision.
> >
> >
> > Thanks,
> > Pankaj Dubey
> > > Maybe we could consider create device structure for each syscon compatible
> > device in
> > > syscon driver in of_syscon_register in first time which seems to be
> > reasonable.
> > >
> > > Regards
> > > Dong Aisheng
> > >
> > > > --------------------------------------------
> > > > Subject: [PATCH] regmap: fix NULL pointer dereference in
> > > > regmap_get_val_endian
> > > >
> > > > Recent commits for getting reg endianess causing NULL pointer
> > > > dereference if dev is passed NULL in regmap_init_mmio. This patch
> > > > fixes this issue, and allows to parse reg endianess only if dev and
> > > > dev->of_node exist.
> > > >
> > > > Signed-off-by: Pankaj Dubey <pankaj.dubey@...sung.com>
> > > > ---
> > > > drivers/base/regmap/regmap.c | 23 ++++++++++++++---------
> > > > 1 file changed, 14 insertions(+), 9 deletions(-)
> > > >
> > > > diff --git a/drivers/base/regmap/regmap.c
> > > > b/drivers/base/regmap/regmap.c index f2281af..455a877 100644
> > > > --- a/drivers/base/regmap/regmap.c
> > > > +++ b/drivers/base/regmap/regmap.c
> > > > @@ -477,7 +477,7 @@ static enum regmap_endian
> > > > regmap_get_val_endian(struct device *dev,
> > > > const struct regmap_bus *bus,
> > > > const struct regmap_config *config)
> > {
> > > > - struct device_node *np = dev->of_node;
> > > > + struct device_node *np;
> > > > enum regmap_endian endian;
> > > >
> > > > /* Retrieve the endianness specification from the regmap config
> */
> > > > @@ -487,15 +487,20 @@ static enum regmap_endian
> > > > regmap_get_val_endian(struct device *dev,
> > > > if (endian != REGMAP_ENDIAN_DEFAULT)
> > > > return endian;
> > > >
> > > > - /* Parse the device's DT node for an endianness specification */
> > > > - if (of_property_read_bool(np, "big-endian"))
> > > > - endian = REGMAP_ENDIAN_BIG;
> > > > - else if (of_property_read_bool(np, "little-endian"))
> > > > - endian = REGMAP_ENDIAN_LITTLE;
> > > > + /* If the dev and dev->of_node exist try to get endianness from
> DT
> > > > */
> > > > + if (dev && dev->of_node) {
> > > > + np = dev->of_node;
> > > >
> > > > - /* If the endianness was specified in DT, use that */
> > > > - if (endian != REGMAP_ENDIAN_DEFAULT)
> > > > - return endian;
> > > > + /* Parse the device's DT node for an endianness
> > > > specification */
> > > > + if (of_property_read_bool(np, "big-endian"))
> > > > + endian = REGMAP_ENDIAN_BIG;
> > > > + else if (of_property_read_bool(np, "little-endian"))
> > > > + endian = REGMAP_ENDIAN_LITTLE;
> > > > +
> > > > + /* If the endianness was specified in DT, use that */
> > > > + if (endian != REGMAP_ENDIAN_DEFAULT)
> > > > + return endian;
> > > > + }
> > > >
> > > > /* Retrieve the endianness specification from the bus config */
> > > > if (bus && bus->val_format_endian_default)
> > > > --
> > > >
> > > > Thanks,
> > > > Pankaj Dubey
> > > >
> > > > > Regards
> > > > > Dong Aisheng
> > > > >
> > > > > >
> > > > > > Thanks,
> > > > > > Pankaj Dubey
> > > > > >
> > > > > > > Regards
> > > > > > > Dong Aisheng
> > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > > _______________________________________________
> > > > > > > > linux-arm-kernel mailing list
> > > > > > > > linux-arm-kernel@...ts.infradead.org
> > > > > > > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
> > > > > >
> > > >
> >
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists