1 // SPDX-License-Identifier: GPL-2.0 2 // 3 // Register cache access API - flat caching support 4 // 5 // Copyright 2012 Wolfson Microelectronics plc 6 // 7 // Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 8 9 #include <linux/device.h> 10 #include <linux/seq_file.h> 11 #include <linux/slab.h> 12 13 #include "internal.h" 14 15 static inline unsigned int regcache_flat_get_index(const struct regmap *map, 16 unsigned int reg) 17 { 18 return regcache_get_index_by_order(map, reg); 19 } 20 21 static int regcache_flat_init(struct regmap *map) 22 { 23 int i; 24 unsigned int *cache; 25 26 if (!map || map->reg_stride_order < 0 || !map->max_register) 27 return -EINVAL; 28 29 map->cache = kcalloc(regcache_flat_get_index(map, map->max_register) 30 + 1, sizeof(unsigned int), GFP_KERNEL); 31 if (!map->cache) 32 return -ENOMEM; 33 34 cache = map->cache; 35 36 for (i = 0; i < map->num_reg_defaults; i++) { 37 unsigned int reg = map->reg_defaults[i].reg; 38 unsigned int index = regcache_flat_get_index(map, reg); 39 40 cache[index] = map->reg_defaults[i].def; 41 } 42 43 return 0; 44 } 45 46 static int regcache_flat_exit(struct regmap *map) 47 { 48 kfree(map->cache); 49 map->cache = NULL; 50 51 return 0; 52 } 53 54 static int regcache_flat_read(struct regmap *map, 55 unsigned int reg, unsigned int *value) 56 { 57 unsigned int *cache = map->cache; 58 unsigned int index = regcache_flat_get_index(map, reg); 59 60 *value = cache[index]; 61 62 return 0; 63 } 64 65 static int regcache_flat_write(struct regmap *map, unsigned int reg, 66 unsigned int value) 67 { 68 unsigned int *cache = map->cache; 69 unsigned int index = regcache_flat_get_index(map, reg); 70 71 cache[index] = value; 72 73 return 0; 74 } 75 76 struct regcache_ops regcache_flat_ops = { 77 .type = REGCACHE_FLAT, 78 .name = "flat", 79 .init = regcache_flat_init, 80 .exit = regcache_flat_exit, 81 .read = regcache_flat_read, 82 .write = regcache_flat_write, 83 }; 84