diff options
Diffstat (limited to 'sound/soc/omap/omap-pcm.c')
| -rw-r--r-- | sound/soc/omap/omap-pcm.c | 15 | 
1 files changed, 8 insertions, 7 deletions
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c index 9db2770e964..825db385f01 100644 --- a/sound/soc/omap/omap-pcm.c +++ b/sound/soc/omap/omap-pcm.c @@ -37,7 +37,8 @@ static const struct snd_pcm_hardware omap_pcm_hardware = {  				  SNDRV_PCM_INFO_INTERLEAVED |  				  SNDRV_PCM_INFO_PAUSE |  				  SNDRV_PCM_INFO_RESUME, -	.formats		= SNDRV_PCM_FMTBIT_S16_LE, +	.formats		= SNDRV_PCM_FMTBIT_S16_LE | +				  SNDRV_PCM_FMTBIT_S32_LE,  	.period_bytes_min	= 32,  	.period_bytes_max	= 64 * 1024,  	.periods_min		= 2, @@ -149,6 +150,7 @@ static int omap_pcm_prepare(struct snd_pcm_substream *substream)  	struct omap_runtime_data *prtd = runtime->private_data;  	struct omap_pcm_dma_data *dma_data = prtd->dma_data;  	struct omap_dma_channel_params dma_params; +	int bytes;  	/* return if this is a bufferless transfer e.g.  	 * codec <--> BT codec or GSM modem -- lg FIXME */ @@ -156,11 +158,7 @@ static int omap_pcm_prepare(struct snd_pcm_substream *substream)  		return 0;  	memset(&dma_params, 0, sizeof(dma_params)); -	/* -	 * Note: Regardless of interface data formats supported by OMAP McBSP -	 * or EAC blocks, internal representation is always fixed 16-bit/sample -	 */ -	dma_params.data_type			= OMAP_DMA_DATA_TYPE_S16; +	dma_params.data_type			= dma_data->data_type;  	dma_params.trigger			= dma_data->dma_req;  	dma_params.sync_mode			= dma_data->sync_mode;  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { @@ -170,6 +168,7 @@ static int omap_pcm_prepare(struct snd_pcm_substream *substream)  		dma_params.src_start		= runtime->dma_addr;  		dma_params.dst_start		= dma_data->port_addr;  		dma_params.dst_port		= OMAP_DMA_PORT_MPUI; +		dma_params.dst_fi		= dma_data->packet_size;  	} else {  		dma_params.src_amode		= OMAP_DMA_AMODE_CONSTANT;  		dma_params.dst_amode		= OMAP_DMA_AMODE_POST_INC; @@ -177,6 +176,7 @@ static int omap_pcm_prepare(struct snd_pcm_substream *substream)  		dma_params.src_start		= dma_data->port_addr;  		dma_params.dst_start		= runtime->dma_addr;  		dma_params.src_port		= OMAP_DMA_PORT_MPUI; +		dma_params.src_fi		= dma_data->packet_size;  	}  	/*  	 * Set DMA transfer frame size equal to ALSA period size and frame @@ -184,7 +184,8 @@ static int omap_pcm_prepare(struct snd_pcm_substream *substream)  	 * we can transfer the whole ALSA buffer with single DMA transfer but  	 * still can get an interrupt at each period bounary  	 */ -	dma_params.elem_count	= snd_pcm_lib_period_bytes(substream) / 2; +	bytes = snd_pcm_lib_period_bytes(substream); +	dma_params.elem_count	= bytes >> dma_data->data_type;  	dma_params.frame_count	= runtime->periods;  	omap_set_dma_params(prtd->dma_ch, &dma_params);  |