提交 95aaf402 编写于 作者: A Andy Shevchenko 提交者: Tom Rini

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 <sjg@chromium.org>
Signed-off-by: NAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: NSimon Glass <sjg@chromium.org>
上级 41f668b9
...@@ -237,6 +237,32 @@ static void __maybe_unused console_devices_set(int file, struct stdio_dev *dev) ...@@ -237,6 +237,32 @@ static void __maybe_unused console_devices_set(int file, struct stdio_dev *dev)
console_devices[file][0] = 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 depends on tstc() always being called before getchar().
* This is guaranteed to be true because this routine is called * 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) ...@@ -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) static inline int console_getc(int file)
{ {
return stdio_devices[file]->getc(stdio_devices[file]); return stdio_devices[file]->getc(stdio_devices[file]);
...@@ -389,6 +420,9 @@ int console_start(int file, struct stdio_dev *sdev) ...@@ -389,6 +420,9 @@ int console_start(int file, struct stdio_dev *sdev)
{ {
int error; int error;
if (!console_needs_start_stop(file, sdev))
return 0;
/* Start new device */ /* Start new device */
if (sdev->start) { if (sdev->start) {
error = sdev->start(sdev); error = sdev->start(sdev);
...@@ -401,6 +435,9 @@ int console_start(int file, struct stdio_dev *sdev) ...@@ -401,6 +435,9 @@ int console_start(int file, struct stdio_dev *sdev)
void console_stop(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) if (sdev->stop)
sdev->stop(sdev); sdev->stop(sdev);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册