rk30: add serial support
author黄涛 <huangtao@rock-chips.com>
Tue, 7 Feb 2012 10:49:15 +0000 (18:49 +0800)
committer黄涛 <huangtao@rock-chips.com>
Tue, 7 Feb 2012 10:49:15 +0000 (18:49 +0800)
drivers/tty/serial/Kconfig
drivers/tty/serial/rk_serial.c

index f94445822a1ac02ee72f418358d35abe18c97acf..33703784f78f98a47abd0d6da2e85393bdba6767 100644 (file)
@@ -1513,52 +1513,52 @@ config SERIAL_BCM63XX_CONSOLE
          you can make it the console by answering Y to this option.
 
 config SERIAL_RK29
-       bool "RockChip rk29 serial port support"
-       depends on ARM && ARCH_RK29
+       bool "RockChip RK29/RK30 serial port support"
+       depends on ARCH_RK29 || ARCH_RK30
        select SERIAL_CORE
 
 config UART0_RK29
-       bool "RockChip rk29 serial port 0 support"
+       bool "Serial port 0 support"
        depends on SERIAL_RK29
 
 config UART0_CTS_RTS_RK29
-       bool "RockChip rk29 serial port 0 CTS/RTS support"
+       bool "Serial port 0 CTS/RTS support"
        depends on UART0_RK29
 
 config UART0_DMA_RK29
-       bool "RockChip rk29 serial port 0 DMA support (EXPERIMENTAL)"
+       bool "Serial port 0 DMA support (EXPERIMENTAL)"
        depends on UART0_RK29
 
 config UART1_RK29
-       bool "RockChip rk29 serial port 1 support"
+       bool "Serial port 1 support"
        depends on SERIAL_RK29
 
 config UART2_RK29
-       bool "RockChip rk29 serial port 2 support"
+       bool "Serial port 2 support"
        depends on SERIAL_RK29
 
 config UART2_CTS_RTS_RK29
-       bool "RockChip rk29 serial port 2 CTS/RTS support"
+       bool "Serial port 2 CTS/RTS support"
        depends on UART2_RK29
 
 config UART2_DMA_RK29
-       bool "RockChip rk29 serial port 2 DMA support (EXPERIMENTAL)"
+       bool "Serial port 2 DMA support (EXPERIMENTAL)"
        depends on UART2_RK29
 
 config UART3_RK29
-       bool "RockChip rk29 serial port 3 support"
+       bool "Serial port 3 support"
        depends on SERIAL_RK29
 
 config UART3_CTS_RTS_RK29
-       bool "RockChip rk29 serial port 3 CTS/RTS support"
+       bool "Serial port 3 CTS/RTS support"
        depends on UART3_RK29
 
 config UART3_DMA_RK29
-       bool "RockChip rk29 serial port 3 DMA support (EXPERIMENTAL)"
+       bool "Serial port 3 DMA support (EXPERIMENTAL)"
        depends on UART3_RK29
 
 config SERIAL_RK29_CONSOLE
-       bool "Rockchip rk29 serial console support"
+       bool "Serial console support"
        depends on SERIAL_RK29=y
        select SERIAL_CORE_CONSOLE
 
index 91f35d1669e78ba555798cb21f2e13766ee6d304..6d169c9c947c2e21dd9fb5bbc553882545c71fe8 100644 (file)
@@ -45,7 +45,6 @@
 #include <linux/clk.h>\r
 #include <linux/timer.h>\r
 #include <linux/workqueue.h>\r
-#include <mach/rk29-dma-pl330.h>\r
 #include <linux/dma-mapping.h>\r
 \r
 #include <asm/io.h>\r
 \r
 #define UART1_USE_DMA CLOSE_DMA\r
 \r
+#define USE_DMA (UART0_USE_DMA | UART1_USE_DMA | UART2_USE_DMA | UART3_USE_DMA)\r
+#if USE_DMA\r
+#include <mach/dma-pl330.h>\r
+#endif\r
+\r
 #define DMA_TX_TRRIGE_LEVEL 30\r
 \r
 #define USE_TIMER 1           // use timer for dma transport\r
