diff options
| author | Mark Brown <broonie@linaro.org> | 2013-12-03 13:08:59 -0500 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2013-12-03 13:08:59 -0500 |
| commit | 1c4b578aa4ea2ef98871dc8ad95acb1fa14f9bcd (patch) | |
| tree | a5be6de20a51086ac240059f18fb5889bc210845 | |
| parent | dc1ccc48159d63eca5089e507c82c7d22ef60839 (diff) | |
| parent | ebff65473f56e6c30de928fd6a4f1ce5ae36e8c5 (diff) | |
Merge remote-tracking branch 'asoc/fix/core' into asoc-linus
| -rw-r--r-- | sound/soc/soc-core.c | 4 | ||||
| -rw-r--r-- | sound/soc/soc-devres.c | 4 | ||||
| -rw-r--r-- | sound/soc/soc-pcm.c | 18 |
3 files changed, 16 insertions, 10 deletions
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index 4e53d87e881d..a66783e13a9c 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c | |||
| @@ -3212,11 +3212,11 @@ int snd_soc_bytes_get(struct snd_kcontrol *kcontrol, | |||
| 3212 | break; | 3212 | break; |
| 3213 | case 2: | 3213 | case 2: |
| 3214 | ((u16 *)(&ucontrol->value.bytes.data))[0] | 3214 | ((u16 *)(&ucontrol->value.bytes.data))[0] |
| 3215 | &= ~params->mask; | 3215 | &= cpu_to_be16(~params->mask); |
| 3216 | break; | 3216 | break; |
| 3217 | case 4: | 3217 | case 4: |
| 3218 | ((u32 *)(&ucontrol->value.bytes.data))[0] | 3218 | ((u32 *)(&ucontrol->value.bytes.data))[0] |
| 3219 | &= ~params->mask; | 3219 | &= cpu_to_be32(~params->mask); |
| 3220 | break; | 3220 | break; |
| 3221 | default: | 3221 | default: |
| 3222 | return -EINVAL; | 3222 | return -EINVAL; |
diff --git a/sound/soc/soc-devres.c b/sound/soc/soc-devres.c index b1d732255c02..3449c1e909ae 100644 --- a/sound/soc/soc-devres.c +++ b/sound/soc/soc-devres.c | |||
| @@ -66,7 +66,7 @@ static void devm_card_release(struct device *dev, void *res) | |||
| 66 | */ | 66 | */ |
| 67 | int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card) | 67 | int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card) |
| 68 | { | 68 | { |
| 69 | struct device **ptr; | 69 | struct snd_soc_card **ptr; |
| 70 | int ret; | 70 | int ret; |
| 71 | 71 | ||
| 72 | ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL); | 72 | ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL); |
| @@ -75,7 +75,7 @@ int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card) | |||
| 75 | 75 | ||
| 76 | ret = snd_soc_register_card(card); | 76 | ret = snd_soc_register_card(card); |
| 77 | if (ret == 0) { | 77 | if (ret == 0) { |
| 78 | *ptr = dev; | 78 | *ptr = card; |
| 79 | devres_add(dev, ptr); | 79 | devres_add(dev, ptr); |
| 80 | } else { | 80 | } else { |
| 81 | devres_free(ptr); | 81 | devres_free(ptr); |
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 42782c01e413..11a90cd027fa 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c | |||
| @@ -148,12 +148,12 @@ static void soc_pcm_apply_msb(struct snd_pcm_substream *substream, | |||
| 148 | } | 148 | } |
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | static void soc_pcm_init_runtime_hw(struct snd_pcm_hardware *hw, | 151 | static void soc_pcm_init_runtime_hw(struct snd_pcm_runtime *runtime, |
| 152 | struct snd_soc_pcm_stream *codec_stream, | 152 | struct snd_soc_pcm_stream *codec_stream, |
| 153 | struct snd_soc_pcm_stream *cpu_stream) | 153 | struct snd_soc_pcm_stream *cpu_stream) |
| 154 | { | 154 | { |
| 155 | hw->rate_min = max(codec_stream->rate_min, cpu_stream->rate_min); | 155 | struct snd_pcm_hardware *hw = &runtime->hw; |
| 156 | hw->rate_max = max(codec_stream->rate_max, cpu_stream->rate_max); | 156 | |
| 157 | hw->channels_min = max(codec_stream->channels_min, | 157 | hw->channels_min = max(codec_stream->channels_min, |
| 158 | cpu_stream->channels_min); | 158 | cpu_stream->channels_min); |
| 159 | hw->channels_max = min(codec_stream->channels_max, | 159 | hw->channels_max = min(codec_stream->channels_max, |
| @@ -166,6 +166,13 @@ static void soc_pcm_init_runtime_hw(struct snd_pcm_hardware *hw, | |||
| 166 | if (cpu_stream->rates | 166 | if (cpu_stream->rates |
| 167 | & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS)) | 167 | & (SNDRV_PCM_RATE_KNOT | SNDRV_PCM_RATE_CONTINUOUS)) |
| 168 | hw->rates |= codec_stream->rates; | 168 | hw->rates |= codec_stream->rates; |
| 169 | |||
| 170 | snd_pcm_limit_hw_rates(runtime); | ||
| 171 | |||
| 172 | hw->rate_min = max(hw->rate_min, cpu_stream->rate_min); | ||
| 173 | hw->rate_min = max(hw->rate_min, codec_stream->rate_min); | ||
| 174 | hw->rate_max = min_not_zero(hw->rate_max, cpu_stream->rate_max); | ||
| 175 | hw->rate_max = min_not_zero(hw->rate_max, codec_stream->rate_max); | ||
| 169 | } | 176 | } |
| 170 | 177 | ||
| 171 | /* | 178 | /* |
| @@ -235,15 +242,14 @@ static int soc_pcm_open(struct snd_pcm_substream *substream) | |||
| 235 | 242 | ||
| 236 | /* Check that the codec and cpu DAIs are compatible */ | 243 | /* Check that the codec and cpu DAIs are compatible */ |
| 237 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 244 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 238 | soc_pcm_init_runtime_hw(&runtime->hw, &codec_dai_drv->playback, | 245 | soc_pcm_init_runtime_hw(runtime, &codec_dai_drv->playback, |
| 239 | &cpu_dai_drv->playback); | 246 | &cpu_dai_drv->playback); |
| 240 | } else { | 247 | } else { |
| 241 | soc_pcm_init_runtime_hw(&runtime->hw, &codec_dai_drv->capture, | 248 | soc_pcm_init_runtime_hw(runtime, &codec_dai_drv->capture, |
| 242 | &cpu_dai_drv->capture); | 249 | &cpu_dai_drv->capture); |
| 243 | } | 250 | } |
| 244 | 251 | ||
| 245 | ret = -EINVAL; | 252 | ret = -EINVAL; |
| 246 | snd_pcm_limit_hw_rates(runtime); | ||
| 247 | if (!runtime->hw.rates) { | 253 | if (!runtime->hw.rates) { |
| 248 | printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n", | 254 | printk(KERN_ERR "ASoC: %s <-> %s No matching rates\n", |
| 249 | codec_dai->name, cpu_dai->name); | 255 | codec_dai->name, cpu_dai->name); |
