From 93d49083df46d905cf3c93eb254a571620b12160 Mon Sep 17 00:00:00 2001 From: Dimitris Papastamos Date: Mon, 19 Sep 2011 14:34:01 +0100 Subject: [PATCH] --- yaml --- r: 266985 b: refs/heads/master c: 195af65ca92179ac2b524d35d732dc6fecec2744 h: refs/heads/master i: 266983: 8c57f42884f03e12bb9db3e6c112f433f0088eb2 v: v3 --- [refs] | 2 +- trunk/drivers/base/regmap/Makefile | 2 +- trunk/drivers/base/regmap/internal.h | 1 + trunk/drivers/base/regmap/regcache-indexed.c | 65 ++++++++++++++++++++ trunk/drivers/base/regmap/regcache.c | 1 + trunk/include/linux/regmap.h | 1 + 6 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 trunk/drivers/base/regmap/regcache-indexed.c diff --git a/[refs] b/[refs] index 4b6c06838507..19aaf8e9a7a3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9fabe24e9b1af84509b842731d2beaf85e66681e +refs/heads/master: 195af65ca92179ac2b524d35d732dc6fecec2744 diff --git a/trunk/drivers/base/regmap/Makefile b/trunk/drivers/base/regmap/Makefile index 2e103ea9a3a0..418d151eb30b 100644 --- a/trunk/drivers/base/regmap/Makefile +++ b/trunk/drivers/base/regmap/Makefile @@ -1,4 +1,4 @@ -obj-$(CONFIG_REGMAP) += regmap.o regcache.o +obj-$(CONFIG_REGMAP) += regmap.o regcache.o regcache-indexed.o obj-$(CONFIG_DEBUG_FS) += regmap-debugfs.o obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o diff --git a/trunk/drivers/base/regmap/internal.h b/trunk/drivers/base/regmap/internal.h index 615f5581d5db..5bd5759efd5c 100644 --- a/trunk/drivers/base/regmap/internal.h +++ b/trunk/drivers/base/regmap/internal.h @@ -118,4 +118,5 @@ int regcache_lookup_reg(struct regmap *map, unsigned int reg); int regcache_insert_reg(struct regmap *map, unsigned int reg, unsigned int val); +extern struct regcache_ops regcache_indexed_ops; #endif diff --git a/trunk/drivers/base/regmap/regcache-indexed.c b/trunk/drivers/base/regmap/regcache-indexed.c new file mode 100644 index 000000000000..ff8b44ce044b --- /dev/null +++ b/trunk/drivers/base/regmap/regcache-indexed.c @@ -0,0 +1,65 @@ +/* + * Register cache access API - indexed caching support + * + * Copyright 2011 Wolfson Microelectronics plc + * + * Author: Dimitris Papastamos + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include + +#include "internal.h" + +static int regcache_indexed_read(struct regmap *map, unsigned int reg, + unsigned int *value) +{ + int ret; + + ret = regcache_lookup_reg(map, reg); + if (ret < 0) + *value = 0; + else + *value = map->reg_defaults[ret].def; + return 0; +} + +static int regcache_indexed_write(struct regmap *map, unsigned int reg, + unsigned int value) +{ + int ret; + + ret = regcache_lookup_reg(map, reg); + if (ret < 0) + return regcache_insert_reg(map, reg, value); + map->reg_defaults[ret].def = value; + return 0; +} + +static int regcache_indexed_sync(struct regmap *map) +{ + int i; + int ret; + + for (i = 0; i < map->num_reg_defaults; i++) { + ret = regmap_write(map, map->reg_defaults[i].reg, + map->reg_defaults[i].def); + if (ret < 0) + return ret; + dev_dbg(map->dev, "Synced register %#x, value %#x\n", + map->reg_defaults[i].reg, + map->reg_defaults[i].def); + } + return 0; +} + +struct regcache_ops regcache_indexed_ops = { + .type = REGCACHE_INDEXED, + .name = "indexed", + .read = regcache_indexed_read, + .write = regcache_indexed_write, + .sync = regcache_indexed_sync +}; diff --git a/trunk/drivers/base/regmap/regcache.c b/trunk/drivers/base/regmap/regcache.c index 9575e4c5f34a..22b73ec12fd5 100644 --- a/trunk/drivers/base/regmap/regcache.c +++ b/trunk/drivers/base/regmap/regcache.c @@ -16,6 +16,7 @@ #include "internal.h" static const struct regcache_ops *cache_types[] = { + ®cache_indexed_ops, }; static int regcache_hw_init(struct regmap *map) diff --git a/trunk/include/linux/regmap.h b/trunk/include/linux/regmap.h index 9d8029449292..ae6d3a4cee97 100644 --- a/trunk/include/linux/regmap.h +++ b/trunk/include/linux/regmap.h @@ -23,6 +23,7 @@ struct spi_device; /* An enum of all the supported cache types */ enum regcache_type { REGCACHE_NONE, + REGCACHE_INDEXED, }; /**