Discussion:
[PATCH] ARM: imx: add support for Udoo Neo full
Uwe Kleine-König
2017-06-27 19:03:17 UTC
Permalink
From: Uwe Kleine-König <u.kleine-***@pengutronix.de>

Signed-off-by: Uwe Kleine-König <u.kleine-***@pengutronix.de>
---
Hello,

note that this patch only makes the machine work if you don't choose
CONSOLE_ACTIVATE_NONE or apply these patches:

of_device_is_stdout_path: simplify
of_device_is_stdout_path: split off options and support aliases

that currently sit in next as 0e193b668479 and 23522645b3b3. That's
because the (upstream) dts has:

stdout-path = "serial0:115200n8";

in /chosen that of_device_is_stdout_path doesn't understand without
these.

Best regards
Uwe

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 0ecfb3e4b398..98f923a134a0 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -130,6 +130,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 <common.h>
+#include <init.h>
+#include <linux/clk.h>
+
+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 <debug_ll.h>
+#include <common.h>
+#include <linux/sizes.h>
+#include <mach/generic.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <mach/esdctl.h>
+
+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 2342d35a4bd1..3129a7dfbce1 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -82,6 +82,7 @@ pbl-dtb-$(CONFIG_MACH_TX25) += imx25-karo-tx25.dtb.o
pbl-dtb-$(CONFIG_MACH_TX6X) += imx6dl-tx6u.dtb.o
pbl-dtb-$(CONFIG_MACH_TX6X) += imx6q-tx6q.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_VSCOM_BALTOS) += am335x-baltos-minimal.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 <arm/imx6sx-udoo-neo-full.dts>
+
+/{
+};
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 80f53ce124c1..c0aa74c93a33 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -356,6 +356,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 cdad2e0b8826..867ff5f6a564 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
--
2.11.0
Stefan Lengfeld
2017-06-27 19:40:02 UTC
Permalink
Hi Uwe,
Post by Uwe Kleine-König
---
Hello,
note that this patch only makes the machine work if you don't choose
of_device_is_stdout_path: simplify
of_device_is_stdout_path: split off options and support aliases
that currently sit in next as 0e193b668479 and 23522645b3b3. That's
stdout-path = "serial0:115200n8";
in /chosen that of_device_is_stdout_path doesn't understand without
these.
Best regards
Uwe
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 0ecfb3e4b398..98f923a134a0 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -130,6 +130,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
Maybe add or replace your copyright here. At least you have changed some
strings and function names.
Post by Uwe Kleine-König
+ *
+ * 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 <common.h>
+#include <init.h>
+#include <linux/clk.h>
+
+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
I'm always wondering where the magic values in the flash headers are
coming from. Whether they are copied from u-boot or another
variant/board or completely self-made or provided by a friendly hardware
engineer in an Excel sheet ;-) Maybe you can add a comment here or in
the commit message. But this would be a new convention, because I have
not seen it in other flash headers yet.

The rest looks good.

Kind regards,
Stefan Lengfeld
Post by Uwe Kleine-König
+
+/* 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 <debug_ll.h>
+#include <common.h>
+#include <linux/sizes.h>
+#include <mach/generic.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <mach/esdctl.h>
+
+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 2342d35a4bd1..3129a7dfbce1 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -82,6 +82,7 @@ pbl-dtb-$(CONFIG_MACH_TX25) += imx25-karo-tx25.dtb.o
pbl-dtb-$(CONFIG_MACH_TX6X) += imx6dl-tx6u.dtb.o
pbl-dtb-$(CONFIG_MACH_TX6X) += imx6q-tx6q.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_VSCOM_BALTOS) += am335x-baltos-minimal.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 <arm/imx6sx-udoo-neo-full.dts>
+
+/{
+};
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
index 80f53ce124c1..c0aa74c93a33 100644
--- a/arch/arm/mach-imx/Kconfig
+++ b/arch/arm/mach-imx/Kconfig
@@ -356,6 +356,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 cdad2e0b8826..867ff5f6a564 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
--
2.11.0
_______________________________________________
barebox mailing list
http://lists.infradead.org/mailman/listinfo/barebox
Uwe Kleine-König
2017-06-28 08:16:07 UTC
Permalink
Hello Stefan,
Post by Stefan Lengfeld
Post by Uwe Kleine-König
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
Maybe add or replace your copyright here. At least you have changed some
strings and function names.
I wonder if a board.c like this is copyrightable at all and don't feel
an urge to eternalize my name there.
Post by Stefan Lengfeld
Post by Uwe Kleine-König
+ * 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 <common.h>
+#include <init.h>
+#include <linux/clk.h>
+
+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
I'm always wondering where the magic values in the flash headers are
coming from. Whether they are copied from u-boot or another
variant/board or completely self-made or provided by a friendly hardware
engineer in an Excel sheet ;-) Maybe you can add a comment here or in
the commit message. But this would be a new convention, because I have
not seen it in other flash headers yet.
I got it in a patch from Sascha, don't know where he got it from. I
guess it's a mixure of copy-and-paste from other imxcfgs and the RAMs
datasheet.

Best regards
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Sascha Hauer
2017-06-30 06:35:47 UTC
Permalink
Post by Stefan Lengfeld
Hi Uwe,
Post by Uwe Kleine-König
+++ b/arch/arm/boards/udoo-neo/flash-header-mx6sx-udoo-neo_full.imxcfg
@@ -0,0 +1,124 @@
+loadaddr 0x80000000
+soc imx6
+dcdofs 0x400
I'm always wondering where the magic values in the flash headers are
coming from. Whether they are copied from u-boot or another
variant/board or completely self-made or provided by a friendly hardware
engineer in an Excel sheet ;-) Maybe you can add a comment here or in
the commit message. But this would be a new convention, because I have
not seen it in other flash headers yet.
Adding this information is a good idea. In this case the values come
from:

/*
* These values are taken from:
* repository: https://github.com/UDOOboard/uboot-imx
* branch: udoo/2015.04.imx
* file: board/udoo/udoo_neo/udoo_neo_basic.cfg
*/

