Merge branch 'for-2.6.31' into for-2.6.32

This commit is contained in:
Mark Brown 2009-08-07 11:42:01 +01:00
commit b9b5cc26d0
3 changed files with 39 additions and 25 deletions

View File

@ -387,8 +387,8 @@ void omap_mcbsp_register_board_cfg(struct omap_mcbsp_platform_data *config,
void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config); void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config);
int omap_mcbsp_request(unsigned int id); int omap_mcbsp_request(unsigned int id);
void omap_mcbsp_free(unsigned int id); void omap_mcbsp_free(unsigned int id);
void omap_mcbsp_start(unsigned int id); void omap_mcbsp_start(unsigned int id, int tx, int rx);
void omap_mcbsp_stop(unsigned int id); void omap_mcbsp_stop(unsigned int id, int tx, int rx);
void omap_mcbsp_xmit_word(unsigned int id, u32 word); void omap_mcbsp_xmit_word(unsigned int id, u32 word);
u32 omap_mcbsp_recv_word(unsigned int id); u32 omap_mcbsp_recv_word(unsigned int id);

View File

@ -328,14 +328,15 @@ void omap_mcbsp_free(unsigned int id)
EXPORT_SYMBOL(omap_mcbsp_free); EXPORT_SYMBOL(omap_mcbsp_free);
/* /*
* Here we start the McBSP, by enabling the sample * Here we start the McBSP, by enabling transmitter, receiver or both.
* generator, both transmitter and receivers, * If no transmitter or receiver is active prior calling, then sample-rate
* and the frame sync. * generator and frame sync are started.
*/ */
void omap_mcbsp_start(unsigned int id) void omap_mcbsp_start(unsigned int id, int tx, int rx)
{ {
struct omap_mcbsp *mcbsp; struct omap_mcbsp *mcbsp;
void __iomem *io_base; void __iomem *io_base;
int idle;
u16 w; u16 w;
if (!omap_mcbsp_check_valid_id(id)) { if (!omap_mcbsp_check_valid_id(id)) {
@ -348,32 +349,40 @@ void omap_mcbsp_start(unsigned int id)
mcbsp->rx_word_length = (OMAP_MCBSP_READ(io_base, RCR1) >> 5) & 0x7; mcbsp->rx_word_length = (OMAP_MCBSP_READ(io_base, RCR1) >> 5) & 0x7;
mcbsp->tx_word_length = (OMAP_MCBSP_READ(io_base, XCR1) >> 5) & 0x7; mcbsp->tx_word_length = (OMAP_MCBSP_READ(io_base, XCR1) >> 5) & 0x7;
/* Start the sample generator */ idle = !((OMAP_MCBSP_READ(io_base, SPCR2) |
w = OMAP_MCBSP_READ(io_base, SPCR2); OMAP_MCBSP_READ(io_base, SPCR1)) & 1);
OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 6));
if (idle) {
/* Start the sample generator */
w = OMAP_MCBSP_READ(io_base, SPCR2);
OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 6));
}
/* Enable transmitter and receiver */ /* Enable transmitter and receiver */
w = OMAP_MCBSP_READ(io_base, SPCR2); w = OMAP_MCBSP_READ(io_base, SPCR2);
OMAP_MCBSP_WRITE(io_base, SPCR2, w | 1); OMAP_MCBSP_WRITE(io_base, SPCR2, w | (tx & 1));
w = OMAP_MCBSP_READ(io_base, SPCR1); w = OMAP_MCBSP_READ(io_base, SPCR1);
OMAP_MCBSP_WRITE(io_base, SPCR1, w | 1); OMAP_MCBSP_WRITE(io_base, SPCR1, w | (rx & 1));
udelay(100); udelay(100);
/* Start frame sync */ if (idle) {
w = OMAP_MCBSP_READ(io_base, SPCR2); /* Start frame sync */
OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 7)); w = OMAP_MCBSP_READ(io_base, SPCR2);
OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 7));
}
/* Dump McBSP Regs */ /* Dump McBSP Regs */
omap_mcbsp_dump_reg(id); omap_mcbsp_dump_reg(id);
} }
EXPORT_SYMBOL(omap_mcbsp_start); EXPORT_SYMBOL(omap_mcbsp_start);
void omap_mcbsp_stop(unsigned int id) void omap_mcbsp_stop(unsigned int id, int tx, int rx)
{ {
struct omap_mcbsp *mcbsp; struct omap_mcbsp *mcbsp;
void __iomem *io_base; void __iomem *io_base;
int idle;
u16 w; u16 w;
if (!omap_mcbsp_check_valid_id(id)) { if (!omap_mcbsp_check_valid_id(id)) {
@ -386,15 +395,20 @@ void omap_mcbsp_stop(unsigned int id)
/* Reset transmitter */ /* Reset transmitter */
w = OMAP_MCBSP_READ(io_base, SPCR2); w = OMAP_MCBSP_READ(io_base, SPCR2);
OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(1)); OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(tx & 1));
/* Reset receiver */ /* Reset receiver */
w = OMAP_MCBSP_READ(io_base, SPCR1); w = OMAP_MCBSP_READ(io_base, SPCR1);
OMAP_MCBSP_WRITE(io_base, SPCR1, w & ~(1)); OMAP_MCBSP_WRITE(io_base, SPCR1, w & ~(rx & 1));
/* Reset the sample rate generator */ idle = !((OMAP_MCBSP_READ(io_base, SPCR2) |
w = OMAP_MCBSP_READ(io_base, SPCR2); OMAP_MCBSP_READ(io_base, SPCR1)) & 1);
OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(1 << 6));
if (idle) {
/* Reset the sample rate generator */
w = OMAP_MCBSP_READ(io_base, SPCR2);
OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(1 << 6));
}
} }
EXPORT_SYMBOL(omap_mcbsp_stop); EXPORT_SYMBOL(omap_mcbsp_stop);

View File

@ -183,21 +183,21 @@ static int omap_mcbsp_dai_trigger(struct snd_pcm_substream *substream, int cmd,
struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai; struct snd_soc_dai *cpu_dai = rtd->dai->cpu_dai;
struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
int err = 0; int err = 0, play = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
switch (cmd) { switch (cmd) {
case SNDRV_PCM_TRIGGER_START: case SNDRV_PCM_TRIGGER_START:
case SNDRV_PCM_TRIGGER_RESUME: case SNDRV_PCM_TRIGGER_RESUME:
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
if (!mcbsp_data->active++) mcbsp_data->active++;
omap_mcbsp_start(mcbsp_data->bus_id); omap_mcbsp_start(mcbsp_data->bus_id, play, !play);
break; break;
case SNDRV_PCM_TRIGGER_STOP: case SNDRV_PCM_TRIGGER_STOP:
case SNDRV_PCM_TRIGGER_SUSPEND: case SNDRV_PCM_TRIGGER_SUSPEND:
case SNDRV_PCM_TRIGGER_PAUSE_PUSH: case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
if (!--mcbsp_data->active) omap_mcbsp_stop(mcbsp_data->bus_id, play, !play);
omap_mcbsp_stop(mcbsp_data->bus_id); mcbsp_data->active--;
break; break;
default: default:
err = -EINVAL; err = -EINVAL;