2009-05-07 09:31:42 -07:00
/*
* mach - davinci / sram . c - DaVinci simple SRAM allocator
*
* Copyright ( C ) 2009 David Brownell
*
* 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/module.h>
# include <linux/init.h>
2012-10-05 13:04:41 -04:00
# include <linux/io.h>
2009-05-07 09:31:42 -07:00
# include <linux/genalloc.h>
# include <mach/common.h>
2015-01-30 10:45:33 +01:00
# include "sram.h"
2009-05-07 09:31:42 -07:00
static struct gen_pool * sram_pool ;
2012-10-05 13:04:43 -04:00
struct gen_pool * sram_get_gen_pool ( void )
{
return sram_pool ;
}
2009-05-07 09:31:42 -07:00
void * sram_alloc ( size_t len , dma_addr_t * dma )
{
dma_addr_t dma_base = davinci_soc_info . sram_dma ;
if ( dma )
* dma = 0 ;
if ( ! sram_pool | | ( dma & & ! dma_base ) )
return NULL ;
2013-11-12 15:09:54 -08:00
return gen_pool_dma_alloc ( sram_pool , len , dma ) ;
2009-05-07 09:31:42 -07:00
}
EXPORT_SYMBOL ( sram_alloc ) ;
void sram_free ( void * addr , size_t len )
{
gen_pool_free ( sram_pool , ( unsigned long ) addr , len ) ;
}
EXPORT_SYMBOL ( sram_free ) ;
/*
* REVISIT This supports CPU and DMA access to / from SRAM , but it
* doesn ' t ( yet ? ) support some other notable uses of SRAM : as TCM
* for data and / or instructions ; and holding code needed to enter
* and exit suspend states ( while DRAM can ' t be used ) .
*/
static int __init sram_init ( void )
{
2012-10-05 13:04:41 -04:00
phys_addr_t phys = davinci_soc_info . sram_dma ;
2009-05-07 09:31:42 -07:00
unsigned len = davinci_soc_info . sram_len ;
int status = 0 ;
2013-04-10 14:57:14 +05:30
void __iomem * addr ;
2009-05-07 09:31:42 -07:00
if ( len ) {
2009-06-05 21:45:14 -07:00
len = min_t ( unsigned , len , SRAM_SIZE ) ;
2009-05-07 09:31:42 -07:00
sram_pool = gen_pool_create ( ilog2 ( SRAM_GRANULARITY ) , - 1 ) ;
if ( ! sram_pool )
status = - ENOMEM ;
}
2012-10-05 13:04:41 -04:00
if ( sram_pool ) {
addr = ioremap ( phys , len ) ;
if ( ! addr )
return - ENOMEM ;
2013-04-10 14:57:14 +05:30
status = gen_pool_add_virt ( sram_pool , ( unsigned long ) addr ,
2012-10-05 13:04:41 -04:00
phys , len , - 1 ) ;
if ( status < 0 )
iounmap ( addr ) ;
}
2009-05-07 09:31:42 -07:00
WARN_ON ( status < 0 ) ;
return status ;
}
core_initcall ( sram_init ) ;