@@ -130,6 +134,7 @@ static void dbg(const char *fmt, ...)
 #endif\r
 \r
 \r
+#if USE_DMA\r
 /* added by hhb@rock-chips.com for uart dma transfer */\r
 \r
 struct rk29_uart_dma_t {\r
@@ -158,6 +163,7 @@ struct rk29_uart_dma_t {
        int                     rx_timeout;\r
 \r
 };\r
+#endif\r
 \r
 struct uart_rk_port {\r
        struct uart_port        port;\r
@@ -188,19 +194,25 @@ struct uart_rk_port {
        struct work_struct uart_work;\r
        struct work_struct uart_work_rx;\r
        struct workqueue_struct *uart_wq;\r
+#if USE_DMA\r
        struct rk29_uart_dma_t *prk29_uart_dma_t;\r
+#endif\r
 };\r
 \r
+#if USE_DMA\r
 static void serial_rk_release_dma_tx(struct uart_port *port);\r
 static int serial_rk_start_tx_dma(struct uart_port *port);\r
 static void serial_rk_rx_timeout(unsigned long uart);\r
 static void serial_rk_release_dma_rx(struct uart_port *port);\r
 static int serial_rk_start_rx_dma(struct uart_port *port);\r
+#else\r
+static inline int serial_rk_start_tx_dma(struct uart_port *port) { return 0; }\r
+#endif\r
 static int serial_rk_startup(struct uart_port *port);\r
 static inline unsigned int serial_in(struct uart_rk_port *up, int offset)\r
 {\r
        offset = offset << 2;\r
-       return readb(up->port.membase + offset);\r
+       return __raw_readb(up->port.membase + offset);\r
 }\r
 \r
 /* Save the LCR value so it can be re-written when a Busy Detect IRQ occurs. */\r
@@ -221,7 +233,8 @@ static inline void dwapb_check_clear_ier(struct uart_rk_port *up, int offset)
 static inline void serial_out(struct uart_rk_port *up, int offset, unsigned char value)\r
 {\r
        dwapb_save_out_value(up, offset, value);\r
-       writeb(value, up->port.membase + (offset << 2));\r
+       __raw_writeb(value, up->port.membase + (offset << 2));\r
+       dsb();\r
        dwapb_check_clear_ier(up, offset);\r
 }\r
 \r
@@ -344,11 +357,13 @@ static void serial_rk_stop_tx(struct uart_port *port)
 {\r
        struct uart_rk_port *up =\r
                container_of(port, struct uart_rk_port, port);\r
+#if USE_DMA\r
        struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;\r
 \r
        if(OPEN_DMA == prk29_uart_dma_t->use_dma){\r
                serial_rk_release_dma_tx(port);\r
        }\r
+#endif\r
        __stop_tx(up);\r
 }\r
 \r
@@ -370,11 +385,13 @@ static void serial_rk_stop_rx(struct uart_port *port)
 {\r
        struct uart_rk_port *up =\r
                container_of(port, struct uart_rk_port, port);\r
+#if USE_DMA\r
        struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;\r
 \r
        if(OPEN_DMA == prk29_uart_dma_t->use_dma){\r
                serial_rk_release_dma_rx(port);\r
        }\r
+#endif\r
        up->ier &= ~UART_IER_RLSI;\r
        up->port.read_status_mask &= ~UART_LSR_DR;\r
        serial_out(up, UART_IER, up->ier);\r
@@ -395,6 +412,7 @@ static void serial_rk_enable_ms(struct uart_port *port)
 }\r
 \r
 \r
+#if USE_DMA\r
 /*\r
  * Start transmitting by dma.\r
  */\r
@@ -758,6 +776,7 @@ static void serial_rk_start_dma_rx(struct work_struct *work)
                                        container_of(work, struct uart_rk_port, uart_work_rx);\r
        serial_rk_start_rx_dma(&up->port);\r
 }\r
+#endif /* USE_DMA */\r
 \r
 \r
 \r
@@ -916,6 +935,7 @@ static void serial_rk_handle_port(struct uart_rk_port *up)
        status = serial_in(up, UART_LSR);\r
 \r
        DEBUG_INTR("status = %x...", status);\r
+#if USE_DMA\r
        /* DMA mode enable */\r
        if(up->prk29_uart_dma_t->use_dma == 1) {\r
 \r
@@ -934,7 +954,9 @@ static void serial_rk_handle_port(struct uart_rk_port *up)
                        }\r
                }\r
 \r
