diff options
Diffstat (limited to 'drivers/tty/serial/omap-serial.c')
| -rw-r--r-- | drivers/tty/serial/omap-serial.c | 57 |
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 | ||
| 1238 | static 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 | |||
| 1245 | static 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 | |||
| 1252 | static 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 | |||
| 1265 | static 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 | |||
| 1274 | static 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 | |||
| 1287 | OF_EARLYCON_DECLARE(omapserial, "ti,omap2-uart", early_omap_serial_setup); | ||
| 1288 | OF_EARLYCON_DECLARE(omapserial, "ti,omap3-uart", early_omap_serial_setup); | ||
| 1289 | OF_EARLYCON_DECLARE(omapserial, "ti,omap4-uart", early_omap_serial_setup); | ||
| 1290 | #endif /* CONFIG_SERIAL_EARLYCON */ | ||
| 1291 | |||
| 1237 | static struct uart_omap_port *serial_omap_console_ports[OMAP_MAX_HSUART_PORTS]; | 1292 | static struct uart_omap_port *serial_omap_console_ports[OMAP_MAX_HSUART_PORTS]; |
| 1238 | 1293 | ||
| 1239 | static struct uart_driver serial_omap_reg; | 1294 | static 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 | ||
| 1398 | static struct uart_ops serial_omap_pops = { | 1453 | static 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, |
