|
@@ -1888,13 +1888,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;
|
|
@@ -1911,11 +1908,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;
|
|
|
}
|