1*359fb3f8SBin Meng // SPDX-License-Identifier: GPL-2.0
2*359fb3f8SBin Meng /*
3*359fb3f8SBin Meng  * Copyright (C) 2012 ARM Ltd.
4*359fb3f8SBin Meng  * Author: Marc Zyngier <marc.zyngier@arm.com>
5*359fb3f8SBin Meng  *
6*359fb3f8SBin Meng  * Adapted for ARM and earlycon:
7*359fb3f8SBin Meng  * Copyright (C) 2014 Linaro Ltd.
8*359fb3f8SBin Meng  * Author: Rob Herring <robh@kernel.org>
9*359fb3f8SBin Meng  */
10*359fb3f8SBin Meng #include <linux/kernel.h>
11*359fb3f8SBin Meng #include <linux/console.h>
12*359fb3f8SBin Meng #include <linux/init.h>
13*359fb3f8SBin Meng #include <linux/serial_core.h>
14*359fb3f8SBin Meng #include <asm/semihost.h>
15*359fb3f8SBin Meng 
smh_write(struct console * con,const char * s,unsigned n)16*359fb3f8SBin Meng static void smh_write(struct console *con, const char *s, unsigned n)
17*359fb3f8SBin Meng {
18*359fb3f8SBin Meng 	struct earlycon_device *dev = con->data;
19*359fb3f8SBin Meng 	uart_console_write(&dev->port, s, n, smh_putc);
20*359fb3f8SBin Meng }
21*359fb3f8SBin Meng 
22*359fb3f8SBin Meng static int
early_smh_setup(struct earlycon_device * device,const char * opt)23*359fb3f8SBin Meng __init early_smh_setup(struct earlycon_device *device, const char *opt)
24*359fb3f8SBin Meng {
25*359fb3f8SBin Meng 	device->con->write = smh_write;
26*359fb3f8SBin Meng 	return 0;
27*359fb3f8SBin Meng }
28*359fb3f8SBin Meng EARLYCON_DECLARE(smh, early_smh_setup);
29