aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorShengjiu Wang <b02247@freescale.com>2014-04-17 03:32:12 -0400
committerNitin Garg <nitin.garg@freescale.com>2014-04-17 22:19:16 -0400
commitbff0667f0f1778e792989baa453c4e70d434b26b (patch)
tree3c370ef25b3dbcf65841fe5931f62de65999c67e /sound
parent85230971c5e685e688f2d5446f01a723ba617488 (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.c69
-rw-r--r--sound/soc/fsl/imx-cs42888.c2
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
166static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 168static int be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,