summaryrefslogtreecommitdiff
path: root/include/sound
diff options
context:
space:
mode:
authorDimitris Papastamos <dp@opensource.wolfsonmicro.com>2010-11-11 10:04:59 +0000
committerMark Brown <broonie@opensource.wolfsonmicro.com>2010-11-11 15:59:22 +0000
commita7f387d5afd5e1102f909ab611370014f1f59ae2 (patch)
treea1a48921d3ec2279d99369b2f7cc0f28165f2fd4 /include/sound
parentcc28fb8e7d55d4d7c1661dc0b236f4faddecdd9e (diff)
downloadlinux-3.10-a7f387d5afd5e1102f909ab611370014f1f59ae2.tar.gz
linux-3.10-a7f387d5afd5e1102f909ab611370014f1f59ae2.tar.bz2
linux-3.10-a7f387d5afd5e1102f909ab611370014f1f59ae2.zip
ASoC: soc-cache: Add support for rbtree based register caching
This patch adds support for rbtree compression when storing the register cache. It does this by not adding any uninitialized registers (those whose value is 0). If any of those registers is written with a nonzero value they get added into the rbtree. Consider a sample device with a large sparse register map. The register indices are between [0, 0x31ff]. An array of 12800 registers is thus created each of which is 2 bytes. This results in a 25kB region. This array normally lives outside soc-core, normally in the driver itself. The original soc-core code would kmemdup this region resulting in 50kB total memory. When using the rbtree compression technique and __devinitconst on the original array the figures are as follows. For this typical device, you might have 100 initialized registers, that is registers that are nonzero by default. We build an rbtree with 100 nodes, each of which is 24 bytes. This results in ~2kB of memory. Assuming that the target arch can freeup the memory used by the initial __devinitconst array, we end up using about ~2kB bytes of actual memory. The memory footprint will increase as uninitialized registers get written and thus new nodes created in the rbtree. In practice, most of those registers are never changed. If the target arch can't freeup the __devinitconst array, we end up using a total of ~27kB. The difference between the rbtree and the LZO caching techniques, is that if using the LZO technique the size of the cache will increase slower as more uninitialized registers get changed. Signed-off-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'include/sound')
-rw-r--r--include/sound/soc.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h
index 10f5932d3d0..af23f422886 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -257,7 +257,8 @@ enum snd_soc_control_type {
enum snd_soc_compress_type {
SND_SOC_NO_COMPRESSION,
- SND_SOC_LZO_COMPRESSION
+ SND_SOC_LZO_COMPRESSION,
+ SND_SOC_RBTREE_COMPRESSION
};
int snd_soc_register_platform(struct device *dev,