2011-07-08 02:40:14 -07:00
/*
* l2 cache initialization for CSR SiRFprimaII
*
* Copyright ( c ) 2011 Cambridge Silicon Radio Limited , a CSR plc group company .
*
* Licensed under GPLv2 or later .
*/
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/of.h>
# include <asm/hardware/cache-l2x0.h>
2014-02-18 14:46:27 +08:00
struct l2x0_aux {
2012-12-20 17:20:46 +08:00
u32 val ;
u32 mask ;
} ;
2014-02-18 14:46:27 +08:00
static const struct l2x0_aux prima2_l2x0_aux __initconst = {
2012-12-20 17:20:46 +08:00
. val = 2 < < L2X0_AUX_CTRL_WAY_SIZE_SHIFT ,
. mask = 0 ,
} ;
2014-02-18 14:46:27 +08:00
static const struct l2x0_aux marco_l2x0_aux __initconst = {
2012-12-20 17:20:46 +08:00
. val = ( 2 < < L2X0_AUX_CTRL_WAY_SIZE_SHIFT ) |
( 1 < < L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT ) ,
. mask = L2X0_AUX_CTRL_MASK ,
} ;
2014-02-18 14:46:27 +08:00
static const struct of_device_id sirf_l2x0_ids [ ] __initconst = {
2012-12-20 17:20:46 +08:00
{ . compatible = " sirf,prima2-pl310-cache " , . data = & prima2_l2x0_aux , } ,
{ . compatible = " sirf,marco-pl310-cache " , . data = & marco_l2x0_aux , } ,
2011-09-15 19:16:28 -07:00
{ } ,
2011-07-08 02:40:14 -07:00
} ;
2011-09-15 19:16:28 -07:00
static int __init sirfsoc_l2x0_init ( void )
2011-07-08 02:40:14 -07:00
{
struct device_node * np ;
2012-12-20 17:20:46 +08:00
const struct l2x0_aux * aux ;
2011-07-08 02:40:14 -07:00
2012-12-20 17:20:46 +08:00
np = of_find_matching_node ( NULL , sirf_l2x0_ids ) ;
2011-09-15 19:16:28 -07:00
if ( np ) {
2012-12-20 17:20:46 +08:00
aux = of_match_node ( sirf_l2x0_ids , np ) - > data ;
return l2x0_of_init ( aux - > val , aux - > mask ) ;
2011-07-08 02:40:14 -07:00
}
return 0 ;
}
2011-09-15 19:16:28 -07:00
early_initcall ( sirfsoc_l2x0_init ) ;