[alsa-devel] [PATCH] ASoC don't clobber platform DMA driver ops
Tabi Timur-B04825
B04825 at freescale.com
Tue Nov 15 17:56:46 CET 2011
On Tue, Nov 15, 2011 at 9:59 AM, Alan Tull <alan.tull at freescale.com> wrote:
> Previously, only one static struct for ops existed for all
> platform DMA drivers to share. Half of the ops are shared
> functions and the other half are initialized to point directly
> to ops in the platform driver. This creates problems where
> each time soc_new_pcm is called, the new platform driver's
> ops would overwrite a subset of the ops.
>
> This patch creates and populates a ops struct for each call
> to soc_pcm_new.
>
> Signed-off-by: Alan Tull <alan.tull at freescale.com>
> ---
Something is wrong. When I apply this patch, I get this:
CC sound/soc/soc-core.o
/home/b04825/git/linux.34/sound/soc/soc-core.c: In function
'soc_cleanup_card_resources':
/home/b04825/git/linux.34/sound/soc/soc-core.c:1583:3: error:
incompatible type for argument 1 of 'kfree'
/home/b04825/git/linux.34/include/linux/slab.h:161:6: note: expected
'const void *' but argument is of type 'struct snd_pcm_ops'
/* free the ops */
for (i = 0; i < card->num_rtd; i++) {
struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
kfree(rtd->ops);
}
rtd->ops is not a pointer, so it can't be freed. Also, this:
+ rtd->ops = soc_pcm_ops;
is a memcpy. Why not just write to rtd->ops directly?
--
Timur Tabi
Linux kernel developer at Freescale
More information about the Alsa-devel
mailing list