diff --git a/rpi-Drain-RX-queue-on-setbrg.patch b/rpi-Drain-RX-queue-on-setbrg.patch index afeee95..19d82f1 100644 --- a/rpi-Drain-RX-queue-on-setbrg.patch +++ b/rpi-Drain-RX-queue-on-setbrg.patch @@ -1,15 +1,15 @@ -From patchwork Tue Mar 6 13:13:26 2018 +From patchwork Wed Mar 7 21:08:24 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit -Subject: [U-Boot, +Subject: [U-Boot, v2, 1/2] serial_bcm283x_mu: Flush RX queue after setting baud rate X-Patchwork-Submitter: Alexander Graf -X-Patchwork-Id: 882056 -Message-Id: <20180306131327.61174-2-agraf@suse.de> +X-Patchwork-Id: 882789 +Message-Id: <20180307210825.50709-2-agraf@suse.de> To: u-boot@lists.denx.de Cc: Tom Rini -Date: Tue, 6 Mar 2018 14:13:26 +0100 +Date: Wed, 7 Mar 2018 22:08:24 +0100 From: Alexander Graf List-Id: U-Boot discussion @@ -62,3 +62,156 @@ index 40029fadbc..d87b44e902 100644 } +From patchwork Wed Mar 7 21:08:25 2018 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 8bit +Subject: [U-Boot, v2, + 2/2] bcm283x_pl011: Flush RX queue after setting baud rate +X-Patchwork-Submitter: Alexander Graf +X-Patchwork-Id: 882790 +Message-Id: <20180307210825.50709-3-agraf@suse.de> +To: u-boot@lists.denx.de +Cc: Tom Rini +Date: Wed, 7 Mar 2018 22:08:25 +0100 +From: Alexander Graf +List-Id: U-Boot discussion + +After the UART was initialized, we may still have bogus data in the +RX queue if it was enabled with incorrect pin muxing before. + +So let's flush the RX queue whenever we initialize baud rates. + +This fixes a regression with the dynamic pinmuxing code when enable_uart=1 +is not set in config.txt on Raspberry Pis that use pl011 for serial. + +Fixes: caf2233b28 ("bcm283x: Add pinctrl driver") +Reported-by: Göran Lundberg +Reported-by: Peter Robinson +Signed-off-by: Alexander Graf +--- + +v1 -> v2: + + - correctly drain the queue +--- + drivers/serial/serial_bcm283x_pl011.c | 25 ++++++++++++++++++++++++- + drivers/serial/serial_pl01x.c | 10 +++++----- + drivers/serial/serial_pl01x_internal.h | 7 ++++++- + 3 files changed, 35 insertions(+), 7 deletions(-) + +diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c +index bfd39f84f3..dad7236895 100644 +--- a/drivers/serial/serial_bcm283x_pl011.c ++++ b/drivers/serial/serial_bcm283x_pl011.c +@@ -9,6 +9,7 @@ + #include + #include + #include ++#include + #include "serial_pl01x_internal.h" + + /* +@@ -55,6 +56,28 @@ static int bcm283x_pl011_serial_ofdata_to_platdata(struct udevice *dev) + return 0; + } + ++static int bcm283x_pl011_serial_setbrg(struct udevice *dev, int baudrate) ++{ ++ int r; ++ ++ r = pl01x_serial_setbrg(dev, baudrate); ++ ++ /* ++ * We may have been muxed to a bogus line before. Drain the RX ++ * queue so we start at a clean slate. ++ */ ++ while (pl01x_serial_getc(dev) != -EAGAIN) ; ++ ++ return r; ++} ++ ++static const struct dm_serial_ops bcm283x_pl011_serial_ops = { ++ .putc = pl01x_serial_putc, ++ .pending = pl01x_serial_pending, ++ .getc = pl01x_serial_getc, ++ .setbrg = bcm283x_pl011_serial_setbrg, ++}; ++ + static const struct udevice_id bcm283x_pl011_serial_id[] = { + {.compatible = "brcm,bcm2835-pl011", .data = TYPE_PL011}, + {} +@@ -67,7 +90,7 @@ U_BOOT_DRIVER(bcm283x_pl011_uart) = { + .ofdata_to_platdata = of_match_ptr(bcm283x_pl011_serial_ofdata_to_platdata), + .platdata_auto_alloc_size = sizeof(struct pl01x_serial_platdata), + .probe = pl01x_serial_probe, +- .ops = &pl01x_serial_ops, ++ .ops = &bcm283x_pl011_serial_ops, + .flags = DM_FLAG_PRE_RELOC, + .priv_auto_alloc_size = sizeof(struct pl01x_priv), + }; +diff --git a/drivers/serial/serial_pl01x.c b/drivers/serial/serial_pl01x.c +index 23d9d839cb..45f1282770 100644 +--- a/drivers/serial/serial_pl01x.c ++++ b/drivers/serial/serial_pl01x.c +@@ -273,7 +273,7 @@ __weak struct serial_device *default_serial_console(void) + + #ifdef CONFIG_DM_SERIAL + +-static int pl01x_serial_setbrg(struct udevice *dev, int baudrate) ++int pl01x_serial_setbrg(struct udevice *dev, int baudrate) + { + struct pl01x_serial_platdata *plat = dev_get_platdata(dev); + struct pl01x_priv *priv = dev_get_priv(dev); +@@ -299,21 +299,21 @@ int pl01x_serial_probe(struct udevice *dev) + return 0; + } + +-static int pl01x_serial_getc(struct udevice *dev) ++int pl01x_serial_getc(struct udevice *dev) + { + struct pl01x_priv *priv = dev_get_priv(dev); + + return pl01x_getc(priv->regs); + } + +-static int pl01x_serial_putc(struct udevice *dev, const char ch) ++int pl01x_serial_putc(struct udevice *dev, const char ch) + { + struct pl01x_priv *priv = dev_get_priv(dev); + + return pl01x_putc(priv->regs, ch); + } + +-static int pl01x_serial_pending(struct udevice *dev, bool input) ++int pl01x_serial_pending(struct udevice *dev, bool input) + { + struct pl01x_priv *priv = dev_get_priv(dev); + unsigned int fr = readl(&priv->regs->fr); +@@ -324,7 +324,7 @@ static int pl01x_serial_pending(struct udevice *dev, bool input) + return fr & UART_PL01x_FR_TXFF ? 0 : 1; + } + +-const struct dm_serial_ops pl01x_serial_ops = { ++static const struct dm_serial_ops pl01x_serial_ops = { + .putc = pl01x_serial_putc, + .pending = pl01x_serial_pending, + .getc = pl01x_serial_getc, +diff --git a/drivers/serial/serial_pl01x_internal.h b/drivers/serial/serial_pl01x_internal.h +index c56dd54c7b..d4605f24a3 100644 +--- a/drivers/serial/serial_pl01x_internal.h ++++ b/drivers/serial/serial_pl01x_internal.h +@@ -43,7 +43,12 @@ struct pl01x_regs { + + int pl01x_serial_ofdata_to_platdata(struct udevice *dev); + int pl01x_serial_probe(struct udevice *dev); +-extern const struct dm_serial_ops pl01x_serial_ops; ++ ++/* Needed for external pl01x_serial_ops drivers */ ++int pl01x_serial_putc(struct udevice *dev, const char ch); ++int pl01x_serial_pending(struct udevice *dev, bool input); ++int pl01x_serial_getc(struct udevice *dev); ++int pl01x_serial_setbrg(struct udevice *dev, int baudrate); + + struct pl01x_priv { + struct pl01x_regs *regs; diff --git a/uboot-tools.spec b/uboot-tools.spec index a3aa9ee..7e24698 100644 --- a/uboot-tools.spec +++ b/uboot-tools.spec @@ -2,7 +2,7 @@ Name: uboot-tools Version: 2018.03 -Release: 0.9%{?candidate:.%{candidate}}%{?dist} +Release: 0.10%{?candidate:.%{candidate}}%{?dist} Summary: U-Boot utilities License: GPLv2+ BSD LGPL-2.1+ LGPL-2.0+ URL: http://www.denx.de/wiki/U-Boot @@ -288,6 +288,9 @@ cp -p board/warp7/README builds/docs/README.warp7 %endif %changelog +* Thu Mar 8 2018 Peter Robinson 2018.03-0.10.rc4 +- Fix for Raspberry Pi 2 boot + * Wed Mar 7 2018 Peter Robinson 2018.03-0.9.rc4 - 2018.03 RC4 - Fixes for Raspberry Pi 3 boot