diff mbox series

[U-Boot] serial: omap: Introduce DM specific omap serial

Message ID 20180810130620.17534-1-lokeshvutla@ti.com
State Superseded
Delegated to: Tom Rini
Headers show
Series [U-Boot] serial: omap: Introduce DM specific omap serial | expand

Commit Message

Lokesh Vutla Aug. 10, 2018, 1:06 p.m. UTC
Add driver model support for OMAP_SERIAL while reusing
the functions in ns16550.c

Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
---

Based on the conclusion on the thread[1], added a separate driver for
omap uart.

[1] https://patchwork.ozlabs.org/patch/944756/

 drivers/serial/Kconfig       |   9 +++
 drivers/serial/Makefile      |   1 +
 drivers/serial/ns16550.c     |  42 ------------
 drivers/serial/serial_omap.c | 121 +++++++++++++++++++++++++++++++++++
 4 files changed, 131 insertions(+), 42 deletions(-)
 create mode 100644 drivers/serial/serial_omap.c

Comments

Tom Rini Aug. 10, 2018, 1:14 p.m. UTC | #1
On Fri, Aug 10, 2018 at 06:36:20PM +0530, Lokesh Vutla wrote:

> Add driver model support for OMAP_SERIAL while reusing
> the functions in ns16550.c
> 
> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
> ---
> 
> Based on the conclusion on the thread[1], added a separate driver for
> omap uart.
> 
> [1] https://patchwork.ozlabs.org/patch/944756/
> 
>  drivers/serial/Kconfig       |   9 +++
>  drivers/serial/Makefile      |   1 +
>  drivers/serial/ns16550.c     |  42 ------------
>  drivers/serial/serial_omap.c | 121 +++++++++++++++++++++++++++++++++++
>  4 files changed, 131 insertions(+), 42 deletions(-)
>  create mode 100644 drivers/serial/serial_omap.c

For the record, I don't like this, but I'm not naking it, and I guess
this is what we'll need moving forward.  FWIW, the alternative (patching
the dtsi files in the kernel) looks like:

diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi
index 9cd62bc2ca35..dab6bc9607bb 100644
--- a/arch/arm/boot/dts/am33xx.dtsi
+++ b/arch/arm/boot/dts/am33xx.dtsi
@@ -346,6 +346,7 @@
 			ti,hwmods = "uart1";
 			clock-frequency = <48000000>;
 			reg = <0x44e09000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <72>;
 			status = "disabled";
 			dmas = <&edma 26 0>, <&edma 27 0>;
@@ -357,6 +358,7 @@
 			ti,hwmods = "uart2";
 			clock-frequency = <48000000>;
 			reg = <0x48022000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <73>;
 			status = "disabled";
 			dmas = <&edma 28 0>, <&edma 29 0>;
@@ -368,6 +370,7 @@
 			ti,hwmods = "uart3";
 			clock-frequency = <48000000>;
 			reg = <0x48024000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <74>;
 			status = "disabled";
 			dmas = <&edma 30 0>, <&edma 31 0>;
@@ -379,6 +382,7 @@
 			ti,hwmods = "uart4";
 			clock-frequency = <48000000>;
 			reg = <0x481a6000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <44>;
 			status = "disabled";
 		};
@@ -388,6 +392,7 @@
 			ti,hwmods = "uart5";
 			clock-frequency = <48000000>;
 			reg = <0x481a8000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <45>;
 			status = "disabled";
 		};
@@ -397,6 +402,7 @@
 			ti,hwmods = "uart6";
 			clock-frequency = <48000000>;
 			reg = <0x481aa000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <46>;
 			status = "disabled";
 		};
diff --git a/arch/arm/boot/dts/am3517.dtsi b/arch/arm/boot/dts/am3517.dtsi
index ca294914bbb1..1eceeba076d8 100644
--- a/arch/arm/boot/dts/am3517.dtsi
+++ b/arch/arm/boot/dts/am3517.dtsi
@@ -56,6 +56,7 @@
 			ti,hwmods = "uart4";
 			status = "disabled";
 			reg = <0x4809e000 0x400>;
+			reg-shift = <2>;
 			interrupts = <84>;
 			dmas = <&sdma 55 &sdma 54>;
 			dma-names = "tx", "rx";
