summaryrefslogtreecommitdiffstats
path: root/drivers/serial
diff options
context:
space:
mode:
authorRouven Czerwinski <r.czerwinski@pengutronix.de>2019-01-15 06:44:05 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2019-02-05 12:39:09 +0100
commit77de547cd179b910cdcb8530df15d77a0fc66a3c (patch)
tree4657d844dc48c71625d50e6eb368610947f24104 /drivers/serial
parentde698980f33e6f4f457e38a0b77494de4752feae (diff)
downloadbarebox-77de547cd179b910cdcb8530df15d77a0fc66a3c.tar.gz
barebox-77de547cd179b910cdcb8530df15d77a0fc66a3c.tar.xz
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> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/serial')
-rw-r--r--drivers/serial/serial_ns16550.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c
index 8ddcfdbefc..ccd082e495 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;
@@ -528,6 +550,12 @@ static struct of_device_id ns16550_serial_dt_ids[] = {
.data = &jz_drvdata,
},
#endif
+#if IS_ENABLED(CONFIG_MACH_RPI_COMMON)
+ {
+ .compatible = "brcm,bcm2835-aux-uart",
+ .data = &rpi_drvdata,
+ },
+#endif
{
/* sentinel */
},