* [PATCH] serial: ns16550: make probe clock enabling optional @ 2026-10-06 11:14 khaliforce 2026-10-07 9:40 ` Yao Zi 2026-10-07 10:25 ` [PATCH v2] serial: ns16550: enable clocks for DesignWare UARTs khaliforce 0 siblings, 2 replies; 3+ messages in thread From: khaliforce @ 2026-10-06 11:14 UTC (permalink / raw) To: u-boot; +Cc: Samuel Holland, Tom Rini From: Samuel Holland <samuel@sholland.org> Some platforms need the UART clock gates enabled before NS16550 register access. This is required by the downstream Allwinner D1 port used on the MangoPi MQ Pro. Add CONFIG_NS16550_CLK_ENABLE to enable the UART clocks during probe when explicitly selected by a platform. The option defaults to disabled, preserving the existing behavior on other platforms. The clock-enabling code originates from Samuel Holland's D1 work. This patch makes that behavior optional through Kconfig. Link: https://github.com/smaeul/u-boot/commit/0617377a2555031f02a459b3451fa33ce53e9b74 Signed-off-by: Samuel Holland <samuel@sholland.org> Co-developed-by: khaliforce <kforce@gmail.com> Signed-off-by: khaliforce <kforce@gmail.com> --- Tested on a MangoPi MQ Pro with the downstream D1 port based on U-Boot v2026.10: - With the option enabled, cold boot and warm reboot succeeded through SPL, OpenSBI, U-Boot, GRUB and Linux. - Removing only this patch, without adding diagnostic code, resulted in no UART output at all, not even a single character, and the board did not become reachable over SSH. The standalone patch also builds on current upstream main for RISC-V64, ARM64 and ARM32. An additional RISC-V64 build with CLK and NS16550_CLK_ENABLE enabled passed. With the option disabled, the tested ARM64 and ARM32 NS16550 .text sections were unchanged. Checkpatch reports no errors or warnings. drivers/serial/Kconfig | 7 +++++++ drivers/serial/ns16550.c | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index ffc58d663ff..4c5400a3816 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -821,6 +821,13 @@ config SYS_NS16550 be used. It can be a constant or a function to get clock, eg, get_serial_clock(). +config NS16550_CLK_ENABLE + bool "Enable NS16550 clocks during probe" + depends on SYS_NS16550 && DM_SERIAL && CLK + help + Enable all UART clocks before register access. + Select this when firmware does not enable the UART clock gates. + config NS16550_DYNAMIC bool "Allow NS16550 to be configured at runtime" depends on SYS_NS16550 diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 10271f46aa6..217a7cf7238 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -516,6 +516,15 @@ int ns16550_serial_probe(struct udevice *dev) if (!ret) reset_deassert_bulk(&reset_bulk); + if (IS_ENABLED(CONFIG_NS16550_CLK_ENABLE) && + CONFIG_IS_ENABLED(CLK)) { + struct clk_bulk clk_bulk; + + ret = clk_get_bulk(dev, &clk_bulk); + if (!ret) + clk_enable_bulk(&clk_bulk); + } + com_port->plat = dev_get_plat(dev); ns16550_init(com_port, -1); ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] serial: ns16550: make probe clock enabling optional 2026-10-06 11:14 [PATCH] serial: ns16550: make probe clock enabling optional khaliforce @ 2026-10-07 9:40 ` Yao Zi 2026-10-07 10:25 ` [PATCH v2] serial: ns16550: enable clocks for DesignWare UARTs khaliforce 1 sibling, 0 replies; 3+ messages in thread From: Yao Zi @ 2026-10-07 9:40 UTC (permalink / raw) To: khaliforce, u-boot; +Cc: Samuel Holland, Tom Rini, Yao Zi On Tue, Oct 06, 2026 at 08:14:01PM +0900, khaliforce wrote: > From: Samuel Holland <samuel@sholland.org> > > Some platforms need the UART clock gates enabled before NS16550 > register access. This is required by the downstream Allwinner D1 > port used on the MangoPi MQ Pro. > > Add CONFIG_NS16550_CLK_ENABLE to enable the UART clocks during > probe when explicitly selected by a platform. The option defaults > to disabled, preserving the existing behavior on other platforms. > > The clock-enabling code originates from Samuel Holland's D1 work. > This patch makes that behavior optional through Kconfig. I think the appropriate way to model this is introducing devicetree-compatible-specific behaviors. > Link: https://github.com/smaeul/u-boot/commit/0617377a2555031f02a459b3451fa33ce53e9b74 > Signed-off-by: Samuel Holland <samuel@sholland.org> > Co-developed-by: khaliforce <kforce@gmail.com> > Signed-off-by: khaliforce <kforce@gmail.com> > --- Best regards, Yao Zi ^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH v2] serial: ns16550: enable clocks for DesignWare UARTs 2026-10-06 11:14 [PATCH] serial: ns16550: make probe clock enabling optional khaliforce 2026-10-07 9:40 ` Yao Zi @ 2026-10-07 10:25 ` khaliforce 1 sibling, 0 replies; 3+ messages in thread From: khaliforce @ 2026-10-07 10:25 UTC (permalink / raw) To: u-boot; +Cc: Samuel Holland, me, trini From: Samuel Holland <samuel@sholland.org> D1 needs its DesignWare UART clocks enabled before register access. Select this behavior through the existing snps,dw-apb-uart compatible. Keep other UART variants unchanged. Allow fixed-clock devices without a clocks property. Propagate clock provider and enable errors. Tested on MangoPi MQ Pro. Link: https://github.com/smaeul/u-boot/commit/0617377a2555031f02a459b3451fa33ce53e9b74 Suggested-by: Yao Zi <me@ziyao.cc> Signed-off-by: Samuel Holland <samuel@sholland.org> Co-developed-by: khaliforce <kforce@gmail.com> Signed-off-by: khaliforce <kforce@gmail.com> --- Changes in v2: - Select clock enabling through snps,dw-apb-uart match data. - Remove the proposed NS16550_CLK_ENABLE Kconfig option. - Preserve fixed-clock UARTs without a clocks property. - Propagate clock provider and enable errors. Validation: - U-Boot CI Docker builds pass: MQ Pro, RISC-V QEMU, x96q, MQ R, and AM335x EVM. - QEMU console tests pass: ns16550a and snps,dw-apb-uart without clocks. - MQ Pro UART input/output, clock gate, SD, GRUB, Linux, SSH, and repeated boots pass. - Other physical boards are not tested. drivers/serial/ns16550.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 10271f46aa6..c631d9628ea 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -492,6 +492,14 @@ static int ns16550_serial_assign_base(struct ns16550_plat *plat, return 0; } +#if CONFIG_IS_ENABLED(OF_CONTROL) +enum { + PORT_NS16550 = 0, + PORT_JZ4780, + PORT_DW_APB, +}; +#endif + int ns16550_serial_probe(struct udevice *dev) { struct ns16550_plat *plat = dev_get_plat(dev); @@ -516,19 +524,28 @@ int ns16550_serial_probe(struct udevice *dev) if (!ret) reset_deassert_bulk(&reset_bulk); +#if CONFIG_IS_ENABLED(OF_REAL) + if (CONFIG_IS_ENABLED(CLK) && + dev_get_driver_data(dev) == PORT_DW_APB) { + struct clk_bulk clk_bulk; + + ret = clk_get_bulk(dev, &clk_bulk); + if (!ret) { + ret = clk_enable_bulk(&clk_bulk); + if (ret) + return ret; + } else if (ret != -ENOENT && ret != -ENOSYS) { + return ret; + } + } +#endif + com_port->plat = dev_get_plat(dev); ns16550_init(com_port, -1); return 0; } -#if CONFIG_IS_ENABLED(OF_CONTROL) -enum { - PORT_NS16550 = 0, - PORT_JZ4780, -}; -#endif - #if CONFIG_IS_ENABLED(OF_REAL) int ns16550_serial_of_to_plat(struct udevice *dev) { @@ -598,7 +615,7 @@ static const struct udevice_id ns16550_serial_ids[] = { { .compatible = "ns16550a", .data = PORT_NS16550 }, { .compatible = "ingenic,jz4780-uart", .data = PORT_JZ4780 }, { .compatible = "nvidia,tegra20-uart", .data = PORT_NS16550 }, - { .compatible = "snps,dw-apb-uart", .data = PORT_NS16550 }, + { .compatible = "snps,dw-apb-uart", .data = PORT_DW_APB }, { .compatible = "intel,xscale-uart", .data = PORT_NS16550 }, {} }; -- 2.53.0 ^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-07 10:39 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-10-06 11:14 [PATCH] serial: ns16550: make probe clock enabling optional khaliforce 2026-10-07 9:40 ` Yao Zi 2026-10-07 10:25 ` [PATCH v2] serial: ns16550: enable clocks for DesignWare UARTs khaliforce
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.