2010-02-04 12:21:53 -08:00
/*
2010-11-15 11:30:00 -06:00
* Copyright 2008 - 2010 Freescale Semiconductor , Inc . All Rights Reserved .
2010-02-04 12:21:53 -08:00
*
* The code contained herein is licensed under the GNU General Public
* License . You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations :
*
* http : //www.opensource.org/licenses/gpl-license.html
* http : //www.gnu.org/copyleft/gpl.html
*
* Create static mapping between physical to virtual memory .
*/
# include <linux/mm.h>
# include <linux/init.h>
2011-10-09 17:42:15 +08:00
# include <linux/clk.h>
2010-02-04 12:21:53 -08:00
# include <asm/mach/map.h>
# include <mach/hardware.h>
# include <mach/common.h>
2011-06-22 22:41:30 +08:00
# include <mach/devices-common.h>
2010-02-04 12:21:53 -08:00
# include <mach/iomux-v3.h>
2011-10-09 17:42:15 +08:00
static struct clk * gpc_dvfs_clk ;
2011-09-28 17:16:06 +08:00
static void imx5_idle ( void )
{
2011-08-03 11:34:59 -04:00
/* gpc clock is needed for SRPG */
if ( gpc_dvfs_clk = = NULL ) {
gpc_dvfs_clk = clk_get ( NULL , " gpc_dvfs " ) ;
if ( IS_ERR ( gpc_dvfs_clk ) )
return ;
2011-10-09 17:42:15 +08:00
}
2011-08-03 11:34:59 -04:00
clk_enable ( gpc_dvfs_clk ) ;
mx5_cpu_lp_set ( WAIT_UNCLOCKED_POWER_OFF ) ;
if ( tzic_enable_wake ( ) ! = 0 )
cpu_do_idle ( ) ;
clk_disable ( gpc_dvfs_clk ) ;
2011-09-28 17:16:06 +08:00
}
2011-09-09 17:17:47 +08:00
/*
* Define the MX50 memory map .
*/
static struct map_desc mx50_io_desc [ ] __initdata = {
imx_map_entry ( MX50 , TZIC , MT_DEVICE ) ,
imx_map_entry ( MX50 , SPBA0 , MT_DEVICE ) ,
imx_map_entry ( MX50 , AIPS1 , MT_DEVICE ) ,
imx_map_entry ( MX50 , AIPS2 , MT_DEVICE ) ,
} ;
2010-02-04 12:21:53 -08:00
/*
* Define the MX51 memory map .
*/
2010-10-25 15:38:09 +02:00
static struct map_desc mx51_io_desc [ ] __initdata = {
2011-09-09 17:17:49 +08:00
imx_map_entry ( MX51 , TZIC , MT_DEVICE ) ,
2010-10-25 15:38:09 +02:00
imx_map_entry ( MX51 , IRAM , MT_DEVICE ) ,
imx_map_entry ( MX51 , AIPS1 , MT_DEVICE ) ,
imx_map_entry ( MX51 , SPBA0 , MT_DEVICE ) ,
imx_map_entry ( MX51 , AIPS2 , MT_DEVICE ) ,
2010-02-04 12:21:53 -08:00
} ;
2010-11-15 11:30:00 -06:00
/*
* Define the MX53 memory map .
*/
static struct map_desc mx53_io_desc [ ] __initdata = {
2011-09-09 17:17:49 +08:00
imx_map_entry ( MX53 , TZIC , MT_DEVICE ) ,
2010-11-15 11:30:00 -06:00
imx_map_entry ( MX53 , AIPS1 , MT_DEVICE ) ,
imx_map_entry ( MX53 , SPBA0 , MT_DEVICE ) ,
imx_map_entry ( MX53 , AIPS2 , MT_DEVICE ) ,
} ;
2010-02-04 12:21:53 -08:00
/*
* 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 .
*/
2011-09-09 17:17:47 +08:00
void __init mx50_map_io ( void )
{
iotable_init ( mx50_io_desc , ARRAY_SIZE ( mx50_io_desc ) ) ;
}
2010-02-04 12:21:53 -08:00
void __init mx51_map_io ( void )
2011-02-07 16:35:21 +01:00
{
iotable_init ( mx51_io_desc , ARRAY_SIZE ( mx51_io_desc ) ) ;
}
2011-09-09 17:17:47 +08:00
void __init mx53_map_io ( void )
{
iotable_init ( mx53_io_desc , ARRAY_SIZE ( mx53_io_desc ) ) ;
}
void __init imx50_init_early ( void )
{
mxc_set_cpu_type ( MXC_CPU_MX50 ) ;
mxc_iomux_v3_init ( MX50_IO_ADDRESS ( MX50_IOMUXC_BASE_ADDR ) ) ;
mxc_arch_reset_init ( MX50_IO_ADDRESS ( MX50_WDOG_BASE_ADDR ) ) ;
}
2011-02-07 16:35:21 +01:00
void __init imx51_init_early ( void )
2010-02-04 12:21:53 -08:00
{
mxc_set_cpu_type ( MXC_CPU_MX51 ) ;
mxc_iomux_v3_init ( MX51_IO_ADDRESS ( MX51_IOMUXC_BASE_ADDR ) ) ;
2010-12-06 16:38:32 -02:00
mxc_arch_reset_init ( MX51_IO_ADDRESS ( MX51_WDOG1_BASE_ADDR ) ) ;
2011-08-03 11:34:59 -04:00
arm_pm_idle = imx5_idle ;
2010-02-04 12:21:53 -08:00
}
2011-02-07 16:35:21 +01:00
void __init imx53_init_early ( void )
2010-11-15 11:30:00 -06:00
{
mxc_set_cpu_type ( MXC_CPU_MX53 ) ;
mxc_iomux_v3_init ( MX53_IO_ADDRESS ( MX53_IOMUXC_BASE_ADDR ) ) ;
2011-02-17 18:09:52 -02:00
mxc_arch_reset_init ( MX53_IO_ADDRESS ( MX53_WDOG1_BASE_ADDR ) ) ;
2010-11-15 11:30:00 -06:00
}
2011-09-09 17:17:47 +08:00
void __init mx50_init_irq ( void )
2010-02-04 12:21:53 -08:00
{
2011-09-09 17:17:47 +08:00
tzic_init_irq ( MX50_IO_ADDRESS ( MX50_TZIC_BASE_ADDR ) ) ;
}
2010-03-18 16:56:30 +01:00
2010-02-04 12:21:53 -08:00
void __init mx51_init_irq ( void )
{
2011-09-09 17:17:49 +08:00
tzic_init_irq ( MX51_IO_ADDRESS ( MX51_TZIC_BASE_ADDR ) ) ;
2010-02-04 12:21:53 -08:00
}
2010-11-15 11:29:59 -06:00
void __init mx53_init_irq ( void )
{
2011-09-09 17:17:49 +08:00
tzic_init_irq ( MX53_IO_ADDRESS ( MX53_TZIC_BASE_ADDR ) ) ;
2011-06-06 00:07:55 +08:00
}
2011-06-22 22:41:30 +08:00
static struct sdma_script_start_addrs imx51_sdma_script __initdata = {
. ap_2_ap_addr = 642 ,
. uart_2_mcu_addr = 817 ,
. mcu_2_app_addr = 747 ,
. mcu_2_shp_addr = 961 ,
. ata_2_mcu_addr = 1473 ,
. mcu_2_ata_addr = 1392 ,
. app_2_per_addr = 1033 ,
. app_2_mcu_addr = 683 ,
. shp_2_per_addr = 1251 ,
. shp_2_mcu_addr = 892 ,
} ;
static struct sdma_platform_data imx51_sdma_pdata __initdata = {
2011-06-22 22:41:31 +08:00
. fw_name = " sdma-imx51.bin " ,
2011-06-22 22:41:30 +08:00
. script_addrs = & imx51_sdma_script ,
} ;
static struct sdma_script_start_addrs imx53_sdma_script __initdata = {
. ap_2_ap_addr = 642 ,
. app_2_mcu_addr = 683 ,
. mcu_2_app_addr = 747 ,
. uart_2_mcu_addr = 817 ,
. shp_2_mcu_addr = 891 ,
. mcu_2_shp_addr = 960 ,
. uartsh_2_mcu_addr = 1032 ,
. spdif_2_mcu_addr = 1100 ,
. mcu_2_spdif_addr = 1134 ,
. firi_2_mcu_addr = 1193 ,
. mcu_2_firi_addr = 1290 ,
} ;
static struct sdma_platform_data imx53_sdma_pdata __initdata = {
2011-06-22 22:41:31 +08:00
. fw_name = " sdma-imx53.bin " ,
2011-06-22 22:41:30 +08:00
. script_addrs = & imx53_sdma_script ,
} ;
2012-03-05 22:30:52 +08:00
static const struct resource imx50_audmux_res [ ] __initconst = {
DEFINE_RES_MEM ( MX50_AUDMUX_BASE_ADDR , SZ_16K ) ,
} ;
static const struct resource imx51_audmux_res [ ] __initconst = {
DEFINE_RES_MEM ( MX51_AUDMUX_BASE_ADDR , SZ_16K ) ,
} ;
static const struct resource imx53_audmux_res [ ] __initconst = {
DEFINE_RES_MEM ( MX53_AUDMUX_BASE_ADDR , SZ_16K ) ,
} ;
2011-09-09 17:17:47 +08:00
void __init imx50_soc_init ( void )
{
/* i.mx50 has the i.mx31 type gpio */
mxc_register_gpio ( " imx31-gpio " , 0 , MX50_GPIO1_BASE_ADDR , SZ_16K , MX50_INT_GPIO1_LOW , MX50_INT_GPIO1_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 1 , MX50_GPIO2_BASE_ADDR , SZ_16K , MX50_INT_GPIO2_LOW , MX50_INT_GPIO2_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 2 , MX50_GPIO3_BASE_ADDR , SZ_16K , MX50_INT_GPIO3_LOW , MX50_INT_GPIO3_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 3 , MX50_GPIO4_BASE_ADDR , SZ_16K , MX50_INT_GPIO4_LOW , MX50_INT_GPIO4_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 4 , MX50_GPIO5_BASE_ADDR , SZ_16K , MX50_INT_GPIO5_LOW , MX50_INT_GPIO5_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 5 , MX50_GPIO6_BASE_ADDR , SZ_16K , MX50_INT_GPIO6_LOW , MX50_INT_GPIO6_HIGH ) ;
2012-03-05 22:30:52 +08:00
/* i.mx50 has the i.mx31 type audmux */
platform_device_register_simple ( " imx31-audmux " , 0 , imx50_audmux_res ,
ARRAY_SIZE ( imx50_audmux_res ) ) ;
2011-09-09 17:17:47 +08:00
}
2011-06-06 00:07:55 +08:00
void __init imx51_soc_init ( void )
{
2011-07-07 00:37:41 +08:00
/* i.mx51 has the i.mx31 type gpio */
2011-07-25 12:05:09 +02:00
mxc_register_gpio ( " imx31-gpio " , 0 , MX51_GPIO1_BASE_ADDR , SZ_16K , MX51_INT_GPIO1_LOW , MX51_INT_GPIO1_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 1 , MX51_GPIO2_BASE_ADDR , SZ_16K , MX51_INT_GPIO2_LOW , MX51_INT_GPIO2_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 2 , MX51_GPIO3_BASE_ADDR , SZ_16K , MX51_INT_GPIO3_LOW , MX51_INT_GPIO3_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 3 , MX51_GPIO4_BASE_ADDR , SZ_16K , MX51_INT_GPIO4_LOW , MX51_INT_GPIO4_HIGH ) ;
2011-06-22 22:41:30 +08:00
2011-07-13 21:33:17 +08:00
/* i.mx51 has the i.mx35 type sdma */
imx_add_imx_sdma ( " imx35-sdma " , MX51_SDMA_BASE_ADDR , MX51_INT_SDMA , & imx51_sdma_pdata ) ;
2012-03-05 22:30:52 +08:00
/* i.mx51 has the i.mx31 type audmux */
platform_device_register_simple ( " imx31-audmux " , 0 , imx51_audmux_res ,
ARRAY_SIZE ( imx51_audmux_res ) ) ;
2011-06-06 00:07:55 +08:00
}
void __init imx53_soc_init ( void )
{
2011-07-07 00:37:41 +08:00
/* i.mx53 has the i.mx31 type gpio */
mxc_register_gpio ( " imx31-gpio " , 0 , MX53_GPIO1_BASE_ADDR , SZ_16K , MX53_INT_GPIO1_LOW , MX53_INT_GPIO1_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 1 , MX53_GPIO2_BASE_ADDR , SZ_16K , MX53_INT_GPIO2_LOW , MX53_INT_GPIO2_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 2 , MX53_GPIO3_BASE_ADDR , SZ_16K , MX53_INT_GPIO3_LOW , MX53_INT_GPIO3_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 3 , MX53_GPIO4_BASE_ADDR , SZ_16K , MX53_INT_GPIO4_LOW , MX53_INT_GPIO4_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 4 , MX53_GPIO5_BASE_ADDR , SZ_16K , MX53_INT_GPIO5_LOW , MX53_INT_GPIO5_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 5 , MX53_GPIO6_BASE_ADDR , SZ_16K , MX53_INT_GPIO6_LOW , MX53_INT_GPIO6_HIGH ) ;
mxc_register_gpio ( " imx31-gpio " , 6 , MX53_GPIO7_BASE_ADDR , SZ_16K , MX53_INT_GPIO7_LOW , MX53_INT_GPIO7_HIGH ) ;
2011-06-22 22:41:30 +08:00
2011-07-13 21:33:17 +08:00
/* i.mx53 has the i.mx35 type sdma */
imx_add_imx_sdma ( " imx35-sdma " , MX53_SDMA_BASE_ADDR , MX53_INT_SDMA , & imx53_sdma_pdata ) ;
2012-03-05 22:30:52 +08:00
/* i.mx53 has the i.mx31 type audmux */
platform_device_register_simple ( " imx31-audmux " , 0 , imx53_audmux_res ,
ARRAY_SIZE ( imx53_audmux_res ) ) ;
2010-11-15 11:29:59 -06:00
}