summaryrefslogtreecommitdiff
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.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c
index 3009a8909cc..9b19ae172c3 100644
--- a/drivers/tty/serial/omap-serial.c
+++ b/drivers/tty/serial/omap-serial.c
@@ -1109,7 +1109,14 @@ serial_omap_pm(struct uart_port *port, unsigned int state,
pm_runtime_mark_last_busy(up->dev);
pm_runtime_put_autosuspend(up->dev);
}
+static void serial_omap_wake_peer(struct uart_port *port)
+{
+ struct uart_omap_port *up = to_uart_omap_port(port);
+ struct omap_uart_port_info *pdata = up->dev->platform_data;
+ if (pdata->wake_peer)
+ pdata->wake_peer(port);
+}
static void serial_omap_release_port(struct uart_port *port)
{
dev_dbg(port->dev, "serial_omap_release_port+\n");
@@ -1341,6 +1348,7 @@ static struct uart_ops serial_omap_pops = {
.shutdown = serial_omap_shutdown,
.set_termios = serial_omap_set_termios,
.pm = serial_omap_pm,
+ .wake_peer = serial_omap_wake_peer,
.type = serial_omap_type,
.release_port = serial_omap_release_port,
.request_port = serial_omap_request_port,
@@ -1860,6 +1868,39 @@ static void __exit serial_omap_exit(void)
uart_unregister_driver(&serial_omap_reg);
}
+/* Used by ext client device connected to uart to control uart */
+int omap_serial_ext_uart_enable(u8 port_id)
+{
+ struct uart_omap_port *up;
+ int err = 0;
+
+ if (port_id > OMAP_MAX_HSUART_PORTS) {
+ pr_err("Invalid Port_id %d passed to %s\n", port_id, __func__);
+ err = -ENODEV;
+ } else {
+ up = ui[port_id];
+ pm_runtime_get_sync(up->dev);
+ }
+ return err;
+}
+
+int omap_serial_ext_uart_disable(u8 port_id)
+{
+ struct uart_omap_port *up;
+ int err = 0;
+
+ if (port_id > OMAP_MAX_HSUART_PORTS) {
+ pr_err("Invalid Port_id %d passed to %s\n", port_id, __func__);
+ err = -ENODEV;
+ } else {
+ up = ui[port_id];
+ pm_runtime_mark_last_busy(up->dev);
+ pm_runtime_put_autosuspend(up->dev);
+ }
+ return err;
+}
+
+
module_init(serial_omap_init);
module_exit(serial_omap_exit);