From 34ce52e283aaee8f56c352a00eeb546b8307aa71 Mon Sep 17 00:00:00 2001
From: Oliver Scott <Oliver.Scott@data61.csiro.au>
Date: Tue, 19 Feb 2019 13:30:59 +1100
Subject: [PATCH] serial-refactor: Refactor kernel serial drivers

Have added a drivers/serial folder to kernel, where all serial drivers
will be kept. The point is to have the the dts parsed and generate cmake
to include the right uart.c file prefixed with the compatibility.
Have removed all io.c from plat and includes from plat/config.cmake and
updated CHANGES file.
---
 CHANGES                                       |  1 +
 .../io.c => drivers/serial/arm,pl011.c}       |  7 ++-
 .../serial/brcm,bcm2835-aux-uart.c}           |  2 +-
 src/drivers/serial/config.cmake               | 19 +++++++
 .../io.c => drivers/serial/fsl,imx31-uart.c}  |  0
 .../io.c => drivers/serial/fsl,imx6q-uart.c}  |  0
 .../io.c => drivers/serial/qcom,msm-uartdm.c} |  0
 .../serial/samsung,exynos4210-uart.c}         |  0
 .../serial/tegra_omap3_dwapb.c}               |  0
 .../io.c => drivers/serial/xlnx,xuartps.c}    |  0
 src/plat/allwinnerA20/config.cmake            |  3 +-
 src/plat/allwinnerA20/machine/io.c            | 39 -------------
 src/plat/am335x/config.cmake                  |  1 -
 src/plat/am335x/machine/io.c                  | 38 -------------
 src/plat/apq8064/config.cmake                 |  1 -
 src/plat/bcm2837/config.cmake                 |  1 -
 src/plat/exynos4/config.cmake                 |  1 -
 src/plat/exynos5/config.cmake                 |  1 -
 src/plat/hikey/config.cmake                   |  1 -
 src/plat/imx31/config.cmake                   |  1 -
 src/plat/imx6/config.cmake                    |  1 -
 src/plat/imx7/config.cmake                    |  2 +-
 src/plat/imx7/machine/io.c                    | 56 -------------------
 src/plat/omap3/config.cmake                   |  1 -
 src/plat/omap3/machine/io.c                   | 39 -------------
 src/plat/tk1/config.cmake                     |  1 -
 src/plat/tx1/config.cmake                     |  1 -
 src/plat/tx1/machine/io.c                     | 42 --------------
 src/plat/tx2/config.cmake                     |  1 -
 src/plat/tx2/machine/io.c                     | 42 --------------
 src/plat/zynq7000/config.cmake                |  1 -
 src/plat/zynqmp/config.cmake                  |  1 -
 src/plat/zynqmp/machine/io.c                  | 47 ----------------
 tools/hardware.yml                            |  1 -
 tools/hardware_gen.py                         | 17 +++++-
 35 files changed, 43 insertions(+), 326 deletions(-)
 rename src/{plat/hikey/machine/io.c => drivers/serial/arm,pl011.c} (84%)
 rename src/{plat/bcm2837/machine/io.c => drivers/serial/brcm,bcm2835-aux-uart.c} (98%)
 create mode 100644 src/drivers/serial/config.cmake
 rename src/{plat/imx31/machine/io.c => drivers/serial/fsl,imx31-uart.c} (100%)
 rename src/{plat/imx6/machine/io.c => drivers/serial/fsl,imx6q-uart.c} (100%)
 rename src/{plat/apq8064/machine/io.c => drivers/serial/qcom,msm-uartdm.c} (100%)
 rename src/{plat/exynos_common/io.c => drivers/serial/samsung,exynos4210-uart.c} (100%)
 rename src/{plat/tk1/machine/io.c => drivers/serial/tegra_omap3_dwapb.c} (100%)
 rename src/{plat/zynq7000/machine/io.c => drivers/serial/xlnx,xuartps.c} (100%)
 delete mode 100755 src/plat/allwinnerA20/machine/io.c
 delete mode 100644 src/plat/am335x/machine/io.c
 delete mode 100644 src/plat/imx7/machine/io.c
 delete mode 100644 src/plat/omap3/machine/io.c
 delete mode 100644 src/plat/tx1/machine/io.c
 delete mode 100644 src/plat/tx2/machine/io.c
 delete mode 100644 src/plat/zynqmp/machine/io.c

