arm64: zynqmp: Fix debug uart initialization

The commit 0dba45864b2a ("arm: Init the debug UART") calls
debug_uart_init() from crt0.S but it won't work because SOC is not
configured yet. That's why create board_debug_uart_init() which calls
psu_init() via new psu_uboot_init() earlier before the first access to UART
in SPL. In full U-Boot call psu_uboot_init() only when
CONFIG_ZYNQMP_PSU_INIT_ENABLED is enabled.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Link: https://lore.kernel.org/r/878dc2daaa8685346f889989fbfb98b2e44da7fb.1645104518.git.michal.simek@xilinx.com
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index c5b21cd..5e237d8 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -1199,6 +1199,7 @@
 	select ARM64
 	select CLK
 	select DM
+	select DEBUG_UART_BOARD_INIT if SPL && DEBUG_UART
 	select DM_ETH if NET
 	select DM_MAILBOX
 	select DM_MMC if MMC
diff --git a/arch/arm/mach-zynqmp/include/mach/psu_init_gpl.h b/arch/arm/mach-zynqmp/include/mach/psu_init_gpl.h
index e37acda..434a7fa 100644
--- a/arch/arm/mach-zynqmp/include/mach/psu_init_gpl.h
+++ b/arch/arm/mach-zynqmp/include/mach/psu_init_gpl.h
@@ -22,5 +22,6 @@
 
 int psu_init(void);
 unsigned long psu_post_config_data(void);
+int psu_uboot_init(void);
 
 #endif /* _PSU_INIT_GPL_H_ */
diff --git a/arch/arm/mach-zynqmp/spl.c b/arch/arm/mach-zynqmp/spl.c
index 6b836cb..b428fd5 100644
--- a/arch/arm/mach-zynqmp/spl.c
+++ b/arch/arm/mach-zynqmp/spl.c
@@ -19,9 +19,19 @@
 #include <asm/arch/psu_init_gpl.h>
 #include <asm/arch/sys_proto.h>
 
+#if defined(CONFIG_DEBUG_UART_BOARD_INIT)
+void board_debug_uart_init(void)
+{
+	psu_uboot_init();
+}
+#endif
+
 void board_init_f(ulong dummy)
 {
-	board_early_init_f();
+#if !defined(CONFIG_DEBUG_UART_BOARD_INIT)
+	psu_uboot_init();
+#endif
+
 	board_early_init_r();
 #ifdef CONFIG_SPL_ZYNQMP_DRAM_ECC_INIT
 	zynqmp_ecc_init();