X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fserial%2Fserial_bcm283x_pl011.c;h=7d8ab7b71613a13c07446ba47a3faa59682320d0;hb=2f02845817bec0dd0f89eb0d829b17b40d005afc;hp=bfd39f84f359db784398957eb98468ff93e0cfe3;hpb=f2ee91501892d3280a4c58093ad3a18dccd0b562;p=oweals%2Fu-boot.git diff --git a/drivers/serial/serial_bcm283x_pl011.c b/drivers/serial/serial_bcm283x_pl011.c index bfd39f84f3..7d8ab7b716 100644 --- a/drivers/serial/serial_bcm283x_pl011.c +++ b/drivers/serial/serial_bcm283x_pl011.c @@ -1,7 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2018 Alexander Graf - * - * SPDX-License-Identifier: GPL-2.0+ */ #include @@ -9,6 +8,7 @@ #include #include #include +#include #include "serial_pl01x_internal.h" /* @@ -55,6 +55,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 +89,9 @@ 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, +#if !CONFIG_IS_ENABLED(OF_CONTROL) || CONFIG_IS_ENABLED(OF_BOARD) .flags = DM_FLAG_PRE_RELOC, +#endif .priv_auto_alloc_size = sizeof(struct pl01x_priv), };