diff --git a/CHANGES b/CHANGES
index deb574abf..e2ddc1da3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -23,6 +23,7 @@ Upcoming release: BREAKING
       user level.
 * Support added for Aarch64 hypervisor mode (EL2) for Nvidia TX1 and TX2. This is not verified.
 * Support for generating ARM machine header files (memory regions and interrupts) based on a device tree.
+* Support added for ARM kernel serial driver to be linked in at build time based on the device tree compatibility string.
 
 ## Upgrade Notes
 ---
diff --git a/src/plat/hikey/machine/io.c b/src/drivers/serial/arm,pl011.c
similarity index 84%
rename from src/plat/hikey/machine/io.c
rename to src/drivers/serial/arm,pl011.c
index 6dae9a84e..17ab80219 100644
--- a/src/plat/hikey/machine/io.c
+++ b/src/drivers/serial/arm,pl011.c
@@ -17,6 +17,7 @@
 #define UARTDR                    0x000
 #define UARTFR                    0x018
 #define PL011_UARTFR_TXFF         (1 << 5)
+#define PL011_UARTFR_RXFE         (1 << 4)
 
 #define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
 
@@ -34,6 +35,8 @@ putDebugChar(unsigned char c)
 unsigned char
 getDebugChar(void)
 {
-    return 0;
+    while ((*UART_REG(UARTFR) & PL011_UARTFR_RXFE) != 0);
+
+    return *UART_REG(UARTDR);
 }
-#endif
+#endif //CONFIG_DEBUG_BUILD
\ No newline at end of file
diff --git a/src/plat/bcm2837/machine/io.c b/src/drivers/serial/brcm,bcm2835-aux-uart.c
similarity index 98%
rename from src/plat/bcm2837/machine/io.c
rename to src/drivers/serial/brcm,bcm2835-aux-uart.c
index 7ea6fb6ed..bbf9470b0 100644
--- a/src/plat/bcm2837/machine/io.c
+++ b/src/drivers/serial/brcm,bcm2835-aux-uart.c
@@ -59,4 +59,4 @@ unsigned char getDebugChar(void)
     while ( !(*UART_REG(MU_LSR) & MU_LSR_DATAREADY) );
     return *UART_REG(MU_IO);
 }