-       }else {   //dma mode disable\r
+       } else\r
+#endif\r
+       {       //dma mode disable\r
 \r
                /*\r
                 * when uart receive a serial of data which doesn't have stop bit and so on, that causes frame error,and\r
@@ -1223,6 +1245,7 @@ static int serial_rk_startup(struct uart_port *port)
        up->msr_saved_flags = 0;\r
 #endif\r
 \r
+#if USE_DMA\r
        if (1 == up->prk29_uart_dma_t->use_dma) {\r
 \r
                if(up->port.state->xmit.buf != up->prk29_uart_dma_t->tx_buffer){\r
@@ -1239,7 +1262,9 @@ static int serial_rk_startup(struct uart_port *port)
 #endif\r
                up->port_activity = jiffies;\r
 \r
-       }else{\r
+       } else\r
+#endif /* USE_DMA */\r
+       {\r
                up->ier = 0;\r
                serial_out(up, UART_IER, up->ier);\r
        }\r
@@ -1367,11 +1392,13 @@ serial_rk_set_termios(struct uart_port *port, struct ktermios *termios,
                fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;\r
        }\r
        else{\r
+#if USE_DMA\r
                //added by hhb@rock-chips.com\r
                if(up->prk29_uart_dma_t->use_timer == 1){\r
                        fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_01;\r
-               }\r
-               else{\r
+               } else\r
+#endif\r
+               {\r
                        fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | UART_FCR_T_TRIG_01;\r
                }\r
        }\r
@@ -1728,13 +1755,17 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
 \r
        sprintf(up->name, "rk29_serial.%d", pdev->id);\r
        up->pdev = pdev;\r
+#ifdef CONFIG_ARCH_RK29\r
        up->clk = clk_get(&pdev->dev, "uart");\r
        if (unlikely(IS_ERR(up->clk))) {\r
                ret = PTR_ERR(up->clk);\r
                goto do_free;\r
        }\r
+#endif\r
        up->tx_loadsz = 30;\r
+#if USE_DMA\r
        up->prk29_uart_dma_t = &rk29_uart_ports_dma_t[pdev->id];\r
+#endif\r
        up->port.dev = &pdev->dev;\r
        up->port.type = PORT_RK;\r
        up->port.irq = irq;\r
@@ -1754,6 +1785,7 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
        up->port.irqflags = IRQF_DISABLED;\r
        up->port.uartclk = clk_get_rate(up->clk);\r
 \r
+#if USE_DMA\r
        /* set dma config */\r
        if(1 == up->prk29_uart_dma_t->use_dma) {\r
                pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);\r
@@ -1801,6 +1833,7 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
                up->ier |= THRE_MODE;                   // enable THRE interrupt mode\r
                serial_out(up, UART_IER, up->ier);\r
        }\r
+#endif\r
 \r
        serial_rk_add_console_port(up);\r
        ret = uart_add_one_port(&serial_rk_reg, &up->port);\r
@@ -1877,7 +1910,7 @@ static struct platform_driver serial_rk_driver = {
        .suspend        = serial_rk_suspend,\r
        .resume         = serial_rk_resume,\r
        .driver         = {\r
-#if defined(CONFIG_SERIAL_RK29)\r
+#if defined(CONFIG_ARCH_RK29)\r
                .name   = "rk29_serial",\r
 #elif defined(CONFIG_SERIAL_RK2818)\r
                .name   = "rk2818_serial",\r