mirror of
https://xff.cz/git/u-boot/
synced 2025-09-26 13:01:17 +02:00
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: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
committed by
Tom Rini
parent
41f668b97c
commit
95aaf40254
@@ -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)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user