-#endif /* CONFIG_DEBUG_BUILD */
+#endif //CONFIG_DEBUG_BUILD
\ No newline at end of file
diff --git a/src/drivers/serial/config.cmake b/src/drivers/serial/config.cmake
new file mode 100644
index 000000000..d2f41e679
--- /dev/null
+++ b/src/drivers/serial/config.cmake
@@ -0,0 +1,19 @@
+
+cmake_minimum_required(VERSION 3.7.2)
+
+macro(RegisterDriver compatibility_strings match_strings)
+    foreach(match_string IN ITEMS ${match_strings})
+        list(FIND ${compatibility_strings} ${match_string} res)
+        if(NOT (res EQUAL -1))
+            add_sources(${ARGN})
+            break()
+        endif()
+    endforeach()
+endmacro()
+
+RegisterDriver(compatibility_strings "nvidia,tegra20-uart;ti,omap3-uart;snps,dw-apb-uart" PREFIX src/drivers/serial CFILES "tegra_omap3_dwapb.c")
+
+set(serial_list brcm,bcm2835-aux-uart fsl,imx31-uart arm,pl011 samsung,exynos4210-uart fsl,imx6q-uart qcom,msm-uartdm xlnx,xuartps)    
+foreach(c IN ITEMS ${serial_list})
+    RegisterDriver(compatibility_strings "${c}" PREFIX src/drivers/serial CFILES "${c}.c")
+endforeach()
\ No newline at end of file
diff --git a/src/plat/imx31/machine/io.c b/src/drivers/serial/fsl,imx31-uart.c
similarity index 100%
rename from src/plat/imx31/machine/io.c
rename to src/drivers/serial/fsl,imx31-uart.c
diff --git a/src/plat/imx6/machine/io.c b/src/drivers/serial/fsl,imx6q-uart.c
similarity index 100%
rename from src/plat/imx6/machine/io.c
rename to src/drivers/serial/fsl,imx6q-uart.c
diff --git a/src/plat/apq8064/machine/io.c b/src/drivers/serial/qcom,msm-uartdm.c
similarity index 100%
rename from src/plat/apq8064/machine/io.c
rename to src/drivers/serial/qcom,msm-uartdm.c
diff --git a/src/plat/exynos_common/io.c b/src/drivers/serial/samsung,exynos4210-uart.c
similarity index 100%
rename from src/plat/exynos_common/io.c
rename to src/drivers/serial/samsung,exynos4210-uart.c
diff --git a/src/plat/tk1/machine/io.c b/src/drivers/serial/tegra_omap3_dwapb.c
similarity index 100%
rename from src/plat/tk1/machine/io.c
rename to src/drivers/serial/tegra_omap3_dwapb.c
diff --git a/src/plat/zynq7000/machine/io.c b/src/drivers/serial/xlnx,xuartps.c
similarity index 100%
rename from src/plat/zynq7000/machine/io.c
rename to src/drivers/serial/xlnx,xuartps.c
diff --git a/src/plat/allwinnerA20/config.cmake b/src/plat/allwinnerA20/config.cmake
index 082d7a591..6dd67698d 100644
--- a/src/plat/allwinnerA20/config.cmake
+++ b/src/plat/allwinnerA20/config.cmake
@@ -25,8 +25,7 @@ endif()
 
 add_sources(
     DEP "KernelPlatAllwinnerA20"
-    CFILES src/plat/allwinnerA20/machine/io.c
-           src/plat/allwinnerA20/machine/hardware.c
+    CFILES src/plat/allwinnerA20/machine/hardware.c
            src/plat/allwinnerA20/machine/l2cache.c
            src/arch/arm/machine/gic_pl390.c
 )
diff --git a/src/plat/allwinnerA20/machine/io.c b/src/plat/allwinnerA20/machine/io.c
deleted file mode 100755
index c4f24224f..000000000
--- a/src/plat/allwinnerA20/machine/io.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2015, DornerWorks, Ltd.
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(GD_GPL)
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define UTHR 0x00 /* UART Transmit Holding Register */
-#define ULSR 0x14 /* UART Line Status Register */
-#define ULSR_THRE 0x20 /* Transmit Holding Register Empty */
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
-void
-putDebugChar(unsigned char c)
-{
-    while ((*UART_REG(ULSR) & ULSR_THRE) == 0);
-
-    *UART_REG(UTHR) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    return 0;
-}
-#endif
diff --git a/src/plat/am335x/config.cmake b/src/plat/am335x/config.cmake
index aa564bc93..b55ecee06 100644
--- a/src/plat/am335x/config.cmake
+++ b/src/plat/am335x/config.cmake
@@ -24,6 +24,5 @@ add_sources(
     DEP "KernelPlatformAM335X"
     CFILES
         src/plat/am335x/machine/hardware.c
-        src/plat/am335x/machine/io.c
         src/plat/am335x/machine/l2cache.c
 )
