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
#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
#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
int rx_timeout;\r
\r
};\r
+#endif\r
\r
struct uart_rk_port {\r
struct uart_port port;\r
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
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
{\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
{\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
}\r
\r
\r
+#if USE_DMA\r
/*\r
* Start transmitting by dma.\r
*/\r
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
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
}\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
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
#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
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
\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
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
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
.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