diff options
Diffstat (limited to 'sound/soc/s3c24xx/s3c-i2s-v2.c')
| -rw-r--r-- | sound/soc/s3c24xx/s3c-i2s-v2.c | 17 | 
1 files changed, 14 insertions, 3 deletions
diff --git a/sound/soc/s3c24xx/s3c-i2s-v2.c b/sound/soc/s3c24xx/s3c-i2s-v2.c index 1a283170ca9..aa7af0b8d42 100644 --- a/sound/soc/s3c24xx/s3c-i2s-v2.c +++ b/sound/soc/s3c24xx/s3c-i2s-v2.c @@ -36,6 +36,7 @@  #include <mach/dma.h>  #include "s3c-i2s-v2.h" +#include "s3c24xx-pcm.h"  #undef S3C_IIS_V2_SUPPORTED @@ -357,19 +358,19 @@ static int s3c2412_i2s_hw_params(struct snd_pcm_substream *substream,  #endif  #ifdef CONFIG_PLAT_S3C64XX -	iismod &= ~0x606; +	iismod &= ~(S3C64XX_IISMOD_BLC_MASK | S3C2412_IISMOD_BCLK_MASK);  	/* Sample size */  	switch (params_format(params)) {  	case SNDRV_PCM_FORMAT_S8:  		/* 8 bit sample, 16fs BCLK */ -		iismod |= 0x2004; +		iismod |= (S3C64XX_IISMOD_BLC_8BIT | S3C2412_IISMOD_BCLK_16FS);  		break;  	case SNDRV_PCM_FORMAT_S16_LE:  		/* 16 bit sample, 32fs BCLK */  		break;  	case SNDRV_PCM_FORMAT_S24_LE:  		/* 24 bit sample, 48fs BCLK */ -		iismod |= 0x4002; +		iismod |= (S3C64XX_IISMOD_BLC_24BIT | S3C2412_IISMOD_BCLK_48FS);  		break;  	}  #endif @@ -387,6 +388,8 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,  	int capture = (substream->stream == SNDRV_PCM_STREAM_CAPTURE);  	unsigned long irqs;  	int ret = 0; +	int channel = ((struct s3c24xx_pcm_dma_params *) +		  rtd->dai->cpu_dai->dma_data)->channel;  	pr_debug("Entered %s\n", __func__); @@ -416,6 +419,14 @@ static int s3c2412_i2s_trigger(struct snd_pcm_substream *substream, int cmd,  			s3c2412_snd_txctrl(i2s, 1);  		local_irq_restore(irqs); + +		/* +		 * Load the next buffer to DMA to meet the reqirement +		 * of the auto reload mechanism of S3C24XX. +		 * This call won't bother S3C64XX. +		 */ +		s3c2410_dma_ctrl(channel, S3C2410_DMAOP_STARTED); +  		break;  	case SNDRV_PCM_TRIGGER_STOP:  |