aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
authorAnton Vorontsov <anton.vorontsov@linaro.org>2012-09-24 17:27:53 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-09-26 16:47:02 -0400
commitc7f3e7087ab0abb52bb1286010f2c104fd38ca5c (patch)
tree322207554769abe35110e41a4de93aa273b8c901 /drivers/tty
parent729043e82cdd403a131127254528afea8031ebab (diff)
tty/serial/core: Introduce poll_init callback
It was noticed that polling drivers (like KGDB) are not able to use serial ports if the ports were not previously initialized via console. I.e. when booting with console=ttyAMA0 kgdboc=ttyAMA0, everything works fine, but with console=ttyFOO kgdboc=ttyAMA0, the kgdboc doesn't work. This is because we don't initialize the hardware. Calling ->startup() is not an option, because drivers request interrupts there, and drivers fail to handle situations when tty isn't opened with interrupts enabled. So, we have to implement a new callback (actually, tty_ops already have a similar callback), which does everything needed to initialize just the hardware. Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org> Acked-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/serial/serial_core.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 78036c510ccc..0fcfd98a9566 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -2129,6 +2129,7 @@ static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2129 int bits = 8; 2129 int bits = 8;
2130 int parity = 'n'; 2130 int parity = 'n';
2131 int flow = 'n'; 2131 int flow = 'n';
2132 int ret;
2132 2133
2133 if (!state || !state->uart_port) 2134 if (!state || !state->uart_port)
2134 return -1; 2135 return -1;
@@ -2137,6 +2138,22 @@ static int uart_poll_init(struct tty_driver *driver, int line, char *options)
2137 if (!(port->ops->poll_get_char && port->ops->poll_put_char)) 2138 if (!(port->ops->poll_get_char && port->ops->poll_put_char))
2138 return -1; 2139 return -1;
2139 2140
2141 if (port->ops->poll_init) {
2142 struct tty_port *tport = &state->port;
2143
2144 ret = 0;
2145 mutex_lock(&tport->mutex);
2146 /*
2147 * We don't set ASYNCB_INITIALIZED as we only initialized the
2148 * hw, e.g. state->xmit is still uninitialized.
2149 */
2150 if (!test_bit(ASYNCB_INITIALIZED, &tport->flags))
2151 ret = port->ops->poll_init(port);
2152 mutex_unlock(&tport->mutex);
2153 if (ret)
2154 return ret;
2155 }
2156
2140 if (options) { 2157 if (options) {
2141 uart_parse_options(options, &baud, &parity, &bits, &flow); 2158 uart_parse_options(options, &baud, &parity, &bits, &flow);
2142 return uart_set_options(port, NULL, baud, parity, bits, flow); 2159 return uart_set_options(port, NULL, baud, parity, bits, flow);