summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/kindle-mx50
diff options
context:
space:
mode:
authorAlexander Kurz <akurz@blala.de>2017-04-23 19:37:41 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2017-04-24 15:33:27 +0200
commit2c506afbadcd546dcc54a0e8599e454fd4aecfdc (patch)
tree68860ea5f9314ccf7c837f208cd7d65fddd592c2 /arch/arm/boards/kindle-mx50
parent13ed8eeaf0e7efc72991b9d92d1758297aa9c338 (diff)
downloadbarebox-2c506afbadcd546dcc54a0e8599e454fd4aecfdc.tar.gz
barebox-2c506afbadcd546dcc54a0e8599e454fd4aecfdc.tar.xz
ARM: i.MX50: Add support for i.MX50 based Amazon Kindle e-book readers
The Kindle Model No. D01100 (Kindle Wi-Fi), D01200 (Kindle Touch) and EY21 (Kindle Paperwhite) are refered as the Kindle 4th and 5th generation. Those models are based on an i.MX50 SoC and use LPDDR1 or LPDDR2 Memory. The devices boot in internal boot mode from a build-in eMMC, alternatively some devices may be set into USB-downloader mode by pressing a specific key at startup. Add support for the i.MX50 based Kindle device and make barebox a drop-in replacement for the factory shipped u-boot image. Notable features: - Support for eMMC, USB, UART, I2C, SPI and Keys (except keyboard). - LPDDR1 and LPDDR2 setup is done via DCD, the same imximage may be used for USB-startup and for installation. - Support for vendor specific ATAGs that are required for the Kindle-System. - usbserial barebox console access by pressing Select button at startup, alternatively full console support on connector J14. Signed-off-by: Alexander Kurz <akurz@blala.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'arch/arm/boards/kindle-mx50')
-rw-r--r--arch/arm/boards/kindle-mx50/Makefile4
-rw-r--r--arch/arm/boards/kindle-mx50/board.c162
-rw-r--r--arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/boot/mmc_kernel15
-rw-r--r--arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/init/usbconsole21
-rw-r--r--arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/autoboot_timeout1
-rw-r--r--arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/boot.default1
-rw-r--r--arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.consoleblank1
-rw-r--r--arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.eink1
-rw-r--r--arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr1.imxcfg166
-rw-r--r--arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr2.imxcfg176
-rw-r--r--arch/arm/boards/kindle-mx50/lowlevel.c50
11 files changed, 598 insertions, 0 deletions
diff --git a/arch/arm/boards/kindle-mx50/Makefile b/arch/arm/boards/kindle-mx50/Makefile
new file mode 100644
index 0000000000..76ad17a1c2
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/Makefile
@@ -0,0 +1,4 @@
+obj-y += board.o flash-header-kindle-lpddr1.dcd.o flash-header-kindle-lpddr2.dcd.o
+extra-y += flash-header-kindle-lpddr1.dcd.S flash-header-kindle-lpddr1.dcd flash-header-kindle-lpddr2.dcd.S flash-header-kindle-lpddr2.dcd
+lwl-y += lowlevel.o
+bbenv-y += defaultenv-kindle-mx50
diff --git a/arch/arm/boards/kindle-mx50/board.c b/arch/arm/boards/kindle-mx50/board.c
new file mode 100644
index 0000000000..fa4beb7f3c
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/board.c
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2007 Sascha Hauer, Pengutronix
+ * Copyright (C) 2017 Alexander Kurz <akurz@blala.de>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * 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 <envfs.h>
+#include <environment.h>
+#include <init.h>
+#include <io.h>
+#include <driver.h>
+#include <param.h>
+#include <magicvar.h>
+#include <partition.h>
+#include <libfile.h>
+#include <globalvar.h>
+#include <asm/armlinux.h>
+#include <generated/mach-types.h>
+#include <linux/sizes.h>
+#include <usb/fsl_usb2.h>
+#include <mach/generic.h>
+#include <mach/imx50-regs.h>
+#include <mach/imx5.h>
+#include <mach/revision.h>
+
+/* 16 byte id for serial number */
+#define ATAG_SERIAL16 0x5441000a
+/* 16 byte id for a board revision */
+#define ATAG_REVISION16 0x5441000b
+
+struct char16_tag {
+ char data[16];
+};
+
+static struct tag *setup_16char_tag(struct tag *params, uint32_t tag,
+ const char *value)
+{
+ struct char16_tag *target;
+ target = ((void *) params) + sizeof(struct tag_header);
+ params->hdr.tag = tag;
+ params->hdr.size = tag_size(char16_tag);
+ memcpy(target->data, value, sizeof target->data);
+ return tag_next(params);
+}
+
+static const char *get_env_16char_tag(const char *tag)
+{
+ static const char *default16 = "0000000000000000";
+ const char *value;
+ value = getenv(tag);
+ if (!value) {
+ pr_err("env var %s not found, using default\n", tag);
+ return default16;
+ }
+ if (strlen(value) != 16) {
+ pr_err("env var %s: expecting 16 characters, using default\n",
+ tag);
+ return default16;
+ }
+ pr_info("%s: %s\n", tag, value);
+ return value;
+}
+
+BAREBOX_MAGICVAR_NAMED(global_atags_serial16, global.board.serial16,
+ "Pass the kindle Serial as vendor-specific ATAG to linux");
+BAREBOX_MAGICVAR_NAMED(global_atags_revision16, global.board.revision16,
+ "Pass the kindle BoardId as vendor-specific ATAG to linux");
+
+/* The Kindle Kernel expects two custom ATAGs, ATAG_REVISION16 describing
+ * the board and ATAG_SERIAL16 to identify the individual device.
+ */
+struct tag *kindle_mx50_append_atags(struct tag *params)
+{
+ params = setup_16char_tag(params, ATAG_SERIAL16,
+ get_env_16char_tag("global.board.serial16"));
+ params = setup_16char_tag(params, ATAG_REVISION16,
+ get_env_16char_tag("global.board.revision16"));
+ return params;
+}
+
+static char *serial16;
+static char *revision16;
+static char *mac;
+
+static void kindle_rev_init(void)
+{
+ int ret;
+ size_t size;
+ void *buf;
+ const char userdata[] = "/dev/disk0.boot0.userdata";
+ ret = read_file_2(userdata, &size, &buf, 128);
+ if (ret && ret != -EFBIG) {
+ pr_err("Could not read board info from %s\n", userdata);
+ return;
+ }
+
+ serial16 = xzalloc(17);
+ revision16 = xzalloc(17);
+ mac = xzalloc(17);
+
+ memcpy(serial16, buf, 16);
+ memcpy(revision16, buf + 96, 16);
+ memcpy(mac, buf + 48, 16);
+
+ globalvar_add_simple_string("board.serial16", &serial16);
+ globalvar_add_simple_string("board.revision16", &revision16);
+ globalvar_add_simple_string("board.mac", &mac);
+
+ free(buf);
+}
+
+static int kindle_mx50_late_init(void)
+{
+ armlinux_set_revision(0x50000 | imx_silicon_revision());
+ /* Compatibility ATAGs for original kernel */
+ armlinux_set_atag_appender(kindle_mx50_append_atags);
+
+ kindle_rev_init();
+
+ return 0;
+}
+late_initcall(kindle_mx50_late_init);
+
+static int kindle_mx50_mem_init(void)
+{
+ arm_add_mem_device("ram0", MX50_CSD0_BASE_ADDR, SZ_256M);
+ return 0;
+}
+mem_initcall(kindle_mx50_mem_init);
+
+static int kindle_mx50_devices_init(void)
+{
+ struct device_d *dev;
+ /* Probe the eMMC to allow reading the board serial and revision */
+ dev = get_device_by_name("mci0");
+ if (dev)
+ dev_set_param(dev, "probe", "1");
+
+ defaultenv_append_directory(defaultenv_kindle_mx50);
+
+ return 0;
+}
+device_initcall(kindle_mx50_devices_init);
+
+static int kindle_mx50_postcore_init(void)
+{
+ imx50_init_lowlevel(800);
+
+ return 0;
+}
+postcore_initcall(kindle_mx50_postcore_init);
diff --git a/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/boot/mmc_kernel b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/boot/mmc_kernel
new file mode 100644
index 0000000000..a43ee0cc92
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/boot/mmc_kernel
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Boot the Amazon factory-shipped kernel uimage stored on
+# the eMMC at CONFIG_MMC_BOOTFLASH_ADDR 0x41000
+
+# Purge the OF tree to enable passing of ATAGs
+oftree -f
+
+# The same machine type introduced with freescale ENGR00124359
+armlinux_architecture=2955
+
+armlinux_system_serial="$global.board.ocotp_serial"
+
+global linux.bootargs.dyn.root="root=/dev/mmcblk0p1 rootwait ro"
+
+bootm -c /dev/disk0.kernel
diff --git a/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/init/usbconsole b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/init/usbconsole
new file mode 100644
index 0000000000..4fe12113cc
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/init/usbconsole
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+if test "$global.model" = "Amazon Kindle D01100"; then
+ if gpio_get_value 18; then; else
+ usbserial
+ global.autoboot_timeout=60
+ fi
+fi
+
+if test "$global.model" = "Amazon Kindle D01200"; then
+ sleep 5
+ if gpio_get_value 0; then
+ usbserial
+ global.autoboot_timeout=60
+ fi
+fi
+
+if test "$global.model" = "Amazon Kindle EY21"; then
+ usbserial
+ global.autoboot_timeout=10
+fi
diff --git a/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/autoboot_timeout b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/autoboot_timeout
new file mode 100644
index 0000000000..00750edc07
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/autoboot_timeout
@@ -0,0 +1 @@
+3
diff --git a/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/boot.default b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/boot.default
new file mode 100644
index 0000000000..3118b7af45
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/boot.default
@@ -0,0 +1 @@
+mmc_kernel
diff --git a/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.consoleblank b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.consoleblank
new file mode 100644
index 0000000000..efc4ee63d4
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.consoleblank
@@ -0,0 +1 @@
+consoleblank=0
diff --git a/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.eink b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.eink
new file mode 100644
index 0000000000..2ff3618376
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/defaultenv-kindle-mx50/nv/linux.bootargs.eink
@@ -0,0 +1 @@
+fslepdc video=mxcepdcfb:E60,bpp=8
diff --git a/arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr1.imxcfg b/arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr1.imxcfg
new file mode 100644
index 0000000000..e6b6098973
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr1.imxcfg
@@ -0,0 +1,166 @@
+# DCD i.MX50 SoC setup using 256MiB LPDDR1
+# Copyright (C) 2017 Alexander Kurz <akurz@blala.de>
+#
+# Initial DCD setup according to Freescale ENGR00124359
+# with adaption for LPDDR1 ENGR00025557
+# Copyright (C) 2010 Freescale Semiconductor, Inc.
+
+soc imx50
+loadaddr 0x70020000
+dcdofs 0x400
+
+# Switch pll1_sw_clk to step_clk
+wm 32 0x53fd400c 0x00000004
+# Setup PLL1 to 800MHz
+wm 32 0x63f80000 0x00001232
+wm 32 0x63f80004 0x00000002
+wm 32 0x63f80008 0x00000080
+wm 32 0x63f8000c 0x00000002
+wm 32 0x63f80010 0x00000001
+wm 32 0x63f8001c 0x00000080
+wm 32 0x63f80020 0x00000002
+wm 32 0x63f80024 0x00000001
+wm 32 0x63f80000 0x00001232
+check 8 while_any_bit_clear 0x63f80000 0x01
+# Switch pll1_sw_clk to pll1
+wm 32 0x53fd400c 0x00000000
+
+# CGR
+wm 32 0x53fd4068 0xffffffff
+wm 32 0x53fd406c 0xffffffff
+wm 32 0x53fd4070 0xffffffff
+wm 32 0x53fd4074 0xffffffff
+wm 32 0x53fd4078 0xffffffff
+wm 32 0x53fd407c 0xffffffff
+wm 32 0x53fd4080 0xffffffff
+wm 32 0x53fd4084 0xffffffff
+wm 32 0x53FD4098 0x80000004
+
+# CCM DDR div 4 / 200MHz
+wm 32 0x53fd4098 0x80000004
+check 32 while_all_bits_set 0x53fd408c 0x00000004
+
+# IOMUX
+wm 32 0x53fa8490 0x00180000
+wm 32 0x53fa8494 0x00180000
+wm 32 0x53fa86ac 0x00000000
+wm 32 0x53fa8668 0x00180000
+wm 32 0x53fa866c 0x00000000
+wm 32 0x53fa8670 0x00000000
+wm 32 0x53fa868c 0x00000000
+wm 32 0x53fa8698 0x00180000
+wm 32 0x53fa86a0 0x00180000
+wm 32 0x53fa86a4 0x00180000
+wm 32 0x53fa86a8 0x00180000
+wm 32 0x53fa86b4 0x00180000
+
+# set SW_PAD_CTL_GRP_NANDF to Low output voltage
+wm 32 0x53fa86c0 0x2000
+
+wm 32 0x53fa8498 0x00180200
+wm 32 0x53fa849c 0x00180200
+wm 32 0x53fa84c8 0x00180000
+wm 32 0x53fa84cc 0x00180080
+wm 32 0x53fa84f0 0x00180000
+wm 32 0x53fa84f4 0x00180080
+wm 32 0x53fa84fc 0x00180080
+wm 32 0x53fa8500 0x00180000
+wm 32 0x53fa8524 0x00180080
+wm 32 0x53fa8528 0x00180000
+
+# ZQ Load
+wm 32 0x1400012C 0x00000817
+wm 32 0x14000128 0x09180000
+wm 32 0x14000124 0x00310000
+wm 32 0x14000124 0x00200000
+wm 32 0x14000128 0x09180010
+wm 32 0x14000124 0x00310000
+wm 32 0x14000124 0x00200000
+
+# DRAM_CTL
+wm 32 0x14000000 0x00000100
+wm 32 0x14000008 0x00009c40
+wm 32 0x14000014 0x02000000
+wm 32 0x14000018 0x01010006
+wm 32 0x1400001c 0x080b0201
+wm 32 0x14000020 0x02000303
+wm 32 0x14000024 0x0036b002
+wm 32 0x14000028 0x00000606
+wm 32 0x1400002c 0x06030400
+wm 32 0x14000030 0x01000000
+wm 32 0x14000034 0x00000a02
+wm 32 0x14000038 0x00000003
+wm 32 0x1400003c 0x00001801
+wm 32 0x14000040 0x00050612
+wm 32 0x14000044 0x00000200
+wm 32 0x14000048 0x001c001c
+wm 32 0x1400004c 0x00010000
+wm 32 0x1400005c 0x01000000
+wm 32 0x14000060 0x00000001
+wm 32 0x14000064 0x00000000
+wm 32 0x14000068 0x00320000
+wm 32 0x1400006c 0x00000000
+wm 32 0x14000070 0x00000000
+wm 32 0x14000074 0x00320000
+wm 32 0x14000080 0x02000000
+wm 32 0x14000084 0x00000100
+wm 32 0x14000088 0x02400040
+wm 32 0x1400008c 0x01000000
+wm 32 0x14000090 0x0a000100
+wm 32 0x14000094 0x01011f1f
+wm 32 0x14000098 0x01010101
+wm 32 0x1400009c 0x00030101
+wm 32 0x140000a4 0x00010000
+wm 32 0x140000a8 0x00000000
+wm 32 0x140000ac 0x0000ffff
+wm 32 0x140000c8 0x02020101
+wm 32 0x140000cc 0x00000000
+wm 32 0x140000d0 0x01000202
+wm 32 0x140000d4 0x00000200
+wm 32 0x140000d8 0x00000001
+wm 32 0x140000dc 0x0000ffff
+wm 32 0x140000e0 0x00000000
+wm 32 0x140000e4 0x02020000
+wm 32 0x140000e8 0x02020202
+wm 32 0x140000ec 0x00000202
+wm 32 0x140000f0 0x01010064
+wm 32 0x140000f4 0x01010101
+wm 32 0x140000f8 0x00010101
+wm 32 0x140000fc 0x00000064
+wm 32 0x14000104 0x02000602
+wm 32 0x14000108 0x06120000
+wm 32 0x1400010c 0x06120612
+wm 32 0x14000110 0x06120612
+wm 32 0x14000114 0x01030612
+wm 32 0x14000118 0x00010002
+wm 32 0x1400011c 0x00001000
+
+# DDR PHY
+wm 32 0x14000200 0x00000000
+wm 32 0x14000204 0x00000000
+wm 32 0x14000208 0x35002725
+wm 32 0x14000210 0x35002725
+wm 32 0x14000218 0x35002725
+wm 32 0x14000220 0x35002725
+wm 32 0x14000228 0x35002725
+wm 32 0x1400020c 0x380002d0
+wm 32 0x14000214 0x380002d0
+wm 32 0x1400021c 0x380002d0
+wm 32 0x14000224 0x380002d0
+wm 32 0x1400022c 0x380002d0
+wm 32 0x14000230 0x00000000
+wm 32 0x14000234 0x00800006
+wm 32 0x14000238 0x60101414
+wm 32 0x14000240 0x60101414
+wm 32 0x14000248 0x60101414
+wm 32 0x14000250 0x60101414
+wm 32 0x14000258 0x60101414
+wm 32 0x1400023c 0x00101001
+wm 32 0x14000244 0x00101001
+wm 32 0x1400024c 0x00101001
+wm 32 0x14000254 0x00101001
+wm 32 0x1400025c 0x00102201
+
+# start DDR
+wm 32 0x14000000 0x00000101
+check 32 while_any_bit_clear 0x140000a8 0x00000010
diff --git a/arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr2.imxcfg b/arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr2.imxcfg
new file mode 100644
index 0000000000..ffceac34b5
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/flash-header-kindle-lpddr2.imxcfg
@@ -0,0 +1,176 @@
+# DCD i.MX50 SoC setup using 256MiB LPDDR2
+# Copyright (C) 2017 Alexander Kurz <akurz@blala.de>
+#
+# Initial DCD setup according to Freescale ENGR00124359 with adaption from
+# Kindle_src_5.6.1.1_2634130033 uboot_2009.08 imx50_yoshi flash_header.
+# Copyright (C) 2010 Freescale Semiconductor, Inc.
+
+soc imx50
+loadaddr 0x70020000
+
+dcdofs 0x400
+
+# Switch pll1_sw_clk to step_clk
+wm 32 0x53fd400c 0x00000004
+# Setup PLL1 to 800MHz
+wm 32 0x63f80000 0x00001236
+wm 32 0x63f80004 0x00000002
+wm 32 0x63f80008 0x00000080
+wm 32 0x63f8000c 0x000000b3
+wm 32 0x63f80010 0x000000b4
+wm 32 0x63f8001c 0x00000080
+wm 32 0x63f80020 0x000000b3
+wm 32 0x63f80024 0x000000b4
+wm 32 0x63f80000 0x00001236
+check 8 while_any_bit_clear 0x63f80000 0x01
+# Switch pll1_sw_clk to pll1
+wm 32 0x53fd400c 0x00000000
+
+# CGR
+wm 32 0x53fd4068 0xffffffff
+wm 32 0x53fd406c 0xffffffff
+wm 32 0x53fd4070 0xffffffff
+wm 32 0x53fd4074 0xffffffff
+wm 32 0x53fd4078 0xffffffff
+wm 32 0x53fd407c 0xffffffff
+wm 32 0x53fd4080 0xffffffff
+wm 32 0x53fd4084 0xffffffff
+wm 32 0x53FD4098 0x80000004
+
+# CCM DDR div 3 / 266MHz
+wm 32 0x53fd4098 0x80000003
+check 32 while_all_bits_set 0x53fd408c 0x00000004
+
+# IOMUX
+wm 32 0x53fa86ac 0x04000000
+wm 32 0x53fa8668 0x00200000
+wm 32 0x53fa866c 0x00000200
+wm 32 0x53fa8670 0x00000000
+wm 32 0x53fa868c 0x00000000
+wm 32 0x53fa8698 0x00200000
+wm 32 0x53fa86a0 0x00200000
+wm 32 0x53fa86a4 0x00200000
+wm 32 0x53fa86a8 0x00200000
+wm 32 0x53fa86b4 0x00200000
+
+# set SW_PAD_CTL_GRP_NANDF to Low output voltage
+wm 32 0x53fa86c0 0x2000
+
+wm 32 0x53fa8490 0x00200000
+wm 32 0x53fa8494 0x00200000
+wm 32 0x53fa8498 0x00200000
+wm 32 0x53fa849c 0x00200000
+wm 32 0x53fa84c8 0x00200000
+wm 32 0x53fa84cc 0x00200000
+wm 32 0x53fa84f0 0x00200000
+wm 32 0x53fa84f4 0x00200000
+wm 32 0x53fa84fc 0x00200000
+wm 32 0x53fa8500 0x00200000
+wm 32 0x53fa8524 0x00200000
+wm 32 0x53fa8528 0x00200000
+
+# ZQ Load
+wm 32 0x1400012C 0x00000817
+wm 32 0x14000128 0x09180000
+wm 32 0x14000124 0x00310000
+wm 32 0x14000124 0x00200000
+wm 32 0x14000128 0x09180010
+wm 32 0x14000124 0x00310000
+wm 32 0x14000124 0x00200000
+
+# DRAM_CTL
+wm 32 0x14000000 0x00000500
+wm 32 0x14000008 0x0000001b
+wm 32 0x1400000c 0x0000d056
+wm 32 0x14000010 0x0000010b
+wm 32 0x14000014 0x00000a6b
+wm 32 0x14000018 0x02020d0c
+wm 32 0x1400001c 0x0c110302
+wm 32 0x14000020 0x05020503
+wm 32 0x14000024 0x0048eb05
+wm 32 0x14000028 0x00000606
+wm 32 0x1400002c 0x09040501
+wm 32 0x14000030 0x02000000
+wm 32 0x14000034 0x00000e02
+wm 32 0x14000038 0x00000006
+wm 32 0x1400003c 0x00002301
+wm 32 0x14000040 0x00050408
+wm 32 0x14000044 0x00000300
+wm 32 0x14000048 0x00260026
+wm 32 0x1400004c 0x00010000
+wm 32 0x14000050 0x00000000
+wm 32 0x14000054 0x00000000
+wm 32 0x14000058 0x00000000
+wm 32 0x1400005c 0x02000000
+wm 32 0x14000060 0x00000002
+wm 32 0x14000064 0x00000000
+wm 32 0x14000068 0x00000000
+wm 32 0x1400006c 0x00040042
+wm 32 0x14000070 0x00000001
+wm 32 0x14000074 0x00000000
+wm 32 0x14000078 0x00040042
+wm 32 0x1400007c 0x00000001
+wm 32 0x14000080 0x010b0000
+wm 32 0x14000084 0x00000060
+wm 32 0x14000088 0x02400018
+wm 32 0x1400008c 0x01000e00
+wm 32 0x14000090 0x0a010101
+wm 32 0x14000094 0x01011f1f
+wm 32 0x14000098 0x01010101
+wm 32 0x1400009c 0x00030101
+wm 32 0x140000a0 0x00010000
+wm 32 0x140000a4 0x00010000
+wm 32 0x140000a8 0x00000000
+wm 32 0x140000ac 0x0000ffff
+wm 32 0x140000c8 0x02020101
+wm 32 0x140000cc 0x01000000
+wm 32 0x140000d0 0x01000201
+wm 32 0x140000d4 0x00000200
+wm 32 0x140000d8 0x00000102
+wm 32 0x140000dc 0x0000ffff
+wm 32 0x140000e0 0x0000ff00
+wm 32 0x140000e4 0x02020000
+wm 32 0x140000e8 0x02020202
+wm 32 0x140000ec 0x00000202
+wm 32 0x140000f0 0x01010064
+wm 32 0x140000f4 0x01010101
+wm 32 0x140000f8 0x00010101
+wm 32 0x140000fc 0x00000064
+wm 32 0x14000100 0x00000000
+wm 32 0x14000104 0x02000802
+wm 32 0x14000108 0x04080000
+wm 32 0x1400010c 0x04080408
+wm 32 0x14000110 0x04080408
+wm 32 0x14000114 0x03060408
+wm 32 0x14000118 0x00010002
+wm 32 0x1400011c 0x00001000
+
+# DDR PHY
+wm 32 0x14000200 0x00000000
+wm 32 0x14000204 0x00000000
+wm 32 0x14000208 0x35003a27
+wm 32 0x14000210 0x35003a27
+wm 32 0x14000218 0x35003a27
+wm 32 0x14000220 0x35003a27
+wm 32 0x14000228 0x35003a27
+wm 32 0x1400020c 0x380002e1
+wm 32 0x14000214 0x380002e1
+wm 32 0x1400021c 0x380002e1
+wm 32 0x14000224 0x380002e1
+wm 32 0x1400022c 0x380002e1
+wm 32 0x14000230 0x00000000
+wm 32 0x14000234 0x00810006
+wm 32 0x14000238 0x60101014
+wm 32 0x14000240 0x60101014
+wm 32 0x14000248 0x60101014
+wm 32 0x14000250 0x60101014
+wm 32 0x14000258 0x60101014
+wm 32 0x1400023c 0x00100b01
+wm 32 0x14000244 0x00100b01
+wm 32 0x1400024c 0x00100b01
+wm 32 0x14000254 0x00100b01
+wm 32 0x1400025c 0x00100b01
+
+# start DDR
+wm 32 0x14000000 0x00000501
+check 32 while_any_bit_clear 0x140000a8 0x00000010
diff --git a/arch/arm/boards/kindle-mx50/lowlevel.c b/arch/arm/boards/kindle-mx50/lowlevel.c
new file mode 100644
index 0000000000..dc321b533b
--- /dev/null
+++ b/arch/arm/boards/kindle-mx50/lowlevel.c
@@ -0,0 +1,50 @@
+#include <common.h>
+#include <linux/sizes.h>
+#include <io.h>
+#include <asm/barebox-arm-head.h>
+#include <asm/barebox-arm.h>
+#include <asm/sections.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include <mach/imx50-regs.h>
+#include <mach/generic.h>
+
+extern char __dtb_imx50_kindle_d01100_start[];
+extern char __dtb_imx50_kindle_d01200_start[];
+extern char __dtb_imx50_kindle_ey21_start[];
+
+ENTRY_FUNCTION(start_imx50_kindle_d01100, r0, r1, r2)
+{
+ void *fdt;
+
+ imx5_cpu_lowlevel_init();
+ arm_setup_stack(MX50_IRAM_BASE_ADDR + MX50_IRAM_SIZE - 8);
+
+ fdt = __dtb_imx50_kindle_d01100_start - get_runtime_offset();
+
+ barebox_arm_entry(MX50_CSD0_BASE_ADDR, SZ_256M, fdt);
+}
+
+ENTRY_FUNCTION(start_imx50_kindle_d01200, r0, r1, r2)
+{
+ void *fdt;
+
+ imx5_cpu_lowlevel_init();
+ arm_setup_stack(MX50_IRAM_BASE_ADDR + MX50_IRAM_SIZE - 8);
+
+ fdt = __dtb_imx50_kindle_d01200_start - get_runtime_offset();
+
+ barebox_arm_entry(MX50_CSD0_BASE_ADDR, SZ_256M, fdt);
+}
+
+ENTRY_FUNCTION(start_imx50_kindle_ey21, r0, r1, r2)
+{
+ void *fdt;
+
+ imx5_cpu_lowlevel_init();
+ arm_setup_stack(MX50_IRAM_BASE_ADDR + MX50_IRAM_SIZE - 8);
+
+ fdt = __dtb_imx50_kindle_ey21_start - get_runtime_offset();
+
+ barebox_arm_entry(MX50_CSD0_BASE_ADDR, SZ_256M, fdt);
+}