Merge branch '3.2-without-smb2' of git://git.samba.org/sfrench/cifs-2.6
[pandora-kernel.git] / drivers / base / regmap / regcache-indexed.c
1 /*
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
17 static 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 = map->reg_defaults[ret].def;
25
26         return ret;
27 }
28
29 static int regcache_indexed_write(struct regmap *map, unsigned int reg,
30                                   unsigned int value)
31 {
32         int ret;
33
34         ret = regcache_lookup_reg(map, reg);
35         if (ret < 0)
36                 return regcache_insert_reg(map, reg, value);
37         map->reg_defaults[ret].def = value;
38         return 0;
39 }
40
41 static int regcache_indexed_sync(struct regmap *map)
42 {
43         unsigned int i;
44         int ret;
45
46         for (i = 0; i < map->num_reg_defaults; i++) {
47                 ret = _regmap_write(map, map->reg_defaults[i].reg,
48                                     map->reg_defaults[i].def);
49                 if (ret < 0)
50                         return ret;
51                 dev_dbg(map->dev, "Synced register %#x, value %#x\n",
52                         map->reg_defaults[i].reg,
53                         map->reg_defaults[i].def);
54         }
55         return 0;
56 }
57
58 struct regcache_ops regcache_indexed_ops = {
59         .type = REGCACHE_INDEXED,
60         .name = "indexed",
61         .read = regcache_indexed_read,
62         .write = regcache_indexed_write,
63         .sync = regcache_indexed_sync
64 };