diff options
-rw-r--r-- | common/console.c | 37 | ||||
-rw-r--r-- | include/console.h | 3 |
2 files changed, 35 insertions, 5 deletions
diff --git a/common/console.c b/common/console.c index 53030b5856..7e3be8cad8 100644 --- a/common/console.c +++ b/common/console.c @@ -138,29 +138,56 @@ static const char *console_active_get(struct device_d *dev, return cdev->active; } -static int console_baudrate_set(struct param_d *param, void *priv) +int console_set_baudrate(struct console_device *cdev, unsigned baudrate) { - struct console_device *cdev = priv; + int ret; unsigned char c; + if (!cdev->setbrg) + return -ENOSYS; + + if (cdev->baudrate == baudrate) + return 0; + /* * If the device is already active, change its baudrate. * The baudrate of an inactive device will be set at activation time. */ if (cdev->f_active) { printf("## Switch baudrate to %d bps and press ENTER ...\n", - cdev->baudrate); + baudrate); mdelay(50); - cdev->setbrg(cdev, cdev->baudrate); + } + + ret = cdev->setbrg(cdev, baudrate); + if (ret) + return ret; + + if (cdev->f_active) { mdelay(50); do { c = getc(); } while (c != '\r' && c != '\n'); } + cdev->baudrate = baudrate; + cdev->baudrate_param = baudrate; + return 0; } +unsigned console_get_baudrate(struct console_device *cdev) +{ + return cdev->baudrate; +} + +static int console_baudrate_set(struct param_d *param, void *priv) +{ + struct console_device *cdev = priv; + + return console_set_baudrate(cdev, cdev->baudrate_param); +} + static void console_init_early(void) { kfifo_init(console_input_fifo, console_input_buffer, @@ -230,7 +257,7 @@ int console_register(struct console_device *newcdev) if (newcdev->setbrg) { newcdev->baudrate = CONFIG_BAUDRATE; dev_add_param_int(dev, "baudrate", console_baudrate_set, - NULL, &newcdev->baudrate, "%u", newcdev); + NULL, &newcdev->baudrate_param, "%u", newcdev); } if (newcdev->putc && !newcdev->puts) diff --git a/include/console.h b/include/console.h index f7055e6394..36dee9a3cc 100644 --- a/include/console.h +++ b/include/console.h @@ -55,6 +55,7 @@ struct console_device { char active[4]; unsigned int baudrate; + unsigned int baudrate_param; const char *linux_console_name; }; @@ -78,5 +79,7 @@ struct console_device *console_get_first_active(void); int console_set_active(struct console_device *cdev, unsigned active); unsigned console_get_active(struct console_device *cdev); +int console_set_baudrate(struct console_device *cdev, unsigned baudrate); +unsigned console_get_baudrate(struct console_device *cdev); #endif |