summaryrefslogtreecommitdiff
path: root/drivers/serial/serial-uclass.c
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2022-04-15 08:04:16 -0400
committerTom Rini <trini@konsulko.com>2022-04-15 08:04:16 -0400
commit74ae732d80f54540d3a244e0e28e66d263e6a57e (patch)
treee0ac006d78607573b9e00c1213a8e7bb56cf15a0 /drivers/serial/serial-uclass.c
parent42a2d90cf51acea56bf19006ed5688c93c099ff0 (diff)
parentb8617df6d5c8afb74ae8bb4b732a8b56b4f5e9ee (diff)
Merge branch '2022-04-14-assorted-updates'
- Apple M1 Ultra support, TI power domain fix, atsha204a big endian support, LED cleanups and support for default-state, increase malloc pool on sandbox, ubifs bugfix, further serial cleanup / semihost support, fix a few cases around enabling/disabling FS support in SPL, clean up duplication of table_compute_checksum()
Diffstat (limited to 'drivers/serial/serial-uclass.c')
-rw-r--r--drivers/serial/serial-uclass.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
index 10d6b800e2f..30650e37b0d 100644
--- a/drivers/serial/serial-uclass.c
+++ b/drivers/serial/serial-uclass.c
@@ -198,6 +198,22 @@ static void _serial_putc(struct udevice *dev, char ch)
} while (err == -EAGAIN);
}
+static int __serial_puts(struct udevice *dev, const char *str, size_t len)
+{
+ struct dm_serial_ops *ops = serial_get_ops(dev);
+
+ do {
+ ssize_t written = ops->puts(dev, str, len);
+
+ if (written < 0)
+ return written;
+ str += written;
+ len -= written;
+ } while (len);
+
+ return 0;
+}
+
static void _serial_puts(struct udevice *dev, const char *str)
{
struct dm_serial_ops *ops = serial_get_ops(dev);
@@ -210,19 +226,15 @@ static void _serial_puts(struct udevice *dev, const char *str)
do {
const char *newline = strchrnul(str, '\n');
- size_t len = newline - str + !!*newline;
+ size_t len = newline - str;
- do {
- ssize_t written = ops->puts(dev, str, len);
+ if (__serial_puts(dev, str, len))
+ return;
- if (written < 0)
- return;
- str += written;
- len -= written;
- } while (len);
+ if (*newline && __serial_puts(dev, "\r\n", 2))
+ return;
- if (*newline)
- _serial_putc(dev, '\r');
+ str += len + !!*newline;
} while (*str);
}