2012-04-19 22:23:13 +05:30
/*
* arch / arm / mach - spear13xx / spear13xx . c
*
* SPEAr13XX machines common source file
*
* Copyright ( C ) 2012 ST Microelectronics
2015-07-17 16:23:50 -07:00
* Viresh Kumar < vireshk @ kernel . org >
2012-04-19 22:23:13 +05:30
*
* This file is licensed under the terms of the GNU General Public
* License version 2. This program is licensed " as is " without any
* warranty of any kind , whether express or implied .
*/
# define pr_fmt(fmt) "SPEAr13xx: " fmt
# include <linux/amba/pl022.h>
# include <linux/clk.h>
2013-02-06 21:17:47 -06:00
# include <linux/clocksource.h>
2012-04-19 22:23:13 +05:30
# include <linux/err.h>
2012-11-05 16:18:28 -06:00
# include <linux/of.h>
2012-04-19 22:23:13 +05:30
# include <asm/hardware/cache-l2x0.h>
# include <asm/mach/map.h>
# include <mach/spear.h>
2013-05-06 23:43:45 +02:00
# include "generic.h"
2012-04-19 22:23:13 +05:30
void __init spear13xx_l2x0_init ( void )
{
/*
* 512 KB ( 64 KB / way ) , 8 - way associativity , parity supported
*
* FIXME : 9 th bit , of Auxillary Controller register must be set
* for some spear13xx devices for stable L2 operation .
*
* Enable Early BRESP , L2 prefetch for Instruction and Data ,
* write alloc and ' Full line of zero ' options
*
*/
2013-04-30 17:52:16 +02:00
if ( ! IS_ENABLED ( CONFIG_CACHE_L2X0 ) )
return ;
2012-04-19 22:23:13 +05:30
2014-03-16 20:52:25 +00:00
writel_relaxed ( 0x06 , VA_L2CC_BASE + L310_PREFETCH_CTRL ) ;
2012-04-19 22:23:13 +05:30
/*
* Program following latencies in order to make
* SPEAr1340 work at 600 MHz
*/
2014-03-16 20:52:25 +00:00
writel_relaxed ( 0x221 , VA_L2CC_BASE + L310_TAG_LATENCY_CTRL ) ;
writel_relaxed ( 0x441 , VA_L2CC_BASE + L310_DATA_LATENCY_CTRL ) ;
2014-03-19 12:18:02 +00:00
l2x0_init ( VA_L2CC_BASE , 0x30a00001 , 0xfe0fffff ) ;
2012-04-19 22:23:13 +05:30
}
/*
* Following will create 16 MB static virtual / physical mappings
* PHYSICAL VIRTUAL
2013-11-29 15:57:35 +05:30
* 0xB3000000 0xF9000000
2012-04-19 22:23:13 +05:30
* 0xE0000000 0xFD000000
* 0xEC000000 0xFC000000
* 0xED000000 0xFB000000
*/
2014-06-24 17:13:53 +05:30
static struct map_desc spear13xx_io_desc [ ] __initdata = {
2012-04-19 22:23:13 +05:30
{
2012-09-14 20:22:00 +00:00
. virtual = ( unsigned long ) VA_PERIP_GRP2_BASE ,
2012-04-19 22:23:13 +05:30
. pfn = __phys_to_pfn ( PERIP_GRP2_BASE ) ,
. length = SZ_16M ,
. type = MT_DEVICE
} , {
2012-09-14 20:22:00 +00:00
. virtual = ( unsigned long ) VA_PERIP_GRP1_BASE ,
2012-04-19 22:23:13 +05:30
. pfn = __phys_to_pfn ( PERIP_GRP1_BASE ) ,
. length = SZ_16M ,
. type = MT_DEVICE
} , {
2012-09-14 20:22:00 +00:00
. virtual = ( unsigned long ) VA_A9SM_AND_MPMC_BASE ,
2012-04-19 22:23:13 +05:30
. pfn = __phys_to_pfn ( A9SM_AND_MPMC_BASE ) ,
. length = SZ_16M ,
. type = MT_DEVICE
} , {
. virtual = ( unsigned long ) VA_L2CC_BASE ,
. pfn = __phys_to_pfn ( L2CC_BASE ) ,
. length = SZ_4K ,
. type = MT_DEVICE
} ,
} ;
/* This will create static memory mapping for selected devices */
void __init spear13xx_map_io ( void )
{
iotable_init ( spear13xx_io_desc , ARRAY_SIZE ( spear13xx_io_desc ) ) ;
}
static void __init spear13xx_clk_init ( void )
{
if ( of_machine_is_compatible ( " st,spear1310 " ) )
2012-12-02 17:59:57 +01:00
spear1310_clk_init ( VA_MISC_BASE , VA_SPEAR1310_RAS_BASE ) ;
2012-04-19 22:23:13 +05:30
else if ( of_machine_is_compatible ( " st,spear1340 " ) )
2012-12-02 17:59:57 +01:00
spear1340_clk_init ( VA_MISC_BASE ) ;
2012-04-19 22:23:13 +05:30
else
pr_err ( " %s: Unknown machine \n " , __func__ ) ;
}
2012-11-08 12:40:59 -07:00
void __init spear13xx_timer_init ( void )
2012-04-19 22:23:13 +05:30
{
char pclk_name [ ] = " osc_24m_clk " ;
struct clk * gpt_clk , * pclk ;
spear13xx_clk_init ( ) ;
/* get the system timer clock */
gpt_clk = clk_get_sys ( " gpt0 " , NULL ) ;
if ( IS_ERR ( gpt_clk ) ) {
pr_err ( " %s:couldn't get clk for gpt \n " , __func__ ) ;
BUG ( ) ;
}
/* get the suitable parent clock for timer*/
pclk = clk_get ( NULL , pclk_name ) ;
if ( IS_ERR ( pclk ) ) {
pr_err ( " %s:couldn't get %s as parent for gpt \n " , __func__ ,
pclk_name ) ;
BUG ( ) ;
}
clk_set_parent ( gpt_clk , pclk ) ;
clk_put ( gpt_clk ) ;
clk_put ( pclk ) ;
spear_setup_of_timer ( ) ;
2017-05-26 17:40:46 +02:00
timer_probe ( ) ;
2012-04-19 22:23:13 +05:30
}