diff options
author | Mark Brown <broonie@linaro.org> | 2013-08-31 19:25:13 +0100 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2013-08-31 19:25:13 +0100 |
commit | 3dedb61ec7a62ba669d07c604ebfa28598b569f2 (patch) | |
tree | ba7032a969555d34b456537e8bfc8d28e48e6f6a /drivers/base/regmap/regmap.c | |
parent | 1801ceaf073f77e0f2ccfbd54ee0e93bd6adbb5d (diff) | |
parent | aab13ebca2c67c3b8f004a013a36f661a3950b00 (diff) |
Merge remote-tracking branch 'regmap/topic/patch' into regmap-next
Diffstat (limited to 'drivers/base/regmap/regmap.c')
-rw-r--r-- | drivers/base/regmap/regmap.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c index 0e85367e504..ff58f3847c0 100644 --- a/drivers/base/regmap/regmap.c +++ b/drivers/base/regmap/regmap.c @@ -1891,13 +1891,10 @@ EXPORT_SYMBOL_GPL(regmap_async_complete); int regmap_register_patch(struct regmap *map, const struct reg_default *regs, int num_regs) { + struct reg_default *p; int i, ret; bool bypass; - /* If needed the implementation can be extended to support this */ - if (map->patch) - return -EBUSY; - map->lock(map->lock_arg); bypass = map->cache_bypass; @@ -1914,11 +1911,13 @@ int regmap_register_patch(struct regmap *map, const struct reg_default *regs, } } - map->patch = kcalloc(num_regs, sizeof(struct reg_default), GFP_KERNEL); - if (map->patch != NULL) { - memcpy(map->patch, regs, - num_regs * sizeof(struct reg_default)); - map->patch_regs = num_regs; + p = krealloc(map->patch, + sizeof(struct reg_default) * (map->patch_regs + num_regs), + GFP_KERNEL); + if (p) { + memcpy(p + map->patch_regs, regs, num_regs * sizeof(*regs)); + map->patch = p; + map->patch_regs += num_regs; } else { ret = -ENOMEM; } |