2010-06-19 04:08:12 +00:00
/*
* Copyright ( C ) 2009 - 2010 , Lars - Peter Clausen < lars @ metafoo . de >
2011-05-02 11:47:00 +02:00
* Copyright ( C ) 2011 , Maarten ter Huurne < maarten @ treewalker . org >
2010-06-19 04:08:12 +00:00
* JZ4740 setup code
*
* This program is free software ; you can redistribute it and / or modify it
2013-01-22 12:59:30 +01:00
* under the terms of the GNU General Public License as published by the
2010-06-19 04:08:12 +00:00
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*
*/
# include <linux/init.h>
2011-05-02 11:47:00 +02:00
# include <linux/io.h>
2015-05-24 16:11:19 +01:00
# include <linux/irqchip.h>
2010-06-19 04:08:12 +00:00
# include <linux/kernel.h>
2015-05-24 16:11:42 +01:00
# include <linux/libfdt.h>
2015-05-24 16:11:15 +01:00
# include <linux/of_fdt.h>
2010-06-19 04:08:12 +00:00
2011-05-02 11:47:00 +02:00
# include <asm/bootinfo.h>
2015-05-24 16:11:15 +01:00
# include <asm/prom.h>
2011-05-02 11:47:00 +02:00
# include <asm/mach-jz4740/base.h>
2010-06-19 04:08:12 +00:00
# include "reset.h"
2011-05-02 11:47:00 +02:00
# define JZ4740_EMC_SDRAM_CTRL 0x80
static void __init jz4740_detect_mem ( void )
{
void __iomem * jz_emc_base ;
u32 ctrl , bus , bank , rows , cols ;
2014-11-22 00:22:09 +01:00
phys_addr_t size ;
2011-05-02 11:47:00 +02:00
jz_emc_base = ioremap ( JZ4740_EMC_BASE_ADDR , 0x100 ) ;
ctrl = readl ( jz_emc_base + JZ4740_EMC_SDRAM_CTRL ) ;
bus = 2 - ( ( ctrl > > 31 ) & 1 ) ;
bank = 1 + ( ( ctrl > > 19 ) & 1 ) ;
cols = 8 + ( ( ctrl > > 26 ) & 7 ) ;
rows = 11 + ( ( ctrl > > 20 ) & 3 ) ;
printk ( KERN_DEBUG
" SDRAM preconfigured: bus:%u bank:%u rows:%u cols:%u \n " ,
bus , bank , rows , cols ) ;
iounmap ( jz_emc_base ) ;
size = 1 < < ( bus + bank + cols + rows ) ;
add_memory_region ( 0 , size , BOOT_MEM_RAM ) ;
}
2010-06-19 04:08:12 +00:00
void __init plat_mem_setup ( void )
{
2015-05-24 16:11:42 +01:00
int offset ;
2010-06-19 04:08:12 +00:00
jz4740_reset_init ( ) ;
2015-05-24 16:11:15 +01:00
__dt_setup_arch ( __dtb_start ) ;
2015-05-24 16:11:42 +01:00
offset = fdt_path_offset ( __dtb_start , " /memory " ) ;
if ( offset < 0 )
jz4740_detect_mem ( ) ;
2010-06-19 04:08:12 +00:00
}
2015-05-24 16:11:15 +01:00
void __init device_tree_init ( void )
{
if ( ! initial_boot_params )
return ;
unflatten_and_copy_device_tree ( ) ;
}
2010-06-19 04:08:12 +00:00
const char * get_system_type ( void )
{
2016-08-03 13:45:50 -07:00
if ( IS_ENABLED ( CONFIG_MACH_JZ4780 ) )
2015-05-24 16:11:46 +01:00
return " JZ4780 " ;
2010-06-19 04:08:12 +00:00
return " JZ4740 " ;
}
2015-05-24 16:11:19 +01:00
void __init arch_init_irq ( void )
{
irqchip_init ( ) ;
}