]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/base/regmap/regmap.c
Merge remote-tracking branch 'regmap/topic/smbus' into regmap-next
[karo-tx-linux.git] / drivers / base / regmap / regmap.c
index 2615cc180d35401961304eb94d60144241efa147..74d8c0672cf6162e9d3d28afbd68f742a5ecb732 100644 (file)
@@ -35,10 +35,14 @@ static int _regmap_update_bits(struct regmap *map, unsigned int reg,
                               unsigned int mask, unsigned int val,
                               bool *change);
 
+static int _regmap_bus_reg_read(void *context, unsigned int reg,
+                               unsigned int *val);
 static int _regmap_bus_read(void *context, unsigned int reg,
                            unsigned int *val);
 static int _regmap_bus_formatted_write(void *context, unsigned int reg,
                                       unsigned int val);
+static int _regmap_bus_reg_write(void *context, unsigned int reg,
+                                unsigned int val);
 static int _regmap_bus_raw_write(void *context, unsigned int reg,
                                 unsigned int val);
 
@@ -535,6 +539,12 @@ struct regmap *regmap_init(struct device *dev,
                map->reg_read  = config->reg_read;
                map->reg_write = config->reg_write;
 
+               map->defer_caching = false;
+               goto skip_format_initialization;
+       } else if (!bus->read || !bus->write) {
+               map->reg_read = _regmap_bus_reg_read;
+               map->reg_write = _regmap_bus_reg_write;
+
                map->defer_caching = false;
                goto skip_format_initialization;
        } else {
@@ -1336,6 +1346,14 @@ static int _regmap_bus_formatted_write(void *context, unsigned int reg,
        return ret;
 }
 
+static int _regmap_bus_reg_write(void *context, unsigned int reg,
+                                unsigned int val)
+{
+       struct regmap *map = context;
+
+       return map->bus->reg_write(map->bus_context, reg, val);
+}
+
 static int _regmap_bus_raw_write(void *context, unsigned int reg,
                                 unsigned int val)
 {
@@ -1980,6 +1998,14 @@ static int _regmap_raw_read(struct regmap *map, unsigned int reg, void *val,
        return ret;
 }
 
+static int _regmap_bus_reg_read(void *context, unsigned int reg,
+                               unsigned int *val)
+{
+       struct regmap *map = context;
+
+       return map->bus->reg_read(map->bus_context, reg, val);
+}
+
 static int _regmap_bus_read(void *context, unsigned int reg,
                            unsigned int *val)
 {