diff --git a/arch/arm/boot/dts/am4372.dtsi b/arch/arm/boot/dts/am4372.dtsi
index f0cbd86312dc..0f0f203a0fdd 100644
--- a/arch/arm/boot/dts/am4372.dtsi
+++ b/arch/arm/boot/dts/am4372.dtsi
@@ -300,6 +300,7 @@
 		uart0: serial@44e09000 {
 			compatible = "ti,am4372-uart","ti,omap2-uart";
 			reg = <0x44e09000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart1";
 		};
@@ -307,6 +308,7 @@
 		uart1: serial@48022000 {
 			compatible = "ti,am4372-uart","ti,omap2-uart";
 			reg = <0x48022000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart2";
 			status = "disabled";
@@ -315,6 +317,7 @@
 		uart2: serial@48024000 {
 			compatible = "ti,am4372-uart","ti,omap2-uart";
 			reg = <0x48024000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart3";
 			status = "disabled";
@@ -323,6 +326,7 @@
 		uart3: serial@481a6000 {
 			compatible = "ti,am4372-uart","ti,omap2-uart";
 			reg = <0x481a6000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart4";
 			status = "disabled";
@@ -331,6 +335,7 @@
 		uart4: serial@481a8000 {
 			compatible = "ti,am4372-uart","ti,omap2-uart";
 			reg = <0x481a8000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart5";
 			status = "disabled";
@@ -339,6 +344,7 @@
 		uart5: serial@481aa000 {
 			compatible = "ti,am4372-uart","ti,omap2-uart";
 			reg = <0x481aa000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart6";
 			status = "disabled";
diff --git a/arch/arm/boot/dts/dm814x.dtsi b/arch/arm/boot/dts/dm814x.dtsi
index 601c57afd4fe..6014e3ff2005 100644
--- a/arch/arm/boot/dts/dm814x.dtsi
+++ b/arch/arm/boot/dts/dm814x.dtsi
@@ -258,6 +258,7 @@
 				compatible = "ti,am3352-uart", "ti,omap3-uart";
 				ti,hwmods = "uart1";
 				reg = <0x20000 0x2000>;
+				reg-shift = <2>;
 				clock-frequency = <48000000>;
 				interrupts = <72>;
 				dmas = <&edma 26 0 &edma 27 0>;
@@ -268,6 +269,7 @@
 				compatible = "ti,am3352-uart", "ti,omap3-uart";
 				ti,hwmods = "uart2";
 				reg = <0x22000 0x2000>;
+				reg-shift = <2>;
 				clock-frequency = <48000000>;
 				interrupts = <73>;
 				dmas = <&edma 28 0 &edma 29 0>;
@@ -278,6 +280,7 @@
 				compatible = "ti,am3352-uart", "ti,omap3-uart";
 				ti,hwmods = "uart3";
 				reg = <0x24000 0x2000>;
+				reg-shift = <2>;
 				clock-frequency = <48000000>;
 				interrupts = <74>;
 				dmas = <&edma 30 0 &edma 31 0>;
diff --git a/arch/arm/boot/dts/dm816x.dtsi b/arch/arm/boot/dts/dm816x.dtsi
index 1edc2b48b254..fc363420b6f2 100644
--- a/arch/arm/boot/dts/dm816x.dtsi
+++ b/arch/arm/boot/dts/dm816x.dtsi
@@ -390,6 +390,7 @@
 			compatible = "ti,am3352-uart", "ti,omap3-uart";
 			ti,hwmods = "uart1";
 			reg = <0x48020000 0x2000>;
+			reg-shift = <2>;
 			clock-frequency = <48000000>;
 			interrupts = <72>;
 			dmas = <&edma 26 &edma 27>;
@@ -400,6 +401,7 @@
 			compatible = "ti,am3352-uart", "ti,omap3-uart";
 			ti,hwmods = "uart2";
 			reg = <0x48022000 0x2000>;
+			reg-shift = <2>;
 			clock-frequency = <48000000>;
 			interrupts = <73>;
 			dmas = <&edma 28 &edma 29>;
@@ -410,6 +412,7 @@
 			compatible = "ti,am3352-uart", "ti,omap3-uart";
 			ti,hwmods = "uart3";
 			reg = <0x48024000 0x2000>;
+			reg-shift = <2>;
 			clock-frequency = <48000000>;
 			interrupts = <74>;
 			dmas = <&edma 30 &edma 31>;
diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
index f4ddd86f2c77..ca6e49e8024d 100644
--- a/arch/arm/boot/dts/dra7.dtsi
+++ b/arch/arm/boot/dts/dra7.dtsi
@@ -610,6 +610,7 @@
 		uart1: serial@4806a000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x4806a000 0x100>;
+			reg-shift = <2>;
 			interrupts-extended = <&crossbar_mpu GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart1";
 			clock-frequency = <48000000>;
@@ -621,6 +622,7 @@
 		uart2: serial@4806c000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x4806c000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart2";
 			clock-frequency = <48000000>;
@@ -632,6 +634,7 @@
 		uart3: serial@48020000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x48020000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart3";
 			clock-frequency = <48000000>;
@@ -643,6 +646,7 @@
 		uart4: serial@4806e000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x4806e000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart4";
 			clock-frequency = <48000000>;
@@ -654,6 +658,7 @@
 		uart5: serial@48066000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x48066000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart5";
 			clock-frequency = <48000000>;
@@ -665,6 +670,7 @@
 		uart6: serial@48068000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x48068000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 101 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart6";
 			clock-frequency = <48000000>;
@@ -676,6 +682,7 @@
 		uart7: serial@48420000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x48420000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 218 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart7";
 			clock-frequency = <48000000>;
@@ -685,6 +692,7 @@
 		uart8: serial@48422000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x48422000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 219 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart8";
 			clock-frequency = <48000000>;
@@ -694,6 +702,7 @@
 		uart9: serial@48424000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x48424000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 220 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart9";
 			clock-frequency = <48000000>;
@@ -703,6 +712,7 @@
 		uart10: serial@4ae2b000 {
 			compatible = "ti,dra742-uart", "ti,omap4-uart";
 			reg = <0x4ae2b000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 221 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart10";
 			clock-frequency = <48000000>;
diff --git a/arch/arm/boot/dts/omap2.dtsi b/arch/arm/boot/dts/omap2.dtsi
index f1d6de8b3c19..789a07384cce 100644
--- a/arch/arm/boot/dts/omap2.dtsi
+++ b/arch/arm/boot/dts/omap2.dtsi
@@ -154,6 +154,7 @@
 			compatible = "ti,omap2-uart";
 			ti,hwmods = "uart1";
 			reg = <0x4806a000 0x2000>;
+			reg-shift = <2>;
 			interrupts = <72>;
 			dmas = <&sdma 49 &sdma 50>;
 			dma-names = "tx", "rx";
@@ -164,6 +165,7 @@
 			compatible = "ti,omap2-uart";
 			ti,hwmods = "uart2";
 			reg = <0x4806c000 0x400>;
+			reg-shift = <2>;
 			interrupts = <73>;
 			dmas = <&sdma 51 &sdma 52>;
 			dma-names = "tx", "rx";
@@ -174,6 +176,7 @@
 			compatible = "ti,omap2-uart";
 			ti,hwmods = "uart3";
 			reg = <0x4806e000 0x400>;
+			reg-shift = <2>;
 			interrupts = <74>;
 			dmas = <&sdma 53 &sdma 54>;
 			dma-names = "tx", "rx";
diff --git a/arch/arm/boot/dts/omap3.dtsi b/arch/arm/boot/dts/omap3.dtsi
index 4043ecb38016..f283fdf0af27 100644
--- a/arch/arm/boot/dts/omap3.dtsi
+++ b/arch/arm/boot/dts/omap3.dtsi
@@ -288,6 +288,7 @@
 		uart1: serial@4806a000 {
 			compatible = "ti,omap3-uart";
 			reg = <0x4806a000 0x2000>;
+			reg-shift = <2>;
 			interrupts-extended = <&intc 72>;
 			dmas = <&sdma 49 &sdma 50>;
 			dma-names = "tx", "rx";
@@ -298,6 +299,7 @@
 		uart2: serial@4806c000 {
 			compatible = "ti,omap3-uart";
 			reg = <0x4806c000 0x400>;
+			reg-shift = <2>;
 			interrupts-extended = <&intc 73>;
 			dmas = <&sdma 51 &sdma 52>;
 			dma-names = "tx", "rx";
@@ -308,6 +310,7 @@
 		uart3: serial@49020000 {
 			compatible = "ti,omap3-uart";
 			reg = <0x49020000 0x400>;
+			reg-shift = <2>;
 			interrupts-extended = <&intc 74>;
 			dmas = <&sdma 53 &sdma 54>;
 			dma-names = "tx", "rx";
diff --git a/arch/arm/boot/dts/omap36xx.dtsi b/arch/arm/boot/dts/omap36xx.dtsi
index 6fb23ada1f64..5fdec069ecd3 100644
--- a/arch/arm/boot/dts/omap36xx.dtsi
+++ b/arch/arm/boot/dts/omap36xx.dtsi
@@ -35,6 +35,7 @@
 		uart4: serial@49042000 {
 			compatible = "ti,omap3-uart";
 			reg = <0x49042000 0x400>;
+			reg-shift = <2>;
 			interrupts = <80>;
 			dmas = <&sdma 81 &sdma 82>;
 			dma-names = "tx", "rx";
diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi
index e554b6e039f3..4119347fe664 100644
--- a/arch/arm/boot/dts/omap4.dtsi
+++ b/arch/arm/boot/dts/omap4.dtsi
@@ -445,6 +445,7 @@
 		uart1: serial@4806a000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x4806a000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart1";
 			clock-frequency = <48000000>;
@@ -453,6 +454,7 @@
 		uart2: serial@4806c000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x4806c000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart2";
 			clock-frequency = <48000000>;
@@ -461,6 +463,7 @@
 		uart3: serial@48020000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x48020000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart3";
 			clock-frequency = <48000000>;
@@ -469,6 +472,7 @@
 		uart4: serial@4806e000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x4806e000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart4";
 			clock-frequency = <48000000>;
diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi
index 732b61a0e990..b40bbe36939b 100644
--- a/arch/arm/boot/dts/omap5.dtsi
+++ b/arch/arm/boot/dts/omap5.dtsi
@@ -551,6 +551,7 @@
 		uart1: serial@4806a000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x4806a000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart1";
 			clock-frequency = <48000000>;
@@ -559,6 +560,7 @@
 		uart2: serial@4806c000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x4806c000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart2";
 			clock-frequency = <48000000>;
@@ -567,6 +569,7 @@
 		uart3: serial@48020000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x48020000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart3";
 			clock-frequency = <48000000>;
@@ -575,6 +578,7 @@
 		uart4: serial@4806e000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x4806e000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart4";
 			clock-frequency = <48000000>;
@@ -583,6 +587,7 @@
 		uart5: serial@48066000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x48066000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart5";
 			clock-frequency = <48000000>;
@@ -591,6 +596,7 @@
 		uart6: serial@48068000 {
 			compatible = "ti,omap4-uart";
 			reg = <0x48068000 0x100>;
+			reg-shift = <2>;
 			interrupts = <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>;
 			ti,hwmods = "uart6";
 			clock-frequency = <48000000>;

with a final diffstat of:
 11 files changed, 46 insertions(+)
Adam Ford Aug. 10, 2018, 2:17 p.m. UTC | #2
On Fri, Aug 10, 2018 at 8:07 AM Lokesh Vutla <lokeshvutla@ti.com> wrote:
>
> Add driver model support for OMAP_SERIAL while reusing
> the functions in ns16550.c
>
> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
> ---
>
> Based on the conclusion on the thread[1], added a separate driver for
> omap uart.
>
> [1] https://patchwork.ozlabs.org/patch/944756/
>
>  drivers/serial/Kconfig       |   9 +++
>  drivers/serial/Makefile      |   1 +
>  drivers/serial/ns16550.c     |  42 ------------
>  drivers/serial/serial_omap.c | 121 +++++++++++++++++++++++++++++++++++
>  4 files changed, 131 insertions(+), 42 deletions(-)
>  create mode 100644 drivers/serial/serial_omap.c
>
> diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
> index 766e5ced03..0aa2338135 100644
> --- a/drivers/serial/Kconfig
> +++ b/drivers/serial/Kconfig
> @@ -625,6 +625,15 @@ config MSM_SERIAL
>           for example APQ8016 and MSM8916.
>           Single baudrate is supported in current implementation (115200).
>
> +config OMAP_SERIAL
> +       bool "Support for OMAP specific UART"
> +       depends on DM_SERIAL
> +       default y if (ARCH_OMAP2PLUS || SOC_DA8XX)
> +       select SYS_NS16550
> +       help
> +         If you have an TI based SoC and want to use the on-chip serial
> +         port, say Y to this option. If unsure say N.
> +
>  config OWL_SERIAL
>         bool "Actions Semi OWL UART"
>         depends on DM_SERIAL && ARCH_OWL
> diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
> index 9fa81d855d..03dc29ee2e 100644
> --- a/drivers/serial/Makefile
> +++ b/drivers/serial/Makefile
> @@ -65,6 +65,7 @@ obj-$(CONFIG_MVEBU_A3700_UART) += serial_mvebu_a3700.o
>  obj-$(CONFIG_MPC8XX_CONS) += serial_mpc8xx.o
>  obj-$(CONFIG_NULLDEV_SERIAL) += serial_nulldev.o
>  obj-$(CONFIG_OWL_SERIAL) += serial_owl.o
> +obj-$(CONFIG_OMAP_SERIAL) += serial_omap.o
>
>  ifndef CONFIG_SPL_BUILD
>  obj-$(CONFIG_USB_TTY) += usbtty.o
> diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
> index 9c80090aa7..1858465ec9 100644
> --- a/drivers/serial/ns16550.c
> +++ b/drivers/serial/ns16550.c
> @@ -279,42 +279,6 @@ DEBUG_UART_FUNCS
>
>  #endif
>
> -#ifdef CONFIG_DEBUG_UART_OMAP
> -
> -#include <debug_uart.h>
> -
> -static inline void _debug_uart_init(void)
> -{
> -       struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
> -       int baud_divisor;
> -
> -       baud_divisor = ns16550_calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK,
> -                                           CONFIG_BAUDRATE);
> -       serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER);
> -       serial_dout(&com_port->mdr1, 0x7);
> -       serial_dout(&com_port->mcr, UART_MCRVAL);
> -       serial_dout(&com_port->fcr, UART_FCR_DEFVAL);
> -
> -       serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
> -       serial_dout(&com_port->dll, baud_divisor & 0xff);
> -       serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff);
> -       serial_dout(&com_port->lcr, UART_LCRVAL);
> -       serial_dout(&com_port->mdr1, 0x0);
> -}
> -
> -static inline void _debug_uart_putc(int ch)
> -{
> -       struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
> -
> -       while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
> -               ;
> -       serial_dout(&com_port->thr, ch);
> -}
> -
> -DEBUG_UART_FUNCS
> -
> -#endif
> -
>  #ifdef CONFIG_DM_SERIAL
>  static int ns16550_serial_putc(struct udevice *dev, const char ch)
>  {
> @@ -489,12 +453,6 @@ static const struct udevice_id ns16550_serial_ids[] = {
>         { .compatible = "ingenic,jz4780-uart",  .data = PORT_JZ4780  },
>         { .compatible = "nvidia,tegra20-uart",  .data = PORT_NS16550 },
>         { .compatible = "snps,dw-apb-uart",     .data = PORT_NS16550 },
> -       { .compatible = "ti,omap2-uart",        .data = PORT_NS16550 },
> -       { .compatible = "ti,omap3-uart",        .data = PORT_NS16550 },
> -       { .compatible = "ti,omap4-uart",        .data = PORT_NS16550 },
> -       { .compatible = "ti,am3352-uart",       .data = PORT_NS16550 },
> -       { .compatible = "ti,am4372-uart",       .data = PORT_NS16550 },
> -       { .compatible = "ti,dra742-uart",       .data = PORT_NS16550 },
>         {}
>  };

I am not trying to rock the boat, but I am wondering if it's necessary
to completely migrate the driver for OMAP.  I was thinking about the
possibility of creating a structure which includes the PORT_NS16550 as
well as reg-shift and point .data entry to that new structure.  This
way, .compatible = "ti,omapX-uart" would also bring with it the
'reg-shift' for all board using that driver compatible flag.  For the
other boards that don't need it, it can default to something else.

It limits the number of different drivers that do the same thing, and
it allows the DTS and DTSI files to remain in sync with the kernel.

Just a thought.

adam

>  #endif /* OF_CONTROL && !OF_PLATDATA */
> diff --git a/drivers/serial/serial_omap.c b/drivers/serial/serial_omap.c
> new file mode 100644
> index 0000000000..5d408deda9
> --- /dev/null
> +++ b/drivers/serial/serial_omap.c
> @@ -0,0 +1,121 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Texas Instruments' OMAP serial driver
> + *
> + * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
> + *     Lokesh Vutla <lokeshvutla@ti.com>
> + */
> +
> +#include <common.h>
> +#include <debug_uart.h>
> +#include <dm.h>
> +#include <dt-structs.h>
> +#include <ns16550.h>
> +#include <serial.h>
> +#include <clk.h>
> +
> +#ifdef CONFIG_DEBUG_UART_OMAP
> +
> +#include <debug_uart.h>
> +
> +static inline void _debug_uart_init(void)
> +{
> +       struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
> +       int baud_divisor;
> +
> +       baud_divisor = ns16550_calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK,
> +                                           CONFIG_BAUDRATE);
> +       serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER);
> +       serial_dout(&com_port->mdr1, 0x7);
> +       serial_dout(&com_port->mcr, UART_MCRVAL);
> +       serial_dout(&com_port->fcr, UART_FCR_DEFVAL);
> +
> +       serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
> +       serial_dout(&com_port->dll, baud_divisor & 0xff);
> +       serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff);
> +       serial_dout(&com_port->lcr, UART_LCRVAL);
> +       serial_dout(&com_port->mdr1, 0x0);
> +}
> +
> +static inline void _debug_uart_putc(int ch)
> +{
> +       struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
> +
> +       while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
> +               ;
> +       serial_dout(&com_port->thr, ch);
> +}
> +
> +DEBUG_UART_FUNCS
> +
> +#endif
> +
> +#if CONFIG_IS_ENABLED(DM_SERIAL)
> +
> +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
> +static int omap_serial_ofdata_to_platdata(struct udevice *dev)
> +{
> +       struct ns16550_platdata *plat = dev->platdata;
> +       fdt_addr_t addr;
> +       struct clk clk;
> +       int err;
> +
> +       /* try Processor Local Bus device first */
> +       addr = dev_read_addr(dev);
> +       if (addr == FDT_ADDR_T_NONE)
> +               return -EINVAL;
> +
> +       plat->base = (unsigned long)map_physmem(addr, 0, MAP_NOCACHE);
> +
> +       plat->reg_offset = dev_read_u32_default(dev, "reg-offset", 0);
> +       plat->reg_shift = 2;
> +
> +       err = clk_get_by_index(dev, 0, &clk);
> +       if (!err) {
> +               err = clk_get_rate(&clk);
> +               if (!IS_ERR_VALUE(err))
> +                       plat->clock = err;
> +       } else if (err != -ENOENT && err != -ENODEV && err != -ENOSYS) {
> +               debug("omap serial failed to get clock\n");
> +               return err;
> +       }
> +
> +       if (!plat->clock)
> +               plat->clock = dev_read_u32_default(dev, "clock-frequency",
> +                                                  CONFIG_SYS_NS16550_CLK);
> +       if (!plat->clock) {
> +               debug("omap serial clock not defined\n");
> +               return -EINVAL;
> +       }
> +
> +       plat->fcr = UART_FCR_DEFVAL;
> +
> +       return 0;
> +}
> +static const struct udevice_id omap_serial_ids[] = {
> +       { .compatible = "ti,omap2-uart", },
> +       { .compatible = "ti,omap3-uart", },
> +       { .compatible = "ti,omap4-uart", },
> +       { .compatible = "ti,am3352-uart", },
> +       { .compatible = "ti,am4372-uart", },
> +       { .compatible = "ti,dra742-uart", },
> +       {}
> +};
> +#endif /* OF_CONTROL && !OF_PLATDATA */
> +
> +#if CONFIG_IS_ENABLED(SERIAL_PRESENT)
> +U_BOOT_DRIVER(omap_serial) = {
> +       .name   = "omap_serial",
> +       .id     = UCLASS_SERIAL,
> +#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
> +       .of_match = omap_serial_ids,
> +       .ofdata_to_platdata = omap_serial_ofdata_to_platdata,
> +       .platdata_auto_alloc_size = sizeof(struct ns16550_platdata),
> +#endif
> +       .priv_auto_alloc_size = sizeof(struct NS16550),
> +       .probe = ns16550_serial_probe,
> +       .ops    = &ns16550_serial_ops,
> +       .flags  = DM_FLAG_PRE_RELOC,
> +};
> +#endif
> +#endif /* DM_SERIAL */
> --
> 2.18.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> https://lists.denx.de/listinfo/u-boot
diff mbox series

Patch

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 766e5ced03..0aa2338135 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -625,6 +625,15 @@  config MSM_SERIAL
 	  for example APQ8016 and MSM8916.
 	  Single baudrate is supported in current implementation (115200).
 
+config OMAP_SERIAL
+	bool "Support for OMAP specific UART"
+	depends on DM_SERIAL
+	default y if (ARCH_OMAP2PLUS || SOC_DA8XX)
+	select SYS_NS16550
+	help
+	  If you have an TI based SoC and want to use the on-chip serial
+	  port, say Y to this option. If unsure say N.
+
 config OWL_SERIAL
 	bool "Actions Semi OWL UART"
 	depends on DM_SERIAL && ARCH_OWL
diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile
index 9fa81d855d..03dc29ee2e 100644
--- a/drivers/serial/Makefile
+++ b/drivers/serial/Makefile
@@ -65,6 +65,7 @@  obj-$(CONFIG_MVEBU_A3700_UART) += serial_mvebu_a3700.o
 obj-$(CONFIG_MPC8XX_CONS) += serial_mpc8xx.o
 obj-$(CONFIG_NULLDEV_SERIAL) += serial_nulldev.o
 obj-$(CONFIG_OWL_SERIAL) += serial_owl.o
+obj-$(CONFIG_OMAP_SERIAL) += serial_omap.o
 
 ifndef CONFIG_SPL_BUILD
 obj-$(CONFIG_USB_TTY) += usbtty.o
diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c
index 9c80090aa7..1858465ec9 100644
--- a/drivers/serial/ns16550.c
+++ b/drivers/serial/ns16550.c
@@ -279,42 +279,6 @@  DEBUG_UART_FUNCS
 
 #endif
 
-#ifdef CONFIG_DEBUG_UART_OMAP
-
-#include <debug_uart.h>
-
-static inline void _debug_uart_init(void)
-{
-	struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
-	int baud_divisor;
-
-	baud_divisor = ns16550_calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK,
-					    CONFIG_BAUDRATE);
-	serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER);
-	serial_dout(&com_port->mdr1, 0x7);
-	serial_dout(&com_port->mcr, UART_MCRVAL);
-	serial_dout(&com_port->fcr, UART_FCR_DEFVAL);
-
-	serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
-	serial_dout(&com_port->dll, baud_divisor & 0xff);
-	serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff);
-	serial_dout(&com_port->lcr, UART_LCRVAL);
-	serial_dout(&com_port->mdr1, 0x0);
-}
-
-static inline void _debug_uart_putc(int ch)
-{
-	struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
-
-	while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
-		;
-	serial_dout(&com_port->thr, ch);
-}
-
-DEBUG_UART_FUNCS
-
-#endif
-
 #ifdef CONFIG_DM_SERIAL
 static int ns16550_serial_putc(struct udevice *dev, const char ch)
 {
@@ -489,12 +453,6 @@  static const struct udevice_id ns16550_serial_ids[] = {
 	{ .compatible = "ingenic,jz4780-uart",	.data = PORT_JZ4780  },
 	{ .compatible = "nvidia,tegra20-uart",	.data = PORT_NS16550 },
 	{ .compatible = "snps,dw-apb-uart",	.data = PORT_NS16550 },
-	{ .compatible = "ti,omap2-uart",	.data = PORT_NS16550 },
-	{ .compatible = "ti,omap3-uart",	.data = PORT_NS16550 },
-	{ .compatible = "ti,omap4-uart",	.data = PORT_NS16550 },
-	{ .compatible = "ti,am3352-uart",	.data = PORT_NS16550 },
-	{ .compatible = "ti,am4372-uart",	.data = PORT_NS16550 },
-	{ .compatible = "ti,dra742-uart",	.data = PORT_NS16550 },
 	{}
 };
 #endif /* OF_CONTROL && !OF_PLATDATA */
diff --git a/drivers/serial/serial_omap.c b/drivers/serial/serial_omap.c
new file mode 100644
index 0000000000..5d408deda9
--- /dev/null
+++ b/drivers/serial/serial_omap.c
@@ -0,0 +1,121 @@ 
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Texas Instruments' OMAP serial driver
+ *
+ * Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
+ *	Lokesh Vutla <lokeshvutla@ti.com>
+ */
+
+#include <common.h>
+#include <debug_uart.h>
+#include <dm.h>
+#include <dt-structs.h>
+#include <ns16550.h>
+#include <serial.h>
+#include <clk.h>
+
+#ifdef CONFIG_DEBUG_UART_OMAP
+
+#include <debug_uart.h>
+
+static inline void _debug_uart_init(void)
+{
+	struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
+	int baud_divisor;
+
+	baud_divisor = ns16550_calc_divisor(com_port, CONFIG_DEBUG_UART_CLOCK,
+					    CONFIG_BAUDRATE);
+	serial_dout(&com_port->ier, CONFIG_SYS_NS16550_IER);
+	serial_dout(&com_port->mdr1, 0x7);
+	serial_dout(&com_port->mcr, UART_MCRVAL);
+	serial_dout(&com_port->fcr, UART_FCR_DEFVAL);
+
+	serial_dout(&com_port->lcr, UART_LCR_BKSE | UART_LCRVAL);
+	serial_dout(&com_port->dll, baud_divisor & 0xff);
+	serial_dout(&com_port->dlm, (baud_divisor >> 8) & 0xff);
+	serial_dout(&com_port->lcr, UART_LCRVAL);
+	serial_dout(&com_port->mdr1, 0x0);
+}
+
+static inline void _debug_uart_putc(int ch)
+{
+	struct NS16550 *com_port = (struct NS16550 *)CONFIG_DEBUG_UART_BASE;
+
+	while (!(serial_din(&com_port->lsr) & UART_LSR_THRE))
+		;
+	serial_dout(&com_port->thr, ch);
+}
+
+DEBUG_UART_FUNCS
+
+#endif
+
+#if CONFIG_IS_ENABLED(DM_SERIAL)
+
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+static int omap_serial_ofdata_to_platdata(struct udevice *dev)
+{
+	struct ns16550_platdata *plat = dev->platdata;
+	fdt_addr_t addr;
+	struct clk clk;
+	int err;
+
+	/* try Processor Local Bus device first */
+	addr = dev_read_addr(dev);
+	if (addr == FDT_ADDR_T_NONE)
+		return -EINVAL;
+
+	plat->base = (unsigned long)map_physmem(addr, 0, MAP_NOCACHE);
+
+	plat->reg_offset = dev_read_u32_default(dev, "reg-offset", 0);
+	plat->reg_shift = 2;
+
+	err = clk_get_by_index(dev, 0, &clk);
+	if (!err) {
+		err = clk_get_rate(&clk);
+		if (!IS_ERR_VALUE(err))
+			plat->clock = err;
+	} else if (err != -ENOENT && err != -ENODEV && err != -ENOSYS) {
+		debug("omap serial failed to get clock\n");
+		return err;
+	}
+
+	if (!plat->clock)
+		plat->clock = dev_read_u32_default(dev, "clock-frequency",
+						   CONFIG_SYS_NS16550_CLK);
+	if (!plat->clock) {
+		debug("omap serial clock not defined\n");
+		return -EINVAL;
+	}
+
+	plat->fcr = UART_FCR_DEFVAL;
+
+	return 0;
+}
+static const struct udevice_id omap_serial_ids[] = {
+	{ .compatible = "ti,omap2-uart", },
+	{ .compatible = "ti,omap3-uart", },
+	{ .compatible = "ti,omap4-uart", },
+	{ .compatible = "ti,am3352-uart", },
+	{ .compatible = "ti,am4372-uart", },
+	{ .compatible = "ti,dra742-uart", },
+	{}
+};
+#endif /* OF_CONTROL && !OF_PLATDATA */
+
+#if CONFIG_IS_ENABLED(SERIAL_PRESENT)
+U_BOOT_DRIVER(omap_serial) = {
+	.name	= "omap_serial",
+	.id	= UCLASS_SERIAL,
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !CONFIG_IS_ENABLED(OF_PLATDATA)
+	.of_match = omap_serial_ids,
+	.ofdata_to_platdata = omap_serial_ofdata_to_platdata,
+	.platdata_auto_alloc_size = sizeof(struct ns16550_platdata),
+#endif
+	.priv_auto_alloc_size = sizeof(struct NS16550),
+	.probe = ns16550_serial_probe,
+	.ops	= &ns16550_serial_ops,
+	.flags	= DM_FLAG_PRE_RELOC,
+};
+#endif
+#endif /* DM_SERIAL */