@ -16,6 +16,7 @@
# include <linux/slab.h>
# include <linux/dma-mapping.h>
# include <linux/kernel.h>
# include <linux/genalloc.h>
# include <sound/core.h>
# include <sound/pcm.h>
@ -23,7 +24,6 @@
# include <sound/soc.h>
# include <asm/dma.h>
# include <mach/sram.h>
# include "davinci-pcm.h"
@ -251,7 +251,9 @@ static void davinci_pcm_dma_irq(unsigned link, u16 ch_status, void *data)
}
}
static int allocate_sram ( struct snd_pcm_substream * substream , unsigned size ,
# ifdef CONFIG_GENERIC_ALLOCATOR
static int allocate_sram ( struct snd_pcm_substream * substream ,
struct gen_pool * sram_pool , unsigned size ,
struct snd_pcm_hardware * ppcm )
{
struct snd_dma_buffer * buf = & substream - > dma_buffer ;
@ -263,9 +265,10 @@ static int allocate_sram(struct snd_pcm_substream *substream, unsigned size,
return 0 ;
ppcm - > period_bytes_max = size ;
iram_virt = sram_alloc ( size , & iram_phys ) ;
iram_virt = ( void * ) gen_pool_alloc ( sram_pool , size ) ;
if ( ! iram_virt )
goto exit1 ;
iram_phys = gen_pool_virt_to_phys ( sram_pool , ( unsigned ) iram_virt ) ;
iram_dma = kzalloc ( sizeof ( * iram_dma ) , GFP_KERNEL ) ;
if ( ! iram_dma )
goto exit2 ;
@ -277,11 +280,33 @@ static int allocate_sram(struct snd_pcm_substream *substream, unsigned size,
return 0 ;
exit2 :
if ( iram_virt )
sram_free ( iram_virt , size ) ;
gen_pool_free ( sram_pool , ( unsigned ) iram_virt , size ) ;
exit1 :
return - ENOMEM ;
}
static void davinci_free_sram ( struct snd_pcm_substream * substream ,
struct snd_dma_buffer * iram_dma )
{
struct davinci_runtime_data * prtd = substream - > runtime - > private_data ;
struct gen_pool * sram_pool = prtd - > params - > sram_pool ;
gen_pool_free ( sram_pool , ( unsigned ) iram_dma - > area , iram_dma - > bytes ) ;
}
# else
static int allocate_sram ( struct snd_pcm_substream * substream ,
struct gen_pool * sram_pool , unsigned size ,
struct snd_pcm_hardware * ppcm )
{
return 0 ;
}
static void davinci_free_sram ( struct snd_pcm_substream * substream ,
struct snd_dma_buffer * iram_dma )
{
}
# endif
/*
* Only used with ping / pong .
* This is called after runtime - > dma_addr , period_bytes and data_type are valid
@ -668,7 +693,7 @@ static int davinci_pcm_open(struct snd_pcm_substream *substream)
ppcm = ( substream - > stream = = SNDRV_PCM_STREAM_PLAYBACK ) ?
& pcm_hardware_playback : & pcm_hardware_capture ;
allocate_sram ( substream , params - > sram_size , ppcm ) ;
allocate_sram ( substream , params - > sram_pool , params - > sram_ size , ppcm ) ;
snd_soc_set_runtime_hwparams ( substream , ppcm ) ;
/* ensure that buffer size is a multiple of period size */
ret = snd_pcm_hw_constraint_integer ( runtime ,
@ -811,7 +836,7 @@ static void davinci_pcm_free(struct snd_pcm *pcm)
buf - > area = NULL ;
iram_dma = buf - > private_data ;
if ( iram_dma ) {
sram_free ( iram_dma - > area , iram_dma - > bytes ) ;
davinci_free_sram ( substream , iram_dma ) ;
kfree ( iram_dma ) ;
}
}