• Dimitris Papastamos's avatar
    regmap: Add the rbtree cache support · 28644c80
    Dimitris Papastamos authored
    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: default avatarDimitris Papastamos <dp@opensource.wolfsonmicro.com>
    Tested-by: default avatarLars-Peter Clausen <lars@metafoo.de>
    Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
    28644c80
regcache-rbtree.c 9.87 KB