diff options
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.patch | 65 |
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 */ |