dm: console/serial: fix flushc() doesn't work

fixes: c1e72b20c9
(dm: console/serial: add flushc() support)

Change-Id: I0e0fae58b23bad52b4377d00e89f1b055d39f187
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2019-07-30 15:10:15 +08:00 committed by Jianhong Chen
parent 09d1ed2844
commit a581116483
2 changed files with 21 additions and 5 deletions

View File

@ -54,6 +54,11 @@ static int nulldev_input(struct stdio_dev *dev)
/* nulldev is empty! */ /* nulldev is empty! */
return 0; return 0;
} }
static void nulldev_clear(struct stdio_dev *dev)
{
/* nulldev is empty! */
}
#endif #endif
static void stdio_serial_putc(struct stdio_dev *dev, const char c) static void stdio_serial_putc(struct stdio_dev *dev, const char c)
@ -76,6 +81,11 @@ static int stdio_serial_tstc(struct stdio_dev *dev)
return serial_tstc(); return serial_tstc();
} }
static void stdio_serial_clear(struct stdio_dev *dev)
{
serial_clear();
}
/************************************************************************** /**************************************************************************
* SYSTEM DRIVERS * SYSTEM DRIVERS
************************************************************************** **************************************************************************
@ -93,6 +103,7 @@ static void drv_system_init (void)
dev.puts = stdio_serial_puts; dev.puts = stdio_serial_puts;
dev.getc = stdio_serial_getc; dev.getc = stdio_serial_getc;
dev.tstc = stdio_serial_tstc; dev.tstc = stdio_serial_tstc;
dev.clear = stdio_serial_clear;
stdio_register (&dev); stdio_register (&dev);
#ifdef CONFIG_SYS_DEVICE_NULLDEV #ifdef CONFIG_SYS_DEVICE_NULLDEV
@ -104,6 +115,7 @@ static void drv_system_init (void)
dev.puts = nulldev_puts; dev.puts = nulldev_puts;
dev.getc = nulldev_input; dev.getc = nulldev_input;
dev.tstc = nulldev_input; dev.tstc = nulldev_input;
dev.clear = nulldev_clear;
stdio_register (&dev); stdio_register (&dev);
#endif #endif

View File

@ -201,6 +201,14 @@ static int __serial_tstc(struct udevice *dev)
return 1; return 1;
} }
static void __serial_clear(struct udevice *dev)
{
struct dm_serial_ops *ops = serial_get_ops(dev);
if (ops->clear)
ops->clear(dev);
}
#if CONFIG_IS_ENABLED(SERIAL_RX_BUFFER) #if CONFIG_IS_ENABLED(SERIAL_RX_BUFFER)
static int _serial_tstc(struct udevice *dev) static int _serial_tstc(struct udevice *dev)
{ {
@ -281,14 +289,10 @@ void serial_setbrg(void)
void serial_clear(void) void serial_clear(void)
{ {
struct dm_serial_ops *ops;
if (!gd->cur_serial_dev) if (!gd->cur_serial_dev)
return; return;
ops = serial_get_ops(gd->cur_serial_dev); __serial_clear(gd->cur_serial_dev);
if (ops->setbrg)
ops->clear(gd->cur_serial_dev);
} }
void serial_stdio_init(void) void serial_stdio_init(void)