]> Git Repo - linux.git/commitdiff
Merge remote-tracking branch 'regmap/topic/dt-endian' into regmap-next
authorMark Brown <[email protected]>
Mon, 29 Sep 2014 19:49:42 +0000 (20:49 +0100)
committerMark Brown <[email protected]>
Mon, 29 Sep 2014 19:49:42 +0000 (20:49 +0100)
1  2 
drivers/base/regmap/regmap.c

index 3a785a4f4ff6b0259b4d4082f716f0d1548d290c,fd7ae9a10c4d707864b0671299918eb33a964af3..d2f8a818d20068af51a2d30d74d37e7ebea77db2
@@@ -15,6 -15,7 +15,7 @@@
  #include <linux/export.h>
  #include <linux/mutex.h>
  #include <linux/err.h>
+ #include <linux/of.h>
  #include <linux/rbtree.h>
  #include <linux/sched.h>
  
@@@ -109,7 -110,7 +110,7 @@@ bool regmap_readable(struct regmap *map
  
  bool regmap_volatile(struct regmap *map, unsigned int reg)
  {
 -      if (!regmap_readable(map, reg))
 +      if (!map->format.format_write && !regmap_readable(map, reg))
                return false;
  
        if (map->volatile_reg)
@@@ -448,6 -449,71 +449,71 @@@ int regmap_attach_dev(struct device *de
  }
  EXPORT_SYMBOL_GPL(regmap_attach_dev);
  
+ static enum regmap_endian regmap_get_reg_endian(const struct regmap_bus *bus,
+                                       const struct regmap_config *config)
+ {
+       enum regmap_endian endian;
+       /* Retrieve the endianness specification from the regmap config */
+       endian = config->reg_format_endian;
+       /* If the regmap config specified a non-default value, use that */
+       if (endian != REGMAP_ENDIAN_DEFAULT)
+               return endian;
+       /* Retrieve the endianness specification from the bus config */
+       if (bus && bus->reg_format_endian_default)
+               endian = bus->reg_format_endian_default;
+       /* If the bus specified a non-default value, use that */
+       if (endian != REGMAP_ENDIAN_DEFAULT)
+               return endian;
+       /* Use this if no other value was found */
+       return REGMAP_ENDIAN_BIG;
+ }
+ 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;
+       enum regmap_endian endian;
+       /* Retrieve the endianness specification from the regmap config */
+       endian = config->val_format_endian;
+       /* If the regmap config specified a non-default value, use that */
+       if (endian != REGMAP_ENDIAN_DEFAULT)
+               return endian;
+       /* If the dev and dev->of_node exist try to get endianness from DT */
+       if (dev && dev->of_node) {
+               np = dev->of_node;
+               /* 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)
+               endian = bus->val_format_endian_default;
+       /* If the bus specified a non-default value, use that */
+       if (endian != REGMAP_ENDIAN_DEFAULT)
+               return endian;
+       /* Use this if no other value was found */
+       return REGMAP_ENDIAN_BIG;
+ }
  /**
   * regmap_init(): Initialise register map
   *
@@@ -551,17 -617,8 +617,8 @@@ struct regmap *regmap_init(struct devic
                map->reg_read  = _regmap_bus_read;
        }
  
-       reg_endian = config->reg_format_endian;
-       if (reg_endian == REGMAP_ENDIAN_DEFAULT)
-               reg_endian = bus->reg_format_endian_default;
-       if (reg_endian == REGMAP_ENDIAN_DEFAULT)
-               reg_endian = REGMAP_ENDIAN_BIG;
-       val_endian = config->val_format_endian;
-       if (val_endian == REGMAP_ENDIAN_DEFAULT)
-               val_endian = bus->val_format_endian_default;
-       if (val_endian == REGMAP_ENDIAN_DEFAULT)
-               val_endian = REGMAP_ENDIAN_BIG;
+       reg_endian = regmap_get_reg_endian(bus, config);
+       val_endian = regmap_get_val_endian(dev, bus, config);
  
        switch (config->reg_bits + map->reg_shift) {
        case 2:
@@@ -1408,7 -1465,7 +1465,7 @@@ int _regmap_write(struct regmap *map, u
        }
  
  #ifdef LOG_DEVICE
 -      if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
 +      if (map->dev && strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
                dev_info(map->dev, "%x <= %x\n", reg, val);
  #endif
  
@@@ -1659,9 -1716,6 +1716,9 @@@ out
        } else {
                void *wval;
  
 +              if (!val_count)
 +                      return -EINVAL;
 +
                wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL);
                if (!wval) {
                        dev_err(map->dev, "Error in memory allocation\n");
@@@ -2061,7 -2115,7 +2118,7 @@@ static int _regmap_read(struct regmap *
        ret = map->reg_read(context, reg, val);
        if (ret == 0) {
  #ifdef LOG_DEVICE
 -              if (strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
 +              if (map->dev && strcmp(dev_name(map->dev), LOG_DEVICE) == 0)
                        dev_info(map->dev, "%x => %x\n", reg, *val);
  #endif
  
This page took 0.11029 seconds and 4 git commands to generate.