2017-10-25 14:34:56 +08:00
// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2005-2017 Andes Technology Corporation
# include <linux/compiler.h>
# include <linux/of_address.h>
# include <linux/of_fdt.h>
# include <linux/of_platform.h>
# include <asm/l2_cache.h>
void __iomem * atl2c_base ;
static const struct of_device_id atl2c_ids [ ] __initconst = {
2018-08-07 12:03:13 +08:00
{ . compatible = " andestech,atl2c " , } ,
{ }
2017-10-25 14:34:56 +08:00
} ;
static int __init atl2c_of_init ( void )
{
struct device_node * np ;
struct resource res ;
unsigned long tmp = 0 ;
unsigned long l2set , l2way , l2clsz ;
if ( ! ( __nds32__mfsr ( NDS32_SR_MSC_CFG ) & MSC_CFG_mskL2C ) )
return - ENODEV ;
np = of_find_matching_node ( NULL , atl2c_ids ) ;
if ( ! np )
return - ENODEV ;
if ( of_address_to_resource ( np , 0 , & res ) )
return - ENODEV ;
atl2c_base = ioremap ( res . start , resource_size ( & res ) ) ;
if ( ! atl2c_base )
return - ENOMEM ;
l2set =
64 < < ( ( L2C_R_REG ( L2_CA_CONF_OFF ) & L2_CA_CONF_mskL2SET ) > >
L2_CA_CONF_offL2SET ) ;
l2way =
1 +
( ( L2C_R_REG ( L2_CA_CONF_OFF ) & L2_CA_CONF_mskL2WAY ) > >
L2_CA_CONF_offL2WAY ) ;
l2clsz =
4 < < ( ( L2C_R_REG ( L2_CA_CONF_OFF ) & L2_CA_CONF_mskL2CLSZ ) > >
L2_CA_CONF_offL2CLSZ ) ;
pr_info ( " L2:%luKB/%luS/%luW/%luB \n " ,
l2set * l2way * l2clsz / 1024 , l2set , l2way , l2clsz ) ;
tmp = L2C_R_REG ( L2CC_PROT_OFF ) ;
tmp & = ~ L2CC_PROT_mskMRWEN ;
L2C_W_REG ( L2CC_PROT_OFF , tmp ) ;
tmp = L2C_R_REG ( L2CC_SETUP_OFF ) ;
tmp & = ~ L2CC_SETUP_mskPART ;
L2C_W_REG ( L2CC_SETUP_OFF , tmp ) ;
tmp = L2C_R_REG ( L2CC_CTRL_OFF ) ;
tmp | = L2CC_CTRL_mskEN ;
L2C_W_REG ( L2CC_CTRL_OFF , tmp ) ;
return 0 ;
}
subsys_initcall ( atl2c_of_init ) ;