regmap: fix NULL pointer dereference in regmap_get_val_endian
authorPankaj Dubey <pankaj.dubey@samsung.com>
Thu, 18 Sep 2014 09:42:20 +0000 (15:12 +0530)
committerMark Brown <broonie@kernel.org>
Thu, 18 Sep 2014 17:55:31 +0000 (10:55 -0700)
Recents commits for getting reg endianness causing NULL pointer
dereference if dev is passed NULL in regmap_init_mmio. This patch
fixes this issue, and allows to parse reg endianness only if dev
and dev->of_node exist.

Signed-off-by: Pankaj Dubey <pankaj.dubey@samsung.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/regmap.c

index 01ae4b829360ea59355fa6cfca6e159e0754af36..fd7ae9a10c4d707864b0671299918eb33a964af3 100644 (file)
@@ -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)