diff options
author | Shengjiu Wang <b02247@freescale.com> | 2014-04-17 03:32:12 -0400 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-17 22:19:16 -0400 |
commit | bff0667f0f1778e792989baa453c4e70d434b26b (patch) | |
tree | 3c370ef25b3dbcf65841fe5931f62de65999c67e /sound | |
parent | 85230971c5e685e688f2d5446f01a723ba617488 (diff) |
ENGR00309073-3 ASoC: fsl: Support recording with asrc p2p
update asrc p2p to support recording, which use ideal ratio mode.
Signed-off-by: Shengjiu Wang <b02247@freescale.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/fsl/fsl_asrc.c | 69 | ||||
-rw-r--r-- | sound/soc/fsl/imx-cs42888.c | 2 |
2 files changed, 45 insertions, 26 deletions
diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c index 2d801cd66c1a..6dd2d4a9bbff 100644 --- a/sound/soc/fsl/fsl_asrc.c +++ b/sound/soc/fsl/fsl_asrc.c | |||
@@ -54,6 +54,7 @@ static int asrc_p2p_request_channel(struct snd_pcm_substream *substream) | |||
54 | struct dma_slave_config slave_config; | 54 | struct dma_slave_config slave_config; |
55 | dma_cap_mask_t mask; | 55 | dma_cap_mask_t mask; |
56 | struct snd_soc_dpcm *dpcm; | 56 | struct snd_soc_dpcm *dpcm; |
57 | bool playback = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; | ||
57 | int ret; | 58 | int ret; |
58 | 59 | ||
59 | /* find the be for this fe stream */ | 60 | /* find the be for this fe stream */ |
@@ -91,9 +92,9 @@ static int asrc_p2p_request_channel(struct snd_pcm_substream *substream) | |||
91 | buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES; | 92 | buswidth = DMA_SLAVE_BUSWIDTH_4_BYTES; |
92 | 93 | ||
93 | /* reconfig memory to FIFO dma request */ | 94 | /* reconfig memory to FIFO dma request */ |
94 | dma_params_fe->addr = asrc_p2p->asrc_ops.asrc_p2p_per_addr(asrc_index, 1); | 95 | dma_params_fe->addr = asrc_p2p->asrc_ops.asrc_p2p_per_addr(asrc_index, playback); |
95 | dma_params_fe->maxburst = dma_params_be->maxburst; | 96 | dma_params_fe->maxburst = dma_params_be->maxburst; |
96 | fe_filter_data->dma_request0 = asrc_p2p->dmarx[asrc_index]; | 97 | fe_filter_data->dma_request0 = playback ? asrc_p2p->dmarx[asrc_index] : asrc_p2p->dmatx[asrc_index]; |
97 | 98 | ||
98 | dma_cap_zero(mask); | 99 | dma_cap_zero(mask); |
99 | dma_cap_set(DMA_SLAVE, mask); | 100 | dma_cap_set(DMA_SLAVE, mask); |
@@ -102,7 +103,7 @@ static int asrc_p2p_request_channel(struct snd_pcm_substream *substream) | |||
102 | /* config p2p dma channel */ | 103 | /* config p2p dma channel */ |
103 | p2p_params->dma_data.peripheral_type = IMX_DMATYPE_ASRC; | 104 | p2p_params->dma_data.peripheral_type = IMX_DMATYPE_ASRC; |
104 | p2p_params->dma_data.priority = DMA_PRIO_HIGH; | 105 | p2p_params->dma_data.priority = DMA_PRIO_HIGH; |
105 | p2p_params->dma_data.dma_request1 = asrc_p2p->dmatx[asrc_index]; | 106 | p2p_params->dma_data.dma_request1 = playback ? asrc_p2p->dmatx[asrc_index] : asrc_p2p->dmarx[asrc_index]; |
106 | /* need to get target device's dma dma_addr, burstsize */ | 107 | /* need to get target device's dma dma_addr, burstsize */ |
107 | p2p_params->dma_data.dma_request0 = be_filter_data->dma_request0; | 108 | p2p_params->dma_data.dma_request0 = be_filter_data->dma_request0; |
108 | 109 | ||
@@ -118,14 +119,21 @@ static int asrc_p2p_request_channel(struct snd_pcm_substream *substream) | |||
118 | * twice of dma_params's burstsize. | 119 | * twice of dma_params's burstsize. |
119 | */ | 120 | */ |
120 | slave_config.direction = DMA_DEV_TO_DEV; | 121 | slave_config.direction = DMA_DEV_TO_DEV; |
121 | slave_config.src_addr = asrc_p2p->asrc_ops.asrc_p2p_per_addr(asrc_index, 0); | ||
122 | slave_config.src_addr_width = buswidth; | 122 | slave_config.src_addr_width = buswidth; |
123 | slave_config.src_maxburst = dma_params_be->maxburst * 2; | 123 | slave_config.src_maxburst = dma_params_be->maxburst * 2; |
124 | slave_config.dst_addr = dma_params_be->addr; | ||
125 | slave_config.dst_addr_width = buswidth; | 124 | slave_config.dst_addr_width = buswidth; |
126 | slave_config.dst_maxburst = dma_params_be->maxburst * 2; | 125 | slave_config.dst_maxburst = dma_params_be->maxburst * 2; |
127 | slave_config.dma_request0 = be_filter_data->dma_request0; | 126 | slave_config.dma_request0 = be_filter_data->dma_request0; |
128 | slave_config.dma_request1 = asrc_p2p->dmatx[asrc_index]; | 127 | |
128 | if (playback) { | ||
129 | slave_config.src_addr = asrc_p2p->asrc_ops.asrc_p2p_per_addr(asrc_index, !playback); | ||
130 | slave_config.dst_addr = dma_params_be->addr; | ||
131 | slave_config.dma_request1 = asrc_p2p->dmatx[asrc_index]; | ||
132 | } else { | ||
133 | slave_config.dst_addr = asrc_p2p->asrc_ops.asrc_p2p_per_addr(asrc_index, !playback); | ||
134 | slave_config.src_addr = dma_params_be->addr; | ||
135 | slave_config.dma_request1 = asrc_p2p->dmarx[asrc_index]; | ||
136 | } | ||
129 | 137 | ||
130 | ret = dmaengine_slave_config(p2p_params->dma_chan, &slave_config); | 138 | ret = dmaengine_slave_config(p2p_params->dma_chan, &slave_config); |
131 | if (ret) { | 139 | if (ret) { |
@@ -199,29 +207,38 @@ static int config_asrc(struct snd_pcm_substream *substream, | |||
199 | return -EINVAL; | 207 | return -EINVAL; |
200 | } | 208 | } |
201 | 209 | ||
202 | config.input_word_width = word_width; | ||
203 | config.output_word_width = p2p_word_width; | ||
204 | config.pair = p2p_params->asrc_index; | 210 | config.pair = p2p_params->asrc_index; |
205 | config.channel_num = channel; | 211 | config.channel_num = channel; |
206 | config.input_sample_rate = rate; | ||
207 | config.output_sample_rate = asrc_p2p->p2p_rate; | ||
208 | config.inclk = INCLK_NONE; | 212 | config.inclk = INCLK_NONE; |
209 | switch (asrc_p2p->per_dev) { | 213 | |
210 | case SSI1: | 214 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
211 | config.outclk = OUTCLK_SSI1_TX; | 215 | config.input_word_width = word_width; |
212 | break; | 216 | config.output_word_width = p2p_word_width; |
213 | case SSI2: | 217 | config.input_sample_rate = rate; |
214 | config.outclk = OUTCLK_SSI2_TX; | 218 | config.output_sample_rate = asrc_p2p->p2p_rate; |
215 | break; | 219 | switch (asrc_p2p->per_dev) { |
216 | case SSI3: | 220 | case SSI1: |
217 | config.outclk = OUTCLK_SSI3_TX; | 221 | config.outclk = OUTCLK_SSI1_TX; |
218 | break; | 222 | break; |
219 | case ESAI: | 223 | case SSI2: |
220 | config.outclk = OUTCLK_ESAI_TX; | 224 | config.outclk = OUTCLK_SSI2_TX; |
221 | break; | 225 | break; |
222 | default: | 226 | case SSI3: |
223 | dev_err(cpu_dai->dev, "peripheral device is not correct\n"); | 227 | config.outclk = OUTCLK_SSI3_TX; |
224 | return -EINVAL; | 228 | break; |
229 | case ESAI: | ||
230 | config.outclk = OUTCLK_ESAI_TX; | ||
231 | break; | ||
232 | default: | ||
233 | dev_err(cpu_dai->dev, "peripheral device is not correct\n"); | ||
234 | return -EINVAL; | ||
235 | } | ||
236 | } else { | ||
237 | config.input_word_width = p2p_word_width; | ||
238 | config.output_word_width = word_width; | ||
239 | config.input_sample_rate = asrc_p2p->p2p_rate; | ||
240 | config.output_sample_rate = rate; | ||
241 | config.outclk = OUTCLK_ASRCK1_CLK; | ||
225 | } | 242 | } |
226 | 243 | ||
227 | ret = asrc_p2p->asrc_ops.asrc_p2p_config_pair(&config); | 244 | ret = asrc_p2p->asrc_ops.asrc_p2p_config_pair(&config); |
diff --git a/sound/soc/fsl/imx-cs42888.c b/sound/soc/fsl/imx-cs42888.c index 7a7c47a27e9f..db9f58d89868 100644 --- a/sound/soc/fsl/imx-cs42888.c +++ b/sound/soc/fsl/imx-cs42888.c | |||
@@ -161,6 +161,8 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
161 | {"AIN2R", NULL, "Line In Jack"}, | 161 | {"AIN2R", NULL, "Line In Jack"}, |
162 | {"esai-Playback", NULL, "asrc-Playback"}, | 162 | {"esai-Playback", NULL, "asrc-Playback"}, |
163 | {"codec-Playback", NULL, "esai-Playback"},/* dai route for be and fe */ | 163 | {"codec-Playback", NULL, "esai-Playback"},/* dai route for be and fe */ |
164 | {"asrc-Capture", NULL, "esai-Capture"}, | ||
165 | {"esai-Capture", NULL, "codec-Capture"}, | ||
164 | }; | 166 | }; |
165 | 167 | ||
166 | static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, | 168 | static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, |