diff --git a/src/plat/am335x/machine/io.c b/src/plat/am335x/machine/io.c
deleted file mode 100644
index 1b93e0b92..000000000
--- a/src/plat/am335x/machine/io.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2014, General Dynamics C4 Systems
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(GD_GPL)
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define UTHR 0x00 /* UART Transmit Holding Register */
-#define ULSR 0x14 /* UART Line Status Register */
-#define ULSR_THRE BIT(5) /* Transmit Holding Register Empty */
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-#if defined(CONFIG_PRINTING) || defined(CONFIG_DEBUG_BUILD)
-void
-putDebugChar(unsigned char c)
-{
-    while ((*UART_REG(ULSR) & ULSR_THRE) == 0);
-    *UART_REG(UTHR) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    return 0;
-}
-#endif
diff --git a/src/plat/apq8064/config.cmake b/src/plat/apq8064/config.cmake
index b811a90a6..74e31b25b 100644
--- a/src/plat/apq8064/config.cmake
+++ b/src/plat/apq8064/config.cmake
@@ -24,7 +24,6 @@ endif()
 add_sources(
     DEP "KernelPlatformAPQ8064"
     CFILES
-        src/plat/apq8064/machine/io.c
         src/plat/apq8064/machine/timer.c
         src/arch/arm/machine/gic_pl390.c
         src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/bcm2837/config.cmake b/src/plat/bcm2837/config.cmake
index 8a1ebdb89..c64844112 100644
--- a/src/plat/bcm2837/config.cmake
+++ b/src/plat/bcm2837/config.cmake
@@ -27,7 +27,6 @@ endif()
 add_sources(
     DEP "KernelPlatformRpi3"
     CFILES
-        src/plat/bcm2837/machine/io.c
         src/plat/bcm2837/machine/intc.c
         src/arch/arm/machine/generic_timer.c
         src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/exynos4/config.cmake b/src/plat/exynos4/config.cmake
index ac0817881..63fcfbc8a 100644
--- a/src/plat/exynos4/config.cmake
+++ b/src/plat/exynos4/config.cmake
@@ -23,7 +23,6 @@ endif()
 add_sources(
     DEP "KernelPlatformExynos4"
     CFILES
-        src/plat/exynos_common/io.c
         src/plat/exynos4/machine/hardware.c
         src/arch/arm/machine/l2c_310.c
         src/arch/arm/machine/gic_pl390.c
diff --git a/src/plat/exynos5/config.cmake b/src/plat/exynos5/config.cmake
index 720b644c3..685123a81 100644
--- a/src/plat/exynos5/config.cmake
+++ b/src/plat/exynos5/config.cmake
@@ -36,7 +36,6 @@ add_sources(
     CFILES
         src/arch/arm/machine/generic_timer.c
         src/plat/exynos5/machine/hardware.c
-        src/plat/exynos_common/io.c
         src/arch/arm/machine/gic_pl390.c
         src/arch/arm/machine/l2c_nop.c
 )
diff --git a/src/plat/hikey/config.cmake b/src/plat/hikey/config.cmake
index bbcf79fe0..66ef6e0b2 100644
--- a/src/plat/hikey/config.cmake
+++ b/src/plat/hikey/config.cmake
@@ -73,7 +73,6 @@ endif()
 add_sources(
     DEP "KernelPlatformHikey"
     CFILES
-        src/plat/hikey/machine/io.c
         src/arch/arm/machine/generic_timer.c
         src/arch/arm/machine/gic_pl390.c
         src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/imx31/config.cmake b/src/plat/imx31/config.cmake
index bfcd84674..79870aa9e 100644
--- a/src/plat/imx31/config.cmake
+++ b/src/plat/imx31/config.cmake
@@ -24,7 +24,6 @@ endif()
 add_sources(
     DEP "KernelPlatformKZM"
     CFILES
-        src/plat/imx31/machine/io.c
         src/plat/imx31/machine/hardware.c
 )
 
diff --git a/src/plat/imx6/config.cmake b/src/plat/imx6/config.cmake
index 7c20f02da..dc87ced34 100644
--- a/src/plat/imx6/config.cmake
+++ b/src/plat/imx6/config.cmake
@@ -33,7 +33,6 @@ endif()
 add_sources(
     DEP "KernelPlatImx6"
     CFILES
-        src/plat/imx6/machine/io.c
         src/arch/arm/machine/l2c_310.c
         src/arch/arm/machine/priv_timer.c
         src/arch/arm/machine/gic_pl390.c
diff --git a/src/plat/imx7/config.cmake b/src/plat/imx7/config.cmake
index 73ddd16c2..c486b6063 100644
--- a/src/plat/imx7/config.cmake
+++ b/src/plat/imx7/config.cmake
@@ -26,7 +26,7 @@ endif()
 
 add_sources(
     DEP "KernelPlatImx7"
-    CFILES src/plat/imx7/machine/io.c
+    CFILES 
            src/arch/arm/machine/generic_timer.c
            src/arch/arm/machine/gic_pl390.c
            src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/imx7/machine/io.c b/src/plat/imx7/machine/io.c
deleted file mode 100644
index 967aabb57..000000000
--- a/src/plat/imx7/machine/io.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2014, General Dynamics C4 Systems
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(GD_GPL)
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define URXD  0x00 /* UART Receiver Register */
-#define UTXD  0x40 /* UART Transmitter Register */
-#define UCR1  0x80 /* UART Control Register 1 */
-#define UCR2  0x84 /* UART Control Register 2 */
-#define UCR3  0x88 /* UART Control Register 3 */
-#define UCR4  0x8c /* UART Control Register 4 */
-#define UFCR  0x90 /* UART FIFO Control Register */
-#define USR1  0x94 /* UART Status Register 1 */
-#define USR2  0x98 /* UART Status Register 2 */
-#define UESC  0x9c /* UART Escape Character Register */
-#define UTIM  0xa0 /* UART Escape Timer Register */
-#define UBIR  0xa4 /* UART BRM Incremental Register */
-#define UBMR  0xa8 /* UART BRM Modulator Register */
-#define UBRC  0xac /* UART Baud Rate Counter Register */
-#define ONEMS 0xb0 /* UART One Millisecond Register */
-#define UTS   0xb4 /* UART Test Register */
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-
-#define UART_SR2_TXFIFO_EMPTY 14
-#define UART_SR2_RXFIFO_RDR    0
-
-#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
-void
-putDebugChar(unsigned char c)
-{
-    while (!(*UART_REG(USR2) & BIT(UART_SR2_TXFIFO_EMPTY)));
-    *UART_REG(UTXD) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    while (!(*UART_REG(USR2) & BIT(UART_SR2_RXFIFO_RDR)));
-    return *UART_REG(URXD);
-}
-#endif /* CONFIG_DEBUG_BUILD */
diff --git a/src/plat/omap3/config.cmake b/src/plat/omap3/config.cmake
index d0439f223..ba19afad3 100644
--- a/src/plat/omap3/config.cmake
+++ b/src/plat/omap3/config.cmake
@@ -25,6 +25,5 @@ add_sources(
     DEP "KernelPlatformOMAP3"
     CFILES
         src/plat/omap3/machine/hardware.c
-        src/plat/omap3/machine/io.c
         src/plat/omap3/machine/l2cache.c
 )
diff --git a/src/plat/omap3/machine/io.c b/src/plat/omap3/machine/io.c
deleted file mode 100644
index 11760221b..000000000
--- a/src/plat/omap3/machine/io.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2014, General Dynamics C4 Systems
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(GD_GPL)
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define UTHR 0x00 /* UART Transmit Holding Register */
-#define ULSR 0x14 /* UART Line Status Register */
-#define ULSR_THRE 0x20 /* Transmit Holding Register Empty */
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
-void
-putDebugChar(unsigned char c)
-{
-    while ((*UART_REG(ULSR) & ULSR_THRE) == 0);
-
-    *UART_REG(UTHR) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    return 0;
-}
-#endif
diff --git a/src/plat/tk1/config.cmake b/src/plat/tk1/config.cmake
index 0b4616aef..b24d67abb 100644
--- a/src/plat/tk1/config.cmake
+++ b/src/plat/tk1/config.cmake
@@ -25,7 +25,6 @@ endif()
 add_sources(
     DEP "KernelPlatformTK1"
     CFILES
-        src/plat/tk1/machine/io.c
         src/plat/tk1/machine/smmu.c
         src/arch/arm/machine/generic_timer.c
         src/arch/arm/machine/gic_pl390.c
diff --git a/src/plat/tx1/config.cmake b/src/plat/tx1/config.cmake
index 578cdf2d6..574525647 100644
--- a/src/plat/tx1/config.cmake
+++ b/src/plat/tx1/config.cmake
@@ -26,7 +26,6 @@ endif()
 add_sources(
     DEP "KernelPlatformTx1"
     CFILES
-        src/plat/tx1/machine/io.c
         src/arch/arm/machine/generic_timer.c
         src/arch/arm/machine/gic_pl390.c
         src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/tx1/machine/io.c b/src/plat/tx1/machine/io.c
deleted file mode 100644
index 9190bf161..000000000
--- a/src/plat/tx1/machine/io.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2017, Data61
- * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
- * ABN 41 687 119 230.
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(DATA61_GPL)
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define UTHR        0x0
-#define ULSR        0x14
-#define ULSR_THRE   (1 << 5)
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
-void
-putDebugChar(unsigned char c)
-{
-    while ((*UART_REG(ULSR) & ULSR_THRE) == 0);
-
-    *UART_REG(UTHR) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    return 0;
-}
-#endif
-
diff --git a/src/plat/tx2/config.cmake b/src/plat/tx2/config.cmake
index db68fabb2..8b6307dee 100644
--- a/src/plat/tx2/config.cmake
+++ b/src/plat/tx2/config.cmake
@@ -29,7 +29,6 @@ endif()
 add_sources(
     DEP "KernelPlatformTx2"
     CFILES
-        src/plat/tx2/machine/io.c
         src/arch/arm/machine/generic_timer.c
         src/arch/arm/machine/gic_pl390.c
         src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/tx2/machine/io.c b/src/plat/tx2/machine/io.c
deleted file mode 100644
index 6d03e77e1..000000000
--- a/src/plat/tx2/machine/io.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright 2018, Data61
- * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
- * ABN 41 687 119 230.
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(DATA61_GPL)
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define UTHR        0x0
-#define ULSR        0x14
-#define ULSR_THRE   BIT(5)
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
-void
-putDebugChar(unsigned char c)
-{
-    while ((*UART_REG(ULSR) & ULSR_THRE) == 0);
-
-    *UART_REG(UTHR) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    return 0;
-}
-#endif
-
diff --git a/src/plat/zynq7000/config.cmake b/src/plat/zynq7000/config.cmake
index b77f92a2d..d3e34f53a 100644
--- a/src/plat/zynq7000/config.cmake
+++ b/src/plat/zynq7000/config.cmake
@@ -23,7 +23,6 @@ endif()
 add_sources(
     DEP "KernelPlatformZynq7000"
     CFILES
-        src/plat/zynq7000/machine/io.c
         src/arch/arm/machine/l2c_310.c
         src/arch/arm/machine/priv_timer.c
         src/arch/arm/machine/gic_pl390.c
diff --git a/src/plat/zynqmp/config.cmake b/src/plat/zynqmp/config.cmake
index d86b77071..f6c916b53 100644
--- a/src/plat/zynqmp/config.cmake
+++ b/src/plat/zynqmp/config.cmake
@@ -37,7 +37,6 @@ add_sources(
     DEP "KernelPlatformZynqmp"
     CFILES
         src/plat/zynqmp/machine/hardware.c
-        src/plat/zynqmp/machine/io.c
         src/arch/arm/machine/generic_timer.c
         src/arch/arm/machine/gic_pl390.c
         src/arch/arm/machine/l2c_nop.c
diff --git a/src/plat/zynqmp/machine/io.c b/src/plat/zynqmp/machine/io.c
deleted file mode 100644
index ee8c39698..000000000
--- a/src/plat/zynqmp/machine/io.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2017, DornerWorks
- * Copyright 2014, General Dynamics C4 Systems
- *
- * This software may be distributed and modified according to the terms of
- * the GNU General Public License version 2. Note that NO WARRANTY is provided.
- * See "LICENSE_GPLv2.txt" for details.
- *
- * @TAG(GD_DORNERWORKS_GPL)
- */
-/*
- * This data was produced by DornerWorks, Ltd. of Grand Rapids, MI, USA under
- * a DARPA SBIR, Contract Number D16PC00107.
- *
- * Approved for Public Release, Distribution Unlimited.
- */
-
-#include <config.h>
-#include <stdint.h>
-#include <util.h>
-#include <machine/io.h>
-#include <plat/machine/devices_gen.h>
-
-#define XUARTPS_SR             0x2C
-#define XUARTPS_FIFO           0x30
-
-#define XUARTPS_SR_TXEMPTY     BIT(3)
-
-#define UART_REG(x) ((volatile uint32_t *)(UART_PPTR + (x)))
-
-#if defined(CONFIG_DEBUG_BUILD) || defined(CONFIG_PRINTING)
-void
-putDebugChar(unsigned char c)
-{
-    while (!(*UART_REG(XUARTPS_SR) & XUARTPS_SR_TXEMPTY));
-    *UART_REG(XUARTPS_FIFO) = c;
-}
-#endif
-
-#ifdef CONFIG_DEBUG_BUILD
-unsigned char
-getDebugChar(void)
-{
-    while (!(*UART_REG(XUARTPS_SR) & BIT(XUARTPS_SR_TXEMPTY)));
-    return *UART_REG(XUARTPS_FIFO);
-}
-#endif /* CONFIG_DEBUG_BUILD */
diff --git a/tools/hardware.yml b/tools/hardware.yml
index 5788a1023..2a5786d6f 100644
--- a/tools/hardware.yml
+++ b/tools/hardware.yml
@@ -224,7 +224,6 @@ devices:
     - qcom,msm-uartdm
     - samsung,exynos4210-uart
     - snps,dw-apb-uart
-    - ti,am3352-uart
     - ti,omap3-uart
     - xlnx,xuartps
     chosen: stdout-path
diff --git a/tools/hardware_gen.py b/tools/hardware_gen.py
index 328df00db..943be7aa6 100755
--- a/tools/hardware_gen.py
+++ b/tools/hardware_gen.py
@@ -445,6 +445,8 @@ class Config:
         self.blob = blob
         self.chosen = None
         self.aliases = None
+        self.matched_devices = set()
+
         # wrangle the json a little so it's easier
         # to figure out which rules apply to a given device
         for dev in blob['devices']:
@@ -526,6 +528,7 @@ class Config:
                         if reg.user_macro or ('user' in reg_rule and reg_rule['user'] == True):
                             user.add(reg)
                         regs.append(reg)
+                        self.matched_devices.add(compatible)
 
                 kernel.update(set(regs))
 
@@ -586,6 +589,9 @@ class Config:
                 break
         return ret
 
+    def get_matched_devices(self):
+        return sorted(self.matched_devices)
+
 def is_compatible(node, compatibles):
     """ returns True if node matches a compatible in the given list """
     try:
@@ -819,6 +825,11 @@ static const p_region_t BOOT_RODATA dev_p_regs[] = {
 #endif /* __PLAT_DEVICES_GEN_H */
 """
 
+def add_build_rules(devices):
+    devices[-1] = devices[-1] + ";"
+    #print result to cmake variable
+    print(';'.join(devices))
+
 def output_regions(args, devices, memory, kernel, irqs, fp):
     """ generate the device list for the C header file """
     memory = sorted(memory, key=lambda a: a.start)
@@ -920,6 +931,9 @@ def main(args):
     user = fixup_device_regions(user, 1 << args.page_bits, merge=True)
     kernel = fixup_device_regions(kernel, 1 << args.page_bits)
     output_regions(args, user, memory, kernel, kernel_irqs, args.output)
+  
+    #generate cmake
+    add_build_rules(cfg.get_matched_devices())
 
 if __name__ == '__main__':
     parser = argparse.ArgumentParser()
@@ -929,6 +943,5 @@ if __name__ == '__main__':
     parser.add_argument('--phys-align', help='alignment in bits of the base address of the kernel', default=24, type=int)
     parser.add_argument('--config', help='kernel device configuration', required=True, type=argparse.FileType())
     parser.add_argument('--schema', help='config file schema for validation', required=True, type=argparse.FileType())
-
     args = parser.parse_args()
-    main(args)
+    main(args)
\ No newline at end of file
-- 
GitLab