diff options
Diffstat (limited to 'sound/soc/davinci/davinci-mcasp.c')
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 16 | 
1 files changed, 12 insertions, 4 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 4495a40a9468..2ccb8bccc9d4 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c @@ -223,8 +223,8 @@ static void mcasp_start_tx(struct davinci_mcasp *mcasp)  	/* wait for XDATA to be cleared */  	cnt = 0; -	while (!(mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) & -		 ~XRDATA) && (cnt < 100000)) +	while ((mcasp_get_reg(mcasp, DAVINCI_MCASP_TXSTAT_REG) & XRDATA) && +	       (cnt < 100000))  		cnt++;  	/* Release TX state machine */ @@ -681,8 +681,8 @@ static int davinci_mcasp_set_tdm_slot(struct snd_soc_dai *dai,  	}  	mcasp->tdm_slots = slots; -	mcasp->tdm_mask[SNDRV_PCM_STREAM_PLAYBACK] = rx_mask; -	mcasp->tdm_mask[SNDRV_PCM_STREAM_CAPTURE] = tx_mask; +	mcasp->tdm_mask[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask; +	mcasp->tdm_mask[SNDRV_PCM_STREAM_CAPTURE] = rx_mask;  	mcasp->slot_width = slot_width;  	return davinci_mcasp_set_ch_constraints(mcasp); @@ -908,6 +908,14 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream,  		mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD);  		mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG,  			       FSRMOD(total_slots), FSRMOD(0x1FF)); +		/* +		 * If McASP is set to be TX/RX synchronous and the playback is +		 * not running already we need to configure the TX slots in +		 * order to have correct FSX on the bus +		 */ +		if (mcasp_is_synchronous(mcasp) && !mcasp->channels) +			mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, +				       FSXMOD(total_slots), FSXMOD(0x1FF));  	}  	return 0;  | 
