summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorGe Lei <b42127@freescale.com>2012-11-15 14:53:40 +0800
committerChen Liangjun <b36089@freescale.com>2012-11-15 17:19:17 +0800
commit83da6a52d9907ebd4898f5e9fe1071bfd064158f (patch)
treee38cbd170d5e7cbc94fea1043155646a106bf732 /sound
parent72ab3f46c599fadabf83f17b0bde7d6887c805fd (diff)
ENGR00233570-2 ASRC: Use function pointer and hook to support ASRC loadable
In ASoC pcm platform driver, use function pointer(ASRC ops) and hook to call the APIs in ASRC driver, so that the ASoC platform driver can support ASRC loadable. Signed-off-by: Ge Lei <b42127@freescale.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/imx/imx-pcm-dma-mx2.c31
-rw-r--r--sound/soc/imx/imx-pcm.h1
2 files changed, 26 insertions, 6 deletions
diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c
index 3065dfd38b71..047a5db6c491 100644
--- a/sound/soc/imx/imx-pcm-dma-mx2.c
+++ b/sound/soc/imx/imx-pcm-dma-mx2.c
@@ -35,6 +35,14 @@
#include "imx-ssi.h"
#include "imx-pcm.h"
+struct asrc_p2p_ops *asrc_pcm_p2p_ops;
+
+void asrc_p2p_hook(struct asrc_p2p_ops *asrc_p2p_ct)
+{
+ asrc_pcm_p2p_ops = asrc_p2p_ct;
+ return ;
+}
+EXPORT_SYMBOL(asrc_p2p_hook);
static void audio_dma_irq(void *data)
{
@@ -109,14 +117,16 @@ static int imx_ssi_asrc_dma_alloc(struct snd_pcm_substream *substream,
iprtd->asrc_dma_data.peripheral_type = IMX_DMATYPE_ASRC;
iprtd->asrc_dma_data.priority = DMA_PRIO_HIGH;
iprtd->asrc_dma_data.dma_request =
- asrc_get_dma_request(iprtd->asrc_index, 1);
+ iprtd->asrc_pcm_p2p_ops_ko->
+ asrc_p2p_get_dma_request(iprtd->asrc_index, 1);
iprtd->asrc_dma_chan = dma_request_channel(mask, asrc_filter, iprtd);
if (!iprtd->asrc_dma_chan)
goto error;
slave_config.direction = DMA_TO_DEVICE;
- slave_config.dst_addr = asrc_get_per_addr(iprtd->asrc_index, 1);
+ slave_config.dst_addr = iprtd->asrc_pcm_p2p_ops_ko->
+ asrc_p2p_per_addr(iprtd->asrc_index, 1);
slave_config.dst_addr_width = buswidth;
slave_config.dst_maxburst = dma_params->burstsize * buswidth;
@@ -127,7 +137,8 @@ static int imx_ssi_asrc_dma_alloc(struct snd_pcm_substream *substream,
iprtd->asrc_p2p_dma_data.peripheral_type = IMX_DMATYPE_ASRC;
iprtd->asrc_p2p_dma_data.priority = DMA_PRIO_HIGH;
iprtd->asrc_p2p_dma_data.dma_request =
- asrc_get_dma_request(iprtd->asrc_index, 0);
+ iprtd->asrc_pcm_p2p_ops_ko->
+ asrc_p2p_get_dma_request(iprtd->asrc_index, 0);
iprtd->asrc_p2p_dma_data.dma_request_p2p = dma_params->dma;
iprtd->asrc_p2p_dma_chan =
dma_request_channel(mask, asrc_p2p_filter, iprtd);
@@ -146,7 +157,8 @@ static int imx_ssi_asrc_dma_alloc(struct snd_pcm_substream *substream,
}
slave_config.direction = DMA_DEV_TO_DEV;
- slave_config.src_addr = asrc_get_per_addr(iprtd->asrc_index, 0);
+ slave_config.src_addr = iprtd->asrc_pcm_p2p_ops_ko->
+ asrc_p2p_per_addr(iprtd->asrc_index, 0);
slave_config.src_addr_width = buswidth;
slave_config.src_maxburst = dma_params->burstsize * buswidth;
slave_config.dst_addr = dma_params->dma_addr;
@@ -358,7 +370,8 @@ static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
if (iprtd->asrc_enable) {
dmaengine_submit(iprtd->asrc_p2p_desc);
dmaengine_submit(iprtd->asrc_desc);
- asrc_start_conv(iprtd->asrc_index);
+ iprtd->asrc_pcm_p2p_ops_ko->
+ asrc_p2p_start_conv(iprtd->asrc_index);
mdelay(1);
} else {
dmaengine_submit(iprtd->desc);
@@ -371,7 +384,8 @@ static int snd_imx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
if (iprtd->asrc_enable) {
dmaengine_terminate_all(iprtd->asrc_dma_chan);
dmaengine_terminate_all(iprtd->asrc_p2p_dma_chan);
- asrc_stop_conv(iprtd->asrc_index);
+ iprtd->asrc_pcm_p2p_ops_ko->
+ asrc_p2p_stop_conv(iprtd->asrc_index);
} else {
dmaengine_terminate_all(iprtd->dma_chan);
}
@@ -428,6 +442,11 @@ static int snd_imx_open(struct snd_pcm_substream *substream)
iprtd->p2p =
(struct asrc_p2p_params *)snd_soc_pcm_get_drvdata(rtd);
iprtd->asrc_index = -1;
+ if (!asrc_pcm_p2p_ops) {
+ pr_err("ASRC is not loaded!\n");
+ return -EINVAL;
+ }
+ iprtd->asrc_pcm_p2p_ops_ko = asrc_pcm_p2p_ops;
}
runtime->private_data = iprtd;
diff --git a/sound/soc/imx/imx-pcm.h b/sound/soc/imx/imx-pcm.h
index 9b5e1e03fd40..1b126be7a592 100644
--- a/sound/soc/imx/imx-pcm.h
+++ b/sound/soc/imx/imx-pcm.h
@@ -60,6 +60,7 @@ struct imx_pcm_runtime_data {
struct dma_chan *dma_chan;
struct imx_dma_data dma_data;
int asrc_enable;
+ struct asrc_p2p_ops *asrc_pcm_p2p_ops_ko;
#if defined(CONFIG_MXC_ASRC) || defined(CONFIG_IMX_HAVE_PLATFORM_IMX_ASRC)
enum asrc_pair_index asrc_index;