diff options
| -rw-r--r-- | drivers/base/regmap/Makefile | 2 | ||||
| -rw-r--r-- | drivers/base/regmap/internal.h | 1 | ||||
| -rw-r--r-- | drivers/base/regmap/regcache-flat.c | 72 | ||||
| -rw-r--r-- | drivers/base/regmap/regcache.c | 1 | ||||
| -rw-r--r-- | include/linux/regmap.h | 3 | 
5 files changed, 77 insertions, 2 deletions
diff --git a/drivers/base/regmap/Makefile b/drivers/base/regmap/Makefile index 5e75d1b683e..cf129980abd 100644 --- a/drivers/base/regmap/Makefile +++ b/drivers/base/regmap/Makefile @@ -1,5 +1,5 @@  obj-$(CONFIG_REGMAP) += regmap.o regcache.o -obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o +obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o regcache-flat.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/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h index 401d1919635..e22bb80edff 100644 --- a/drivers/base/regmap/internal.h +++ b/drivers/base/regmap/internal.h @@ -177,5 +177,6 @@ int regcache_lookup_reg(struct regmap *map, unsigned int reg);  extern struct regcache_ops regcache_rbtree_ops;  extern struct regcache_ops regcache_lzo_ops; +extern struct regcache_ops regcache_flat_ops;  #endif diff --git a/drivers/base/regmap/regcache-flat.c b/drivers/base/regmap/regcache-flat.c new file mode 100644 index 00000000000..d9762e41959 --- /dev/null +++ b/drivers/base/regmap/regcache-flat.c @@ -0,0 +1,72 @@ +/* + * Register cache access API - flat caching support + * + * Copyright 2012 Wolfson Microelectronics plc + * + * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> + * + * 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 <linux/slab.h> +#include <linux/device.h> +#include <linux/seq_file.h> + +#include "internal.h" + +static int regcache_flat_init(struct regmap *map) +{ +	int i; +	unsigned int *cache; + +	map->cache = kzalloc(sizeof(unsigned int) * (map->max_register + 1), +			     GFP_KERNEL); +	if (!map->cache) +		return -ENOMEM; + +	cache = map->cache; + +	for (i = 0; i < map->num_reg_defaults; i++) +		cache[map->reg_defaults[i].reg] = map->reg_defaults[i].def; + +	return 0; +} + +static int regcache_flat_exit(struct regmap *map) +{ +	kfree(map->cache); +	map->cache = NULL; + +	return 0; +} + +static int regcache_flat_read(struct regmap *map, +			      unsigned int reg, unsigned int *value) +{ +	unsigned int *cache = map->cache; + +	*value = cache[reg]; + +	return 0; +} + +static int regcache_flat_write(struct regmap *map, unsigned int reg, +			       unsigned int value) +{ +	unsigned int *cache = map->cache; + +	cache[reg] = value; + +	return 0; +} + +struct regcache_ops regcache_flat_ops = { +	.type = REGCACHE_FLAT, +	.name = "flat", +	.init = regcache_flat_init, +	.exit = regcache_flat_exit, +	.read = regcache_flat_read, +	.write = regcache_flat_write, +}; diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c index 835883bda97..e69ff3e4742 100644 --- a/drivers/base/regmap/regcache.c +++ b/drivers/base/regmap/regcache.c @@ -22,6 +22,7 @@  static const struct regcache_ops *cache_types[] = {  	®cache_rbtree_ops,  	®cache_lzo_ops, +	®cache_flat_ops,  };  static int regcache_hw_init(struct regmap *map) diff --git a/include/linux/regmap.h b/include/linux/regmap.h index b7e95bf942c..390d879d473 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -28,7 +28,8 @@ struct regmap_range_cfg;  enum regcache_type {  	REGCACHE_NONE,  	REGCACHE_RBTREE, -	REGCACHE_COMPRESSED +	REGCACHE_COMPRESSED, +	REGCACHE_FLAT,  };  /**  |