From f61bddd3045e567f9b50efc31a5dff90fb67948e Mon Sep 17 00:00:00 2001 From: Gopikrishnaiah Anand Date: Fri, 30 May 2014 11:29:56 -0700 Subject: [PATCH] ASoC: pcm: Add support for compat mode When kernel is compiled for 64 bit and userspace client is in 32 bit mode compat ioctl path will be taken. If platform driver supports compat mode asoc framework should call compat function pointers. Change adds support in asoc framework to support compat mode. Change-Id: I4929bc89c2ad467cdc83f5a00fe9d38e425c3ca2 Signed-off-by: Gopikrishnaiah Anand Signed-off-by: Banajit Goswami Signed-off-by: Meng Wang --- sound/soc/soc-pcm.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 42f72c9b78ba..292f17f4fd7d 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -2460,6 +2460,30 @@ out: return ret; } +#ifdef CONFIG_AUDIO_QGKI +static int soc_pcm_compat_ioctl(struct snd_pcm_substream *substream, + unsigned int cmd, void *arg) +{ + struct snd_soc_pcm_runtime *rtd = substream->private_data; + struct snd_soc_component *component; + struct snd_soc_rtdcom_list *rtdcom; + + for_each_rtdcom(rtd, rtdcom) { + component = rtdcom->component; + + if (!component->driver->ops || + !component->driver->ops->compat_ioctl) + continue; + + /* FIXME: use 1st ioctl */ + return component->driver->ops->compat_ioctl( + substream, cmd, arg); + } + + return snd_pcm_lib_ioctl(substream, cmd, arg); +} +#endif + static int dpcm_run_update_shutdown(struct snd_soc_pcm_runtime *fe, int stream) { struct snd_pcm_substream *substream = @@ -2924,6 +2948,9 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) rtd->ops.close = dpcm_fe_dai_close; rtd->ops.pointer = soc_pcm_pointer; rtd->ops.ioctl = snd_soc_pcm_component_ioctl; +#ifdef CONFIG_AUDIO_QGKI + rtd->ops.compat_ioctl = soc_pcm_compat_ioctl; +#endif } else { rtd->ops.open = soc_pcm_open; rtd->ops.hw_params = soc_pcm_hw_params; @@ -2933,6 +2960,9 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) rtd->ops.close = soc_pcm_close; rtd->ops.pointer = soc_pcm_pointer; rtd->ops.ioctl = snd_soc_pcm_component_ioctl; +#ifdef CONFIG_AUDIO_QGKI + rtd->ops.compat_ioctl = soc_pcm_compat_ioctl; +#endif } for_each_rtdcom(rtd, rtdcom) {