aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2009-07-04 22:29:55 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-07-05 07:59:07 -0400
commit1bef449989d0866a7db366a8153135cfa3d5cad9 (patch)
tree39a96450614a7dc5d7e6a729b112eba3a4b12bd2 /sound
parenteba575c30b93755dc0ee5e9adbb5b06d3289b62a (diff)
ASoC: DaVinci: i2s, only start sample generator if needed
Only start sample generator if needed, and more cleanup on davinci_mcbsp_start. Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/davinci/davinci-i2s.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
index 73a0fd8e182f..42609654b5e3 100644
--- a/sound/soc/davinci/davinci-i2s.c
+++ b/sound/soc/davinci/davinci-i2s.c
@@ -146,11 +146,14 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
146 spcr & ~mask); 146 spcr & ~mask);
147 toggle_clock(dev, playback); 147 toggle_clock(dev, playback);
148 } 148 }
149 /* Start the sample generator and enable transmitter/receiver */ 149 if (dev->pcr & (DAVINCI_MCBSP_PCR_FSXM | DAVINCI_MCBSP_PCR_FSRM |
150 spcr |= DAVINCI_MCBSP_SPCR_GRST; 150 DAVINCI_MCBSP_PCR_CLKXM | DAVINCI_MCBSP_PCR_CLKRM)) {
151 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 151 /* Start the sample generator */
152 spcr |= DAVINCI_MCBSP_SPCR_GRST;
153 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
154 }
152 155
153 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { 156 if (playback) {
154 /* Stop the DMA to avoid data loss */ 157 /* Stop the DMA to avoid data loss */
155 /* while the transmitter is out of reset to handle XSYNCERR */ 158 /* while the transmitter is out of reset to handle XSYNCERR */
156 if (platform->pcm_ops->trigger) { 159 if (platform->pcm_ops->trigger) {
@@ -181,23 +184,16 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
181 if (ret < 0) 184 if (ret < 0)
182 printk(KERN_DEBUG "Playback DMA start failed\n"); 185 printk(KERN_DEBUG "Playback DMA start failed\n");
183 } 186 }
184 /* Enable the transmitter */
185 spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
186 spcr |= DAVINCI_MCBSP_SPCR_XRST;
187 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
188
189 } else {
190
191 /* Enable the reciever */
192 spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
193 spcr |= DAVINCI_MCBSP_SPCR_RRST;
194 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
195 } 187 }
196 188
197 189 /* Enable transmitter or receiver */
198 /* Start frame sync */
199 spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG); 190 spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
200 spcr |= DAVINCI_MCBSP_SPCR_FRST; 191 spcr |= mask;
192
193 if (dev->pcr & (DAVINCI_MCBSP_PCR_FSXM | DAVINCI_MCBSP_PCR_FSRM)) {
194 /* Start frame sync */
195 spcr |= DAVINCI_MCBSP_SPCR_FRST;
196 }
201 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); 197 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
202} 198}
203 199