Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ffdaa48a authored by Mark Brown's avatar Mark Brown
Browse files

ASoC: Suppress restore of default register values for rbtree cache sync



Currently the rbtree code will write out the entire register map when
doing a cache sync which is wasteful and will slow things down. Check
to see if the value we're about to write is the default and don't bother
restoring it if it is, either the value will have been retained or the
device will have been reset and holds the value already.

We should really store the defaults in the nodes but this resolves the
immediate issue.

Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Acked-by: default avatarLiam Girdwood <lrg@ti.com>
parent 0168bf0d
Loading
Loading
Loading
Loading
+6 −1
Original line number Original line Diff line number Diff line
@@ -610,7 +610,7 @@ static int snd_soc_rbtree_cache_sync(struct snd_soc_codec *codec)
	struct rb_node *node;
	struct rb_node *node;
	struct snd_soc_rbtree_node *rbnode;
	struct snd_soc_rbtree_node *rbnode;
	unsigned int regtmp;
	unsigned int regtmp;
	unsigned int val;
	unsigned int val, def;
	int ret;
	int ret;
	int i;
	int i;


@@ -622,6 +622,11 @@ static int snd_soc_rbtree_cache_sync(struct snd_soc_codec *codec)
			WARN_ON(codec->writable_register &&
			WARN_ON(codec->writable_register &&
				codec->writable_register(codec, regtmp));
				codec->writable_register(codec, regtmp));
			val = snd_soc_rbtree_get_register(rbnode, i);
			val = snd_soc_rbtree_get_register(rbnode, i);
			def = snd_soc_get_cache_val(codec->reg_def_copy, i,
						    rbnode->word_size);
			if (val == def)
				continue;

			codec->cache_bypass = 1;
			codec->cache_bypass = 1;
			ret = snd_soc_write(codec, regtmp, val);
			ret = snd_soc_write(codec, regtmp, val);
			codec->cache_bypass = 0;
			codec->cache_bypass = 0;