2011-08-12 13:41:50 +02:00
/*
* Copyright ( C ) ST - Ericsson SA 2011
*
* License terms : GNU General Public License ( GPL ) version 2
*/
# include <linux/io.h>
2012-03-08 09:02:02 +00:00
# include <linux/of.h>
2011-08-12 13:41:50 +02:00
# include <asm/cacheflush.h>
# include <asm/hardware/cache-l2x0.h>
2012-09-19 19:31:19 +02:00
2013-03-19 15:41:55 +01:00
# include "db8500-regs.h"
2012-09-19 19:31:19 +02:00
# include "id.h"
2011-08-12 13:41:50 +02:00
static void __iomem * l2x0_base ;
2011-10-08 21:47:06 +02:00
static int __init ux500_l2x0_unlock ( void )
{
int i ;
/*
* Unlock Data and Instruction Lock if locked . Ux500 U - Boot versions
* apparently locks both caches before jumping to the kernel . The
* l2x0 core will not touch the unlock registers if the l2x0 is
* already enabled , so we do it right here instead . The PL310 has
* 8 sets of registers , one per possible CPU .
*/
for ( i = 0 ; i < 8 ; i + + ) {
writel_relaxed ( 0x0 , l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE +
i * L2X0_LOCKDOWN_STRIDE ) ;
writel_relaxed ( 0x0 , l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE +
i * L2X0_LOCKDOWN_STRIDE ) ;
}
return 0 ;
}
2014-03-16 19:15:21 +00:00
static void ux500_l2c310_write_sec ( unsigned long val , unsigned reg )
{
/*
* We can ' t write to secure registers as we are in non - secure
* mode , until we have some SMI service available .
*/
}
2011-10-08 21:47:06 +02:00
static int __init ux500_l2x0_init ( void )
2011-08-12 13:41:50 +02:00
{
2012-08-09 17:10:36 +02:00
if ( cpu_is_u8500_family ( ) | | cpu_is_ux540_family ( ) )
2011-08-12 13:41:50 +02:00
l2x0_base = __io_address ( U8500_L2CC_BASE ) ;
else
2013-06-26 21:46:08 +02:00
/* Non-Ux500 platform */
return - ENODEV ;
2011-08-12 13:41:50 +02:00
2011-10-08 21:47:06 +02:00
/* Unlock before init */
ux500_l2x0_unlock ( ) ;
2014-03-16 19:15:21 +00:00
outer_cache . write_sec = ux500_l2c310_write_sec ;
2012-03-08 09:02:02 +00:00
if ( of_have_populated_dt ( ) )
2014-03-19 12:47:58 +00:00
l2x0_of_init ( 0 , ~ 0 ) ;
2012-03-08 09:02:02 +00:00
else
2014-03-19 12:47:58 +00:00
l2x0_init ( l2x0_base , 0 , ~ 0 ) ;
2011-08-12 13:41:50 +02:00
return 0 ;
}
early_initcall ( ux500_l2x0_init ) ;