blob: 268497aee46dac4009729e692c0a4bd5feb85b37 [file] [log] [blame]
Dimitris Papastamos195af652011-09-19 14:34:01 +01001/*
2 * Register cache access API - indexed caching support
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/slab.h>
14
15#include "internal.h"
16
17static int regcache_indexed_read(struct regmap *map, unsigned int reg,
18 unsigned int *value)
19{
20 int ret;
21
22 ret = regcache_lookup_reg(map, reg);
23 if (ret < 0)
24 *value = 0;
25 else
26 *value = map->reg_defaults[ret].def;
27 return 0;
28}
29
30static int regcache_indexed_write(struct regmap *map, unsigned int reg,
31 unsigned int value)
32{
33 int ret;
34
35 ret = regcache_lookup_reg(map, reg);
36 if (ret < 0)
37 return regcache_insert_reg(map, reg, value);
38 map->reg_defaults[ret].def = value;
39 return 0;
40}
41
42static int regcache_indexed_sync(struct regmap *map)
43{
Dimitris Papastamosdfdc4442011-09-27 11:25:04 +010044 unsigned int i;
Dimitris Papastamos195af652011-09-19 14:34:01 +010045 int ret;
46
47 for (i = 0; i < map->num_reg_defaults; i++) {
48 ret = regmap_write(map, map->reg_defaults[i].reg,
49 map->reg_defaults[i].def);
50 if (ret < 0)
51 return ret;
52 dev_dbg(map->dev, "Synced register %#x, value %#x\n",
53 map->reg_defaults[i].reg,
54 map->reg_defaults[i].def);
55 }
56 return 0;
57}
58
59struct regcache_ops regcache_indexed_ops = {
60 .type = REGCACHE_INDEXED,
61 .name = "indexed",
62 .read = regcache_indexed_read,
63 .write = regcache_indexed_write,
64 .sync = regcache_indexed_sync
65};