2019-05-27 08:55:06 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2011-03-17 09:40:29 +01:00
/*
* Copyright ( C ) 1999 , 2000 Arm Limited
* Copyright ( C ) 2000 Deep Blue Solutions Ltd
* Copyright ( C ) 2002 Shane Nay ( shane @ minirl . com )
* Copyright 2005 - 2007 Freescale Semiconductor , Inc . All Rights Reserved .
* - add MX31 specific definitions
*/
# include <linux/mm.h>
# include <linux/init.h>
# include <linux/err.h>
2016-06-24 12:49:58 +02:00
# include <linux/io.h>
2020-09-16 21:41:18 -03:00
# include <linux/of_address.h>
2012-05-02 19:31:20 +08:00
# include <linux/pinctrl/machine.h>
2011-03-17 09:40:29 +01:00
2012-03-29 23:22:44 -07:00
# include <asm/system_misc.h>
2011-09-28 17:16:05 +08:00
# include <asm/hardware/cache-l2x0.h>
2011-03-17 09:40:29 +01:00
# include <asm/mach/map.h>
2012-09-13 21:01:00 +08:00
# include "common.h"
2012-04-03 12:42:27 +02:00
# include "crmregs-imx3.h"
2012-09-14 14:14:45 +08:00
# include "hardware.h"
2012-04-03 12:42:27 +02:00
void __iomem * mx3_ccm_base ;
2011-09-28 17:16:06 +08:00
static void imx3_idle ( void )
{
unsigned long reg = 0 ;
2011-11-11 13:09:18 +08:00
2011-08-03 11:34:59 -04:00
__asm__ __volatile__ (
/* disable I and D cache */
" mrc p15, 0, %0, c1, c0, 0 \n "
" bic %0, %0, #0x00001000 \n "
" bic %0, %0, #0x00000004 \n "
" mcr p15, 0, %0, c1, c0, 0 \n "
/* invalidate I cache */
" mov %0, #0 \n "
" mcr p15, 0, %0, c7, c5, 0 \n "
/* clear and invalidate D cache */
" mov %0, #0 \n "
" mcr p15, 0, %0, c7, c14, 0 \n "
/* WFI */
" mov %0, #0 \n "
" mcr p15, 0, %0, c7, c0, 4 \n "
" nop \n " " nop \n " " nop \n " " nop \n "
" nop \n " " nop \n " " nop \n "
/* enable I and D cache */
" mrc p15, 0, %0, c1, c0, 0 \n "
" orr %0, %0, #0x00001000 \n "
" orr %0, %0, #0x00000004 \n "
" mcr p15, 0, %0, c1, c0, 0 \n "
: " =r " ( reg ) ) ;
2011-09-28 17:16:06 +08:00
}
2013-05-16 19:40:22 +01:00
static void __iomem * imx3_ioremap_caller ( phys_addr_t phys_addr , size_t size ,
2012-02-13 13:24:15 -06:00
unsigned int mtype , void * caller )
2011-09-28 17:16:07 +08:00
{
if ( mtype = = MT_DEVICE ) {
/*
* Access all peripherals below 0x80000000 as nonshared device
* on mx3 , but leave l2cc alone . Otherwise cache corruptions
* can occur .
*/
if ( phys_addr < 0x80000000 & &
! addr_in_module ( phys_addr , MX3x_L2CC ) )
mtype = MT_DEVICE_NONSHARED ;
}
2012-02-13 13:24:15 -06:00
return __arm_ioremap_caller ( phys_addr , size , mtype , caller ) ;
2011-09-28 17:16:07 +08:00
}
2011-11-22 10:07:26 +01:00
# ifdef CONFIG_SOC_IMX31
2011-03-17 09:40:29 +01:00
static struct map_desc mx31_io_desc [ ] __initdata = {
imx_map_entry ( MX31 , X_MEMC , MT_DEVICE ) ,
imx_map_entry ( MX31 , AVIC , MT_DEVICE_NONSHARED ) ,
imx_map_entry ( MX31 , AIPS1 , MT_DEVICE_NONSHARED ) ,
imx_map_entry ( MX31 , AIPS2 , MT_DEVICE_NONSHARED ) ,
imx_map_entry ( MX31 , SPBA0 , MT_DEVICE_NONSHARED ) ,
} ;
/*
* This function initializes the memory map . It is called during the
* system startup to create static physical to virtual memory mappings
* for the IO modules .
*/
void __init mx31_map_io ( void )
{
iotable_init ( mx31_io_desc , ARRAY_SIZE ( mx31_io_desc ) ) ;
}
2016-06-24 12:49:58 +02:00
static void imx31_idle ( void )
{
int reg = imx_readl ( mx3_ccm_base + MXC_CCM_CCMR ) ;
reg & = ~ MXC_CCM_CCMR_LPM_MASK ;
imx_writel ( reg , mx3_ccm_base + MXC_CCM_CCMR ) ;
imx3_idle ( ) ;
}
2011-03-17 09:40:29 +01:00
void __init imx31_init_early ( void )
{
2020-09-16 21:41:18 -03:00
struct device_node * np ;
2011-03-17 09:40:29 +01:00
mxc_set_cpu_type ( MXC_CPU_MX31 ) ;
2012-02-13 13:24:15 -06:00
arch_ioremap_caller = imx3_ioremap_caller ;
2016-06-24 12:49:58 +02:00
arm_pm_idle = imx31_idle ;
2020-09-16 21:41:18 -03:00
np = of_find_compatible_node ( NULL , NULL , " fsl,imx31-ccm " ) ;
mx3_ccm_base = of_iomap ( np , 0 ) ;
BUG_ON ( ! mx3_ccm_base ) ;
2011-03-17 09:40:29 +01:00
}
2011-11-22 10:07:26 +01:00
# endif /* ifdef CONFIG_SOC_IMX31 */
# ifdef CONFIG_SOC_IMX35
static struct map_desc mx35_io_desc [ ] __initdata = {
imx_map_entry ( MX35 , X_MEMC , MT_DEVICE ) ,
imx_map_entry ( MX35 , AVIC , MT_DEVICE_NONSHARED ) ,
imx_map_entry ( MX35 , AIPS1 , MT_DEVICE_NONSHARED ) ,
imx_map_entry ( MX35 , AIPS2 , MT_DEVICE_NONSHARED ) ,
imx_map_entry ( MX35 , SPBA0 , MT_DEVICE_NONSHARED ) ,
} ;
void __init mx35_map_io ( void )
{
iotable_init ( mx35_io_desc , ARRAY_SIZE ( mx35_io_desc ) ) ;
}
2016-06-24 12:49:58 +02:00
static void imx35_idle ( void )
{
int reg = imx_readl ( mx3_ccm_base + MXC_CCM_CCMR ) ;
reg & = ~ MXC_CCM_CCMR_LPM_MASK ;
reg | = MXC_CCM_CCMR_LPM_WAIT_MX35 ;
imx_writel ( reg , mx3_ccm_base + MXC_CCM_CCMR ) ;
imx3_idle ( ) ;
}
2011-11-22 10:07:26 +01:00
void __init imx35_init_early ( void )
{
2020-09-16 21:41:18 -03:00
struct device_node * np ;
2011-11-22 10:07:26 +01:00
mxc_set_cpu_type ( MXC_CPU_MX35 ) ;
2016-06-24 12:49:58 +02:00
arm_pm_idle = imx35_idle ;
2012-02-13 13:24:15 -06:00
arch_ioremap_caller = imx3_ioremap_caller ;
2020-09-16 21:41:18 -03:00
np = of_find_compatible_node ( NULL , NULL , " fsl,imx35-ccm " ) ;
mx3_ccm_base = of_iomap ( np , 0 ) ;
BUG_ON ( ! mx3_ccm_base ) ;
2011-11-22 10:07:26 +01:00
}
# endif /* ifdef CONFIG_SOC_IMX35 */