update serial for poll read and write
author林辉辉 <lhh@rock-chips.com>
Fri, 14 May 2010 09:57:38 +0000 (09:57 +0000)
committer黄涛 <huangtao@rock-chips.com>
Mon, 21 Jun 2010 05:34:54 +0000 (13:34 +0800)
drivers/serial/rk2818_serial.c

index 7dbb6a832a077d3777b0fa40f251dc38deb4ec7c..002e4e227f719702a89e095a2e1e45a4ba498376 100644 (file)
@@ -436,6 +436,26 @@ static int rk2818_serial_verify_port(struct uart_port *port, struct serial_struc
        return ret;
 }
 
+#ifdef CONFIG_CONSOLE_POLL
+/*
+ * Console polling routines for writing and reading from the uart while
+ * in an interrupt or debug context.
+ */
+
+static int rk2818_serial_poll_get_char(struct uart_port *port)
+{
+       while (!((rk2818_uart_read(port, UART_USR) & UART_RECEIVE_FIFO_NOT_EMPTY) == UART_RECEIVE_FIFO_NOT_EMPTY))
+               barrier();
+       return rk2818_uart_read(port, UART_RBR);
+}
+
+static void rk2818_serial_poll_put_char(struct uart_port *port, unsigned char c)
+{
+       while (!(rk2818_uart_read(port, UART_USR) & UART_TRANSMIT_FIFO_NOT_FULL))
+               barrier();
+       rk2818_uart_write(port, c, UART_THR);
+}
+#endif /* CONFIG_CONSOLE_POLL */
 
 static struct uart_ops rk2818_uart_pops = {
        .tx_empty = rk2818_serial_tx_empty,
@@ -455,6 +475,10 @@ static struct uart_ops rk2818_uart_pops = {
        .config_port = rk2818_serial_config_port,
        .verify_port = rk2818_serial_verify_port,
        .pm = rk2818_serial_pm,
+#ifdef CONFIG_CONSOLE_POLL
+       .poll_get_char = rk2818_serial_poll_get_char,
+       .poll_put_char = rk2818_serial_poll_put_char,
+#endif
 };
 
 
@@ -667,8 +691,11 @@ static void __exit rk2818_serial_exit(void)
        uart_unregister_driver(&rk2818_uart_driver);
 }
 
-
-module_init(rk2818_serial_init);
+/*
+ * While this can be a module, if builtin it's most likely the console
+ * So let's leave module_exit but move module_init to an earlier place
+ */
+arch_initcall(rk2818_serial_init);
 module_exit(rk2818_serial_exit);
 
 MODULE_AUTHOR("lhh lhh@rock-chips.com");