12ac902ceSMark Brown /* 22ac902ceSMark Brown * Register cache access API - flat caching support 32ac902ceSMark Brown * 42ac902ceSMark Brown * Copyright 2012 Wolfson Microelectronics plc 52ac902ceSMark Brown * 62ac902ceSMark Brown * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 72ac902ceSMark Brown * 82ac902ceSMark Brown * This program is free software; you can redistribute it and/or modify 92ac902ceSMark Brown * it under the terms of the GNU General Public License version 2 as 102ac902ceSMark Brown * published by the Free Software Foundation. 112ac902ceSMark Brown */ 122ac902ceSMark Brown 132ac902ceSMark Brown #include <linux/slab.h> 142ac902ceSMark Brown #include <linux/device.h> 152ac902ceSMark Brown #include <linux/seq_file.h> 162ac902ceSMark Brown 172ac902ceSMark Brown #include "internal.h" 182ac902ceSMark Brown 192ac902ceSMark Brown static int regcache_flat_init(struct regmap *map) 202ac902ceSMark Brown { 212ac902ceSMark Brown int i; 222ac902ceSMark Brown unsigned int *cache; 232ac902ceSMark Brown 242ac902ceSMark Brown map->cache = kzalloc(sizeof(unsigned int) * (map->max_register + 1), 252ac902ceSMark Brown GFP_KERNEL); 262ac902ceSMark Brown if (!map->cache) 272ac902ceSMark Brown return -ENOMEM; 282ac902ceSMark Brown 292ac902ceSMark Brown cache = map->cache; 302ac902ceSMark Brown 312ac902ceSMark Brown for (i = 0; i < map->num_reg_defaults; i++) 322ac902ceSMark Brown cache[map->reg_defaults[i].reg] = map->reg_defaults[i].def; 332ac902ceSMark Brown 342ac902ceSMark Brown return 0; 352ac902ceSMark Brown } 362ac902ceSMark Brown 372ac902ceSMark Brown static int regcache_flat_exit(struct regmap *map) 382ac902ceSMark Brown { 392ac902ceSMark Brown kfree(map->cache); 402ac902ceSMark Brown map->cache = NULL; 412ac902ceSMark Brown 422ac902ceSMark Brown return 0; 432ac902ceSMark Brown } 442ac902ceSMark Brown 452ac902ceSMark Brown static int regcache_flat_read(struct regmap *map, 462ac902ceSMark Brown unsigned int reg, unsigned int *value) 472ac902ceSMark Brown { 482ac902ceSMark Brown unsigned int *cache = map->cache; 492ac902ceSMark Brown 502ac902ceSMark Brown *value = cache[reg]; 512ac902ceSMark Brown 522ac902ceSMark Brown return 0; 532ac902ceSMark Brown } 542ac902ceSMark Brown 552ac902ceSMark Brown static int regcache_flat_write(struct regmap *map, unsigned int reg, 562ac902ceSMark Brown unsigned int value) 572ac902ceSMark Brown { 582ac902ceSMark Brown unsigned int *cache = map->cache; 592ac902ceSMark Brown 602ac902ceSMark Brown cache[reg] = value; 612ac902ceSMark Brown 622ac902ceSMark Brown return 0; 632ac902ceSMark Brown } 642ac902ceSMark Brown 652ac902ceSMark Brown struct regcache_ops regcache_flat_ops = { 662ac902ceSMark Brown .type = REGCACHE_FLAT, 672ac902ceSMark Brown .name = "flat", 682ac902ceSMark Brown .init = regcache_flat_init, 692ac902ceSMark Brown .exit = regcache_flat_exit, 702ac902ceSMark Brown .read = regcache_flat_read, 712ac902ceSMark Brown .write = regcache_flat_write, 722ac902ceSMark Brown }; 73