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>
This commit is contained in:
@@ -146,11 +146,14 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
|
|||||||
spcr & ~mask);
|
spcr & ~mask);
|
||||||
toggle_clock(dev, playback);
|
toggle_clock(dev, playback);
|
||||||
}
|
}
|
||||||
/* Start the sample generator and enable transmitter/receiver */
|
if (dev->pcr & (DAVINCI_MCBSP_PCR_FSXM | DAVINCI_MCBSP_PCR_FSRM |
|
||||||
|
DAVINCI_MCBSP_PCR_CLKXM | DAVINCI_MCBSP_PCR_CLKRM)) {
|
||||||
|
/* Start the sample generator */
|
||||||
spcr |= DAVINCI_MCBSP_SPCR_GRST;
|
spcr |= DAVINCI_MCBSP_SPCR_GRST;
|
||||||
davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
|
davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
|
||||||
|
}
|
||||||
|
|
||||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
if (playback) {
|
||||||
/* Stop the DMA to avoid data loss */
|
/* Stop the DMA to avoid data loss */
|
||||||
/* while the transmitter is out of reset to handle XSYNCERR */
|
/* while the transmitter is out of reset to handle XSYNCERR */
|
||||||
if (platform->pcm_ops->trigger) {
|
if (platform->pcm_ops->trigger) {
|
||||||
@@ -181,23 +184,16 @@ static void davinci_mcbsp_start(struct davinci_mcbsp_dev *dev,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
printk(KERN_DEBUG "Playback DMA start failed\n");
|
printk(KERN_DEBUG "Playback DMA start failed\n");
|
||||||
}
|
}
|
||||||
/* Enable the transmitter */
|
|
||||||
spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
|
|
||||||
spcr |= DAVINCI_MCBSP_SPCR_XRST;
|
|
||||||
davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
/* Enable the reciever */
|
|
||||||
spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
|
|
||||||
spcr |= DAVINCI_MCBSP_SPCR_RRST;
|
|
||||||
davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Enable transmitter or receiver */
|
||||||
/* Start frame sync */
|
|
||||||
spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
|
spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG);
|
||||||
|
spcr |= mask;
|
||||||
|
|
||||||
|
if (dev->pcr & (DAVINCI_MCBSP_PCR_FSXM | DAVINCI_MCBSP_PCR_FSRM)) {
|
||||||
|
/* Start frame sync */
|
||||||
spcr |= DAVINCI_MCBSP_SPCR_FRST;
|
spcr |= DAVINCI_MCBSP_SPCR_FRST;
|
||||||
|
}
|
||||||
davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
|
davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user