Messages in this thread | | | Date | Fri, 02 Sep 2011 22:22:58 +0200 | From | Lars-Peter Clausen <> | Subject | Re: [PATCH 3/8] regmap: Add the rbtree cache support |
| |
On 09/02/2011 05:46 PM, Dimitris Papastamos wrote: > This patch adds support for the rbtree cache compression type. > > Each rbnode manages a variable length block of registers. There can be no > two nodes with overlapping blocks. Each block has a base register and a > currently top register, all the other registers, if any, lie in between these > two and in ascending order. > > The reasoning behind the construction of this rbtree is simple. In the > snd_soc_rbtree_cache_init() function, we iterate over the register defaults > provided by the regcache core. For each register value that is non-zero we > insert it in the rbtree. In order to determine in which rbnode we need > to add the register, we first look if there is another register already > added that is adjacent to the one we are about to add. If that is the case > we append it in that rbnode block, otherwise we create a new rbnode > with a single register in its block and add it to the tree. > > There are various optimizations across the implementation to speed up lookups > by caching the most recently used rbnode. > > Signed-off-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> > [...] > + > +static int regcache_rbtree_init(struct regmap *map) > +{ > + struct regcache_rbtree_ctx *rbtree_ctx; > + int i; > + int ret; > + > + map->cache = kmalloc(sizeof *rbtree_ctx, GFP_KERNEL); > + if (!map->cache) > + return -ENOMEM; > + > + rbtree_ctx = map->cache; > + rbtree_ctx->root = RB_ROOT; > + rbtree_ctx->cached_rbnode = NULL; > + > + if (!map->cache_defaults) > + return 0; > + > + for (i = 0; i < map->num_cache_defaults_raw; ++i) { > + ret = regcache_lookup_reg(map, i); > + if (ret < 0) > + continue; > + ret = regcache_rbtree_write(map, > + map->cache_defaults[ret].reg, > + map->cache_defaults[ret].def); > + if (ret) > + goto err; > + }
You can iterate over the caches_defaults elements directly.
[...] > diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c > index dfefe40..2b148d4 100644 > --- a/drivers/base/regmap/regcache.c > +++ b/drivers/base/regmap/regcache.c > @@ -19,6 +19,9 @@ static const struct regcache_ops *cache_types[] = { > #ifdef CONFIG_REGCACHE_INDEXED > ®cache_indexed_ops, > #endif > +#ifdef CONFIG_REGCACHE_RBTREE
This symbol is also not defined. It looks as if all the Kconfig changes are not included in the patchset.
> + ®cache_rbtree_ops, > +#endif > };
| |