diff options
author | Simon Glass <sjg@chromium.org> | 2017-07-27 09:31:04 -0600 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2017-07-31 12:21:40 -0400 |
commit | 7b3c4c3a5305c68a7de2444f555ac7241d6fdb8e (patch) | |
tree | 8d8d971ef07cc5f8c3d5096f9061eee71e0c6d7a | |
parent | 42f9f915c2b7aeac222c93a7f7085d9838722efc (diff) |
dm: console: Check for serial devices properly
With driver model the serial device is often not called "serial". Mark
driver-model stdio devices so that they can be detected and we can look up
the uclass. This is a more reliable way of finding out whether the console
is connected to a serial device or not.
Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r-- | common/console.c | 11 | ||||
-rw-r--r-- | drivers/serial/serial-uclass.c | 2 | ||||
-rw-r--r-- | include/stdio_dev.h | 1 |
3 files changed, 12 insertions, 2 deletions
diff --git a/common/console.c b/common/console.c index b7ed9a3b9de..ec4af3bd90d 100644 --- a/common/console.c +++ b/common/console.c @@ -8,6 +8,7 @@ #include <common.h> #include <console.h> #include <debug_uart.h> +#include <dm.h> #include <stdarg.h> #include <iomux.h> #include <malloc.h> @@ -150,12 +151,20 @@ static int console_setfile(int file, struct stdio_dev * dev) * console_dev_is_serial() - Check if a stdio device is a serial device * * @sdev: Device to check - * @return true if this device is a serial device + * @return true if this device is in the serial uclass (or for pre-driver-model, + * whether it is called "serial". */ static bool console_dev_is_serial(struct stdio_dev *sdev) { bool is_serial; +#ifdef CONFIG_DM_SERIAL + if (sdev->flags & DEV_FLAGS_DM) { + struct udevice *dev = sdev->priv; + + is_serial = device_get_uclass_id(dev) == UCLASS_SERIAL; + } else +#endif is_serial = !strcmp(sdev->name, "serial"); return is_serial; diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index 9cae9fbd871..998d372da6b 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -353,7 +353,7 @@ static int serial_post_probe(struct udevice *dev) memset(&sdev, '\0', sizeof(sdev)); strncpy(sdev.name, dev->name, sizeof(sdev.name)); - sdev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT; + sdev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_DM; sdev.priv = dev; sdev.putc = serial_stub_putc; sdev.puts = serial_stub_puts; diff --git a/include/stdio_dev.h b/include/stdio_dev.h index e4fc8b138b4..3164fa2a557 100644 --- a/include/stdio_dev.h +++ b/include/stdio_dev.h @@ -16,6 +16,7 @@ #define DEV_FLAGS_INPUT 0x00000001 /* Device can be used as input console */ #define DEV_FLAGS_OUTPUT 0x00000002 /* Device can be used as output console */ +#define DEV_FLAGS_DM 0x00000004 /* Device priv is a struct udevice * */ /* Device information */ struct stdio_dev { |