I was about to apply Uwes patch along with this comment, but I just
realized that the values are from udoo_neo_basic whereas the patch
seems to support the udoo_neo_full. The udoo neo full has slightly
different calibration values in the branch above, but probably they
work on both boards. Uwe, do you know which hardware we actually have
and support?

Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Uwe Kleine-König
2017-06-30 09:06:11 UTC
Permalink
Hello Sascha,
Post by Sascha Hauer
Adding this information is a good idea. In this case the values come
/*
* repository: https://github.com/UDOOboard/uboot-imx
* branch: udoo/2015.04.imx
* file: board/udoo/udoo_neo/udoo_neo_basic.cfg
*/
I was about to apply Uwes patch along with this comment, but I just
realized that the values are from udoo_neo_basic whereas the patch
seems to support the udoo_neo_full. The udoo neo full has slightly
different calibration values in the branch above, but probably they
work on both boards. Uwe, do you know which hardware we actually have
and support?
The patch I submitted is tested only on a udoo neo full. Does this
answer your question?

Best regards
Uwe
Sascha Hauer
2017-06-30 09:28:42 UTC
Permalink
Post by Uwe Kleine-König
Hello Sascha,
Post by Sascha Hauer
Adding this information is a good idea. In this case the values come
/*
* repository: https://github.com/UDOOboard/uboot-imx
* branch: udoo/2015.04.imx
* file: board/udoo/udoo_neo/udoo_neo_basic.cfg
*/
I was about to apply Uwes patch along with this comment, but I just
realized that the values are from udoo_neo_basic whereas the patch
seems to support the udoo_neo_full. The udoo neo full has slightly
different calibration values in the branch above, but probably they
work on both boards. Uwe, do you know which hardware we actually have
and support?
The patch I submitted is tested only on a udoo neo full. Does this
answer your question?
Then we should probably use the register values for the udoo neo full,
not for the udoo neo basic.

Sascha
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Andrey Smirnov
2017-06-30 19:46:27 UTC
Permalink
On Tue, Jun 27, 2017 at 12:03 PM, Uwe Kleine-König
Post by Uwe Kleine-König
---
Hello,
note that this patch only makes the machine work if you don't choose
of_device_is_stdout_path: simplify
of_device_is_stdout_path: split off options and support aliases
that currently sit in next as 0e193b668479 and 23522645b3b3. That's
stdout-path = "serial0:115200n8";
in /chosen that of_device_is_stdout_path doesn't understand without
these.
Best regards
Uwe
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 0ecfb3e4b398..98f923a134a0 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -130,6 +130,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 <common.h>
+#include <init.h>
+#include <linux/clk.h>
+
+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 <debug_ll.h>
+#include <common.h>
+#include <linux/sizes.h>
+#include <mach/generic.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <mach/esdctl.h>
+
+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);
You can use "imx_setup_pad()" from <mach/iomux-v3.h> and avoid having
to use those magic numbers. See
arch/arm/boards/freescale-mx6-sabresd/lowlevel.c for example.

Thanks,
Andrey Smirnov

Loading...