diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2019-06-21 01:11:16 -0700 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-06-26 08:57:31 +0200 |
commit | bc482d1ab37b8aeb8cbb0aa380df93ff6e73c9bc (patch) | |
tree | 79cfd3241865c7cd58ba772cd943aee40febca02 /arch/arm/boards/zii-imx7d-dev/lowlevel.c | |
parent | 943a59d1808597496b5234cbd27cb967ab4ce070 (diff) | |
download | barebox-bc482d1ab37b8aeb8cbb0aa380df93ff6e73c9bc.tar.gz barebox-bc482d1ab37b8aeb8cbb0aa380df93ff6e73c9bc.tar.xz |
ARM: zii-imx7d-dev: Add support for RMU2 board
Add support for Remote Modem Unit i.MX7D board.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/boards/zii-imx7d-dev/lowlevel.c')
-rw-r--r-- | arch/arm/boards/zii-imx7d-dev/lowlevel.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/arch/arm/boards/zii-imx7d-dev/lowlevel.c b/arch/arm/boards/zii-imx7d-dev/lowlevel.c index d7f8feb951..3ad4940da8 100644 --- a/arch/arm/boards/zii-imx7d-dev/lowlevel.c +++ b/arch/arm/boards/zii-imx7d-dev/lowlevel.c @@ -19,6 +19,7 @@ #include <mach/esdctl.h> extern char __dtb_imx7d_zii_rpu2_start[]; +extern char __dtb_imx7d_zii_rmu2_start[]; static inline void setup_uart(void) { @@ -39,12 +40,69 @@ static inline void setup_uart(void) putc_ll('>'); } +enum zii_platform_imx7d_type { + ZII_PLATFORM_IMX7D_RPU2 = 0b0000, + ZII_PLATFORM_IMX7D_RMU2 = 0b1000, +}; + +static unsigned int get_system_type(void) +{ +#define GPIO_DR 0x000 +#define GPIO_GDIR 0x004 +#define SYSTEM_TYPE GENMASK(15, 12) + + u32 gdir, dr; + void __iomem *gpio2 = IOMEM(MX7_GPIO2_BASE_ADDR); + void __iomem *iomuxbase = IOMEM(MX7_IOMUXC_BASE_ADDR); + + /* + * System type is encoded as a 4-bit number specified by the + * following pins (pulled up or down with resistors on the + * board). + */ + imx_setup_pad(iomuxbase, MX7D_PAD_EPDC_DATA12__GPIO2_IO12); + imx_setup_pad(iomuxbase, MX7D_PAD_EPDC_DATA13__GPIO2_IO13); + imx_setup_pad(iomuxbase, MX7D_PAD_EPDC_DATA14__GPIO2_IO14); + imx_setup_pad(iomuxbase, MX7D_PAD_EPDC_DATA15__GPIO2_IO15); + + gdir = readl(gpio2 + GPIO_GDIR); + gdir &= ~SYSTEM_TYPE; + writel(gdir, gpio2 + GPIO_GDIR); + + dr = readl(gpio2 + GPIO_DR); + + return FIELD_GET(SYSTEM_TYPE, dr); +} + ENTRY_FUNCTION(start_zii_imx7d_dev, r0, r1, r2) { + void *fdt; + const unsigned int system_type = get_system_type(); + imx7_cpu_lowlevel_init(); if (IS_ENABLED(CONFIG_DEBUG_LL)) setup_uart(); - imx7d_barebox_entry(__dtb_imx7d_zii_rpu2_start + get_runtime_offset()); + switch (system_type) { + default: + if (IS_ENABLED(CONFIG_DEBUG_LL)) { + relocate_to_current_adr(); + setup_c(); + puts_ll("\n*********************************\n"); + puts_ll("* Unknown system type: "); + puthex_ll(system_type); + puts_ll("\n* Assuming RPU2\n"); + puts_ll("*********************************\n"); + } + /* FALLTHROUGH */ + case ZII_PLATFORM_IMX7D_RPU2: + fdt = __dtb_imx7d_zii_rpu2_start; + break; + case ZII_PLATFORM_IMX7D_RMU2: + fdt = __dtb_imx7d_zii_rmu2_start; + break; + } + + imx7d_barebox_entry(fdt + get_runtime_offset()); } |