regmap: Separate regmap dev initialization nodev
authorMichal Simek <michal.simek@xilinx.com>
Mon, 10 Feb 2014 15:22:33 +0000 (16:22 +0100)
committerMark Brown <broonie@linaro.org>
Sun, 16 Feb 2014 01:53:02 +0000 (09:53 +0800)
Create special function regmap_attach_dev
which can be called separately out of regmap_init.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
drivers/base/regmap/regmap.c
include/linux/regmap.h

index 6a19515f8a458b3719fce7325f265a60a4d147a4..43065ceff90f9402f03e752910eeb44c597fa122 100644 (file)
@@ -380,6 +380,28 @@ static void regmap_range_exit(struct regmap *map)
        kfree(map->selector_work_buf);
 }
 
+int regmap_attach_dev(struct device *dev, struct regmap *map,
+                     const struct regmap_config *config)
+{
+       struct regmap **m;
+
+       map->dev = dev;
+
+       regmap_debugfs_init(map, config->name);
+
+       /* Add a devres resource for dev_get_regmap() */
+       m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL);
+       if (!m) {
+               regmap_debugfs_exit(map);
+               return -ENOMEM;
+       }
+       *m = map;
+       devres_add(dev, m);
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(regmap_attach_dev);
+
 /**
  * regmap_init(): Initialise register map
  *
@@ -397,7 +419,7 @@ struct regmap *regmap_init(struct device *dev,
                           void *bus_context,
                           const struct regmap_config *config)
 {
-       struct regmap *map, **m;
+       struct regmap *map;
        int ret = -EINVAL;
        enum regmap_endian reg_endian, val_endian;
        int i, j;
@@ -734,25 +756,18 @@ skip_format_initialization:
                }
        }
 
-       regmap_debugfs_init(map, config->name);
-
        ret = regcache_init(map, config);
        if (ret != 0)
                goto err_range;
 
-       /* Add a devres resource for dev_get_regmap() */
-       m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL);
-       if (!m) {
-               ret = -ENOMEM;
-               goto err_debugfs;
-       }
-       *m = map;
-       devres_add(dev, m);
+       if (dev)
+               ret = regmap_attach_dev(dev, map, config);
+               if (ret != 0)
+                       goto err_regcache;
 
        return map;
 
-err_debugfs:
-       regmap_debugfs_exit(map);
+err_regcache:
        regcache_exit(map);
 err_range:
        regmap_range_exit(map);
index 4149f1a9b00320dfeea8768817b2adbd2d1a4da2..fa4d079fa44c31925d2d023575f12ba173ed14a0 100644 (file)
@@ -317,6 +317,8 @@ struct regmap *regmap_init(struct device *dev,
                           const struct regmap_bus *bus,
                           void *bus_context,
                           const struct regmap_config *config);
+int regmap_attach_dev(struct device *dev, struct regmap *map,
+                                const struct regmap_config *config);
 struct regmap *regmap_init_i2c(struct i2c_client *i2c,
                               const struct regmap_config *config);
 struct regmap *regmap_init_spi(struct spi_device *dev,