Mxuart patch

Document created by jesseg Employee on Aug 23, 2012Last modified by Jodi Paul on Mar 7, 2013
Version 2Show Document
  • View in full screen mode

This patch implements (or exposes) routines to poll the imx uarts. The KGDB drivers need these methods to be implemented or the ttymxc driver is not sufficient. The synthetic CONFIG_CONSOLE_POLL value activates these routines (or CONFIG_SERIAL_MXC_CONSOLE for the polled write). There is still no poll routines in -855-ge067785, which is the September 2010 Linux release from Freescale. Also not in Linux 2.6.36 drivers/serial/imx.c either.

$ git diff drivers/serial/mxc_uart.c 
diff --git a/drivers/serial/mxc_uart.c b/drivers/serial/mxc_uart.c 
index ae6d2e1..728b607 100644 
--- a/drivers/serial/mxc_uart.c 
+++ b/drivers/serial/mxc_uart.c 
@@ -1551,6 +1551,28 @@ mxcuart_pm(struct uart_port *port, unsigned int state, unsigned int oldstate) 
                            clk_enable(umxc->clk); 
   }  +#ifdef CONFIG_CONSOLE_POLL 
+/* 
+ * Read a character from the UART. 
+ */ 
+static inline int mxcuart_console_read_char(struct uart_port *port) 
+{ 
+       volatile unsigned int status; 
+    int ch; 
+ 
+       do { 
+               status = readl(port->membase + MXC_UARTUSR2); 
+       } while ((status & MXC_UARTUSR2_RDR) == 0); 
+       ch = readl(port->membase + MXC_UARTURXD); 
+/* Ignore parity errors, etc. */ 
+/*  status = ch | UART_CREAD_BIT; */ 
+    ch &= 0xff; 
+ 
+    return ch; 
+} 
+static void mxcuart_console_write_char(struct uart_port *port, char ch); 
+#endif 
+ 
   /*! 
    * This structure contains the pointers to the control functions that are 
    * invoked by the core serial driver to access the UART hardware. The 
@@ -1575,14 +1597,18 @@ static struct uart_ops mxc_ops = { 
                .config_port = mxcuart_config_port, 
                .verify_port = mxcuart_verify_port, 
                .send_xchar = mxcuart_send_xchar, 
+#ifdef CONFIG_CONSOLE_POLL 
+              .poll_put_char = mxcuart_console_write_char, 
+              .poll_get_char = mxcuart_console_read_char, 
+#endif 
};  

-#ifdef CONFIG_SERIAL_MXC_CONSOLE 
+#if defined(CONFIG_SERIAL_MXC_CONSOLE) || defined (CONFIG_CONSOLE_POLL)  

   /* 
    * Write out a character once the UART is ready 
    */ 
-static inline void mxcuart_console_write_char(struct uart_port *port, char ch) 
+static void mxcuart_console_write_char(struct uart_port *port, char ch) 
   { 
           volatile unsigned int status;  

@@ -1592,6 +1618,10 @@ static inline void mxcuart_console_write_char(struct uart_port *port, char ch) 
               writel(ch, port->membase + MXC_UARTUTXD); 
    }  

+#endif 
+ 
+#ifdef CONFIG_SERIAL_MXC_CONSOLE 
+ 
   /*! 
    * This function is called to write the console messages through the UART port. 
    * 


Attachments

    Outcomes