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:
parent
d908766208
commit
241c6a017b
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue