From 95aaf40254b44d614dc2eaca89b31f98598e4f27 Mon Sep 17 00:00:00 2001 From: Andy Shevchenko Date: Mon, 21 Dec 2020 14:30:01 +0200 Subject: [PATCH] console: Keep ->start() and ->stop() balanced There is no need to call ->start() for already started device. All the same, there is no need to call ->stop() for devices still in use. For now enforce this only for IOMUX case. Cc: Simon Glass Signed-off-by: Andy Shevchenko Reviewed-by: Simon Glass --- common/console.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/common/console.c b/common/console.c index 5b113da9d5..92e9bc0ec1 100644 --- a/common/console.c +++ b/common/console.c @@ -237,6 +237,32 @@ static void __maybe_unused console_devices_set(int file, struct stdio_dev *dev) console_devices[file][0] = dev; } +/** + * console_needs_start_stop() - check if we need to start or stop the STDIO device + * @file: STDIO file + * @sdev: STDIO device in question + * + * This function checks if we need to start or stop the stdio device used for + * a console. For IOMUX case it simply enforces one time start and one time + * stop of the device independently of how many STDIO files are using it. In + * other words, we start console once before first STDIO device wants it and + * stop after the last is gone. + */ +static bool console_needs_start_stop(int file, struct stdio_dev *sdev) +{ + int i, j; + + for (i = 0; i < ARRAY_SIZE(cd_count); i++) { + if (i == file) + continue; + + for (j = 0; j < cd_count[i]; j++) + if (console_devices[i][j] == sdev) + return false; + } + return true; +} + /* * This depends on tstc() always being called before getchar(). * This is guaranteed to be true because this routine is called @@ -346,6 +372,11 @@ static void __maybe_unused console_devices_set(int file, struct stdio_dev *dev) { } +static inline bool console_needs_start_stop(int file, struct stdio_dev *sdev) +{ + return true; +} + static inline int console_getc(int file) { return stdio_devices[file]->getc(stdio_devices[file]); @@ -389,6 +420,9 @@ int console_start(int file, struct stdio_dev *sdev) { int error; + if (!console_needs_start_stop(file, sdev)) + return 0; + /* Start new device */ if (sdev->start) { error = sdev->start(sdev); @@ -401,6 +435,9 @@ int console_start(int file, struct stdio_dev *sdev) void console_stop(int file, struct stdio_dev *sdev) { + if (!console_needs_start_stop(file, sdev)) + return; + if (sdev->stop) sdev->stop(sdev); } -- GitLab