aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty/serial/omap-serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty/serial/omap-serial.c')
-rw-r--r--drivers/tty/serial/omap-serial.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index a2a529994ba5..6c6f82ad8d5c 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -1234,6 +1234,61 @@ out:
1234 1234
1235#ifdef CONFIG_SERIAL_OMAP_CONSOLE 1235#ifdef CONFIG_SERIAL_OMAP_CONSOLE
1236 1236
1237#ifdef CONFIG_SERIAL_EARLYCON
1238static unsigned int __init omap_serial_early_in(struct uart_port *port,
1239 int offset)
1240{
1241 offset <<= port->regshift;
1242 return readw(port->membase + offset);
1243}
1244
1245static void __init omap_serial_early_out(struct uart_port *port, int offset,
1246 int value)
1247{
1248 offset <<= port->regshift;
1249 writew(value, port->membase + offset);
1250}
1251
1252static void __init omap_serial_early_putc(struct uart_port *port, int c)
1253{
1254 unsigned int status;
1255
1256 for (;;) {
1257 status = omap_serial_early_in(port, UART_LSR);
1258 if ((status & BOTH_EMPTY) == BOTH_EMPTY)
1259 break;
1260 cpu_relax();
1261 }
1262 omap_serial_early_out(port, UART_TX, c);
1263}
1264
1265static void __init early_omap_serial_write(struct console *console,
1266 const char *s, unsigned int count)
1267{
1268 struct earlycon_device *device = console->data;
1269 struct uart_port *port = &device->port;
1270
1271 uart_console_write(port, s, count, omap_serial_early_putc);
1272}
1273
1274static int __init early_omap_serial_setup(struct earlycon_device *device,
1275 const char *options)
1276{
1277 struct uart_port *port = &device->port;
1278
1279 if (!(device->port.membase || device->port.iobase))
1280 return -ENODEV;
1281
1282 port->regshift = 2;
1283 device->con->write = early_omap_serial_write;
1284 return 0;
1285}
1286
1287OF_EARLYCON_DECLARE(omapserial, "ti,omap2-uart", early_omap_serial_setup);
1288OF_EARLYCON_DECLARE(omapserial, "ti,omap3-uart", early_omap_serial_setup);
1289OF_EARLYCON_DECLARE(omapserial, "ti,omap4-uart", early_omap_serial_setup);
1290#endif /* CONFIG_SERIAL_EARLYCON */
1291
1237static struct uart_omap_port *serial_omap_console_ports[OMAP_MAX_HSUART_PORTS]; 1292static struct uart_omap_port *serial_omap_console_ports[OMAP_MAX_HSUART_PORTS];
1238 1293
1239static struct uart_driver serial_omap_reg; 1294static struct uart_driver serial_omap_reg;
@@ -1395,7 +1450,7 @@ serial_omap_config_rs485(struct uart_port *port, struct serial_rs485 *rs485)
1395 return 0; 1450 return 0;
1396} 1451}
1397 1452
1398static struct uart_ops serial_omap_pops = { 1453static const struct uart_ops serial_omap_pops = {
1399 .tx_empty = serial_omap_tx_empty, 1454 .tx_empty = serial_omap_tx_empty,
1400 .set_mctrl = serial_omap_set_mctrl, 1455 .set_mctrl = serial_omap_set_mctrl,
1401 .get_mctrl = serial_omap_get_mctrl, 1456 .get_mctrl = serial_omap_get_mctrl,