9
0
Fork 0

console: Add puts callback to console devices

Some devices may have a much more efficient way to output strings
rather than single characters. Let console devices implement a
callback for this.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2014-06-04 09:17:31 +02:00
parent d908766208
commit 241c6a017b
2 changed files with 30 additions and 0 deletions

View File

@ -162,6 +162,22 @@ static void console_set_stdoutpath(struct console_device *cdev)
free(str);
}
static int __console_puts(struct console_device *cdev, const char *s)
{
int n = 0;
while (*s) {
if (*s == '\n') {
cdev->putc(cdev, '\r');
n++;
}
cdev->putc(cdev, *s);
n++;
s++;
}
return n;
}
int console_register(struct console_device *newcdev)
{
struct device_d *dev = &newcdev->class_dev;
@ -182,6 +198,9 @@ int console_register(struct console_device *newcdev)
NULL, &newcdev->baudrate, "%u", newcdev);
}
if (newcdev->putc && !newcdev->puts)
newcdev->puts = __console_puts;
dev_add_param(dev, "active", console_std_set, NULL, 0);
if (IS_ENABLED(CONFIG_CONSOLE_ACTIVATE_FIRST)) {
@ -342,9 +361,19 @@ EXPORT_SYMBOL(console_putc);
int console_puts(unsigned int ch, const char *str)
{
struct console_device *cdev;
const char *s = str;
int n = 0;
if (initialized == CONSOLE_INIT_FULL) {
for_each_console(cdev) {
if (cdev->f_active & ch) {
n = cdev->puts(cdev, str);
}
}
return n;
}
while (*s) {
if (*s == '\n') {
console_putc(ch, '\r');

View File

@ -39,6 +39,7 @@ struct console_device {
int (*tstc)(struct console_device *cdev);
void (*putc)(struct console_device *cdev, char c);
int (*puts)(struct console_device *cdev, const char *s);
int (*getc)(struct console_device *cdev);
int (*setbrg)(struct console_device *cdev, int baudrate);
void (*flush)(struct console_device *cdev);