select ARM64
        select DM
        select DM_GPIO
+       select DM_SERIAL
          help
          Support for HiKey 96boards platform. It features a HI6220
          SoC, with 8xA53 CPU, mali450 gpu, and 1GB RAM.
        bool "Support ls1021aqds"
        select CPU_V7
        select SUPPORT_SPL
-
 config TARGET_LS1021ATWR
        bool "Support ls1021atwr"
        select CPU_V7
 
 config SYS_CONFIG_NAME
        default "hikey"
 
+config CONS_INDEX
+       int "UART used for console"
+       range 1 4
+       default 4
+       help
+         The hi6220 SoC has 5 UARTs. For example to use UART0 enter 1 here.
+
 endif
 
  */
 #include <common.h>
 #include <dm.h>
+#include <dm/platform_data/serial_pl01x.h>
 #include <errno.h>
 #include <malloc.h>
 #include <netdev.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static const struct pl01x_serial_platdata serial_platdata = {
+#if CONFIG_CONS_INDEX == 1
+       .base = HI6220_UART0_BASE,
+#elif CONFIG_CONS_INDEX == 4
+       .base = HI6220_UART3_BASE,
+#else
+#error "Unsuported console index value."
+#endif
+       .type = TYPE_PL011,
+       .clock = 19200000
+};
+
+U_BOOT_DEVICE(hikey_seriala) = {
+       .name = "serial_pl01x",
+       .platdata = &serial_platdata,
+};
+
+#ifdef CONFIG_BOARD_EARLY_INIT_F
+int board_uart_init(void)
+{
+       switch (CONFIG_CONS_INDEX) {
+       case 1:
+               hi6220_pinmux_config(PERIPH_ID_UART0);
+               break;
+       case 4:
+               hi6220_pinmux_config(PERIPH_ID_UART3);
+               break;
+       default:
+               debug("%s: Unsupported UART selected\n", __func__);
+               return -1;
+       }
+
+       return 0;
+}
+
+int board_early_init_f(void)
+{
+       board_uart_init();
+       return 0;
+}
+#endif
+
 struct peri_sc_periph_regs *peri_sc =
        (struct peri_sc_periph_regs *)HI6220_PERI_BASE;
 
 
 CONFIG_ARM=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
 # CONFIG_CMD_IMLS is not set
 
 /* Flat Device Tree Definitions */
 #define CONFIG_OF_LIBFDT
 
+#define CONFIG_BOARD_EARLY_INIT_F
+
 /* Physical Memory Map */
 
 /* CONFIG_SYS_TEXT_BASE needs to align with where ATF loads bl33.bin */
 /* Size of malloc() pool */
 #define CONFIG_SYS_MALLOC_LEN          (CONFIG_ENV_SIZE + SZ_8M)
 
-/* PL011 Serial Configuration */
-#define CONFIG_PL011_SERIAL
-
-#define CONFIG_PL011_CLOCK             19200000
-#define CONFIG_PL01x_PORTS             {(void *)0xF8015000}
-#define CONFIG_CONS_INDEX              0
-
+/* Serial port PL010/PL011 through the device model */
+#define CONFIG_PL01X_SERIAL
 #define CONFIG_BAUDRATE                        115200
 
 #define CONFIG_CMD_USB