aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Thompson <daniel.thompson@linaro.org>2014-06-05 10:48:11 +0100
committerDaniel Thompson <daniel.thompson@linaro.org>2014-10-20 13:26:59 +0100
commit5ed7c2c21cbf12476d55c0d5ae9a5737ebeac0da (patch)
tree64b570667b946d2078f6f7c60ded9b0e5c391767
parent77cdb782dabb5882ac15d233c44d0dab5f8301e7 (diff)
downloadlinux-5ed7c2c21cbf12476d55c0d5ae9a5737ebeac0da.tar.gz
serial: asc: Add support for KGDB's FIQ/NMI mode
Add a .poll_init() function that enables UART RX and registers the UART's irq with KGDB. By providing this information to KGDB the serial driver offers "permission" for KGDB to route the UART interrupt signal from the drivers own handler to KGDBs FIQ handler (which will eventually use the UART's polled I/O callbacks to interact with the user). Note that the RX is not only enabled but also unmasked. This is required because otherwise the FIQ handler could never trigger. This unmask is copied from similar code in amba-pl011.c . Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org> Cc: Srinivas Kandagatla <srinivas.kandagatla@gmail.com> Cc: Maxime Coquelin <maxime.coquelin@st.com> Cc: Patrice Chotard <patrice.chotard@st.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jiri Slaby <jslaby@suse.cz> Cc: kernel@stlinux.com Cc: linux-serial@vger.kernel.org
-rw-r--r--drivers/tty/serial/st-asc.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/tty/serial/st-asc.c b/drivers/tty/serial/st-asc.c
index a3165842ca29..f9dcf86a1546 100644
--- a/drivers/tty/serial/st-asc.c
+++ b/drivers/tty/serial/st-asc.c
@@ -30,6 +30,7 @@
#include <linux/of_platform.h>
#include <linux/serial_core.h>
#include <linux/clk.h>
+#include <linux/kgdb.h>
#define DRIVER_NAME "st-asc"
#define ASC_SERIAL_NAME "ttyAS"
@@ -615,6 +616,25 @@ asc_verify_port(struct uart_port *port, struct serial_struct *ser)
}
#ifdef CONFIG_CONSOLE_POLL
+
+#ifdef CONFIG_KGDB_FIQ
+/*
+ * Prepare the UART to be used from kgdb's NMI support.
+ */
+static int asc_poll_init(struct uart_port *port)
+{
+ struct asc_port *ascport = container_of(port, struct asc_port, port);
+
+ /* register the FIQ with kgdb */
+ kgdb_register_fiq(ascport->port.irq);
+
+ /* enable RX interrupts in case the interrupt is used for NMI entry. */
+ asc_enable_rx_interrupts(port);
+
+ return 0;
+}
+#endif /* CONFIG_KGDB_FIQ */
+
/*
* Console polling routines for writing and reading from the uart while
* in an interrupt or debug context (i.e. kgdb).
@@ -657,6 +677,9 @@ static struct uart_ops asc_uart_ops = {
.verify_port = asc_verify_port,
.pm = asc_pm,
#ifdef CONFIG_CONSOLE_POLL
+#ifdef CONFIG_KGDB_FIQ
+ .poll_init = asc_poll_init,
+#endif /* CONFIG_KGDB_FIQ */
.poll_get_char = asc_get_poll_char,
.poll_put_char = asc_put_poll_char,
#endif /* CONFIG_CONSOLE_POLL */