ASoC: soc-cache: Introduce the cache_bypass option
authorDimitris Papastamos <dp@opensource.wolfsonmicro.com>
Wed, 19 Jan 2011 14:53:36 +0000 (14:53 +0000)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Thu, 20 Jan 2011 13:40:30 +0000 (13:40 +0000)
This is primarily needed to avoid writing back to the cache
whenever we are syncing the cache with the hardware.  This gives a
performance benefit especially for large register maps.

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>
include/sound/soc.h
sound/soc/soc-cache.c

index d244f90137670982fbf384d28dcefc49ab402748..c184f84a354c74fc8c6f321a497146f3acf0722c 100644 (file)
@@ -488,6 +488,7 @@ struct snd_soc_codec {
        /* runtime */
        struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
        unsigned int active;
+       unsigned int cache_bypass:1; /* Suppress access to the cache */
        unsigned int cache_only:1;  /* Suppress writes to hardware */
        unsigned int cache_sync:1; /* Cache needs to be synced to hardware */
        unsigned int suspended:1; /* Codec is in suspend PM state */
index d97a59f6a249aba058f6a1f13706ff7eef494ac4..1ebff9f12b4e924666bd830c754ae63fdcb2c113 100644 (file)
@@ -25,7 +25,8 @@ static unsigned int snd_soc_4_12_read(struct snd_soc_codec *codec,
        unsigned int val;
 
        if (reg >= codec->driver->reg_cache_size ||
-               snd_soc_codec_volatile_register(codec, reg)) {
+               snd_soc_codec_volatile_register(codec, reg) ||
+               codec->cache_bypass) {
                        if (codec->cache_only)
                                return -1;
 
@@ -49,7 +50,8 @@ static int snd_soc_4_12_write(struct snd_soc_codec *codec, unsigned int reg,
        data[1] = value & 0x00ff;
 
        if (!snd_soc_codec_volatile_register(codec, reg) &&
-               reg < codec->driver->reg_cache_size) {
+               reg < codec->driver->reg_cache_size &&
+               !codec->cache_bypass) {
                ret = snd_soc_cache_write(codec, reg, value);
                if (ret < 0)
                        return -1;
@@ -106,7 +108,8 @@ static unsigned int snd_soc_7_9_read(struct snd_soc_codec *codec,
        unsigned int val;
 
        if (reg >= codec->driver->reg_cache_size ||
-               snd_soc_codec_volatile_register(codec, reg)) {
+               snd_soc_codec_volatile_register(codec, reg) ||
+               codec->cache_bypass) {
                        if (codec->cache_only)
                                return -1;
 
@@ -130,7 +133,8 @@ static int snd_soc_7_9_write(struct snd_soc_codec *codec, unsigned int reg,
        data[1] = value & 0x00ff;
 
        if (!snd_soc_codec_volatile_register(codec, reg) &&
-               reg < codec->driver->reg_cache_size) {
+               reg < codec->driver->reg_cache_size &&
+               !codec->cache_bypass) {
                ret = snd_soc_cache_write(codec, reg, value);
                if (ret < 0)
                        return -1;
@@ -191,7 +195,8 @@ static int snd_soc_8_8_write(struct snd_soc_codec *codec, unsigned int reg,
        data[1] = value & 0xff;
 
        if (!snd_soc_codec_volatile_register(codec, reg) &&
-               reg < codec->driver->reg_cache_size) {
+               reg < codec->driver->reg_cache_size &&
+               !codec->cache_bypass) {
                ret = snd_soc_cache_write(codec, reg, value);
                if (ret < 0)
                        return -1;
@@ -216,7 +221,8 @@ static unsigned int snd_soc_8_8_read(struct snd_soc_codec *codec,
 
        reg &= 0xff;
        if (reg >= codec->driver->reg_cache_size ||
-               snd_soc_codec_volatile_register(codec, reg)) {
+               snd_soc_codec_volatile_register(codec, reg) ||
+               codec->cache_bypass) {
                        if (codec->cache_only)
                                return -1;
 
@@ -271,7 +277,8 @@ static int snd_soc_8_16_write(struct snd_soc_codec *codec, unsigned int reg,
        data[2] = value & 0xff;
 
        if (!snd_soc_codec_volatile_register(codec, reg) &&
-               reg < codec->driver->reg_cache_size) {
+               reg < codec->driver->reg_cache_size &&
+               !codec->cache_bypass) {
                ret = snd_soc_cache_write(codec, reg, value);
                if (ret < 0)
                        return -1;
@@ -295,7 +302,8 @@ static unsigned int snd_soc_8_16_read(struct snd_soc_codec *codec,
        unsigned int val;
 
        if (reg >= codec->driver->reg_cache_size ||
-           snd_soc_codec_volatile_register(codec, reg)) {
+           snd_soc_codec_volatile_register(codec, reg) ||
+           codec->cache_bypass) {
                if (codec->cache_only)
                        return -1;
 
@@ -450,7 +458,8 @@ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
 
        reg &= 0xff;
        if (reg >= codec->driver->reg_cache_size ||
-               snd_soc_codec_volatile_register(codec, reg)) {
+               snd_soc_codec_volatile_register(codec, reg) ||
+               codec->cache_bypass) {
                        if (codec->cache_only)
                                return -1;
 
@@ -476,7 +485,8 @@ static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
 
        reg &= 0xff;
        if (!snd_soc_codec_volatile_register(codec, reg) &&
-               reg < codec->driver->reg_cache_size) {
+               reg < codec->driver->reg_cache_size &&
+               !codec->cache_bypass) {
                ret = snd_soc_cache_write(codec, reg, value);
                if (ret < 0)
                        return -1;
@@ -568,7 +578,8 @@ static unsigned int snd_soc_16_16_read(struct snd_soc_codec *codec,
        unsigned int val;
 
        if (reg >= codec->driver->reg_cache_size ||
-           snd_soc_codec_volatile_register(codec, reg)) {
+           snd_soc_codec_volatile_register(codec, reg) ||
+           codec->cache_bypass) {
                if (codec->cache_only)
                        return -1;
 
@@ -595,7 +606,8 @@ static int snd_soc_16_16_write(struct snd_soc_codec *codec, unsigned int reg,
        data[3] = value & 0xff;
 
        if (!snd_soc_codec_volatile_register(codec, reg) &&
-               reg < codec->driver->reg_cache_size) {
+               reg < codec->driver->reg_cache_size &&
+               !codec->cache_bypass) {
                ret = snd_soc_cache_write(codec, reg, value);
                if (ret < 0)
                        return -1;