so enable the uart only if used so linux can detect the right one enable if it want Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@xxxxxxxxxxxx> --- common/console.c | 6 ++++++ common/console_common.c | 36 ++++++++++++++++++++++++++++++++++++ common/console_simple.c | 3 +++ include/console.h | 4 ++++ 4 files changed, 49 insertions(+) diff --git a/common/console.c b/common/console.c index 56bc864..00fd2cf 100644 --- a/common/console.c +++ b/common/console.c @@ -83,8 +83,14 @@ static int console_std_set(struct device_d *dev, struct param_d *param, if (flag && !cdev->f_active) { /* The device is being activated, set its baudrate */ + if (cdev->startup) + cdev->startup(cdev); if (cdev->setbrg) cdev->setbrg(cdev, cdev->baudrate); + } else if (!flag && cdev->f_active) { + /* The device is being desactivated, shutdown it */ + if (cdev->shutdown) + cdev->shutdown(cdev); } active[i] = 0; diff --git a/common/console_common.c b/common/console_common.c index b18409c..357e002 100644 --- a/common/console_common.c +++ b/common/console_common.c @@ -192,3 +192,39 @@ struct console_device *console_get_by_name(const char *cname) return NULL; } EXPORT_SYMBOL(console_get_by_name); + +int console_open(struct console_device *cdev) +{ + int ret; + + if (cdev->f_active) + return 0; + + if (cdev->startup) { + ret = cdev->startup(cdev); + if (ret) + return ret; + } + + if (cdev->setbrg) { + cdev->baudrate = CONFIG_BAUDRATE; + ret = cdev->setbrg(cdev, cdev->baudrate); + if (ret) { + console_close(cdev); + return ret; + } + } + + return 0; +} +EXPORT_SYMBOL(console_open); + +void console_close(struct console_device *cdev) +{ + if (!cdev->f_active) + return; + + if (cdev->shutdown) + cdev->shutdown(cdev); +} +EXPORT_SYMBOL(console_close); diff --git a/common/console_simple.c b/common/console_simple.c index 6cb72bb..0f83fa4 100644 --- a/common/console_simple.c +++ b/common/console_simple.c @@ -89,6 +89,9 @@ int console_register(struct console_device *newcdev) console_list.prev = console_list.next = &newcdev->list; newcdev->list.prev = newcdev->list.next = &console_list; + if (newcdev->startup) + newcdev->startup(newcdev); + if (newcdev->setbrg) { newcdev->baudrate = CONFIG_BAUDRATE; newcdev->setbrg(newcdev, newcdev->baudrate); diff --git a/include/console.h b/include/console.h index 7d1f5e5..20d9986 100644 --- a/include/console.h +++ b/include/console.h @@ -37,6 +37,8 @@ struct console_device { struct device_d *dev; struct device_d class_dev; + int (*startup)(struct console_device *cdev); + void (*shutdown)(struct console_device *cdev); int (*tstc)(struct console_device *cdev); void (*putc)(struct console_device *cdev, char c); int (*getc)(struct console_device *cdev); @@ -66,5 +68,7 @@ void console_allow_input(bool val); struct console_device *console_get_first_current(void); struct console_device *console_get_by_name(const char *cname); +int console_open(struct console_device *cdev); +void console_close(struct console_device *cdev); #endif -- 1.8.4.rc3 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox