[...] > > I think there should have been a check for NULL on "dev" in > > "regmap_get_val_endian", so that if dev pointer exist then only it makes > > sense to get > > endianness property from DT. > > > > I will suggest following fix in regmap.c for this. With following fix I > > tested it and it works well > > on linux-next also. So if you can confirm following fix is working for you > > then I can post this > > patch. > > > > I tested the patch work. > 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. > > 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@xxxxxxxxxxx> > > --- > > 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; And the 'np' must be NULL as default. Isn't it ? Thanks, BRs Xiubo > > 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@xxxxxxxxxxxxxxxxxxx > > > > > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > > > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html