diff options
-rw-r--r-- | include/sound/soc.h | 1 | ||||
-rw-r--r-- | sound/soc/soc-cache.c | 10 | ||||
-rw-r--r-- | sound/soc/soc-core.c | 15 |
3 files changed, 6 insertions, 20 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h index 3f7de6f992c0..62f320f56644 100644 --- a/include/sound/soc.h +++ b/include/sound/soc.h | |||
@@ -687,7 +687,6 @@ struct snd_soc_codec { | |||
687 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); | 687 | unsigned int (*read)(struct snd_soc_codec *, unsigned int); |
688 | int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); | 688 | int (*write)(struct snd_soc_codec *, unsigned int, unsigned int); |
689 | void *reg_cache; | 689 | void *reg_cache; |
690 | const void *reg_def_copy; | ||
691 | const struct snd_soc_cache_ops *cache_ops; | 690 | const struct snd_soc_cache_ops *cache_ops; |
692 | struct mutex cache_rw_mutex; | 691 | struct mutex cache_rw_mutex; |
693 | int val_bytes; | 692 | int val_bytes; |
diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c index eaa898f8d808..a7f83c0c62ce 100644 --- a/sound/soc/soc-cache.c +++ b/sound/soc/soc-cache.c | |||
@@ -78,8 +78,8 @@ static int snd_soc_flat_cache_sync(struct snd_soc_codec *codec) | |||
78 | ret = snd_soc_cache_read(codec, i, &val); | 78 | ret = snd_soc_cache_read(codec, i, &val); |
79 | if (ret) | 79 | if (ret) |
80 | return ret; | 80 | return ret; |
81 | if (codec->reg_def_copy) | 81 | if (codec_drv->reg_cache_default) |
82 | if (snd_soc_get_cache_val(codec->reg_def_copy, | 82 | if (snd_soc_get_cache_val(codec_drv->reg_cache_default, |
83 | i, codec_drv->reg_word_size) == val) | 83 | i, codec_drv->reg_word_size) == val) |
84 | continue; | 84 | continue; |
85 | 85 | ||
@@ -121,8 +121,10 @@ static int snd_soc_flat_cache_exit(struct snd_soc_codec *codec) | |||
121 | 121 | ||
122 | static int snd_soc_flat_cache_init(struct snd_soc_codec *codec) | 122 | static int snd_soc_flat_cache_init(struct snd_soc_codec *codec) |
123 | { | 123 | { |
124 | if (codec->reg_def_copy) | 124 | const struct snd_soc_codec_driver *codec_drv = codec->driver; |
125 | codec->reg_cache = kmemdup(codec->reg_def_copy, | 125 | |
126 | if (codec_drv->reg_cache_default) | ||
127 | codec->reg_cache = kmemdup(codec_drv->reg_cache_default, | ||
126 | codec->reg_size, GFP_KERNEL); | 128 | codec->reg_size, GFP_KERNEL); |
127 | else | 129 | else |
128 | codec->reg_cache = kzalloc(codec->reg_size, GFP_KERNEL); | 130 | codec->reg_cache = kzalloc(codec->reg_size, GFP_KERNEL); |
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 4ce02e6777e5..bbe833ab657e 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
@@ -4201,20 +4201,6 @@ int snd_soc_register_codec(struct device *dev, | |||
4201 | if (codec_drv->reg_cache_size && codec_drv->reg_word_size) { | 4201 | if (codec_drv->reg_cache_size && codec_drv->reg_word_size) { |
4202 | reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size; | 4202 | reg_size = codec_drv->reg_cache_size * codec_drv->reg_word_size; |
4203 | codec->reg_size = reg_size; | 4203 | codec->reg_size = reg_size; |
4204 | /* it is necessary to make a copy of the default register cache | ||
4205 | * because in the case of using a compression type that requires | ||
4206 | * the default register cache to be marked as the | ||
4207 | * kernel might have freed the array by the time we initialize | ||
4208 | * the cache. | ||
4209 | */ | ||
4210 | if (codec_drv->reg_cache_default) { | ||
4211 | codec->reg_def_copy = kmemdup(codec_drv->reg_cache_default, | ||
4212 | reg_size, GFP_KERNEL); | ||
4213 | if (!codec->reg_def_copy) { | ||
4214 | ret = -ENOMEM; | ||
4215 | goto fail_codec_name; | ||
4216 | } | ||
4217 | } | ||
4218 | } | 4204 | } |
4219 | 4205 | ||
4220 | for (i = 0; i < num_dai; i++) { | 4206 | for (i = 0; i < num_dai; i++) { |
@@ -4273,7 +4259,6 @@ found: | |||
4273 | dev_dbg(codec->dev, "ASoC: Unregistered codec '%s'\n", codec->name); | 4259 | dev_dbg(codec->dev, "ASoC: Unregistered codec '%s'\n", codec->name); |
4274 | 4260 | ||
4275 | snd_soc_cache_exit(codec); | 4261 | snd_soc_cache_exit(codec); |
4276 | kfree(codec->reg_def_copy); | ||
4277 | kfree(codec->name); | 4262 | kfree(codec->name); |
4278 | kfree(codec); | 4263 | kfree(codec); |
4279 | } | 4264 | } |