diff mbox series

[RFC,v2,2/3] dm: Arch-specific changes for tiny-dm

Message ID 20200702211004.1491489-3-sjg@chromium.org
State New
Delegated to: Tom Rini
Headers show
Series RFC: tiny-dm: Proposal for using driver model in SPL | expand

Commit Message

Simon Glass July 2, 2020, 9:10 p.m. UTC
Signed-off-by: Simon Glass <sjg@chromium.org>
---

(no changes since v1)

 arch/arm/dts/rk3288-u-boot.dtsi               | 17 ++++--
 arch/arm/dts/rk3288-veyron.dtsi               | 26 ++++-----
 arch/arm/dts/rk3288.dtsi                      |  3 +
 arch/arm/include/asm/arch-rockchip/clock.h    |  9 +++
 .../include/asm/arch-rockchip/sdram_rk3288.h  | 21 +++++++
 arch/arm/include/asm/arch-rockchip/spi.h      |  1 +
 arch/arm/include/asm/io.h                     | 18 ++++++
 arch/arm/mach-rockchip/rk3288/clk_rk3288.c    | 46 +++++++++++++++
 arch/arm/mach-rockchip/rk3288/rk3288.c        |  2 +
 arch/arm/mach-rockchip/rk3288/syscon_rk3288.c | 45 ++++-----------
 arch/arm/mach-rockchip/sdram.c                | 33 ++++++++---
 arch/sandbox/cpu/u-boot-spl.lds               | 12 ++++
 arch/sandbox/dts/sandbox.dts                  |  3 +-
 arch/sandbox/dts/sandbox.dtsi                 |  2 +-
 arch/x86/cpu/apollolake/cpu_spl.c             |  5 +-
 arch/x86/cpu/apollolake/uart.c                | 56 +++++++++++++++++++
 arch/x86/dts/chromebook_coral.dts             |  1 +
 arch/x86/lib/tpl.c                            |  4 +-
 configs/chromebook_coral_defconfig            |  1 +
 configs/chromebook_jerry_defconfig            | 11 ++++
 configs/rock2_defconfig                       |  3 +
 21 files changed, 247 insertions(+), 72 deletions(-)
diff mbox series

Patch

