regcache-flat.c (1793B)
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 15static 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 21static 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 46static int regcache_flat_exit(struct regmap *map) 47{ 48 kfree(map->cache); 49 map->cache = NULL; 50 51 return 0; 52} 53 54static 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 65static 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 76struct 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};