diff options
Diffstat (limited to 'drivers/serial')
51 files changed, 366 insertions, 70 deletions
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 1fe4607598e..3a1e5a6f287 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -501,6 +501,15 @@ config DEBUG_UART_MT7620 driver will be available until the real driver model serial is running. +config DEBUG_UART_XTENSA_SEMIHOSTING + bool "Xtensa semihosting" + depends on XTENSA_SEMIHOSTING_SERIAL + help + Select this to enable the debug UART using the Xtensa semihosting driver. + This provides basic serial output from the console without needing to + start up driver model. The driver will be available until the real + driver model serial is running. + endchoice config DEBUG_UART_BASE @@ -936,7 +945,6 @@ config SH_SCIF_CLK_FREQ config SEMIHOSTING_SERIAL bool "Semihosting UART support" depends on SEMIHOSTING && !SERIAL_RX_BUFFER - imply SERIAL_PUTS help Select this to enable a serial UART using semihosting. Special halt instructions will be issued which an external debugger (such as a @@ -1115,6 +1123,14 @@ config XEN_SERIAL If built without DM support, then requires Xen to be built with CONFIG_VERBOSE_DEBUG. +config XTENSA_SEMIHOSTING_SERIAL + bool "Xtensa Semihosting UART support" + depends on DM_SERIAL + depends on XTENSA_SEMIHOSTING + imply SERIAL_PUTS + help + Select this to enable a serial UART using Xtensa semihosting. + choice prompt "Console port" default 8xx_CONS_SMC1 diff --git a/drivers/serial/Makefile b/drivers/serial/Makefile index 403ab1ded68..78810f98367 100644 --- a/drivers/serial/Makefile +++ b/drivers/serial/Makefile @@ -60,8 +60,10 @@ obj-$(CONFIG_MT7620_SERIAL) += serial_mt7620.o obj-$(CONFIG_HTIF_CONSOLE) += serial_htif.o obj-$(CONFIG_SIFIVE_SERIAL) += serial_sifive.o obj-$(CONFIG_XEN_SERIAL) += serial_xen.o +obj-$(CONFIG_XTENSA_SEMIHOSTING_SERIAL) += serial_xtensa_semihosting.o obj-$(CONFIG_S5P4418_PL011_SERIAL) += serial_s5p4418_pl011.o ifndef CONFIG_SPL_BUILD obj-$(CONFIG_USB_TTY) += usbtty.o endif +obj-$(CONFIG_UART4_SERIAL) += serial_adi_uart4.o diff --git a/drivers/serial/altera_jtag_uart.c b/drivers/serial/altera_jtag_uart.c index 9e39da7dd24..3f706e1839f 100644 --- a/drivers/serial/altera_jtag_uart.c +++ b/drivers/serial/altera_jtag_uart.c @@ -4,7 +4,6 @@ * Scott McNutt <smcnutt@psyent.com> */ -#include <common.h> #include <dm.h> #include <errno.h> #include <serial.h> diff --git a/drivers/serial/altera_uart.c b/drivers/serial/altera_uart.c index 35920480841..3c13ef25bb4 100644 --- a/drivers/serial/altera_uart.c +++ b/drivers/serial/altera_uart.c @@ -4,7 +4,6 @@ * Scott McNutt <smcnutt@psyent.com> */ -#include <common.h> #include <dm.h> #include <errno.h> #include <serial.h> diff --git a/drivers/serial/arm_dcc.c b/drivers/serial/arm_dcc.c index a402a123b6d..66af136695d 100644 --- a/drivers/serial/arm_dcc.c +++ b/drivers/serial/arm_dcc.c @@ -15,7 +15,6 @@ * this file might be covered by the GNU General Public License. */ -#include <common.h> #include <dm.h> #include <serial.h> diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c index 9827c006fa8..7e45a80969e 100644 --- a/drivers/serial/atmel_usart.c +++ b/drivers/serial/atmel_usart.c @@ -5,7 +5,6 @@ * Modified to support C structur SoC access by * Andreas Bießmann <biessmann@corscience.de> */ -#include <common.h> #include <clk.h> #include <dm.h> #include <errno.h> diff --git a/drivers/serial/ns16550.c b/drivers/serial/ns16550.c index 6deb1d8ddc5..6fcb5b523ac 100644 --- a/drivers/serial/ns16550.c +++ b/drivers/serial/ns16550.c @@ -5,7 +5,7 @@ */ #include <clock_legacy.h> -#include <common.h> +#include <config.h> #include <clk.h> #include <dm.h> #include <errno.h> @@ -227,8 +227,7 @@ static void ns16550_setbrg(struct ns16550 *com_port, int baud_divisor) void ns16550_init(struct ns16550 *com_port, int baud_divisor) { -#if (defined(CONFIG_SPL_BUILD) && \ - (defined(CONFIG_OMAP34XX) || defined(CONFIG_OMAP44XX))) +#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_OMAP34XX) /* * On some OMAP3/OMAP4 devices when UART3 is configured for boot mode * before SPL starts only THRE bit is set. We have to empty the @@ -291,9 +290,9 @@ void ns16550_putc(struct ns16550 *com_port, char c) serial_out(c, &com_port->thr); /* - * Call watchdog_reset() upon newline. This is done here in putc + * Call schedule() upon newline. This is done here in putc * since the environment code uses a single puts() to print the complete - * environment upon "printenv". So we can't put this watchdog call + * environment upon "printenv". So we can't put this schedule call * in puts(). */ if (c == '\n') @@ -390,9 +389,9 @@ static int ns16550_serial_putc(struct udevice *dev, const char ch) serial_out(ch, &com_port->thr); /* - * Call watchdog_reset() upon newline. This is done here in putc + * Call schedule() upon newline. This is done here in putc * since the environment code uses a single puts() to print the complete - * environment upon "printenv". So we can't put this watchdog call + * environment upon "printenv". So we can't put this schedule call * in puts(). */ if (ch == '\n') diff --git a/drivers/serial/sandbox.c b/drivers/serial/sandbox.c index f6ac3d22852..77a1558db68 100644 --- a/drivers/serial/sandbox.c +++ b/drivers/serial/sandbox.c @@ -9,7 +9,6 @@ * U-Boot. */ -#include <common.h> #include <console.h> #include <dm.h> #include <os.h> @@ -139,8 +138,6 @@ static int sandbox_serial_pending(struct udevice *dev, bool input) return 0; os_usleep(100); - if (IS_ENABLED(CONFIG_VIDEO) && !IS_ENABLED(CONFIG_SPL_BUILD)) - video_sync_all(); avail = membuff_putraw(&priv->buf, 100, false, &data); if (!avail) return 1; /* buffer full */ diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index e4fa3933bc8..84f02f7ac76 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -5,7 +5,7 @@ #define LOG_CATEGORY UCLASS_SERIAL -#include <common.h> +#include <config.h> #include <dm.h> #include <env_internal.h> #include <errno.h> diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c index 787edd53602..dc4bb06fa99 100644 --- a/drivers/serial/serial.c +++ b/drivers/serial/serial.c @@ -4,7 +4,7 @@ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. */ -#include <common.h> +#include <config.h> #include <env_internal.h> #include <hang.h> #include <serial.h> diff --git a/drivers/serial/serial_adi_uart4.c b/drivers/serial/serial_adi_uart4.c new file mode 100644 index 00000000000..45f8315d0a0 --- /dev/null +++ b/drivers/serial/serial_adi_uart4.c @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * (C) Copyright 2022 - Analog Devices, Inc. + * + * Written and/or maintained by Timesys Corporation + * + * Converted to driver model by Nathan Barrett-Morrison + * + * Contact: Nathan Barrett-Morrison <nathan.morrison@timesys.com> + * Contact: Greg Malysa <greg.malysa@timesys.com> + * + */ + +#include <clk.h> +#include <dm.h> +#include <serial.h> +#include <asm/io.h> +#include <dm/device_compat.h> +#include <linux/bitops.h> + +/* + * UART4 Masks + */ + +/* UART_CONTROL */ +#define UEN BIT(0) +#define LOOP_ENA BIT(1) +#define UMOD (3 << 4) +#define UMOD_UART (0 << 4) +#define UMOD_MDB BIT(4) +#define UMOD_IRDA BIT(4) +#define WLS (3 << 8) +#define WLS_5 (0 << 8) +#define WLS_6 BIT(8) +#define WLS_7 (2 << 8) +#define WLS_8 (3 << 8) +#define STB BIT(12) +#define STBH BIT(13) +#define PEN BIT(14) +#define EPS BIT(15) +#define STP BIT(16) +#define FPE BIT(17) +#define FFE BIT(18) +#define SB BIT(19) +#define FCPOL BIT(22) +#define RPOLC BIT(23) +#define TPOLC BIT(24) +#define MRTS BIT(25) +#define XOFF BIT(26) +#define ARTS BIT(27) +#define ACTS BIT(28) +#define RFIT BIT(29) +#define RFRT BIT(30) + +/* UART_STATUS */ +#define DR BIT(0) +#define OE BIT(1) +#define PE BIT(2) +#define FE BIT(3) +#define BI BIT(4) +#define THRE BIT(5) +#define TEMT BIT(7) +#define TFI BIT(8) +#define ASTKY BIT(9) +#define ADDR BIT(10) +#define RO BIT(11) +#define SCTS BIT(12) +#define CTS BIT(16) +#define RFCS BIT(17) + +/* UART_EMASK */ +#define ERBFI BIT(0) +#define ETBEI BIT(1) +#define ELSI BIT(2) +#define EDSSI BIT(3) +#define EDTPTI BIT(4) +#define ETFI BIT(5) +#define ERFCI BIT(6) +#define EAWI BIT(7) +#define ERXS BIT(8) +#define ETXS BIT(9) + +DECLARE_GLOBAL_DATA_PTR; + +struct uart4_reg { + u32 revid; + u32 control; + u32 status; + u32 scr; + u32 clock; + u32 emask; + u32 emaskst; + u32 emaskcl; + u32 rbr; + u32 thr; + u32 taip; + u32 tsr; + u32 rsr; + u32 txdiv_cnt; + u32 rxdiv_cnt; +}; + +struct adi_uart4_platdata { + // Hardware registers + struct uart4_reg *regs; + + // Enable divide-by-one baud rate setting + bool edbo; +}; + +static int adi_uart4_set_brg(struct udevice *dev, int baudrate) +{ + struct adi_uart4_platdata *plat = dev_get_plat(dev); + struct uart4_reg *regs = plat->regs; + u32 divisor, uart_base_clk_rate; + struct clk uart_base_clk; + + if (clk_get_by_index(dev, 0, &uart_base_clk)) { + dev_err(dev, "Could not get UART base clock\n"); + return -1; + } + + uart_base_clk_rate = clk_get_rate(&uart_base_clk); + + if (plat->edbo) { + u16 divisor16 = (uart_base_clk_rate + (baudrate / 2)) / baudrate; + + divisor = divisor16 | BIT(31); + } else { + // Divisor is only 16 bits + divisor = 0x0000ffff & ((uart_base_clk_rate + (baudrate * 8)) / (baudrate * 16)); + } + + writel(divisor, ®s->clock); + return 0; +} + +static int adi_uart4_pending(struct udevice *dev, bool input) +{ + struct adi_uart4_platdata *plat = dev_get_plat(dev); + struct uart4_reg *regs = plat->regs; + + if (input) + return (readl(®s->status) & DR) ? 1 : 0; + else + return (readl(®s->status) & THRE) ? 0 : 1; +} + +static int adi_uart4_getc(struct udevice *dev) +{ + struct adi_uart4_platdata *plat = dev_get_plat(dev); + struct uart4_reg *regs = plat->regs; + int uart_rbr_val; + + if (!adi_uart4_pending(dev, true)) + return -EAGAIN; + + uart_rbr_val = readl(®s->rbr); + writel(-1, ®s->status); + + return uart_rbr_val; +} + +static int adi_uart4_putc(struct udevice *dev, const char ch) +{ + struct adi_uart4_platdata *plat = dev_get_plat(dev); + struct uart4_reg *regs = plat->regs; + + if (adi_uart4_pending(dev, false)) + return -EAGAIN; + + writel(ch, ®s->thr); + return 0; +} + +static const struct dm_serial_ops adi_uart4_serial_ops = { + .setbrg = adi_uart4_set_brg, + .getc = adi_uart4_getc, + .putc = adi_uart4_putc, + .pending = adi_uart4_pending, +}; + +static int adi_uart4_of_to_plat(struct udevice *dev) +{ + struct adi_uart4_platdata *plat = dev_get_plat(dev); + fdt_addr_t addr; + + addr = dev_read_addr(dev); + if (addr == FDT_ADDR_T_NONE) + return -EINVAL; + + plat->regs = (struct uart4_reg *)addr; + plat->edbo = dev_read_bool(dev, "adi,enable-edbo"); + + return 0; +} + +static int adi_uart4_probe(struct udevice *dev) +{ + struct adi_uart4_platdata *plat = dev_get_plat(dev); + struct uart4_reg *regs = plat->regs; + + /* always enable UART to 8-bit mode */ + writel(UEN | UMOD_UART | WLS_8, ®s->control); + + writel(-1, ®s->status); + + return 0; +} + +static const struct udevice_id adi_uart4_serial_ids[] = { + { .compatible = "adi,uart4" }, + { } +}; + +U_BOOT_DRIVER(serial_adi_uart4) = { + .name = "serial_adi_uart4", + .id = UCLASS_SERIAL, + .of_match = adi_uart4_serial_ids, + .of_to_plat = adi_uart4_of_to_plat, + .plat_auto = sizeof(struct adi_uart4_platdata), + .probe = adi_uart4_probe, + .ops = &adi_uart4_serial_ops, + .flags = DM_FLAG_PRE_RELOC, +}; diff --git a/drivers/serial/serial_ar933x.c b/drivers/serial/serial_ar933x.c index 4f916349762..4d92752690f 100644 --- a/drivers/serial/serial_ar933x.c +++ b/drivers/serial/serial_ar933x.c @@ -3,7 +3,6 @@ * Copyright (C) 2015-2016 Wills Wang <wills.wang@live.com> */ -#include <common.h> #include <clock_legacy.h> #include <dm.h> #include <div64.h> diff --git a/drivers/serial/serial_arc.c b/drivers/serial/serial_arc.c index c2fc8a901e2..a7e566bd23f 100644 --- a/drivers/serial/serial_arc.c +++ b/drivers/serial/serial_arc.c @@ -7,7 +7,6 @@ * */ -#include <common.h> #include <dm.h> #include <serial.h> #include <asm/global_data.h> @@ -25,7 +24,6 @@ struct arc_serial_regs { unsigned int baudh; }; - struct arc_serial_plat { struct arc_serial_regs *reg; unsigned int uartclk; diff --git a/drivers/serial/serial_bcm283x_mu.c b/drivers/serial/serial_bcm283x_mu.c index 7585f790d22..7fa26244b1c 100644 --- a/drivers/serial/serial_bcm283x_mu.c +++ b/drivers/serial/serial_bcm283x_mu.c @@ -14,7 +14,6 @@ /* Simple U-Boot driver for the BCM283x mini UART */ -#include <common.h> #include <dm.h> #include <errno.h> #include <watchdog.h> diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c index 09a9868a38f..2abc1c4658f 100644 --- a/drivers/serial/serial_bcm283x_pl011.c +++ b/drivers/serial/serial_bcm283x_pl011.c @@ -3,7 +3,6 @@ * Copyright (c) 2018 Alexander Graf <agraf@suse.de> */ -#include <common.h> #include <dm.h> #include <asm/gpio.h> #include <dm/pinctrl.h> diff --git a/drivers/serial/serial_coreboot.c b/drivers/serial/serial_coreboot.c index 23066e4d054..b1f69f6998c 100644 --- a/drivers/serial/serial_coreboot.c +++ b/drivers/serial/serial_coreboot.c @@ -7,7 +7,6 @@ #define LOG_CATGEGORY UCLASS_SERIAL -#include <common.h> #include <dm.h> #include <log.h> #include <ns16550.h> diff --git a/drivers/serial/serial_cortina.c b/drivers/serial/serial_cortina.c index 6dc81a775d3..3ae8fb46584 100644 --- a/drivers/serial/serial_cortina.c +++ b/drivers/serial/serial_cortina.c @@ -5,7 +5,6 @@ * */ -#include <common.h> #include <dm.h> #include <errno.h> #include <watchdog.h> diff --git a/drivers/serial/serial_efi.c b/drivers/serial/serial_efi.c index 0067576389d..5733eaaf9d4 100644 --- a/drivers/serial/serial_efi.c +++ b/drivers/serial/serial_efi.c @@ -4,7 +4,6 @@ * Written by Simon Glass <sjg@chromium.org> */ -#include <common.h> #include <debug_uart.h> #include <dm.h> #include <efi.h> diff --git a/drivers/serial/serial_htif.c b/drivers/serial/serial_htif.c index 5d2bf0aaeba..2a93bbbcc9f 100644 --- a/drivers/serial/serial_htif.c +++ b/drivers/serial/serial_htif.c @@ -3,7 +3,6 @@ * Copyright (C) 2022 Ventana Micro Systems Inc. */ -#include <common.h> #include <dm.h> #include <errno.h> #include <fdtdec.h> diff --git a/drivers/serial/serial_intel_mid.c b/drivers/serial/serial_intel_mid.c index bbf19057c4d..4b528e45292 100644 --- a/drivers/serial/serial_intel_mid.c +++ b/drivers/serial/serial_intel_mid.c @@ -3,7 +3,6 @@ * Copyright (c) 2017 Intel Corporation */ -#include <common.h> #include <dm.h> #include <ns16550.h> #include <serial.h> diff --git a/drivers/serial/serial_linflexuart.c b/drivers/serial/serial_linflexuart.c index b449e55a650..24ecb236d51 100644 --- a/drivers/serial/serial_linflexuart.c +++ b/drivers/serial/serial_linflexuart.c @@ -3,7 +3,6 @@ * (C) Copyright 2013-2016 Freescale Semiconductor, Inc. */ -#include <common.h> #include <dm.h> #include <errno.h> #include <watchdog.h> @@ -70,7 +69,6 @@ static int _linflex_serial_putc(struct linflex_fsl *base, const char c) { __raw_writeb(c, &base->bdrl); - if (!(__raw_readb(&base->uartsr) & UARTSR_DTF)) return -EAGAIN; @@ -198,7 +196,6 @@ U_BOOT_DRIVER(serial_linflex) = { #include <debug_uart.h> - static inline void _debug_uart_init(void) { struct linflex_fsl *base = (struct linflex_fsl *)CONFIG_VAL(DEBUG_UART_BASE); diff --git a/drivers/serial/serial_lpuart.c b/drivers/serial/serial_lpuart.c index 3f2be72b830..93602797b83 100644 --- a/drivers/serial/serial_lpuart.c +++ b/drivers/serial/serial_lpuart.c @@ -4,7 +4,6 @@ * Copyright 2013 Freescale Semiconductor, Inc. */ -#include <common.h> #include <clock_legacy.h> #include <clk.h> #include <dm.h> @@ -102,7 +101,6 @@ static void lpuart_write32(u32 flags, u32 *addr, u32 val) } } - u32 __weak get_lpuart_clk(void) { return get_board_sys_clk(); diff --git a/drivers/serial/serial_mcf.c b/drivers/serial/serial_mcf.c index bb2afd0d8cd..76143575fa9 100644 --- a/drivers/serial/serial_mcf.c +++ b/drivers/serial/serial_mcf.c @@ -15,7 +15,6 @@ * as serial console interface. */ -#include <common.h> #include <dm.h> #include <asm/global_data.h> #include <dm/platform_data/serial_coldfire.h> diff --git a/drivers/serial/serial_meson.c b/drivers/serial/serial_meson.c index be5f380f850..bb79b972957 100644 --- a/drivers/serial/serial_meson.c +++ b/drivers/serial/serial_meson.c @@ -3,7 +3,6 @@ * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com> */ -#include <common.h> #include <dm.h> #include <errno.h> #include <fdtdec.h> diff --git a/drivers/serial/serial_mpc8xx.c b/drivers/serial/serial_mpc8xx.c index d82760c7f10..9ce3fc3d9ec 100644 --- a/drivers/serial/serial_mpc8xx.c +++ b/drivers/serial/serial_mpc8xx.c @@ -4,7 +4,6 @@ * Wolfgang Denk, DENX Software Engineering, wd@denx.de. */ -#include <common.h> #include <command.h> #include <dm.h> #include <serial.h> diff --git a/drivers/serial/serial_msm.c b/drivers/serial/serial_msm.c index a472e0b3683..757e5eaf974 100644 --- a/drivers/serial/serial_msm.c +++ b/drivers/serial/serial_msm.c @@ -8,7 +8,6 @@ * Based on Linux driver. */ -#include <common.h> #include <clk.h> #include <dm.h> #include <errno.h> diff --git a/drivers/serial/serial_msm_geni.c b/drivers/serial/serial_msm_geni.c index 5260474fb9a..cb6c09fdd09 100644 --- a/drivers/serial/serial_msm_geni.c +++ b/drivers/serial/serial_msm_geni.c @@ -9,7 +9,6 @@ #include <asm/io.h> #include <clk.h> -#include <common.h> #include <dm.h> #include <errno.h> #include <linux/delay.h> diff --git a/drivers/serial/serial_mtk.c b/drivers/serial/serial_mtk.c index f146f2b006e..becf9317076 100644 --- a/drivers/serial/serial_mtk.c +++ b/drivers/serial/serial_mtk.c @@ -7,9 +7,10 @@ */ #include <clk.h> -#include <common.h> +#include <config.h> #include <div64.h> #include <dm.h> +#include <dm/device.h> #include <dm/device_compat.h> #include <errno.h> #include <log.h> @@ -76,15 +77,19 @@ struct mtk_serial_regs { * driver * @regs: Register base of the serial port * @clk: The baud clock device + * @clk_bus: The bus clock device * @fixed_clk_rate: Fallback fixed baud clock rate if baud clock * device is not specified * @force_highspeed: Force using high-speed mode + * @upstream_highspeed_logic: Apply upstream high-speed logic */ struct mtk_serial_priv { struct mtk_serial_regs __iomem *regs; struct clk clk; + struct clk clk_bus; u32 fixed_clk_rate; bool force_highspeed; + bool upstream_highspeed_logic; }; static void _mtk_serial_setbrg(struct mtk_serial_priv *priv, int baud, @@ -111,7 +116,12 @@ static void _mtk_serial_setbrg(struct mtk_serial_priv *priv, int baud, goto set_baud; } - if (priv->force_highspeed) + /* + * Upstream linux use highspeed for anything >= 115200 and lowspeed + * for < 115200. Simulate this if we are using the upstream compatible. + */ + if (priv->force_highspeed || + (priv->upstream_highspeed_logic && baud >= 115200)) goto use_hs3; if (baud <= 115200) { @@ -220,6 +230,10 @@ static int mtk_serial_probe(struct udevice *dev) writel(UART_MCRVAL, &priv->regs->mcr); writel(UART_FCRVAL, &priv->regs->fcr); + clk_enable(&priv->clk); + if (priv->clk_bus.dev) + clk_enable(&priv->clk_bus); + return 0; } @@ -250,7 +264,11 @@ static int mtk_serial_of_to_plat(struct udevice *dev) } } + clk_get_by_name(dev, "bus", &priv->clk_bus); + priv->force_highspeed = dev_read_bool(dev, "mediatek,force-highspeed"); + priv->upstream_highspeed_logic = + device_is_compatible(dev, "mediatek,mt6577-uart"); return 0; } diff --git a/drivers/serial/serial_mvebu_a3700.c b/drivers/serial/serial_mvebu_a3700.c index b2017c64556..1a0b85e170a 100644 --- a/drivers/serial/serial_mvebu_a3700.c +++ b/drivers/serial/serial_mvebu_a3700.c @@ -4,7 +4,6 @@ * Copyright (C) 2021 Pali Rohár <pali@kernel.org> */ -#include <common.h> #include <clk.h> #include <dm.h> #include <serial.h> diff --git a/drivers/serial/serial_mxc.c b/drivers/serial/serial_mxc.c index cc85a502726..c5fd740be4d 100644 --- a/drivers/serial/serial_mxc.c +++ b/drivers/serial/serial_mxc.c @@ -3,7 +3,6 @@ * (c) 2007 Sascha Hauer <s.hauer@pengutronix.de> */ -#include <common.h> #include <dm.h> #include <errno.h> #include <watchdog.h> diff --git a/drivers/serial/serial_mxs.c b/drivers/serial/serial_mxs.c index 3659948b872..071bd09fef6 100644 --- a/drivers/serial/serial_mxs.c +++ b/drivers/serial/serial_mxs.c @@ -2,7 +2,6 @@ /* * Copyright (C) 2023 Marek Vasut <marex@denx.de> */ -#include <common.h> #include <dm.h> #include <malloc.h> #include <serial.h> diff --git a/drivers/serial/serial_npcm.c b/drivers/serial/serial_npcm.c index 6bf3a943a2f..661daf1aefa 100644 --- a/drivers/serial/serial_npcm.c +++ b/drivers/serial/serial_npcm.c @@ -3,7 +3,6 @@ * Copyright (c) 2021 Nuvoton Technology Corp. */ -#include <common.h> #include <clk.h> #include <dm.h> #include <serial.h> diff --git a/drivers/serial/serial_ns16550.c b/drivers/serial/serial_ns16550.c index 4014f682040..577864bc219 100644 --- a/drivers/serial/serial_ns16550.c +++ b/drivers/serial/serial_ns16550.c @@ -4,7 +4,7 @@ * Rob Taylor, Flying Pig Systems. robt@flyingpig.com. */ -#include <common.h> +#include <config.h> #include <clock_legacy.h> #include <ns16550.h> #include <serial.h> diff --git a/drivers/serial/serial_nulldev.c b/drivers/serial/serial_nulldev.c index f3ca7f52559..e2c6dec5e32 100644 --- a/drivers/serial/serial_nulldev.c +++ b/drivers/serial/serial_nulldev.c @@ -3,7 +3,6 @@ * Copyright (c) 2015 National Instruments */ -#include <common.h> #include <dm.h> #include <serial.h> @@ -32,7 +31,6 @@ static const struct udevice_id nulldev_serial_ids[] = { { } }; - const struct dm_serial_ops nulldev_serial_ops = { .putc = nulldev_serial_putc, .pending = nulldev_serial_pending, diff --git a/drivers/serial/serial_omap.c b/drivers/serial/serial_omap.c index 49ced8f9fae..94672655c28 100644 --- a/drivers/serial/serial_omap.c +++ b/drivers/serial/serial_omap.c @@ -6,7 +6,7 @@ * Lokesh Vutla <lokeshvutla@ti.com> */ -#include <common.h> +#include <config.h> #include <dm.h> #include <dt-structs.h> #include <log.h> diff --git a/drivers/serial/serial_owl.c b/drivers/serial/serial_owl.c index 3b795785f78..8ce8aa32a21 100644 --- a/drivers/serial/serial_owl.c +++ b/drivers/serial/serial_owl.c @@ -6,7 +6,6 @@ * Copyright (C) 2018 Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> */ -#include <common.h> #include <clk.h> #include <dm.h> #include <errno.h> diff --git a/drivers/serial/serial_pic32.c b/drivers/serial/serial_pic32.c index 0a03a9a2549..a49c4139b5a 100644 --- a/drivers/serial/serial_pic32.c +++ b/drivers/serial/serial_pic32.c @@ -3,7 +3,6 @@ * (c) 2015 Paul Thacker <paul.thacker@microchip.com> * */ -#include <common.h> #include <clk.h> #include <dm.h> #include <malloc.h> diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c index f04c21e0826..80c35963b8f 100644 --- a/drivers/serial/serial_pl01x.c +++ b/drivers/serial/serial_pl01x.c @@ -10,7 +10,6 @@ /* Simple U-Boot driver for the PrimeCell PL010/PL011 UARTs */ -#include <common.h> #include <asm/global_data.h> /* For get_bus_freq() */ #include <clock_legacy.h> diff --git a/drivers/serial/serial_pl01x_internal.h b/drivers/serial/serial_pl01x_internal.h index 71c52bb5312..7ae3ae50908 100644 --- a/drivers/serial/serial_pl01x_internal.h +++ b/drivers/serial/serial_pl01x_internal.h @@ -92,7 +92,6 @@ struct pl01x_priv { #define UART_PL010_LCRH_PEN (1 << 1) #define UART_PL010_LCRH_BRK (1 << 0) - #define UART_PL010_BAUD_460800 1 #define UART_PL010_BAUD_230400 3 #define UART_PL010_BAUD_115200 7 diff --git a/drivers/serial/serial_rockchip.c b/drivers/serial/serial_rockchip.c index f4e9422ed91..8a15173f238 100644 --- a/drivers/serial/serial_rockchip.c +++ b/drivers/serial/serial_rockchip.c @@ -3,7 +3,6 @@ * Copyright (c) 2015 Google, Inc */ -#include <common.h> #include <debug_uart.h> #include <dm.h> #include <dt-structs.h> diff --git a/drivers/serial/serial_s5p4418_pl011.c b/drivers/serial/serial_s5p4418_pl011.c index e4492e662e9..1fb954e80c2 100644 --- a/drivers/serial/serial_s5p4418_pl011.c +++ b/drivers/serial/serial_s5p4418_pl011.c @@ -3,7 +3,6 @@ * Copyright (C) 2022 Stefan Bosch <stefan_b@posteo.net> */ -#include <common.h> #include <dm.h> #include <asm/arch/clk.h> #include <asm/arch/reset.h> diff --git a/drivers/serial/serial_semihosting.c b/drivers/serial/serial_semihosting.c index cfa1ec3148c..56a5ec72428 100644 --- a/drivers/serial/serial_semihosting.c +++ b/drivers/serial/serial_semihosting.c @@ -3,7 +3,6 @@ * Copyright (C) 2022 Sean Anderson <sean.anderson@seco.com> */ -#include <common.h> #include <dm.h> #include <malloc.h> #include <serial.h> diff --git a/drivers/serial/serial_sifive.c b/drivers/serial/serial_sifive.c index c449f3fd02d..e47828e4d6a 100644 --- a/drivers/serial/serial_sifive.c +++ b/drivers/serial/serial_sifive.c @@ -3,7 +3,6 @@ * Copyright (C) 2018 Anup Patel <anup@brainfault.org> */ -#include <common.h> #include <clk.h> #include <debug_uart.h> #include <dm.h> diff --git a/drivers/serial/serial_sti_asc.c b/drivers/serial/serial_sti_asc.c index 40381b57b08..ef68e585dd6 100644 --- a/drivers/serial/serial_sti_asc.c +++ b/drivers/serial/serial_sti_asc.c @@ -6,7 +6,6 @@ * Author(s): Patrice Chotard, <patrice.chotard@foss.st.com> for STMicroelectronics. */ -#include <common.h> #include <dm.h> #include <log.h> #include <serial.h> diff --git a/drivers/serial/serial_stm32.c b/drivers/serial/serial_stm32.c index fb039546a41..1ee58142b3f 100644 --- a/drivers/serial/serial_stm32.c +++ b/drivers/serial/serial_stm32.c @@ -6,7 +6,6 @@ #define LOG_CATEGORY UCLASS_SERIAL -#include <common.h> #include <clk.h> #include <dm.h> #include <log.h> diff --git a/drivers/serial/serial_uniphier.c b/drivers/serial/serial_uniphier.c index 27e4b92c399..a566ba7a47d 100644 --- a/drivers/serial/serial_uniphier.c +++ b/drivers/serial/serial_uniphier.c @@ -5,7 +5,6 @@ * Author: Masahiro Yamada <yamada.masahiro@socionext.com> */ -#include <common.h> #include <dm.h> #include <linux/bitfield.h> #include <linux/bitops.h> diff --git a/drivers/serial/serial_xen.c b/drivers/serial/serial_xen.c index ab318b06462..e05805f6372 100644 --- a/drivers/serial/serial_xen.c +++ b/drivers/serial/serial_xen.c @@ -3,7 +3,6 @@ * (C) 2018 NXP * (C) 2020 EPAM Systems Inc. */ -#include <common.h> #include <cpu_func.h> #include <dm.h> #include <serial.h> diff --git a/drivers/serial/serial_xtensa_semihosting.c b/drivers/serial/serial_xtensa_semihosting.c new file mode 100644 index 00000000000..0e59a9bfdc7 --- /dev/null +++ b/drivers/serial/serial_xtensa_semihosting.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2024 Jiaxun Yang <jiaxun.yang@flygoat.com> + */ + +#include <dm.h> +#include <malloc.h> +#include <serial.h> + +#include <asm/platform/simcall.h> + +/** + * struct simc_serial_priv - Semihosting serial private data + * @counter: Counter used to fake pending every other call + */ +struct simc_serial_priv { + unsigned int counter; +}; + +static int simc_serial_getc(struct udevice *dev) +{ + char ch = 0; + + simc_read(0, &ch, sizeof(ch)); + + return ch; +} + +static int simc_serial_putc(struct udevice *dev, const char ch) +{ + char str[2] = {0}; + + str[0] = ch; + simc_write(1, str, 1); + + return 0; +} + +static int simc_serial_pending(struct udevice *dev, bool input) +{ + struct simc_serial_priv *priv = dev_get_priv(dev); + + if (input) { + int res = simc_poll(0); + return res < 0 ? priv->counter++ & 1 : res; + } + + return false; +} + +static ssize_t smh_serial_puts(struct udevice *dev, const char *s, size_t len) +{ + int ret; + + ret = simc_write(1, s, len); + + return ret; +} + +static const struct dm_serial_ops simc_serial_ops = { + .putc = simc_serial_putc, + .puts = smh_serial_puts, + .getc = simc_serial_getc, + .pending = simc_serial_pending, +}; + +U_BOOT_DRIVER(simc_serial) = { + .name = "serial_xtensa_semihosting", + .id = UCLASS_SERIAL, + .priv_auto = sizeof(struct simc_serial_priv), + .ops = &simc_serial_ops, + .flags = DM_FLAG_PRE_RELOC, +}; + +U_BOOT_DRVINFO(simc_serial) = { + .name = "serial_xtensa_semihosting", +}; + +#if CONFIG_IS_ENABLED(DEBUG_UART_XTENSA_SEMIHOSTING) +#include <debug_uart.h> + +static inline void _debug_uart_init(void) +{ +} + +static inline void _debug_uart_putc(int c) +{ + simc_serial_putc(NULL, c); +} + +DEBUG_UART_FUNCS +#endif diff --git a/drivers/serial/serial_xuartlite.c b/drivers/serial/serial_xuartlite.c index 35df413321f..eb234108746 100644 --- a/drivers/serial/serial_xuartlite.c +++ b/drivers/serial/serial_xuartlite.c @@ -8,7 +8,6 @@ */ #include <config.h> -#include <common.h> #include <dm.h> #include <asm/io.h> #include <linux/bitops.h> diff --git a/drivers/serial/serial_zynq.c b/drivers/serial/serial_zynq.c index 1847d1f6ecd..55f13c00ddf 100644 --- a/drivers/serial/serial_zynq.c +++ b/drivers/serial/serial_zynq.c @@ -5,7 +5,6 @@ */ #include <clk.h> -#include <common.h> #include <debug_uart.h> #include <dm.h> #include <errno.h> diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c index ecb6ba853df..b7d77fbb6a9 100644 --- a/drivers/serial/usbtty.c +++ b/drivers/serial/usbtty.c @@ -7,7 +7,6 @@ * Bryan O'Donoghue, bodonoghue@codehermit.ie */ -#include <common.h> #include <config.h> #include <circbuf.h> #include <env.h> @@ -55,7 +54,6 @@ static circbuf_t usbtty_input; static circbuf_t usbtty_output; - /* * Instance variables */ @@ -78,7 +76,6 @@ int usbtty_configured_flag = 0; */ static char serial_number[16]; - /* * Descriptors, Strings, Local variables. */ @@ -258,12 +255,10 @@ static struct rs232_emu rs232_desc={ .data_bits = 0x08 }; - /* * Static Generic Serial specific data */ - struct gserial_config_desc { struct usb_configuration_descriptor configuration_desc; @@ -576,28 +571,24 @@ static void usbtty_init_strings (void) str2wide (CONFIG_USBD_MANUFACTURER, string->wData); usbtty_string_table[STR_MANUFACTURER]=string; - string = (struct usb_string_descriptor *) wstrProduct; string->bLength = sizeof(wstrProduct); string->bDescriptorType = USB_DT_STRING; str2wide (CONFIG_USBD_PRODUCT_NAME, string->wData); usbtty_string_table[STR_PRODUCT]=string; - string = (struct usb_string_descriptor *) wstrSerial; string->bLength = sizeof(serial_number); string->bDescriptorType = USB_DT_STRING; str2wide (serial_number, string->wData); usbtty_string_table[STR_SERIAL]=string; - string = (struct usb_string_descriptor *) wstrConfiguration; string->bLength = sizeof(wstrConfiguration); string->bDescriptorType = USB_DT_STRING; str2wide (CFG_USBD_CONFIGURATION_STR, string->wData); usbtty_string_table[STR_CONFIG]=string; - string = (struct usb_string_descriptor *) wstrDataInterface; string->bLength = sizeof(wstrDataInterface); string->bDescriptorType = USB_DT_STRING; |