diff --git a/arch/arm/dts/rk3288-u-boot.dtsi b/arch/arm/dts/rk3288-u-boot.dtsi
index e4e762aabf..d120eed884 100644
--- a/arch/arm/dts/rk3288-u-boot.dtsi
+++ b/arch/arm/dts/rk3288-u-boot.dtsi
@@ -6,6 +6,11 @@ 
 #include "rockchip-u-boot.dtsi"
 
 / {
+	aliases {
+		ram0 = &dmc;
+		clk0 = &cru;
+	};
+
 	chosen {
 		u-boot,spl-boot-order = \
 			"same-as-spl", &emmc, &sdmmc;
@@ -50,6 +55,10 @@ 
 
 &cru {
 	u-boot,dm-pre-reloc;
+
+	sysreset {
+		u-boot,dm-pre-reloc;
+	};
 };
 
 &grf {
@@ -57,17 +66,13 @@ 
 };
 
 &vopb {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-pre-proper;
 };
 
 &vopl {
-	u-boot,dm-pre-reloc;
+	u-boot,dm-pre-proper;
 };
 
 &noc {
 	u-boot,dm-pre-reloc;
 };
-
-&gpio7 {
-	u-boot,dm-pre-reloc;
-};
diff --git a/arch/arm/dts/rk3288-veyron.dtsi b/arch/arm/dts/rk3288-veyron.dtsi
index 8754043b9b..9b10eaf1f5 100644
--- a/arch/arm/dts/rk3288-veyron.dtsi
+++ b/arch/arm/dts/rk3288-veyron.dtsi
@@ -10,6 +10,15 @@ 
 #include "rk3288.dtsi"
 
 / {
+	aliases {
+		spi_flash0 = &spi_flash;
+		sysreset0 = &sysreset;
+		syscon0 = &grf;
+		syscon1 = &sgrf;
+		syscon2 = &pmu;
+		syscon3 = &noc;
+	};
+
 	memory {
 		reg = <0x0 0x80000000>;
 	};
@@ -303,7 +312,7 @@ 
 
 	spi_flash: spiflash@0 {
 		u-boot,dm-pre-reloc;
-		compatible = "spidev", "jedec,spi-nor";
+		compatible = "jedec,spi-nor";
 		spi-max-frequency = <20000000>; /* Reduce for Dediprog em100 pro */
 		reg = <0>;
 	};
@@ -315,7 +324,6 @@ 
 	clock-frequency = <400000>;
 	i2c-scl-falling-time-ns = <50>;		/* 2.5ns measured */
 	i2c-scl-rising-time-ns = <100>;		/* 45ns measured */
-	u-boot,dm-pre-reloc;
 
 	rk808: pmic@1b {
 		compatible = "rockchip,rk808";
@@ -328,7 +336,6 @@ 
 		rockchip,system-power-controller;
 		wakeup-source;
 		#clock-cells = <1>;
-		u-boot,dm-pre-reloc;
 
 		vcc1-supply = <&vcc33_sys>;
 		vcc2-supply = <&vcc33_sys>;
@@ -601,7 +608,6 @@ 
 };
 
 &pinctrl {
-	u-boot,dm-pre-reloc;
 	pinctrl-names = "default", "sleep";
 	pinctrl-0 = <
 		/* Common for sleep and wake, but no owners */
@@ -826,15 +832,3 @@ 
 	assigned-clocks = <&cru SCLK_USBPHY480M_SRC>;
 	assigned-clock-parents = <&cru SCLK_OTGPHY0>;
 };
-
-&sdmmc {
-	u-boot,dm-pre-reloc;
-};
-
-&gpio3 {
-	u-boot,dm-pre-reloc;
-};
-
-&gpio8 {
-	u-boot,dm-pre-reloc;
-};
diff --git a/arch/arm/dts/rk3288.dtsi b/arch/arm/dts/rk3288.dtsi
index 866fc08215..3983b746f4 100644
--- a/arch/arm/dts/rk3288.dtsi
+++ b/arch/arm/dts/rk3288.dtsi
@@ -608,6 +608,9 @@ 
 				       <150000000>, <75000000>,
 				       <300000000>, <150000000>,
 				       <75000000>;
+		sysreset: sysreset {
+			compatible = "rockchip,sysreset";
+		};
 	};
 
 	grf: syscon@ff770000 {
diff --git a/arch/arm/include/asm/arch-rockchip/clock.h b/arch/arm/include/asm/arch-rockchip/clock.h
index 22de0aef8d..772d1423ce 100644
--- a/arch/arm/include/asm/arch-rockchip/clock.h
+++ b/arch/arm/include/asm/arch-rockchip/clock.h
@@ -6,6 +6,9 @@ 
 #ifndef _ASM_ARCH_CLOCK_H
 #define _ASM_ARCH_CLOCK_H
 
+/* Include this so that struct syscon_uc_info is available for dt-platdata */
+#include <syscon.h>
+
 /* define pll mode */
 #define RKCLK_PLL_MODE_SLOW		0
 #define RKCLK_PLL_MODE_NORMAL		1
@@ -156,10 +159,16 @@  void *rockchip_get_pmucru(void);
 struct rockchip_cru;
 struct rk3288_grf;
 
+int rockchip_cru_setup_sysreset(struct udevice *dev);
+
+int rockchip_cru_setup_tiny_sysreset(struct tinydev *tdev);
+
 void rk3288_clk_configure_cpu(struct rockchip_cru *cru, struct rk3288_grf *grf);
 
 int rockchip_get_clk(struct udevice **devp);
 
+struct tinydev *tiny_rockchip_get_clk(void);
+
 /*
  * rockchip_reset_bind() - Bind soft reset device as child of clock device
  *
diff --git a/arch/arm/include/asm/arch-rockchip/sdram_rk3288.h b/arch/arm/include/asm/arch-rockchip/sdram_rk3288.h
index 9220763fa7..3358584580 100644
--- a/arch/arm/include/asm/arch-rockchip/sdram_rk3288.h
+++ b/arch/arm/include/asm/arch-rockchip/sdram_rk3288.h
@@ -8,6 +8,9 @@ 
 #ifndef _ASM_ARCH_RK3288_SDRAM_H__
 #define _ASM_ARCH_RK3288_SDRAM_H__
 
+#include <clk.h>
+#include <ram.h>
+
 struct rk3288_sdram_channel {
 	/*
 	 * bit width in address, eg:
@@ -99,4 +102,22 @@  struct rk3288_base_params {
 	u32 odt;
 };
 
+struct rk_chan_info {
+	struct rk3288_ddr_pctl *pctl;
+	struct rk3288_ddr_publ *publ;
+	struct rk3288_msch *msch;
+};
+
+struct rk_dram_info {
+	struct rk_chan_info chan[2];
+	struct ram_info info;
+	struct clk ddr_clk;
+	struct tiny_clk tiny_ddr_clk;
+	struct rockchip_cru *cru;
+	struct rk3288_grf *grf;
+	struct rk3288_sgrf *sgrf;
+	struct rk3288_pmu *pmu;
+	bool is_veyron;
+};
+
 #endif
diff --git a/arch/arm/include/asm/arch-rockchip/spi.h b/arch/arm/include/asm/arch-rockchip/spi.h
index a9d210397a..594b0967b5 100644
--- a/arch/arm/include/asm/arch-rockchip/spi.h
+++ b/arch/arm/include/asm/arch-rockchip/spi.h
@@ -12,6 +12,7 @@ 
 struct rockchip_spi_priv {
 	struct rockchip_spi *regs;
 	struct clk clk;
+	struct tiny_clk tiny_clk;
 	unsigned int max_freq;
 	unsigned int mode;
 	ulong last_transaction_us;	/* Time of last transaction end */
diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h
index 8959749ad6..d26aedd812 100644
--- a/arch/arm/include/asm/io.h
+++ b/arch/arm/include/asm/io.h
@@ -470,6 +470,24 @@  out:
 #define isa_check_signature(io,sig,len)	(0)
 
 #endif	/* __mem_isa */
+
+/*
+ * Provide dummy I/O access on ARM, to allow portable code to compile (e.g. the
+ * ns16550 driver). These functions do nothing and should be guarded by a CONFIG
+ * on ARM so that they are never executed.
+ */
+#define outb(val, port) ({ \
+	__maybe_unused ulong _val = (val); \
+	__maybe_unused ulong _port = (uintptr_t)(port); \
+})
+
+#define outw(val, port) outb(val, port)
+#define outl(val, port) outb(val, port)
+
+#define inb(port) ({ __maybe_unused ulong _port = (uintptr_t)(port); 0; })
+#define inw(port) inb(port)
+#define inl(port) inb(port)
+
 #endif	/* __KERNEL__ */
 
 #include <asm-generic/io.h>
diff --git a/arch/arm/mach-rockchip/rk3288/clk_rk3288.c b/arch/arm/mach-rockchip/rk3288/clk_rk3288.c
index e05bd06a8d..144dfe7256 100644
--- a/arch/arm/mach-rockchip/rk3288/clk_rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288/clk_rk3288.c
@@ -11,6 +11,17 @@ 
 #include <asm/arch-rockchip/cru.h>
 #include <linux/err.h>
 
+static int rockchip_sysreset_probe_(struct sysreset_reg *priv)
+{
+	priv->glb_srst_fst_value = offsetof(struct rockchip_cru,
+					    cru_glb_srst_fst_value);
+	priv->glb_srst_snd_value = offsetof(struct rockchip_cru,
+					    cru_glb_srst_snd_value);
+
+	return 0;
+}
+
+#if !CONFIG_IS_ENABLED(TINY_CLK)
 int rockchip_get_clk(struct udevice **devp)
 {
 	return uclass_get_device_by_driver(UCLASS_CLK,
@@ -31,3 +42,38 @@  void *rockchip_get_cru(void)
 
 	return priv->cru;
 }
+
+int rockchip_cru_setup_sysreset(struct udevice *dev)
+{
+	struct sysreset_reg *priv = dev_get_priv(dev);
+
+	return rockchip_sysreset_probe_(priv);
+}
+
+#else /* TINY_CLK */
+
+struct tinydev *tiny_rockchip_get_clk(void)
+{
+	return tiny_dev_get(UCLASS_CLK, 0);
+}
+
+void *rockchip_get_cru(void)
+{
+	struct rk3288_clk_priv *priv;
+	struct tinydev *tdev;
+
+	tdev = tiny_rockchip_get_clk();
+	if (!tdev)
+		return NULL;
+	priv = tdev->priv;
+
+	return priv->cru;
+}
+
+int rockchip_cru_setup_tiny_sysreset(struct tinydev *tdev)
+{
+	struct sysreset_reg *priv = tinydev_get_priv(tdev);
+
+	return rockchip_sysreset_probe_(priv);
+}
+#endif
diff --git a/arch/arm/mach-rockchip/rk3288/rk3288.c b/arch/arm/mach-rockchip/rk3288/rk3288.c
index 804abe8a1b..1e7baeea45 100644
--- a/arch/arm/mach-rockchip/rk3288/rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288/rk3288.c
@@ -115,6 +115,7 @@  int rk_board_late_init(void)
 	return rk3288_board_late_init();
 }
 
+#if !CONFIG_IS_ENABLED(TINY_CLK)
 static int do_clock(struct cmd_tbl *cmdtp, int flag, int argc,
 		    char *const argv[])
 {
@@ -165,3 +166,4 @@  U_BOOT_CMD(
 	"display information about clocks",
 	""
 );
+#endif
diff --git a/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c b/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c
index e3da0a0194..52697e9cac 100644
--- a/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c
+++ b/arch/arm/mach-rockchip/rk3288/syscon_rk3288.c
@@ -10,6 +10,7 @@ 
 #include <syscon.h>
 #include <asm/arch-rockchip/clock.h>
 
+#if !CONFIG_IS_ENABLED(TINY_SYSCON)
 static const struct udevice_id rk3288_syscon_ids[] = {
 	{ .compatible = "rockchip,rk3288-noc", .data = ROCKCHIP_SYSCON_NOC },
 	{ .compatible = "rockchip,rk3288-grf", .data = ROCKCHIP_SYSCON_GRF },
@@ -24,40 +25,18 @@  U_BOOT_DRIVER(syscon_rk3288) = {
 	.of_match = rk3288_syscon_ids,
 };
 
-#if CONFIG_IS_ENABLED(OF_PLATDATA)
-static int rk3288_syscon_bind_of_platdata(struct udevice *dev)
-{
-	dev->driver_data = dev->driver->of_match->data;
-	debug("syscon: %s %d\n", dev->name, (uint)dev->driver_data);
+U_BOOT_DRIVER_ALIAS(syscon_rk3288, rockchip_rk3288_noc)
+U_BOOT_DRIVER_ALIAS(syscon_rk3288, rockchip_rk3288_pmu)
+U_BOOT_DRIVER_ALIAS(syscon_rk3288, rockchip_rk3288_grf)
+U_BOOT_DRIVER_ALIAS(syscon_rk3288, rockchip_rk3288_sgrf)
 
-	return 0;
-}
+#else
 
-U_BOOT_DRIVER(rockchip_rk3288_noc) = {
-	.name = "rockchip_rk3288_noc",
-	.id = UCLASS_SYSCON,
-	.of_match = rk3288_syscon_ids,
-	.bind = rk3288_syscon_bind_of_platdata,
-};
-
-U_BOOT_DRIVER(rockchip_rk3288_grf) = {
-	.name = "rockchip_rk3288_grf",
-	.id = UCLASS_SYSCON,
-	.of_match = rk3288_syscon_ids + 1,
-	.bind = rk3288_syscon_bind_of_platdata,
-};
-
-U_BOOT_DRIVER(rockchip_rk3288_sgrf) = {
-	.name = "rockchip_rk3288_sgrf",
-	.id = UCLASS_SYSCON,
-	.of_match = rk3288_syscon_ids + 2,
-	.bind = rk3288_syscon_bind_of_platdata,
-};
-
-U_BOOT_DRIVER(rockchip_rk3288_pmu) = {
-	.name = "rockchip_rk3288_pmu",
-	.id = UCLASS_SYSCON,
-	.of_match = rk3288_syscon_ids + 3,
-	.bind = rk3288_syscon_bind_of_platdata,
+U_BOOT_TINY_DRIVER(syscon_rk3288) = {
+	.uclass_id	= UCLASS_SYSCON,
+	.probe		= tiny_syscon_setup,
+// 	.ops		= &rockchip_clk_tiny_ops,
+	DM_TINY_PRIV(<asm/arch-rockchip/clock.h>, \
+		     sizeof(struct syscon_uc_info))
 };
 #endif
diff --git a/arch/arm/mach-rockchip/sdram.c b/arch/arm/mach-rockchip/sdram.c
index 24fe6cc8f0..e4c6644a0f 100644
--- a/arch/arm/mach-rockchip/sdram.c
+++ b/arch/arm/mach-rockchip/sdram.c
@@ -189,15 +189,30 @@  int dram_init(void)
 	struct udevice *dev;
 	int ret;
 
-	ret = uclass_get_device(UCLASS_RAM, 0, &dev);
-	if (ret) {
-		debug("DRAM init failed: %d\n", ret);
-		return ret;
-	}
-	ret = ram_get_info(dev, &ram);
-	if (ret) {
-		debug("Cannot get DRAM size: %d\n", ret);
-		return ret;
+	if (!CONFIG_IS_ENABLED(TINY_RAM)) {
+		ret = uclass_get_device(UCLASS_RAM, 0, &dev);
+		if (ret) {
+			debug("DRAM init failed: %d\n", ret);
+			return log_msg_ret("get", ret);
+		}
+		ret = ram_get_info(dev, &ram);
+		if (ret) {
+			debug("Cannot get DRAM size: %d\n", ret);
+			return log_msg_ret("info", ret);
+		}
+	} else {
+		struct tinydev *dev;
+
+		dev = tiny_dev_get(UCLASS_RAM, 0);
+		if (!dev) {
+			debug("DRAM init failed\n");
+			return log_msg_ret("get", -ENOKEY);
+		}
+		ret = tiny_ram_get_info(dev, &ram);
+		if (ret) {
+			debug("Cannot get DRAM size: %d\n", ret);
+			return log_msg_ret("info", ret);
+		}
 	}
 	gd->ram_size = ram.size;
 	debug("SDRAM base=%lx, size=%lx\n",
diff --git a/arch/sandbox/cpu/u-boot-spl.lds b/arch/sandbox/cpu/u-boot-spl.lds
index c60eb109b1..c2e3e65721 100644
--- a/arch/sandbox/cpu/u-boot-spl.lds
+++ b/arch/sandbox/cpu/u-boot-spl.lds
@@ -5,9 +5,21 @@ 
  * found in the LICENSE file.
  */
 
+/* Put the tiny devices in the data section since they are changed at runtime */
 SECTIONS
 {
+	. = ALIGN(4);
+	.tiny_dev : {
+		__tiny_dev_start = .;
+		KEEP(*(SORT(.u_boot_list*tiny_dev*)));
+		__tiny_dev_end = .;
+	}
+}
 
+INSERT AFTER .data;
+
+SECTIONS
+{
 	. = ALIGN(4);
 	.u_boot_list : {
 		KEEP(*(SORT(.u_boot_list*)));
diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts
index 20f6893829..5480c69ebe 100644
--- a/arch/sandbox/dts/sandbox.dts
+++ b/arch/sandbox/dts/sandbox.dts
@@ -9,10 +9,11 @@ 
 	compatible = "sandbox";
 
 	aliases {
+		axi0 = &axi;
 		i2c0 = &i2c_0;
 		pci0 = &pcic;
 		rtc0 = &rtc_0;
-		axi0 = &axi;
+		serial0 = &serial0;
 		spi0 = &spi;
 	};
 
diff --git a/arch/sandbox/dts/sandbox.dtsi b/arch/sandbox/dts/sandbox.dtsi
index e1f68cd552..99a6b6328c 100644
--- a/arch/sandbox/dts/sandbox.dtsi
+++ b/arch/sandbox/dts/sandbox.dtsi
@@ -259,7 +259,7 @@ 
 	};
 
 	/* Needs to be available prior to relocation */
-	uart0: serial {
+	serial0: serial {
 		u-boot,dm-spl;
 		compatible = "sandbox,serial";
 		sandbox,text-colour = "cyan";
diff --git a/arch/x86/cpu/apollolake/cpu_spl.c b/arch/x86/cpu/apollolake/cpu_spl.c
index 707ceb3e64..0f32ca7dc5 100644
--- a/arch/x86/cpu/apollolake/cpu_spl.c
+++ b/arch/x86/cpu/apollolake/cpu_spl.c
@@ -171,7 +171,7 @@  static void early_ec_init(void)
 
 static int arch_cpu_init_tpl(void)
 {
-	struct udevice *pmc, *sa, *p2sb, *serial, *spi, *lpc;
+	struct udevice *pmc, *sa, *p2sb, *spi, *lpc;
 	int ret;
 
 	ret = uclass_first_device_err(UCLASS_ACPI_PMC, &pmc);
@@ -192,9 +192,6 @@  static int arch_cpu_init_tpl(void)
 	if (ret)
 		return log_msg_ret("northbridge", ret);
 	gd->baudrate = CONFIG_BAUDRATE;
-	ret = uclass_first_device_err(UCLASS_SERIAL, &serial);
-	if (ret)
-		return log_msg_ret("serial", ret);
 	if (CONFIG_IS_ENABLED(SPI_FLASH_SUPPORT)) {
 		ret = uclass_first_device_err(UCLASS_SPI, &spi);
 		if (ret)
diff --git a/arch/x86/cpu/apollolake/uart.c b/arch/x86/cpu/apollolake/uart.c
index f368f7d2db..3ab3fc9d4d 100644
--- a/arch/x86/cpu/apollolake/uart.c
+++ b/arch/x86/cpu/apollolake/uart.c
@@ -8,10 +8,12 @@ 
  */
 
 #include <common.h>
+#include <debug_uart.h>
 #include <dm.h>
 #include <dt-structs.h>
 #include <malloc.h>
 #include <ns16550.h>
+#include <serial.h>
 #include <spl.h>
 #include <asm/io.h>
 #include <asm/pci.h>
@@ -64,6 +66,7 @@  void apl_uart_init(pci_dev_t bdf, ulong base)
 	uart_lpss_init((void *)base);
 }
 
+#if !CONFIG_IS_ENABLED(TINY_SERIAL)
 /*
  * This driver uses its own compatible string but almost everything else from
  * the standard ns16550 driver. This allows us to provide an of-platdata
@@ -132,3 +135,56 @@  U_BOOT_DRIVER(apl_ns16550) = {
 	.ofdata_to_platdata = apl_ns16550_ofdata_to_platdata,
 	.probe = apl_ns16550_probe,
 };
+
+#else /* TINY_SERIAL */
+
+static int apl_ns16550_tiny_probe(struct tinydev *tdev)
+{
+	struct dtd_intel_apl_ns16550 *dtplat = tdev->dtplat;
+	struct ns16550_platdata *plat = tdev->priv;
+	ulong base;
+	pci_dev_t bdf;
+
+	base = dtplat->early_regs[0];
+	bdf = pci_ofplat_get_devfn(dtplat->reg[0]);
+
+	if (!CONFIG_IS_ENABLED(PCI))
+		apl_uart_init(bdf, base);
+
+	plat->base = base;
+	plat->reg_shift = dtplat->reg_shift;
+	plat->reg_width = 1;
+	plat->clock = dtplat->clock_frequency;
+	plat->fcr = UART_FCR_DEFVAL;
+
+	return ns16550_tiny_probe_plat(plat);
+}
+
+static int apl_ns16550_tiny_setbrg(struct tinydev *tdev, int baudrate)
+{
+	struct ns16550_platdata *plat = tdev->priv;
+
+	return ns16550_tiny_setbrg(plat, baudrate);
+}
+
+static int apl_ns16550_tiny_putc(struct tinydev *tdev, const char ch)
+{
+	struct ns16550_platdata *plat = tdev->priv;
+
+	return ns16550_tiny_putc(plat, ch);
+}
+
+struct tiny_serial_ops apl_ns16550_tiny_ops = {
+	.probe	= apl_ns16550_tiny_probe,
+	.setbrg	= apl_ns16550_tiny_setbrg,
+	.putc	= apl_ns16550_tiny_putc,
+};
+
+U_BOOT_TINY_DRIVER(apl_ns16550) = {
+	.uclass_id	= UCLASS_SERIAL,
+	.probe		= apl_ns16550_tiny_probe,
+	.ops		= &apl_ns16550_tiny_ops,
+	DM_TINY_PRIV(<ns16550.h>, sizeof(struct ns16550_platdata))
+};
+
+#endif
diff --git a/arch/x86/dts/chromebook_coral.dts b/arch/x86/dts/chromebook_coral.dts
index 965d9f387d..f1a1f98c08 100644
--- a/arch/x86/dts/chromebook_coral.dts
+++ b/arch/x86/dts/chromebook_coral.dts
@@ -40,6 +40,7 @@ 
 		i2c5 = &i2c_5;
 		i2c6 = &i2c_6;
 		i2c7 = &i2c_7;
+		serial0 = &serial;
 	};
 
 	config {
diff --git a/arch/x86/lib/tpl.c b/arch/x86/lib/tpl.c
index 6f7eb43a17..139de881e8 100644
--- a/arch/x86/lib/tpl.c
+++ b/arch/x86/lib/tpl.c
@@ -41,7 +41,7 @@  static int x86_tpl_init(void)
 	ret = arch_cpu_init();
 	if (ret) {
 		debug("%s: arch_cpu_init() failed\n", __func__);
-		return ret;
+		return log_msg_ret("arch", ret);
 	}
 	ret = arch_cpu_init_dm();
 	if (ret) {
@@ -59,7 +59,7 @@  void board_init_f(ulong flags)
 
 	ret = x86_tpl_init();
 	if (ret) {
-		debug("Error %d\n", ret);
+		printf("Error %d\n", ret);
 		panic("x86_tpl_init fail");
 	}
 
diff --git a/configs/chromebook_coral_defconfig b/configs/chromebook_coral_defconfig
index 79f9b5a232..af8b7a50e8 100644
--- a/configs/chromebook_coral_defconfig
+++ b/configs/chromebook_coral_defconfig
@@ -102,3 +102,4 @@  CONFIG_CMD_DHRYSTONE=y
 CONFIG_TPM=y
 # CONFIG_GZIP is not set
 # CONFIG_EFI_LOADER is not set
+CONFIG_NS16550_DYNAMIC=y
diff --git a/configs/chromebook_jerry_defconfig b/configs/chromebook_jerry_defconfig
index 96246b7512..3a44543bc5 100644
--- a/configs/chromebook_jerry_defconfig
+++ b/configs/chromebook_jerry_defconfig
@@ -107,3 +107,14 @@  CONFIG_DISPLAY_ROCKCHIP_HDMI=y
 CONFIG_SPL_TINY_MEMSET=y
 CONFIG_CMD_DHRYSTONE=y
 CONFIG_ERRNO_STR=y
+CONFIG_NS16550_DYNAMIC=y
+CONFIG_SPL_TINY_ONLY=y
+# CONFIG_TINY_CHECK is not set
+CONFIG_SPL_TINY_RAM=y
+CONFIG_SPL_TINY_SERIAL=y
+CONFIG_SPL_TINY_CLK=y
+# CONFIG_SPL_CLK_FIXED_RATE is not set
+CONFIG_SPL_TINY_SPI=y
+CONFIG_SPL_TINY_SPI_FLASH=y
+CONFIG_SPL_TINY_SYSRESET=y
+CONFIG_SPL_TINY_SYSCON=y
diff --git a/configs/rock2_defconfig b/configs/rock2_defconfig
index 2118402bbe..a458935422 100644
--- a/configs/rock2_defconfig
+++ b/configs/rock2_defconfig
@@ -83,3 +83,6 @@  CONFIG_DISPLAY_ROCKCHIP_HDMI=y
 CONFIG_CONSOLE_SCROLL_LINES=10
 CONFIG_CMD_DHRYSTONE=y
 CONFIG_ERRNO_STR=y
+#CONFIG_SPL_TINY_SERIAL=y
+#CONFIG_SPL_TINY=y
+CONFIG_SPL_OF_PLATDATA=y