From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Wed, 14 Jun 2017 18:32:15 +0200 Subject: [PATCH] ARM: imx: add support for Udoo Neo full MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Uwe Kleine-König Forwarded: id:20170627190317.19253-1-uwe@kleine-koenig.org --- arch/arm/boards/Makefile | 1 + arch/arm/boards/udoo-neo/Makefile | 2 + arch/arm/boards/udoo-neo/board.c | 27 +++++ .../flash-header-mx6sx-udoo-neo_full.imxcfg | 124 +++++++++++++++++++++ arch/arm/boards/udoo-neo/lowlevel.c | 39 +++++++ arch/arm/dts/Makefile | 1 + arch/arm/dts/imx6sx-udoo-neo-full.dts | 4 + arch/arm/mach-imx/Kconfig | 4 + arch/arm/mach-imx/include/mach/esdctl.h | 1 + images/Makefile.imx | 5 + 10 files changed, 208 insertions(+) create mode 100644 arch/arm/boards/udoo-neo/Makefile create mode 100644 arch/arm/boards/udoo-neo/board.c create mode 100644 arch/arm/boards/udoo-neo/flash-header-mx6sx-udoo-neo_full.imxcfg create mode 100644 arch/arm/boards/udoo-neo/lowlevel.c create mode 100644 arch/arm/dts/imx6sx-udoo-neo-full.dts diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index 9bbdd684fa6c..e8bfdf1a3258 100644 --- a/arch/arm/boards/Makefile +++ b/arch/arm/boards/Makefile @@ -132,6 +132,7 @@ obj-$(CONFIG_MACH_TX51) += karo-tx51/ obj-$(CONFIG_MACH_TX53) += karo-tx53/ obj-$(CONFIG_MACH_TX6X) += karo-tx6x/ obj-$(CONFIG_MACH_UDOO) += udoo/ +obj-$(CONFIG_MACH_UDOO_NEO) += udoo-neo/ obj-$(CONFIG_MACH_USB_A9260) += usb-a926x/ obj-$(CONFIG_MACH_USB_A9263) += usb-a926x/ obj-$(CONFIG_MACH_USB_A9G20) += usb-a926x/ diff --git a/arch/arm/boards/udoo-neo/Makefile b/arch/arm/boards/udoo-neo/Makefile new file mode 100644 index 000000000000..01c7a259e9a5 --- /dev/null +++ b/arch/arm/boards/udoo-neo/Makefile @@ -0,0 +1,2 @@ +obj-y += board.o +lwl-y += lowlevel.o diff --git a/arch/arm/boards/udoo-neo/board.c b/arch/arm/boards/udoo-neo/board.c new file mode 100644 index 000000000000..9bf480305d70 --- /dev/null +++ b/arch/arm/boards/udoo-neo/board.c @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2014 Pengutronix, Sascha Hauer + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include +#include +#include + +static int imx6sx_udoneo_coredevices_init(void) +{ + if (!of_machine_is_compatible("fsl,imx6sx-udoo-neo")) + return 0; + + barebox_set_hostname("mx6sx-udooneo"); + + return 0; +} +coredevice_initcall(imx6sx_udoneo_coredevices_init); diff --git a/arch/arm/boards/udoo-neo/flash-header-mx6sx-udoo-neo_full.imxcfg b/arch/arm/boards/udoo-neo/flash-header-mx6sx-udoo-neo_full.imxcfg new file mode 100644 index 000000000000..176aff49b3ec --- /dev/null +++ b/arch/arm/boards/udoo-neo/flash-header-mx6sx-udoo-neo_full.imxcfg @@ -0,0 +1,124 @@ +loadaddr 0x80000000 +soc imx6 +dcdofs 0x400 + +/* Enable all clocks */ +wm 32 0x020c4068 0xffffffff +wm 32 0x020c406c 0xffffffff +wm 32 0x020c4070 0xffffffff +wm 32 0x020c4074 0xffffffff +wm 32 0x020c4078 0xffffffff +wm 32 0x020c407c 0xffffffff +wm 32 0x020c4080 0xffffffff +wm 32 0x020c4084 0xffffffff +/********************************************/ + +/* IOMUX */ +/* DDR IO TYPE */ +wm 32 0x020e0618 0x000c0000 +wm 32 0x020e05fc 0x00000000 +/********************************************/ + +/* CLOCK */ +wm 32 0x020e032c 0x00000030 +/********************************************/ + +/* ADDRESS */ +wm 32 0x020e0300 0x00000020 +wm 32 0x020e02fc 0x00000020 +wm 32 0x020e05f4 0x00000020 +/********************************************/ + +/* CONTROL */ +wm 32 0x020e0340 0x00000020 + +wm 32 0x020e0320 0x00000000 +wm 32 0x020e0310 0x00000020 +wm 32 0x020e0314 0x00000020 +wm 32 0x020e0614 0x00000020 +/********************************************/ + +/* DATA STROBE */ +wm 32 0x020e05f8 0x00020000 +wm 32 0x020e0330 0x00000028 +wm 32 0x020e0334 0x00000028 +wm 32 0x020e0338 0x00000028 +wm 32 0x020e033c 0x00000028 +/********************************************/ + +/* DATA */ +wm 32 0x020e0608 0x00020000 +wm 32 0x020e060c 0x00000028 +wm 32 0x020e0610 0x00000028 +wm 32 0x020e061c 0x00000028 +wm 32 0x020e0620 0x00000028 +wm 32 0x020e02ec 0x00000028 +wm 32 0x020e02f0 0x00000028 +wm 32 0x020e02f4 0x00000028 +wm 32 0x020e02f8 0x00000028 +/********************************************/ + +/* Calibrations */ +/* ZQ */ +wm 32 0x021b0800 0xa1390003 +/********************************************/ + +/* write leveling */ +wm 32 0x021b080c 0x001E0022 +wm 32 0x021b0810 0x001C0019 +/********************************************/ + +/* DQS Read Gate */ +wm 32 0x021b083c 0x41540150 +wm 32 0x021b0840 0x01440138 +/********************************************/ + +/* Read/Write Delay */ +wm 32 0x021b0848 0x403E4644 +wm 32 0x021b0850 0x3C3A4038 +/********************************************/ + +/* read data bit delay */ +wm 32 0x021b081c 0x33333333 +wm 32 0x021b0820 0x33333333 +wm 32 0x021b0824 0x33333333 +wm 32 0x021b0828 0x33333333 +/********************************************/ + +/* Complete calibration by forced measurment */ +wm 32 0x021b08b8 0x00000800 +/********************************************/ + +/* MMDC init */ +/* in DDR3, 64-bit mode, only MMDC0 is initiated */ +wm 32 0x021b0004 0x0002002d +wm 32 0x021b0008 0x00333030 +wm 32 0x021b000c 0x676b52f3 +wm 32 0x021b0010 0xb66d8b63 +wm 32 0x021b0014 0x01ff00db +wm 32 0x021b0018 0x00011740 +wm 32 0x021b001c 0x00008000 +wm 32 0x021b002c 0x000026d2 +wm 32 0x021b0030 0x006b1023 +wm 32 0x021b0040 0x0000005f +wm 32 0x021b0000 0x83190000 +/********************************************/ + +/* Initialize MT41K256M16HA-125 */ +/* MR2 */ +wm 32 0x021b001c 0x04008032 +/* MR3 */ +wm 32 0x021b001c 0x00008033 +/* MR1 */ +wm 32 0x021b001c 0x00048031 +/* MR0 */ +wm 32 0x021b001c 0x05208030 +/* DDR device ZQ calibration */ +wm 32 0x021b001c 0x04008040 +/********************************************/ + +/* final DDR setup, before operation start */ +wm 32 0x021b0020 0x00000800 +wm 32 0x021b0818 0x00011117 +wm 32 0x021b001c 0x00000000 +/********************************************/ diff --git a/arch/arm/boards/udoo-neo/lowlevel.c b/arch/arm/boards/udoo-neo/lowlevel.c new file mode 100644 index 000000000000..e78c2685fd78 --- /dev/null +++ b/arch/arm/boards/udoo-neo/lowlevel.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include +#include +#include + +static inline void setup_uart(void) +{ + void __iomem *iomuxbase = (void *)MX6_IOMUXC_BASE_ADDR; + + imx6_ungate_all_peripherals(); + + writel(0x0, iomuxbase + 0x24); + writel(0x1b0b1, iomuxbase + 0x036C); + writel(0x0, iomuxbase + 0x28); + writel(0x1b0b1, iomuxbase + 0x0370); + + imx6_uart_setup_ll(); + + putc_ll('>'); +} + +extern char __dtb_imx6sx_udoo_neo_full_start[]; + +ENTRY_FUNCTION(start_imx6sx_udoo_neo, r0, r1, r2) +{ + void *fdt; + + imx6_cpu_lowlevel_init(); + + if (IS_ENABLED(CONFIG_DEBUG_LL)) + setup_uart(); + + fdt = __dtb_imx6sx_udoo_neo_full_start - get_runtime_offset(); + + imx6sx_barebox_entry(fdt); +} diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index c5e48092d344..f5b37891c400 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -85,6 +85,7 @@ pbl-dtb-$(CONFIG_MACH_TX6X) += imx6dl-tx6u.dtb.o pbl-dtb-$(CONFIG_MACH_TX6X) += imx6q-tx6q.dtb.o pbl-dtb-$(CONFIG_MACH_TURRIS_OMNIA) += armada-385-turris-omnia-bb.dtb.o pbl-dtb-$(CONFIG_MACH_UDOO) += imx6q-udoo.dtb.o +pbl-dtb-$(CONFIG_MACH_UDOO_NEO) += imx6sx-udoo-neo-full.dtb.o pbl-dtb-$(CONFIG_MACH_USI_TOPKICK) += kirkwood-topkick-bb.dtb.o pbl-dtb-$(CONFIG_MACH_VARISCITE_MX6) += imx6q-var-custom.dtb.o pbl-dtb-$(CONFIG_MACH_VEXPRESS) += vexpress-v2p-ca9.dtb.o diff --git a/arch/arm/dts/imx6sx-udoo-neo-full.dts b/arch/arm/dts/imx6sx-udoo-neo-full.dts new file mode 100644 index 000000000000..9203d40207c5 --- /dev/null +++ b/arch/arm/dts/imx6sx-udoo-neo-full.dts @@ -0,0 +1,4 @@ +#include + +/{ +}; diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 6110924af642..204d0d59994e 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -362,6 +362,10 @@ config MACH_UDOO bool "Freescale i.MX6 UDOO Board" select ARCH_IMX6 +config MACH_UDOO_NEO + bool "i.MX6 UDOO Neo Board (full variant)" + select ARCH_IMX6SX + config MACH_VARISCITE_MX6 bool "Variscite i.MX6 Quad SOM" select ARCH_IMX6 diff --git a/arch/arm/mach-imx/include/mach/esdctl.h b/arch/arm/mach-imx/include/mach/esdctl.h index 66dcc8974cfb..bd6092febca4 100644 --- a/arch/arm/mach-imx/include/mach/esdctl.h +++ b/arch/arm/mach-imx/include/mach/esdctl.h @@ -137,6 +137,7 @@ void __noreturn imx51_barebox_entry(void *boarddata); void __noreturn imx53_barebox_entry(void *boarddata); void __noreturn imx6q_barebox_entry(void *boarddata); void __noreturn imx6ul_barebox_entry(void *boarddata); +#define imx6sx_barebox_entry(boarddata) imx6ul_barebox_entry(boarddata) void imx_esdctl_disable(void); #endif diff --git a/images/Makefile.imx b/images/Makefile.imx index 88d3e5e339ac..b2ebd5c4bfbc 100644 --- a/images/Makefile.imx +++ b/images/Makefile.imx @@ -260,6 +260,11 @@ CFG_start_imx6q_sabresd.pblx.imximg = $(board)/freescale-mx6-sabresd/flash-heade FILE_barebox-freescale-imx6q-sabresd.img = start_imx6q_sabresd.pblx.imximg image-$(CONFIG_MACH_SABRESD) += barebox-freescale-imx6q-sabresd.img +pblx-$(CONFIG_MACH_UDOO_NEO) += start_imx6sx_udoo_neo +CFG_start_imx6sx_udoo_neo.pblx.imximg = $(board)/udoo-neo/flash-header-mx6sx-udoo-neo_full.imxcfg +FILE_barebox-udoo-neo.img = start_imx6sx_udoo_neo.pblx.imximg +image-$(CONFIG_MACH_UDOO_NEO) += barebox-udoo-neo.img + pblx-$(CONFIG_MACH_FREESCALE_IMX6SX_SABRESDB) += start_imx6sx_sabresdb CFG_start_imx6sx_sabresdb.pblx.imximg = $(board)/freescale-mx6sx-sabresdb/flash-header-mx6sx-sabresdb.imxcfg FILE_barebox-freescale-imx6sx-sabresdb.img = start_imx6sx_sabresdb.pblx.imximg