2012-04-17 20:21:30 -07:00
/*
2011-07-21 16:42:30 +09:00
* Copyright ( C ) 2010 - 2011 Samsung Electronics Co . Ltd
*
* Base S5P MFC resource and device definitions
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/kernel.h>
# include <linux/interrupt.h>
# include <linux/platform_device.h>
# include <linux/dma-mapping.h>
# include <linux/memblock.h>
# include <linux/ioport.h>
2012-10-23 22:51:33 +09:00
# include <linux/of_fdt.h>
# include <linux/of.h>
2011-07-21 16:42:30 +09:00
2013-06-19 01:28:56 +09:00
static struct platform_device s5p_device_mfc_l ;
static struct platform_device s5p_device_mfc_r ;
2014-07-02 19:40:44 +02:00
struct s5p_mfc_dt_meminfo {
unsigned long loff ;
unsigned long lsize ;
unsigned long roff ;
unsigned long rsize ;
char * compatible ;
} ;
2013-04-10 14:49:03 +02:00
2011-07-21 16:42:30 +09:00
struct s5p_mfc_reserved_mem {
phys_addr_t base ;
unsigned long size ;
struct device * dev ;
} ;
static struct s5p_mfc_reserved_mem s5p_mfc_mem [ 2 ] __initdata ;
2013-06-19 01:28:56 +09:00
2014-07-02 19:40:44 +02:00
static void __init s5p_mfc_reserve_mem ( phys_addr_t rbase , unsigned int rsize ,
2011-07-21 16:42:30 +09:00
phys_addr_t lbase , unsigned int lsize )
{
int i ;
s5p_mfc_mem [ 0 ] . dev = & s5p_device_mfc_r . dev ;
s5p_mfc_mem [ 0 ] . base = rbase ;
s5p_mfc_mem [ 0 ] . size = rsize ;
s5p_mfc_mem [ 1 ] . dev = & s5p_device_mfc_l . dev ;
s5p_mfc_mem [ 1 ] . base = lbase ;
s5p_mfc_mem [ 1 ] . size = lsize ;
for ( i = 0 ; i < ARRAY_SIZE ( s5p_mfc_mem ) ; i + + ) {
struct s5p_mfc_reserved_mem * area = & s5p_mfc_mem [ i ] ;
if ( memblock_remove ( area - > base , area - > size ) ) {
printk ( KERN_ERR " Failed to reserve memory for MFC device (%ld bytes at 0x%08lx) \n " ,
area - > size , ( unsigned long ) area - > base ) ;
area - > base = 0 ;
}
}
}
2014-03-21 01:49:24 +09:00
int __init s5p_fdt_alloc_mfc_mem ( unsigned long node , const char * uname ,
2012-10-23 22:51:33 +09:00
int depth , void * data )
{
2014-04-01 23:49:03 -05:00
const __be32 * prop ;
int len ;
2014-03-21 01:49:24 +09:00
struct s5p_mfc_dt_meminfo mfc_mem ;
2012-10-23 22:51:33 +09:00
if ( ! data )
return 0 ;
2014-03-21 01:49:24 +09:00
if ( ! of_flat_dt_is_compatible ( node , data ) )
2012-10-23 22:51:33 +09:00
return 0 ;
prop = of_get_flat_dt_prop ( node , " samsung,mfc-l " , & len ) ;
if ( ! prop | | ( len ! = 2 * sizeof ( unsigned long ) ) )
return 0 ;
2014-03-21 01:49:24 +09:00
mfc_mem . loff = be32_to_cpu ( prop [ 0 ] ) ;
mfc_mem . lsize = be32_to_cpu ( prop [ 1 ] ) ;
2012-10-23 22:51:33 +09:00
prop = of_get_flat_dt_prop ( node , " samsung,mfc-r " , & len ) ;
if ( ! prop | | ( len ! = 2 * sizeof ( unsigned long ) ) )
return 0 ;
2014-03-21 01:49:24 +09:00
mfc_mem . roff = be32_to_cpu ( prop [ 0 ] ) ;
mfc_mem . rsize = be32_to_cpu ( prop [ 1 ] ) ;
s5p_mfc_reserve_mem ( mfc_mem . roff , mfc_mem . rsize ,
mfc_mem . loff , mfc_mem . lsize ) ;
2012-10-23 22:51:33 +09:00
return 1 ;
}