ASoC: core: Ensure SND_SOC_BYTES writes are from DMA safe memory
With some buses the transfers may DMAed, especially for larger blocks. Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
5d163336a7
commit
b5a8fe439a
1 changed files with 5 additions and 7 deletions
|
@ -3097,9 +3097,12 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
|
|||
if (!codec->using_regmap)
|
||||
return -EINVAL;
|
||||
|
||||
data = ucontrol->value.bytes.data;
|
||||
len = params->num_regs * codec->val_bytes;
|
||||
|
||||
data = kmemdup(ucontrol->value.bytes.data, len, GFP_KERNEL | GFP_DMA);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* If we've got a mask then we need to preserve the register
|
||||
* bits. We shouldn't modify the incoming data so take a
|
||||
|
@ -3112,10 +3115,6 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
|
|||
|
||||
val &= params->mask;
|
||||
|
||||
data = kmemdup(data, len, GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
switch (codec->val_bytes) {
|
||||
case 1:
|
||||
((u8 *)data)[0] &= ~params->mask;
|
||||
|
@ -3137,8 +3136,7 @@ int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
|
|||
ret = regmap_raw_write(codec->control_data, params->base,
|
||||
data, len);
|
||||
|
||||
if (params->mask)
|
||||
kfree(data);
|
||||
kfree(data);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue