9
0
Fork 0

ARM: i.MX: centralize i.MX startup

Each i.MX SoC has its own SoC initcall. To ease multi SoC support
move it to a single initcall.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-06-23 15:00:28 +02:00
parent a6375f6e45
commit f887536147
11 changed files with 134 additions and 29 deletions

View File

@ -12,7 +12,9 @@
*/
#include <common.h>
#include <init.h>
#include <mach/revision.h>
#include <mach/generic.h>
static int __imx_silicon_revision = IMX_CHIP_REV_UNKNOWN;
@ -29,3 +31,56 @@ void imx_set_silicon_revision(const char *soc, int revision)
(revision >> 4) & 0xf,
revision & 0xf);
}
static int imx_init(void)
{
int ret;
if (cpu_is_mx1())
ret = imx1_init();
else if (cpu_is_mx21())
ret = imx21_init();
else if (cpu_is_mx25())
ret = imx25_init();
else if (cpu_is_mx27())
ret = imx27_init();
else if (cpu_is_mx31())
ret = imx31_init();
else if (cpu_is_mx35())
ret = imx35_init();
else if (cpu_is_mx51())
ret = imx51_init();
else if (cpu_is_mx53())
ret = imx53_init();
else if (cpu_is_mx6())
ret = imx6_init();
else
return -EINVAL;
if (of_get_root_node())
return ret;
if (cpu_is_mx1())
ret = imx1_devices_init();
else if (cpu_is_mx21())
ret = imx21_devices_init();
else if (cpu_is_mx25())
ret = imx25_devices_init();
else if (cpu_is_mx27())
ret = imx27_devices_init();
else if (cpu_is_mx31())
ret = imx31_devices_init();
else if (cpu_is_mx35())
ret = imx35_devices_init();
else if (cpu_is_mx51())
ret = imx51_devices_init();
else if (cpu_is_mx53())
ret = imx53_devices_init();
else if (cpu_is_mx6())
ret = imx6_devices_init();
else
return -EINVAL;
return ret;
}
postcore_initcall(imx_init);

View File

@ -17,6 +17,7 @@
#include <mach/imx1-regs.h>
#include <mach/weim.h>
#include <mach/iomux-v1.h>
#include <mach/generic.h>
#include <reset_source.h>
#define MX1_RSR MX1_SCM_BASE_ADDR
@ -51,10 +52,16 @@ void imx1_setup_eimcs(size_t cs, unsigned upper, unsigned lower)
#include <mach/esdctl.h>
static int imx1_init(void)
int imx1_init(void)
{
imx1_detect_reset_source();
return 0;
}
int imx1_devices_init(void)
{
imx_iomuxv1_init((void *)MX1_GPIO1_BASE_ADDR);
imx1_detect_reset_source();
add_generic_device("imx1-ccm", 0, NULL, MX1_CCM_BASE_ADDR, 0x1000, IORESOURCE_MEM, NULL);
add_generic_device("imx1-gpt", 0, NULL, MX1_TIM1_BASE_ADDR, 0x100, IORESOURCE_MEM, NULL);
@ -67,4 +74,3 @@ static int imx1_init(void)
return 0;
}
postcore_initcall(imx1_init);

View File

@ -17,6 +17,7 @@
#include <mach/imx21-regs.h>
#include <mach/weim.h>
#include <mach/iomux-v1.h>
#include <mach/generic.h>
void imx21_setup_eimcs(size_t cs, unsigned upper, unsigned lower)
{
@ -24,7 +25,12 @@ void imx21_setup_eimcs(size_t cs, unsigned upper, unsigned lower)
writel(lower, MX21_EIM_BASE_ADDR + 4 + cs * 8);
}
static int imx21_init(void)
int imx21_init(void)
{
return 0;
}
int imx21_devices_init(void)
{
imx_iomuxv1_init((void *)MX21_GPIO1_BASE_ADDR);
@ -40,4 +46,3 @@ static int imx21_init(void)
return 0;
}
postcore_initcall(imx21_init);

View File

@ -53,10 +53,15 @@ u64 imx_uid(void)
return uid;
}
static int imx25_init(void)
int imx25_init(void)
{
imx25_boot_save_loc((void *)MX25_CCM_BASE_ADDR);
return 0;
}
int imx25_devices_init(void)
{
add_generic_device("imx_iim", 0, NULL, MX25_IIM_BASE_ADDR, SZ_4K,
IORESOURCE_MEM, NULL);
@ -72,4 +77,3 @@ static int imx25_init(void)
return 0;
}
postcore_initcall(imx25_init);

View File

@ -20,6 +20,7 @@
#include <mach/generic.h>
#include <init.h>
#include <io.h>
#include <mach/generic.h>
static int imx27_silicon_revision(void)
{
@ -96,11 +97,16 @@ static void imx27_init_max(void)
writel(val, max_base + MAX_SLAVE_PORT2_OFFSET + MAX_SLAVE_AMPR_OFFSET);
}
static int imx27_init(void)
int imx27_init(void)
{
imx27_silicon_revision();
imx27_boot_save_loc((void *)MX27_SYSCTRL_BASE_ADDR);
return 0;
}
int imx27_devices_init(void)
{
imx_iomuxv1_init((void *)MX27_GPIO1_BASE_ADDR);
add_generic_device("imx_iim", DEVICE_ID_SINGLE, NULL,
@ -124,4 +130,3 @@ static int imx27_init(void)
return 0;
}
postcore_initcall(imx27_init);

View File

@ -17,6 +17,7 @@
#include <io.h>
#include <mach/imx31-regs.h>
#include <mach/weim.h>
#include <mach/generic.h>
void imx31_setup_weimcs(size_t cs, unsigned upper, unsigned lower,
unsigned additional)
@ -26,7 +27,12 @@ void imx31_setup_weimcs(size_t cs, unsigned upper, unsigned lower,
writel(additional, MX31_WEIM_BASE_ADDR + (cs * 0x10) + 0x8);
}
static int imx31_init(void)
int imx31_init(void)
{
return 0;
}
int imx31_devices_init(void)
{
add_generic_device("imx_iim", 0, NULL, MX31_IIM_BASE_ADDR, SZ_4K,
IORESOURCE_MEM, NULL);
@ -43,4 +49,3 @@ static int imx31_init(void)
return 0;
}
postcore_initcall(imx31_init);

View File

@ -49,20 +49,19 @@ static void imx35_silicon_revision(void)
#define L2_MEM_VAL 0x10
static int imx35_l2_fix(void)
int imx35_init(void)
{
writel(0x515, MX35_CLKCTL_BASE_ADDR + L2_MEM_VAL);
return 0;
}
core_initcall(imx35_l2_fix);
static int imx35_init(void)
{
imx35_silicon_revision();
imx35_boot_save_loc((void *)MX35_CCM_BASE_ADDR);
return 0;
}
int imx35_devices_init(void)
{
add_generic_device("imx_iim", 0, NULL, MX35_IIM_BASE_ADDR, SZ_4K,
IORESOURCE_MEM, NULL);
@ -77,4 +76,3 @@ static int imx35_init(void)
return 0;
}
postcore_initcall(imx35_init);

View File

@ -41,14 +41,16 @@ static int imx51_silicon_revision(void)
return 0;
}
static int imx51_init(void)
int imx51_init(void)
{
imx_set_silicon_revision("i.MX51", imx51_silicon_revision());
imx51_boot_save_loc((void *)MX51_SRC_BASE_ADDR);
if (of_get_root_node())
return 0;
return 0;
}
int imx51_devices_init(void)
{
add_generic_device("imx_iim", 0, NULL, MX51_IIM_BASE_ADDR, SZ_4K,
IORESOURCE_MEM, NULL);
@ -65,7 +67,6 @@ static int imx51_init(void)
return 0;
}
postcore_initcall(imx51_init);
/*
* Saves the boot source media into the $bootsource environment variable

View File

@ -50,11 +50,16 @@ static int imx53_silicon_revision(void)
return 0;
}
static int imx53_init(void)
int imx53_init(void)
{
imx53_silicon_revision();
imx53_boot_save_loc((void *)MX53_SRC_BASE_ADDR);
return 0;
}
int imx53_devices_init(void)
{
add_generic_device("imx_iim", 0, NULL, MX53_IIM_BASE_ADDR, SZ_4K,
IORESOURCE_MEM, NULL);
@ -73,7 +78,6 @@ static int imx53_init(void)
return 0;
}
postcore_initcall(imx53_init);
void imx53_init_lowlevel_early(unsigned int cpufreq_mhz)
{

View File

@ -18,6 +18,7 @@
#include <mach/generic.h>
#include <mach/revision.h>
#include <mach/imx6-regs.h>
#include <mach/generic.h>
#define SI_REV 0x260
@ -56,7 +57,7 @@ void imx6_init_lowlevel(void)
writel(0xffffffff, 0x020c4080);
}
static int imx6_init(void)
int imx6_init(void)
{
u32 rev;
u32 mx6_silicon_revision;
@ -83,9 +84,11 @@ static int imx6_init(void)
imx_set_silicon_revision("i.MX6", mx6_silicon_revision);
if (of_get_root_node())
return 0;
return 0;
}
int imx6_devices_init(void)
{
add_generic_device("imx-iomuxv3", 0, NULL, MX6_IOMUXC_BASE_ADDR, 0x1000, IORESOURCE_MEM, NULL);
add_generic_device("imx6-ccm", 0, NULL, MX6_CCM_BASE_ADDR, 0x4000, IORESOURCE_MEM, NULL);
add_generic_device("imx31-gpt", 0, NULL, MX6_GPT_BASE_ADDR, 0x1000, IORESOURCE_MEM, NULL);
@ -101,4 +104,3 @@ static int imx6_init(void)
return 0;
}
postcore_initcall(imx6_init);

View File

@ -13,6 +13,26 @@ void imx51_boot_save_loc(void __iomem *src_base);
void imx53_boot_save_loc(void __iomem *src_base);
void imx6_boot_save_loc(void __iomem *src_base);
int imx1_init(void);
int imx21_init(void);
int imx25_init(void);
int imx27_init(void);
int imx31_init(void);
int imx35_init(void);
int imx51_init(void);
int imx53_init(void);
int imx6_init(void);
int imx1_devices_init(void);
int imx21_devices_init(void);
int imx25_devices_init(void);
int imx27_devices_init(void);
int imx31_devices_init(void);
int imx35_devices_init(void);
int imx51_devices_init(void);
int imx53_devices_init(void);
int imx6_devices_init(void);
/* There's a off-by-one betweem the gpio bank number and the gpiochip */
/* range e.g. GPIO_1_5 is gpio 5 under linux */
#define IMX_GPIO_NR(bank, nr) (((bank) - 1) * 32 + (nr))