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>
2015-05-14 10:06:55 +02:00
# include <linux/of_address.h>
2012-03-08 09:02:02 +00:00
2011-08-12 13:41:50 +02:00
# 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
2011-10-08 21:47:06 +02:00
static int __init ux500_l2x0_unlock ( void )
{
int i ;
2015-05-14 10:06:55 +02:00
struct device_node * np ;
void __iomem * l2x0_base ;
np = of_find_compatible_node ( NULL , NULL , " arm,pl310-cache " ) ;
l2x0_base = of_iomap ( np , 0 ) ;
of_node_put ( np ) ;
if ( ! l2x0_base )
return - ENODEV ;
2011-10-08 21:47:06 +02:00
/*
* 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 ) ;
}
2015-05-14 10:06:55 +02:00
iounmap ( l2x0_base ) ;
2011-10-08 21:47:06 +02:00
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
{
2014-07-10 10:42:05 +02:00
/* Multiplatform guard */
if ( ! ( ( cpu_is_u8500_family ( ) | | cpu_is_ux540_family ( ) ) ) )
2013-06-26 21:46:08 +02:00
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 ;
2014-07-10 10:42:05 +02:00
l2x0_of_init ( 0 , ~ 0 ) ;
2011-08-12 13:41:50 +02:00
return 0 ;
}
early_initcall ( ux500_l2x0_init ) ;