summaryrefslogtreecommitdiffstats
path: root/configs/platform-v7a/patches/barebox-2019.01.0/0005-serial_ns16550-add-raspberry-pi-compatible-and-init.patch
diff options
context:
space:
mode:
Diffstat (limited to 'configs/platform-v7a/patches/barebox-2019.01.0/0005-serial_ns16550-add-raspberry-pi-compatible-and-init.patch')
-rw-r--r--configs/platform-v7a/patches/barebox-2019.01.0/0005-serial_ns16550-add-raspberry-pi-compatible-and-init.patch65
1 files changed, 65 insertions, 0 deletions
diff --git a/configs/platform-v7a/patches/barebox-2019.01.0/0005-serial_ns16550-add-raspberry-pi-compatible-and-init.patch b/configs/platform-v7a/patches/barebox-2019.01.0/0005-serial_ns16550-add-raspberry-pi-compatible-and-init.patch
new file mode 100644
index 0000000..37a4df8
--- /dev/null
+++ b/configs/platform-v7a/patches/barebox-2019.01.0/0005-serial_ns16550-add-raspberry-pi-compatible-and-init.patch
@@ -0,0 +1,65 @@
+From: Rouven Czerwinski <r.czerwinski@pengutronix.de>
+Date: Tue, 11 Dec 2018 10:50:44 +0100
+Subject: [PATCH] serial_ns16550: add raspberry pi compatible and init
+
+Add the compatible for the Raspberry Pi AUX UART and an init function which
+enables it via the aux register and configures the correct shift value.
+
+Signed-off-by: Rouven Czerwinski <r.czerwinski@pengutronix.de>
+---
+ drivers/serial/serial_ns16550.c | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c
+index 8ddcfdbefc1d..ccd082e495c3 100644
+--- a/drivers/serial/serial_ns16550.c
++++ b/drivers/serial/serial_ns16550.c
+@@ -253,6 +253,23 @@ static void ns16550_jz_init_port(struct console_device *cdev)
+ ns16550_serial_init_port(cdev);
+ }
+
++#define BCM2836_AUX_CLOCK_ENB 0x3f215004 /* BCM2835 AUX Clock enable register */
++#define BCM2836_AUX_CLOCK_EN_UART BIT(0) /* Bit 0 enables the Miniuart */
++
++static void rpi_init_port(struct console_device *cdev)
++{
++ struct ns16550_priv *priv = to_ns16550_priv(cdev);
++
++ writeb(BCM2836_AUX_CLOCK_EN_UART, BCM2836_AUX_CLOCK_ENB);
++ priv->plat.shift = 2;
++ /*
++ * We double the clock rate since the 16550 will divide by 16
++ * (instead of 8 required by the BCM2835 peripheral manual)
++ */
++ priv->plat.clock = priv->plat.clock*2;
++ ns16550_serial_init_port(cdev);
++}
++
+ /*********** Exposed Functions **********************************/
+
+ /**
+@@ -353,6 +370,11 @@ static __maybe_unused struct ns16550_drvdata tegra_drvdata = {
+ .linux_console_name = "ttyS",
+ };
+
++static __maybe_unused struct ns16550_drvdata rpi_drvdata = {
++ .init_port = rpi_init_port,
++ .linux_console_name = "ttyS",
++};
++
+ static int ns16550_init_iomem(struct device_d *dev, struct ns16550_priv *priv)
+ {
+ struct resource *iores;
+@@ -527,6 +549,12 @@ static struct of_device_id ns16550_serial_dt_ids[] = {
+ .compatible = "ingenic,jz4740-uart",
+ .data = &jz_drvdata,
+ },
++#endif
++#if IS_ENABLED(CONFIG_MACH_RPI_COMMON)
++ {
++ .compatible = "brcm,bcm2835-aux-uart",
++ .data = &rpi_drvdata,
++ },
+ #endif
+ {
+ /* sentinel */