Messages in this thread |  | | Date | Mon, 05 Sep 2011 18:22:36 +0200 | | From | Lars-Peter Clausen <> | | Subject | Re: [PATCH 6/6] regmap: Incorporate the regcache core into regmap |
| |
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);
|  |