From: Peter Maydell <peter.maydell@linaro.org>
To: linux-serial@vger.kernel.org
Cc: linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>,
Thomas Gleixner <tglx@kernel.org>, Arnd Bergmann <arnd@arndb.de>,
Russell King <linux@armlinux.org.uk>,
Miaoqian Lin <linmq006@gmail.com>
Subject: [PATCH] serial: amba-pl011: Enable UART in earlycon setup
Date: Tue, 10 Feb 2026 12:50:59 +0000 [thread overview]
Message-ID: <20260210125100.223138-1-peter.maydell@linaro.org> (raw)
Currently the PL011 driver only enables the UART (by setting UARTEN
in REG_CR) in pl011_startup(), so if it is used for earlycon it is
relying on the bootrom/firmware having left the UART enabled.
There's no particular reason not to actively enable the UART before
using it for earlycon, and the earlycon handling for e.g. the 8250
UART sets up the UART in its setup function, so follow that in the
PL011.
This allows use of earlycon with a UART that the firmware hasn't
already been using for its own output, but the main motivation is
that QEMU will otherwise log a message complaining that the guest is
trying to write to a UART it never enabled.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
NB: I have tested this under QEMU, but I do not have any real
PL011-using hardware to hand to test with.
---
drivers/tty/serial/amba-pl011.c | 35 ++++++++++++++++++++++++++++++---
1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
index 7f17d288c807..462a8c380059 100644
--- a/drivers/tty/serial/amba-pl011.c
+++ b/drivers/tty/serial/amba-pl011.c
@@ -2700,6 +2700,37 @@ static int pl011_early_read(struct console *con, char *s, unsigned int n)
*/
static int __init pl011_early_console_setup(struct earlycon_device *device,
const char *opt)
+{
+ unsigned int cr;
+
+ if (!device->port.membase)
+ return -ENODEV;
+
+ device->con->write = pl011_early_write;
+ device->con->read = pl011_early_read;
+
+ if (device->port.iotype == UPIO_MEM32)
+ cr = readl(device->port.membase + UART011_CR);
+ else
+ cr = readw(device->port.membase + UART011_CR);
+ cr &= UART011_CR_RTS | UART011_CR_DTR;
+ cr |= UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE;
+ if (device->port.iotype == UPIO_MEM32)
+ writel(cr, device->port.membase + UART011_CR);
+ else
+ writew(cr, device->port.membase + UART011_CR);
+
+ return 0;
+}
+
+OF_EARLYCON_DECLARE(pl011, "arm,pl011", pl011_early_console_setup);
+
+/*
+ * The SBSA UART has no defined control register and is assumed to
+ * be pre-enabled by firmware, so we do not write to UART011_CR.
+ */
+static int __init sbsa_uart_early_console_setup(struct earlycon_device *device,
+ const char *opt)
{
if (!device->port.membase)
return -ENODEV;
@@ -2710,9 +2741,7 @@ static int __init pl011_early_console_setup(struct earlycon_device *device,
return 0;
}
-OF_EARLYCON_DECLARE(pl011, "arm,pl011", pl011_early_console_setup);
-
-OF_EARLYCON_DECLARE(pl011, "arm,sbsa-uart", pl011_early_console_setup);
+OF_EARLYCON_DECLARE(pl011, "arm,sbsa-uart", sbsa_uart_early_console_setup);
/*
* On Qualcomm Datacenter Technologies QDF2400 SOCs affected by
--
2.43.0
next reply other threads:[~2026-02-10 12:51 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-10 12:50 Peter Maydell [this message]
2026-02-10 13:22 ` [PATCH] serial: amba-pl011: Enable UART in earlycon setup Arnd Bergmann
2026-02-10 13:49 ` Peter Maydell
2026-02-10 14:10 ` Arnd Bergmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260210125100.223138-1-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=arnd@arndb.de \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=linmq006@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=tglx@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox