提交 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)
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);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册