Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: fsl: fsl_qmc_audio: Introduce qmc_audio_pcm_{read,write}_submit()

Submitting data to QMC channels is done in several places: transfer
completions and DAI start. The operation done is simple and consist in
one function call.

With the future introduction of support for non-interleaved mode,
submitting data will be more complex.

To avoid copy/paste of code in several places, introduce
qmc_audio_pcm_{read,write}_submit() whose goal is to handle this
data submission.

Signed-off-by: Herve Codina <herve.codina@bootlin.com>
Link: https://patch.msgid.link/20240701113038.55144-6-herve.codina@bootlin.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Herve Codina and committed by
Mark Brown
33a6969f 5e51a1f9

+45 -48
+45 -48
sound/soc/fsl/fsl_qmc_audio.c
··· 90 90 return 0; 91 91 } 92 92 93 + static void qmc_audio_pcm_write_complete(void *context); 94 + 95 + static int qmc_audio_pcm_write_submit(struct qmc_dai_prtd *prtd) 96 + { 97 + int ret; 98 + 99 + ret = qmc_chan_write_submit(prtd->qmc_dai->chan.qmc_chan, 100 + prtd->ch_dma_addr_current, prtd->ch_dma_size, 101 + qmc_audio_pcm_write_complete, 102 + &prtd->qmc_dai->chan); 103 + if (ret) { 104 + dev_err(prtd->qmc_dai->dev, "write_submit failed %d\n", 105 + ret); 106 + return ret; 107 + } 108 + 109 + return 0; 110 + } 111 + 93 112 static void qmc_audio_pcm_write_complete(void *context) 94 113 { 95 114 struct qmc_dai_chan *chan = context; 96 115 struct qmc_dai_prtd *prtd; 97 - int ret; 98 116 99 117 prtd = chan->prtd_tx; 100 118 ··· 124 106 if (prtd->ch_dma_addr_current >= prtd->ch_dma_addr_end) 125 107 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; 126 108 127 - ret = qmc_chan_write_submit(prtd->qmc_dai->chan.qmc_chan, 128 - prtd->ch_dma_addr_current, prtd->ch_dma_size, 129 - qmc_audio_pcm_write_complete, 130 - &prtd->qmc_dai->chan); 109 + qmc_audio_pcm_write_submit(prtd); 110 + 111 + snd_pcm_period_elapsed(prtd->substream); 112 + } 113 + 114 + static void qmc_audio_pcm_read_complete(void *context, size_t length, unsigned int flags); 115 + 116 + static int qmc_audio_pcm_read_submit(struct qmc_dai_prtd *prtd) 117 + { 118 + int ret; 119 + 120 + ret = qmc_chan_read_submit(prtd->qmc_dai->chan.qmc_chan, 121 + prtd->ch_dma_addr_current, prtd->ch_dma_size, 122 + qmc_audio_pcm_read_complete, 123 + &prtd->qmc_dai->chan); 131 124 if (ret) { 132 - dev_err(prtd->qmc_dai->dev, "write_submit failed %d\n", 125 + dev_err(prtd->qmc_dai->dev, "read_submit failed %d\n", 133 126 ret); 134 127 } 135 128 136 - snd_pcm_period_elapsed(prtd->substream); 129 + return 0; 137 130 } 138 131 139 132 static void qmc_audio_pcm_read_complete(void *context, size_t length, unsigned int flags) 140 133 { 141 134 struct qmc_dai_chan *chan = context; 142 135 struct qmc_dai_prtd *prtd; 143 - int ret; 144 136 145 137 prtd = chan->prtd_rx; 146 138 ··· 167 139 if (prtd->ch_dma_addr_current >= prtd->ch_dma_addr_end) 168 140 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; 169 141 170 - ret = qmc_chan_read_submit(prtd->qmc_dai->chan.qmc_chan, 171 - prtd->ch_dma_addr_current, prtd->ch_dma_size, 172 - qmc_audio_pcm_read_complete, 173 - &prtd->qmc_dai->chan); 174 - if (ret) { 175 - dev_err(prtd->qmc_dai->dev, "read_submit failed %d\n", 176 - ret); 177 - } 142 + qmc_audio_pcm_read_submit(prtd); 178 143 179 144 snd_pcm_period_elapsed(prtd->substream); 180 145 } ··· 189 168 prtd->qmc_dai->chan.prtd_tx = prtd; 190 169 191 170 /* Submit first chunk ... */ 192 - ret = qmc_chan_write_submit(prtd->qmc_dai->chan.qmc_chan, 193 - prtd->ch_dma_addr_current, prtd->ch_dma_size, 194 - qmc_audio_pcm_write_complete, 195 - &prtd->qmc_dai->chan); 196 - if (ret) { 197 - dev_err(component->dev, "write_submit failed %d\n", 198 - ret); 171 + ret = qmc_audio_pcm_write_submit(prtd); 172 + if (ret) 199 173 return ret; 200 - } 201 174 202 175 /* ... prepare next one ... */ 203 176 prtd->ch_dma_addr_current += prtd->ch_dma_size; ··· 199 184 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; 200 185 201 186 /* ... and send it */ 202 - ret = qmc_chan_write_submit(prtd->qmc_dai->chan.qmc_chan, 203 - prtd->ch_dma_addr_current, prtd->ch_dma_size, 204 - qmc_audio_pcm_write_complete, 205 - &prtd->qmc_dai->chan); 206 - if (ret) { 207 - dev_err(component->dev, "write_submit failed %d\n", 208 - ret); 187 + ret = qmc_audio_pcm_write_submit(prtd); 188 + if (ret) 209 189 return ret; 210 - } 211 190 } else { 212 191 prtd->qmc_dai->chan.prtd_rx = prtd; 213 192 214 193 /* Submit first chunk ... */ 215 - ret = qmc_chan_read_submit(prtd->qmc_dai->chan.qmc_chan, 216 - prtd->ch_dma_addr_current, prtd->ch_dma_size, 217 - qmc_audio_pcm_read_complete, 218 - &prtd->qmc_dai->chan); 219 - if (ret) { 220 - dev_err(component->dev, "read_submit failed %d\n", 221 - ret); 194 + ret = qmc_audio_pcm_read_submit(prtd); 195 + if (ret) 222 196 return ret; 223 - } 224 197 225 198 /* ... prepare next one ... */ 226 199 prtd->ch_dma_addr_current += prtd->ch_dma_size; ··· 216 213 prtd->ch_dma_addr_current = prtd->ch_dma_addr_start; 217 214 218 215 /* ... and send it */ 219 - ret = qmc_chan_read_submit(prtd->qmc_dai->chan.qmc_chan, 220 - prtd->ch_dma_addr_current, prtd->ch_dma_size, 221 - qmc_audio_pcm_read_complete, 222 - &prtd->qmc_dai->chan); 223 - if (ret) { 224 - dev_err(component->dev, "write_submit failed %d\n", 225 - ret); 216 + ret = qmc_audio_pcm_read_submit(prtd); 217 + if (ret) 226 218 return ret; 227 - } 228 219 } 229 220 break; 230 221