2009-11-25 18:41:04 +03:00
/*
* imx - pcm - dma - mx2 . c - - ALSA Soc Audio Layer
*
* Copyright 2009 Sascha Hauer < s . hauer @ pengutronix . de >
*
* This code is based on code copyrighted by Freescale ,
* Liam Girdwood , Javier Martin and probably others .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*/
# include <linux/platform_device.h>
2010-11-04 19:05:43 +03:00
# include <linux/dmaengine.h>
2012-02-01 14:42:19 +04:00
# include <linux/types.h>
2009-11-25 18:41:04 +03:00
# include <sound/core.h>
# include <sound/pcm.h>
# include <sound/soc.h>
2012-02-22 13:49:09 +04:00
# include <sound/dmaengine_pcm.h>
2009-11-25 18:41:04 +03:00
2012-03-05 18:30:55 +04:00
# include "imx-pcm.h"
2009-11-25 18:41:04 +03:00
2010-11-04 19:05:43 +03:00
static bool filter ( struct dma_chan * chan , void * param )
2009-11-25 18:41:04 +03:00
{
2013-04-03 13:06:04 +04:00
struct snd_dmaengine_dai_dma_data * dma_data = param ;
2010-11-04 19:05:43 +03:00
if ( ! imx_dma_is_general_purpose ( chan ) )
return false ;
2009-11-25 18:41:04 +03:00
2013-04-03 13:06:04 +04:00
chan - > private = dma_data - > filter_data ;
2010-04-08 13:31:25 +04:00
2012-02-22 13:49:09 +04:00
return true ;
2012-02-22 13:49:06 +04:00
}
2013-04-15 21:19:59 +04:00
static const struct snd_pcm_hardware imx_pcm_hardware = {
2009-11-25 18:41:04 +03:00
. info = SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_BLOCK_TRANSFER |
SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_PAUSE |
SNDRV_PCM_INFO_RESUME ,
. formats = SNDRV_PCM_FMTBIT_S16_LE ,
. rate_min = 8000 ,
. channels_min = 2 ,
. channels_max = 2 ,
. buffer_bytes_max = IMX_SSI_DMABUF_SIZE ,
. period_bytes_min = 128 ,
2010-11-04 19:05:43 +03:00
. period_bytes_max = 65535 , /* Limited by SDMA engine */
2009-11-25 18:41:04 +03:00
. periods_min = 2 ,
. periods_max = 255 ,
. fifo_size = 0 ,
} ;
2013-04-15 21:19:59 +04:00
static const struct snd_dmaengine_pcm_config imx_dmaengine_pcm_config = {
. pcm_hardware = & imx_pcm_hardware ,
. prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config ,
. compat_filter_fn = filter ,
. prealloc_buffer_size = IMX_SSI_DMABUF_SIZE ,
2009-11-25 18:41:04 +03:00
} ;
2013-01-28 10:25:43 +04:00
int imx_pcm_dma_init ( struct platform_device * pdev )
2009-11-25 18:41:04 +03:00
{
2013-04-15 21:19:59 +04:00
return snd_dmaengine_pcm_register ( & pdev - > dev , & imx_dmaengine_pcm_config ,
SND_DMAENGINE_PCM_FLAG_NO_RESIDUE |
SND_DMAENGINE_PCM_FLAG_COMPAT ) ;
}
2013-04-25 07:18:50 +04:00
EXPORT_SYMBOL_GPL ( imx_pcm_dma_init ) ;
2013-04-15 21:19:59 +04:00
void imx_pcm_dma_exit ( struct platform_device * pdev )
{
snd_dmaengine_pcm_unregister ( & pdev - > dev ) ;
2010-03-17 23:15:21 +03:00
}
2013-04-25 07:18:50 +04:00
EXPORT_SYMBOL_GPL ( imx_pcm_dma_exit ) ;