Re: [PATCH 6/6] regmap: Incorporate the regcache core into regmap

Lars-Peter Clausen
2011-09-05T16:22:48Z

On 09/05/2011 03:51 PM, Dimitris Papastamos wrote:
> This patch incorporates the regcache core code into regmap. All previous
> patches have been no-ops essentially up to this point.
>
> The bulk read operation is not supported by regcache at the moment. This
> will be implemented incrementally.
>
> Signed-off-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com>
> ---
> drivers/base/regmap/regmap.c | 56 ++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 56 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
> index fa2bd89..df4e00a 100644
> --- a/drivers/base/regmap/regmap.c
> +++ b/drivers/base/regmap/regmap.c
> @@ -146,6 +146,13 @@ struct regmap *regmap_init(struct device *dev,
> map->readable_reg = config->readable_reg;
> map->volatile_reg = config->volatile_reg;
> map->precious_reg = config->precious_reg;
> + map->cache_type = config->cache_type;
> + map->cache_defaults = config->cache_defaults;
> + map->num_cache_defaults = config->num_cache_defaults;
> + map->num_cache_defaults_raw = config->num_cache_defaults_raw;
> + map->cache_defaults_raw = config->cache_defaults_raw;
> + map->cache_size_raw = (config->val_bits / 8) * config->num_cache_defaults_raw;
> + map->cache_word_size = config->val_bits / 8;
>
> switch (config->reg_bits) {
> case 4:
> @@ -201,6 +208,12 @@ struct regmap *regmap_init(struct device *dev,
> goto err_bus;
> }
>
> +#ifdef CONFIG_REGCACHE

CONFIG_REGCACHE is not defined, so we'll end up with no regcache support.

> + ret = regcache_init(map);
> + if (ret < 0)
> + goto err_bus;
> +#endif
> +
> regmap_debugfs_init(map);
>
> return map;
> @@ -219,6 +232,9 @@ EXPORT_SYMBOL_GPL(regmap_init);
> */
> void regmap_exit(struct regmap *map)
> {
> +#ifdef CONFIG_REGCACHE
> + regcache_exit(map);
> +#endif
> regmap_debugfs_exit(map);
> kfree(map->work_buf);
> module_put(map->bus->owner);
> @@ -321,6 +337,20 @@ int regmap_write(struct regmap *map, unsigned int reg, unsigned int val)
>
> mutex_lock(&map->lock);
>
> +#ifdef CONFIG_REGCACHE
> + if (!map->cache_bypass) {
> + ret = regcache_write(map, reg, val);
> + if (ret < 0) {
> + mutex_unlock(&map->lock);
> + return ret;
> + }
> + if (map->cache_only) {
> + mutex_unlock(&map->lock);
> + return 0;
> + }
> + }
> +#endif
> +
> ret = _regmap_write(map, reg, val);
>
> mutex_unlock(&map->lock);
> @@ -422,6 +452,16 @@ int regmap_read(struct regmap *map, unsigned int reg, unsigned int *val)
>
> mutex_lock(&map->lock);
>
> +#ifdef CONFIG_REGCACHE
> + if (!map->cache_bypass) {
> + ret = regcache_read(map, reg, val);
> + if (!ret) {
> + mutex_unlock(&map->lock);
> + return 0;
> + }
> + }

I think this will need tighter integration. For example do we want to fallback
to a hw read when the cached read fails? And also regcache_read will return for
REGCACHE_NONE, which means we neither do a cached read nor a hw read.

> +#endif
> +
> ret = _regmap_read(map, reg, val);
>
> mutex_unlock(&map->lock);