2 * Driver for RK-UART controller.
\r
3 * Based on drivers/tty/serial/8250.c
\r
5 * Copyright (C) 2011 Rochchip.
\r
7 * This program is free software; you can redistribute it and/or modify
\r
8 * it under the terms of the GNU General Public License as published by
\r
9 * the Free Software Foundation; either version 2 of the License, or
\r
11 * (at your option) any later version.
\r
13 * Author: hhb@rock-chips.com
\r
17 #ifndef CONFIG_SERIAL_RK_CONSOLE
\r
18 #if defined(CONFIG_SERIAL_RK29_CONSOLE)
\r
19 #define CONFIG_SERIAL_RK_CONSOLE
\r
23 #if defined(CONFIG_SERIAL_RK_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
\r
24 #define SUPPORT_SYSRQ
\r
28 #include <linux/module.h>
\r
29 #include <linux/ioport.h>
\r
30 #include <linux/init.h>
\r
31 #include <linux/console.h>
\r
32 #include <linux/sysrq.h>
\r
33 #include <linux/delay.h>
\r
34 #include <linux/platform_device.h>
\r
35 #include <linux/tty.h>
\r
36 #include <linux/ratelimit.h>
\r
37 #include <linux/tty_flip.h>
\r
38 #include <linux/serial_reg.h>
\r
39 #include <linux/serial_core.h>
\r
40 #include <linux/serial.h>
\r
41 #include <linux/serial_8250.h>
\r
42 #include <linux/nmi.h>
\r
43 #include <linux/mutex.h>
\r
44 #include <linux/slab.h>
\r
45 #include <linux/clk.h>
\r
46 #include <linux/timer.h>
\r
47 #include <linux/workqueue.h>
\r
48 #include <linux/dma-mapping.h>
\r
51 #include <asm/irq.h>
\r
55 #define UART_USR 0x1F /* UART Status Register */
\r
56 #define UART_USR_BUSY (1)
\r
57 #define UART_IER_PTIME 0x80 /* Programmable THRE Interrupt Mode Enable */
\r
58 #define UART_LSR_RFE 0x80 /* receive fifo error */
\r
59 #define UART_SRR 0x22 /* software reset register */
\r
60 #define UART_RESET 0x01
\r
61 #define RX_TIMEOUT (3000*10) //uint ms
\r
63 #define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
\r
65 #define UART_NR 4 //uart port number
\r
66 #define POWER_MANEGEMENT 1
\r
68 /* configurate whether the port transmit-receive by DMA */
\r
72 #ifdef CONFIG_UART0_DMA_RK29
\r
73 #define UART0_USE_DMA OPEN_DMA
\r
75 #define UART0_USE_DMA CLOSE_DMA
\r
78 #ifdef CONFIG_UART2_DMA_RK29
\r
79 #define UART2_USE_DMA OPEN_DMA
\r
81 #define UART2_USE_DMA CLOSE_DMA
\r
84 #ifdef CONFIG_UART3_DMA_RK29
\r
85 #define UART3_USE_DMA OPEN_DMA
\r
87 #define UART3_USE_DMA CLOSE_DMA
\r
90 #define UART1_USE_DMA CLOSE_DMA
\r
92 #define USE_DMA (UART0_USE_DMA | UART1_USE_DMA | UART2_USE_DMA | UART3_USE_DMA)
\r
94 #ifdef CONFIG_ARCH_RK29
\r
95 #include <mach/dma-pl330.h>
\r
97 #include <plat/dma-pl330.h>
\r
101 #define DMA_TX_TRRIGE_LEVEL 30
\r
103 #define USE_TIMER 1 // use timer for dma transport
\r
104 #define THRE_MODE 0X00 //0yhh
\r
106 static struct uart_driver serial_rk_reg;
\r
111 #define DBG_PORT 1 //DBG_PORT which uart is used to print log message
\r
113 #ifdef CONFIG_SERIAL_CORE_CONSOLE
\r
114 #define uart_console(port) ((port)->cons && (port)->cons->index == (port)->line)
\r
116 #define uart_console(port) (0)
\r
121 extern void printascii(const char *);
\r
122 static void dbg(const char *fmt, ...)
\r
128 vsprintf(buff, fmt, va);
\r
135 #define DEBUG_INTR(fmt...) if (!uart_console(&up->port)) dbg(fmt)
\r
137 #define DEBUG_INTR(fmt...) do { } while (0)
\r
142 /* added by hhb@rock-chips.com for uart dma transfer */
\r
144 struct rk29_uart_dma_t {
\r
145 u32 use_dma; //1:used
\r
147 enum dma_ch rx_dmach;
\r
148 enum dma_ch tx_dmach;
\r
151 spinlock_t tx_lock;
\r
152 spinlock_t rx_lock;
\r
155 dma_addr_t rx_phy_addr;
\r
156 dma_addr_t tx_phy_addr;
\r
157 u32 rx_buffer_size;
\r
158 u32 tx_buffer_size;
\r
165 /* timer to poll activity on rx dma */
\r
166 struct timer_list rx_timer;
\r
172 struct uart_rk_port {
\r
173 struct uart_port port;
\r
174 struct platform_device *pdev;
\r
177 unsigned int tx_loadsz; /* transmit fifo load size */
\r
184 * Some bits in registers are cleared on a read, so they must
\r
185 * be saved whenever the register is read but the bits will not
\r
186 * be immediately processed.
\r
188 #define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
\r
189 unsigned char lsr_saved_flags;
\r
191 #define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
\r
192 unsigned char msr_saved_flags;
\r
198 unsigned long port_activity;
\r
199 struct work_struct uart_work;
\r
200 struct work_struct uart_work_rx;
\r
201 struct workqueue_struct *uart_wq;
\r
203 struct rk29_uart_dma_t *prk29_uart_dma_t;
\r
208 static void serial_rk_release_dma_tx(struct uart_port *port);
\r
209 static int serial_rk_start_tx_dma(struct uart_port *port);
\r
210 static void serial_rk_rx_timeout(unsigned long uart);
\r
211 static void serial_rk_release_dma_rx(struct uart_port *port);
\r
212 static int serial_rk_start_rx_dma(struct uart_port *port);
\r
214 static inline int serial_rk_start_tx_dma(struct uart_port *port) { return 0; }
\r
216 static int serial_rk_startup(struct uart_port *port);
\r
217 static inline unsigned int serial_in(struct uart_rk_port *up, int offset)
\r
219 offset = offset << 2;
\r
220 return __raw_readb(up->port.membase + offset);
\r
223 /* Save the LCR value so it can be re-written when a Busy Detect IRQ occurs. */
\r
224 static inline void dwapb_save_out_value(struct uart_rk_port *up, int offset,
\r
225 unsigned char value)
\r
227 if (offset == UART_LCR)
\r
231 /* Read the IER to ensure any interrupt is cleared before returning from ISR. */
\r
232 static inline void dwapb_check_clear_ier(struct uart_rk_port *up, int offset)
\r
234 if (offset == UART_TX || offset == UART_IER)
\r
235 serial_in(up, UART_IER);
\r
238 static inline void serial_out(struct uart_rk_port *up, int offset, unsigned char value)
\r
240 dwapb_save_out_value(up, offset, value);
\r
241 __raw_writeb(value, up->port.membase + (offset << 2));
\r
242 if (offset != UART_TX)
\r
244 dwapb_check_clear_ier(up, offset);
\r
247 /* Uart divisor latch read */
\r
248 static inline int serial_dl_read(struct uart_rk_port *up)
\r
250 return serial_in(up, UART_DLL) | serial_in(up, UART_DLM) << 8;
\r
253 /* Uart divisor latch write */
\r
254 static int serial_dl_write(struct uart_rk_port *up, unsigned int value)
\r
256 unsigned int tmout = 100;
\r
257 if(up->port.line != DBG_PORT)
\r
259 while(!(serial_in(up, UART_LCR) & UART_LCR_DLAB)){
\r
261 dbg("set serial.%d baudrate fail with DLAB not set\n", up->port.line);
\r
267 while(serial_in(up, UART_USR) & UART_USR_BUSY){
\r
269 dbg("set serial.%d baudrate timeout\n", up->port.line);
\r
275 serial_out(up, UART_DLL, value & 0xff);
\r
276 serial_out(up, UART_DLM, value >> 8 & 0xff);
\r
282 static int serial_lcr_write(struct uart_rk_port *up, unsigned char value)
\r
284 unsigned int tmout = 15000;
\r
286 if(up->port.line != DBG_PORT)
\r
288 while(serial_in(up, UART_USR) & UART_USR_BUSY){
\r
291 dbg("set serial.%d lc r = 0x%02x timeout\n", up->port.line, value);
\r
298 serial_out(up, UART_LCR, value);
\r
303 static inline void serial_rk_enable_ier_thri(struct uart_rk_port *up)
\r
305 if (!(up->ier & UART_IER_THRI)) {
\r
306 up->ier |= UART_IER_THRI;
\r
307 serial_out(up, UART_IER, up->ier);
\r
312 static inline void serial_rk_disable_ier_thri(struct uart_rk_port *up)
\r
314 if (up->ier & UART_IER_THRI) {
\r
315 up->ier &= ~UART_IER_THRI;
\r
316 serial_out(up, UART_IER, up->ier);
\r
320 static int rk29_uart_dump_register(struct uart_rk_port *up){
\r
322 unsigned int reg_value = 0;
\r
324 reg_value = serial_in(up, UART_IER);
\r
325 dbg("UART_IER = 0x%0x\n", reg_value);
\r
326 reg_value = serial_in(up, UART_IIR);
\r
327 dbg("UART_IIR = 0x%0x\n", reg_value);
\r
328 reg_value = serial_in(up, UART_LSR);
\r
329 dbg("UART_LSR = 0x%0x\n", reg_value);
\r
330 reg_value = serial_in(up, UART_MSR);
\r
331 dbg("UART_MSR = 0x%0x\n", reg_value);
\r
332 reg_value = serial_in(up, UART_MCR);
\r
333 dbg("UART_MCR = 0x%0x\n", reg_value);
\r
334 reg_value = serial_in(up, 0x21);
\r
335 dbg("UART_RFL = 0x%0x\n", reg_value);
\r
336 reg_value = serial_in(up, UART_LCR);
\r
337 dbg("UART_LCR = 0x%0x\n", reg_value);
\r
346 static void serial_rk_clear_fifos(struct uart_rk_port *up)
\r
348 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO);
\r
349 serial_out(up, UART_FCR, UART_FCR_ENABLE_FIFO |
\r
350 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
\r
351 serial_out(up, UART_FCR, 0);
\r
354 static inline void __stop_tx(struct uart_rk_port *p)
\r
356 if (p->ier & UART_IER_THRI) {
\r
357 p->ier &= ~UART_IER_THRI;
\r
358 serial_out(p, UART_IER, p->ier);
\r
362 static void serial_rk_stop_tx(struct uart_port *port)
\r
364 struct uart_rk_port *up =
\r
365 container_of(port, struct uart_rk_port, port);
\r
367 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
369 if(OPEN_DMA == prk29_uart_dma_t->use_dma){
\r
370 serial_rk_release_dma_tx(port);
\r
377 static void serial_rk_start_tx(struct uart_port *port)
\r
379 struct uart_rk_port *up =
\r
380 container_of(port, struct uart_rk_port, port);
\r
383 if(0 == serial_rk_start_tx_dma(port)){
\r
384 serial_rk_enable_ier_thri(up);
\r
390 static void serial_rk_stop_rx(struct uart_port *port)
\r
392 struct uart_rk_port *up =
\r
393 container_of(port, struct uart_rk_port, port);
\r
395 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
397 if(OPEN_DMA == prk29_uart_dma_t->use_dma){
\r
398 serial_rk_release_dma_rx(port);
\r
401 up->ier &= ~UART_IER_RLSI;
\r
402 up->port.read_status_mask &= ~UART_LSR_DR;
\r
403 serial_out(up, UART_IER, up->ier);
\r
407 static void serial_rk_enable_ms(struct uart_port *port)
\r
409 /* no MSR capabilities */
\r
411 struct uart_rk_port *up =
\r
412 container_of(port, struct uart_rk_port, port);
\r
414 dev_dbg(port->dev, "%s\n", __func__);
\r
415 up->ier |= UART_IER_MSI;
\r
416 serial_out(up, UART_IER, up->ier);
\r
423 * Start transmitting by dma.
\r
425 #define DMA_SERIAL_BUFFER_SIZE UART_XMIT_SIZE
\r
427 /* added by hhb@rock-chips.com for uart dma transfer*/
\r
428 static struct rk29_uart_dma_t rk29_uart_ports_dma_t[] = {
\r
429 {UART0_USE_DMA, 0, DMACH_UART0_RX, DMACH_UART0_TX},
\r
430 {UART1_USE_DMA, 0, DMACH_UART1_RX, DMACH_UART1_TX},
\r
431 {UART2_USE_DMA, 0, DMACH_UART2_RX, DMACH_UART2_TX},
\r
432 {UART3_USE_DMA, 0, DMACH_UART3_RX, DMACH_UART3_TX},
\r
436 /* DMAC PL330 add by hhb@rock-chips.com */
\r
437 static struct rk29_dma_client rk29_uart_dma_client = {
\r
438 .name = "rk29xx-uart-dma",
\r
443 static void serial_rk_release_dma_tx(struct uart_port *port)
\r
445 struct uart_rk_port *up =
\r
446 container_of(port, struct uart_rk_port, port);
\r
447 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
451 if(prk29_uart_dma_t && prk29_uart_dma_t->tx_dma_inited) {
\r
452 rk29_dma_free(prk29_uart_dma_t->tx_dmach, &rk29_uart_dma_client);
\r
453 prk29_uart_dma_t->tx_dma_inited = 0;
\r
457 /*this function will be called every time after rk29_dma_enqueue() be invoked*/
\r
458 static void serial_rk_dma_txcb(void *buf, int size, enum rk29_dma_buffresult result) {
\r
459 struct uart_port *port = buf;
\r
460 struct uart_rk_port *up = container_of(port, struct uart_rk_port, port);
\r
461 struct circ_buf *xmit = &port->state->xmit;
\r
463 if(result != RK29_RES_OK){
\r
467 port->icount.tx += size;
\r
468 xmit->tail = (xmit->tail + size) & (UART_XMIT_SIZE - 1);
\r
470 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
\r
471 uart_write_wakeup(&up->port);
\r
472 spin_lock(&(up->prk29_uart_dma_t->tx_lock));
\r
473 up->prk29_uart_dma_t->tx_dma_used = 0;
\r
474 spin_unlock(&(up->prk29_uart_dma_t->tx_lock));
\r
475 if (!uart_circ_empty(xmit)) {
\r
476 serial_rk_start_tx_dma(port);
\r
479 up->port_activity = jiffies;
\r
480 // dev_info(up->port.dev, "s:%d\n", size);
\r
483 static int serial_rk_init_dma_tx(struct uart_port *port) {
\r
485 struct uart_rk_port *up =
\r
486 container_of(port, struct uart_rk_port, port);
\r
487 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
488 if(!port || !prk29_uart_dma_t){
\r
489 dev_info(up->port.dev, "serial_rk_init_dma_tx fail\n");
\r
493 if(prk29_uart_dma_t->tx_dma_inited) {
\r
497 if (rk29_dma_request(prk29_uart_dma_t->tx_dmach, &rk29_uart_dma_client, NULL) == -EBUSY) {
\r
498 dev_info(up->port.dev, "rk29_dma_request tx fail\n");
\r
502 if (rk29_dma_set_buffdone_fn(prk29_uart_dma_t->tx_dmach, serial_rk_dma_txcb)) {
\r
503 dev_info(up->port.dev, "rk29_dma_set_buffdone_fn tx fail\n");
\r
506 if (rk29_dma_devconfig(prk29_uart_dma_t->tx_dmach, RK29_DMASRC_MEM, (unsigned long)(port->iobase + UART_TX))) {
\r
507 dev_info(up->port.dev, "rk29_dma_devconfig tx fail\n");
\r
510 if (rk29_dma_config(prk29_uart_dma_t->tx_dmach, 1, 1)) {
\r
511 dev_info(up->port.dev, "rk29_dma_config tx fail\n");
\r
515 prk29_uart_dma_t->tx_dma_inited = 1;
\r
516 dev_info(up->port.dev, "serial_rk_init_dma_tx sucess\n");
\r
521 static int serial_rk_start_tx_dma(struct uart_port *port)
\r
524 struct circ_buf *xmit = &port->state->xmit;
\r
525 struct uart_rk_port *up = container_of(port, struct uart_rk_port, port);
\r
526 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
528 if(0 == prk29_uart_dma_t->use_dma){
\r
532 if(-1 == serial_rk_init_dma_tx(port)){
\r
536 if (1 == prk29_uart_dma_t->tx_dma_used){
\r
539 if(!uart_circ_empty(xmit)){
\r
540 if (rk29_dma_enqueue(prk29_uart_dma_t->tx_dmach, port,
\r
541 prk29_uart_dma_t->tx_phy_addr + xmit->tail,
\r
542 CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE))) {
\r
546 rk29_dma_ctrl(prk29_uart_dma_t->tx_dmach, RK29_DMAOP_START);
\r
547 spin_lock(&(prk29_uart_dma_t->tx_lock));
\r
548 up->prk29_uart_dma_t->tx_dma_used = 1;
\r
549 spin_unlock(&(prk29_uart_dma_t->tx_lock));
\r
553 dev_info(up->port.dev, "-serial_rk_start_tx_dma-error-\n");
\r
561 static void serial_rk_dma_rxcb(void *buf, int size, enum rk29_dma_buffresult result) {
\r
566 static void serial_rk_release_dma_rx(struct uart_port *port)
\r
568 struct uart_rk_port *up =
\r
569 container_of(port, struct uart_rk_port, port);
\r
570 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
574 if(prk29_uart_dma_t && prk29_uart_dma_t->rx_dma_inited) {
\r
575 del_timer(&prk29_uart_dma_t->rx_timer);
\r
576 rk29_dma_free(prk29_uart_dma_t->rx_dmach, &rk29_uart_dma_client);
\r
577 prk29_uart_dma_t->rb_pre_pos = 0;
\r
578 prk29_uart_dma_t->rx_dma_inited = 0;
\r
579 prk29_uart_dma_t->rx_dma_start = 0;
\r
584 static int serial_rk_init_dma_rx(struct uart_port *port) {
\r
586 struct uart_rk_port *up =
\r
587 container_of(port, struct uart_rk_port, port);
\r
588 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
589 if(!port || !prk29_uart_dma_t){
\r
590 dev_info(up->port.dev, "serial_rk_init_dma_rx: port fail\n");
\r
593 if(prk29_uart_dma_t->rx_dma_inited) {
\r
597 if (rk29_dma_request(prk29_uart_dma_t->rx_dmach, &rk29_uart_dma_client, NULL) == -EBUSY) {
\r
598 dev_info(up->port.dev, "rk29_dma_request fail rx \n");
\r
602 if (rk29_dma_set_buffdone_fn(prk29_uart_dma_t->rx_dmach, serial_rk_dma_rxcb)) {
\r
603 dev_info(up->port.dev, "rk29_dma_set_buffdone_fn rx fail\n");
\r
606 if (rk29_dma_devconfig(prk29_uart_dma_t->rx_dmach, RK29_DMASRC_HW, (unsigned long)(port->iobase + UART_RX))) {
\r
607 dev_info(up->port.dev, "rk29_dma_devconfig rx fail\n");
\r
611 if (rk29_dma_config(prk29_uart_dma_t->rx_dmach, 1, 1)) {
\r
612 dev_info(up->port.dev, "rk29_dma_config rx fail\n");
\r
616 rk29_dma_setflags(prk29_uart_dma_t->rx_dmach, RK29_DMAF_CIRCULAR);
\r
618 prk29_uart_dma_t->rx_dma_inited = 1;
\r
619 dev_info(up->port.dev, "serial_rk_init_dma_rx sucess\n");
\r
624 static int serial_rk_start_rx_dma(struct uart_port *port)
\r
626 struct uart_rk_port *up =
\r
627 container_of(port, struct uart_rk_port, port);
\r
628 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
629 if(0 == prk29_uart_dma_t->use_dma){
\r
633 if(prk29_uart_dma_t->rx_dma_start == 1){
\r
637 if(-1 == serial_rk_init_dma_rx(port)){
\r
638 dev_info(up->port.dev, "*******serial_rk_init_dma_rx*******error*******\n");
\r
642 if (rk29_dma_enqueue(prk29_uart_dma_t->rx_dmach, (void *)up, prk29_uart_dma_t->rx_phy_addr,
\r
643 prk29_uart_dma_t->rx_buffer_size/2)) {
\r
644 dev_info(up->port.dev, "*******rk29_dma_enqueue fail*****\n");
\r
648 if (rk29_dma_enqueue(prk29_uart_dma_t->rx_dmach, (void *)up,
\r
649 prk29_uart_dma_t->rx_phy_addr+prk29_uart_dma_t->rx_buffer_size/2,
\r
650 prk29_uart_dma_t->rx_buffer_size/2)) {
\r
651 dev_info(up->port.dev, "*******rk29_dma_enqueue fail*****\n");
\r
655 rk29_dma_ctrl(prk29_uart_dma_t->rx_dmach, RK29_DMAOP_START);
\r
656 prk29_uart_dma_t->rx_dma_start = 1;
\r
657 if(prk29_uart_dma_t->use_timer == 1){
\r
658 mod_timer(&prk29_uart_dma_t->rx_timer, jiffies +
\r
659 msecs_to_jiffies(prk29_uart_dma_t->rx_timeout));
\r
661 up->port_activity = jiffies;
\r
665 static void serial_rk_update_rb_addr(struct uart_rk_port *up){
\r
666 dma_addr_t current_pos = 0;
\r
667 dma_addr_t rx_current_pos = 0;
\r
668 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
669 spin_lock(&(up->prk29_uart_dma_t->rx_lock));
\r
670 rk29_dma_getposition(prk29_uart_dma_t->rx_dmach, ¤t_pos, &rx_current_pos);
\r
672 prk29_uart_dma_t->rb_cur_pos = (rx_current_pos - prk29_uart_dma_t->rx_phy_addr);
\r
673 prk29_uart_dma_t->rx_size = CIRC_CNT(prk29_uart_dma_t->rb_cur_pos,
\r
674 prk29_uart_dma_t->rb_pre_pos, prk29_uart_dma_t->rx_buffer_size);
\r
676 spin_unlock(&(up->prk29_uart_dma_t->rx_lock));
\r
679 static void serial_rk_report_dma_rx(unsigned long uart)
\r
681 struct uart_rk_port *up = (struct uart_rk_port *)uart;
\r
682 struct rk29_uart_dma_t *prk29_uart_dma_t = up->prk29_uart_dma_t;
\r
683 if(prk29_uart_dma_t->use_timer == 1){
\r
684 serial_rk_update_rb_addr(up);
\r
686 if(prk29_uart_dma_t->rx_size > 0) {
\r
687 spin_lock(&(up->prk29_uart_dma_t->rx_lock));
\r
689 if(prk29_uart_dma_t->rb_cur_pos > prk29_uart_dma_t->rb_pre_pos){
\r
690 tty_insert_flip_string(up->port.state->port.tty, prk29_uart_dma_t->rx_buffer
\r
691 + prk29_uart_dma_t->rb_pre_pos, prk29_uart_dma_t->rx_size);
\r
692 tty_flip_buffer_push(up->port.state->port.tty);
\r
694 else if(prk29_uart_dma_t->rb_cur_pos < prk29_uart_dma_t->rb_pre_pos){
\r
696 tty_insert_flip_string(up->port.state->port.tty, prk29_uart_dma_t->rx_buffer
\r
697 + prk29_uart_dma_t->rb_pre_pos, CIRC_CNT_TO_END(prk29_uart_dma_t->rb_cur_pos,
\r
698 prk29_uart_dma_t->rb_pre_pos, prk29_uart_dma_t->rx_buffer_size));
\r
699 tty_flip_buffer_push(up->port.state->port.tty);
\r
701 if(prk29_uart_dma_t->rb_cur_pos != 0){
\r
702 tty_insert_flip_string(up->port.state->port.tty, prk29_uart_dma_t->rx_buffer,
\r
703 prk29_uart_dma_t->rb_cur_pos);
\r
704 tty_flip_buffer_push(up->port.state->port.tty);
\r
708 prk29_uart_dma_t->rb_pre_pos = (prk29_uart_dma_t->rb_pre_pos + prk29_uart_dma_t->rx_size)
\r
709 & (prk29_uart_dma_t->rx_buffer_size - 1);
\r
710 up->port.icount.rx += prk29_uart_dma_t->rx_size;
\r
711 spin_unlock(&(up->prk29_uart_dma_t->rx_lock));
\r
712 prk29_uart_dma_t->rx_timeout = 7;
\r
713 up->port_activity = jiffies;
\r
718 if (jiffies_to_msecs(jiffies - up->port_activity) < RX_TIMEOUT) {
\r
719 if(prk29_uart_dma_t->use_timer == 1){
\r
720 mod_timer(&prk29_uart_dma_t->rx_timer, jiffies + msecs_to_jiffies(prk29_uart_dma_t->rx_timeout));
\r
727 prk29_uart_dma_t->rx_timeout = 20;
\r
728 mod_timer(&prk29_uart_dma_t->rx_timer, jiffies + msecs_to_jiffies(prk29_uart_dma_t->rx_timeout));
\r
730 // serial_out(up, 0x2a, 0x01);
\r
731 serial_rk_release_dma_rx(&up->port);
\r
732 serial_out(up, 0x2a, 0x01);
\r
733 up->ier |= (UART_IER_RDI | UART_IER_RLSI);
\r
734 serial_out(up, UART_IER, up->ier);
\r
735 // serial_out(up, 0x22, 0x01);
\r
736 dev_info(up->port.dev, "*****enable recv int*****\n");
\r
738 //serial_rk_start_rx_dma(&up->port);
\r
744 if(prk29_uart_dma_t->use_timer == 1){
\r
745 mod_timer(&prk29_uart_dma_t->rx_timer, jiffies + msecs_to_jiffies(prk29_uart_dma_t->rx_timeout));
\r
751 static void serial_rk_rx_timeout(unsigned long uart)
\r
753 struct uart_rk_port *up = (struct uart_rk_port *)uart;
\r
755 //serial_rk_report_dma_rx(up);
\r
756 queue_work(up->uart_wq, &up->uart_work);
\r
759 static void serial_rk_report_revdata_workfunc(struct work_struct *work)
\r
761 struct uart_rk_port *up =
\r
762 container_of(work, struct uart_rk_port, uart_work);
\r
763 serial_rk_report_dma_rx((unsigned long)up);
\r
764 spin_lock(&(up->prk29_uart_dma_t->rx_lock));
\r
766 if(up->prk29_uart_dma_t->use_timer == 1){
\r
769 tty_insert_flip_string(up->port.state->port.tty, up->fifo, up->fifo_size);
\r
770 tty_flip_buffer_push(up->port.state->port.tty);
\r
771 up->port.icount.rx += up->fifo_size;
\r
774 spin_unlock(&(up->prk29_uart_dma_t->rx_lock));
\r
779 static void serial_rk_start_dma_rx(struct work_struct *work)
\r
781 struct uart_rk_port *up =
\r
782 container_of(work, struct uart_rk_port, uart_work_rx);
\r
783 serial_rk_start_rx_dma(&up->port);
\r
785 #endif /* USE_DMA */
\r
790 receive_chars(struct uart_rk_port *up, unsigned int *status)
\r
792 struct tty_struct *tty = up->port.state->port.tty;
\r
793 unsigned char ch, lsr = *status;
\r
794 int max_count = 256;
\r
798 if (likely(lsr & UART_LSR_DR)){
\r
799 ch = serial_in(up, UART_RX);
\r
803 * Intel 82571 has a Serial Over Lan device that will
\r
804 * set UART_LSR_BI without setting UART_LSR_DR when
\r
805 * it receives a break. To avoid reading from the
\r
806 * receive buffer without UART_LSR_DR bit set, we
\r
807 * just force the read character to be 0
\r
812 up->port.icount.rx++;
\r
814 lsr |= up->lsr_saved_flags;
\r
815 up->lsr_saved_flags = 0;
\r
817 if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
\r
819 * For statistics only
\r
821 if (lsr & UART_LSR_BI) {
\r
822 lsr &= ~(UART_LSR_FE | UART_LSR_PE);
\r
823 up->port.icount.brk++;
\r
825 * We do the SysRQ and SAK checking
\r
826 * here because otherwise the break
\r
827 * may get masked by ignore_status_mask
\r
828 * or read_status_mask.
\r
830 if (uart_handle_break(&up->port))
\r
832 } else if (lsr & UART_LSR_PE)
\r
833 up->port.icount.parity++;
\r
834 else if (lsr & UART_LSR_FE)
\r
835 up->port.icount.frame++;
\r
836 if (lsr & UART_LSR_OE)
\r
837 up->port.icount.overrun++;
\r
841 * Mask off conditions which should be ignored.
\r
843 lsr &= up->port.read_status_mask;
\r
845 if (lsr & UART_LSR_BI) {
\r
846 DEBUG_INTR("handling break....");
\r
848 } else if (lsr & UART_LSR_PE)
\r
850 else if (lsr & UART_LSR_FE)
\r
853 if (uart_handle_sysrq_char(&up->port, ch))
\r
856 uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
\r
859 lsr = serial_in(up, UART_LSR);
\r
860 } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
\r
861 spin_unlock(&up->port.lock);
\r
862 tty_flip_buffer_push(tty);
\r
863 spin_lock(&up->port.lock);
\r
867 static void transmit_chars(struct uart_rk_port *up)
\r
869 struct circ_buf *xmit = &up->port.state->xmit;
\r
872 if (up->port.x_char) {
\r
873 serial_out(up, UART_TX, up->port.x_char);
\r
874 up->port.icount.tx++;
\r
875 up->port.x_char = 0;
\r
878 if (uart_tx_stopped(&up->port)) {
\r
882 if (uart_circ_empty(xmit)) {
\r
887 count = up->tx_loadsz;
\r
889 serial_out(up, UART_TX, xmit->buf[xmit->tail]);
\r
890 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
\r
891 up->port.icount.tx++;
\r
892 if (uart_circ_empty(xmit))
\r
894 } while (--count > 0);
\r
896 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
\r
897 uart_write_wakeup(&up->port);
\r
899 DEBUG_INTR("THRE...");
\r
901 if (uart_circ_empty(xmit))
\r
905 static unsigned int check_modem_status(struct uart_rk_port *up)
\r
907 unsigned int status = serial_in(up, UART_MSR);
\r
910 status |= up->msr_saved_flags;
\r
911 up->msr_saved_flags = 0;
\r
912 if (status & UART_MSR_ANY_DELTA && up->ier & UART_IER_MSI &&
\r
913 up->port.state != NULL) {
\r
914 if (status & UART_MSR_TERI)
\r
915 up->port.icount.rng++;
\r
916 if (status & UART_MSR_DDSR)
\r
917 up->port.icount.dsr++;
\r
918 if (status & UART_MSR_DDCD)
\r
919 uart_handle_dcd_change(&up->port, status & UART_MSR_DCD);
\r
920 if (status & UART_MSR_DCTS)
\r
921 uart_handle_cts_change(&up->port, status & UART_MSR_CTS);
\r
923 wake_up_interruptible(&up->port.state->port.delta_msr_wait);
\r
932 * This handles the interrupt from one port.
\r
934 static void serial_rk_handle_port(struct uart_rk_port *up)
\r
936 unsigned int status;
\r
937 unsigned long flags;
\r
938 spin_lock_irqsave(&up->port.lock, flags);
\r
940 /* reading UART_LSR can automatically clears PE FE OE bits, except receive fifo error bit*/
\r
941 status = serial_in(up, UART_LSR);
\r
943 DEBUG_INTR("status = %x...", status);
\r
945 /* DMA mode enable */
\r
946 if(up->prk29_uart_dma_t->use_dma == 1) {
\r
948 if(up->iir & UART_IIR_RLSI){
\r
949 if (status & (UART_LSR_DR | UART_LSR_BI)) {
\r
950 up->port_activity = jiffies;
\r
951 up->ier &= ~UART_IER_RLSI;
\r
952 up->ier &= ~UART_IER_RDI;
\r
953 serial_out(up, UART_IER, up->ier);
\r
954 //receive_chars(up, &status);
\r
955 //mod_timer(&up->prk29_uart_dma_t->rx_timer, jiffies +
\r
956 //msecs_to_jiffies(up->prk29_uart_dma_t->rx_timeout));
\r
957 if(serial_rk_start_rx_dma(&up->port) == -1){
\r
958 receive_chars(up, &status);
\r
965 { //dma mode disable
\r
968 * when uart receive a serial of data which doesn't have stop bit and so on, that causes frame error,and
\r
969 * set UART_LSR_RFE to one,what is worse,we couldn't read the data in the receive fifo. So if
\r
970 * wo don't clear this bit and reset the receive fifo, the received data available interrupt would
\r
971 * occur continuously. added by hhb@rock-chips.com 2011-08-05
\r
974 if (status & UART_LSR_RFE) {
\r
976 if(up->port.line != DBG_PORT){
\r
977 status = serial_in(up, UART_LSR);
\r
978 dev_info(up->port.dev, "error:lsr=0x%x\n", status);
\r
982 // rk29_uart_dump_register(up);
\r
985 if (status & (UART_LSR_DR | UART_LSR_BI)) {
\r
986 receive_chars(up, &status);
\r
988 check_modem_status(up);
\r
989 if (status & UART_LSR_THRE) {
\r
990 transmit_chars(up);
\r
994 spin_unlock_irqrestore(&up->port.lock, flags);
\r
998 * This is the serial driver's interrupt routine.
\r
1001 static irqreturn_t serial_rk_interrupt(int irq, void *dev_id)
\r
1003 struct uart_rk_port *up = dev_id;
\r
1007 iir = serial_in(up, UART_IIR);
\r
1009 DEBUG_INTR("%s(%d) iir = 0x%02x\n", __func__, irq, iir);
\r
1013 if (!(iir & UART_IIR_NO_INT)) {
\r
1014 serial_rk_handle_port(up);
\r
1016 } else if ((iir & UART_IIR_BUSY) == UART_IIR_BUSY) {
\r
1018 /* The DesignWare APB UART has an Busy Detect (0x07)
\r
1019 * interrupt meaning an LCR write attempt occured while the
\r
1020 * UART was busy. The interrupt must be cleared by reading
\r
1021 * the UART status register (USR) and the LCR re-written. */
\r
1023 if(!(serial_in(up, UART_USR) & UART_USR_BUSY)){
\r
1024 serial_out(up, UART_LCR, up->lcr);
\r
1027 dbg("the serial.%d is busy\n", up->port.line);
\r
1029 DEBUG_INTR("end(%d).\n", handled);
\r
1031 return IRQ_RETVAL(handled);
\r
1034 static unsigned int serial_rk_tx_empty(struct uart_port *port)
\r
1036 struct uart_rk_port *up =
\r
1037 container_of(port, struct uart_rk_port, port);
\r
1038 unsigned long flags;
\r
1041 dev_dbg(port->dev, "%s\n", __func__);
\r
1042 spin_lock_irqsave(&up->port.lock, flags);
\r
1043 lsr = serial_in(up, UART_LSR);
\r
1044 up->lsr_saved_flags |= lsr & LSR_SAVE_FLAGS;
\r
1045 spin_unlock_irqrestore(&up->port.lock, flags);
\r
1047 return (lsr & BOTH_EMPTY) == BOTH_EMPTY ? TIOCSER_TEMT : 0;
\r
1050 static unsigned int serial_rk_get_mctrl(struct uart_port *port)
\r
1052 struct uart_rk_port *up =
\r
1053 container_of(port, struct uart_rk_port, port);
\r
1054 unsigned int status;
\r
1057 status = check_modem_status(up);
\r
1060 if (status & UART_MSR_DCD)
\r
1062 if (status & UART_MSR_RI)
\r
1064 if (status & UART_MSR_DSR)
\r
1066 if (status & UART_MSR_CTS)
\r
1068 dev_dbg(port->dev, "%s 0x%08x\n", __func__, ret);
\r
1072 static void serial_rk_set_mctrl(struct uart_port *port, unsigned int mctrl)
\r
1074 struct uart_rk_port *up =
\r
1075 container_of(port, struct uart_rk_port, port);
\r
1076 unsigned char mcr = 0;
\r
1078 dev_dbg(port->dev, "+%s\n", __func__);
\r
1079 if (mctrl & TIOCM_RTS)
\r
1080 mcr |= UART_MCR_RTS;
\r
1081 if (mctrl & TIOCM_DTR)
\r
1082 mcr |= UART_MCR_DTR;
\r
1083 if (mctrl & TIOCM_OUT1)
\r
1084 mcr |= UART_MCR_OUT1;
\r
1085 if (mctrl & TIOCM_OUT2)
\r
1086 mcr |= UART_MCR_OUT2;
\r
1087 if (mctrl & TIOCM_LOOP)
\r
1088 mcr |= UART_MCR_LOOP;
\r
1092 serial_out(up, UART_MCR, mcr);
\r
1093 dev_dbg(port->dev, "-serial.%d %s mcr: 0x%02x\n", port->line, __func__, mcr);
\r
1096 static void serial_rk_break_ctl(struct uart_port *port, int break_state)
\r
1098 struct uart_rk_port *up =
\r
1099 container_of(port, struct uart_rk_port, port);
\r
1100 unsigned long flags;
\r
1102 dev_dbg(port->dev, "+%s\n", __func__);
\r
1103 spin_lock_irqsave(&up->port.lock, flags);
\r
1104 if (break_state == -1)
\r
1105 up->lcr |= UART_LCR_SBC;
\r
1107 up->lcr &= ~UART_LCR_SBC;
\r
1108 serial_lcr_write(up, up->lcr);
\r
1109 spin_unlock_irqrestore(&up->port.lock, flags);
\r
1110 dev_dbg(port->dev, "-%s lcr: 0x%02x\n", __func__, up->lcr);
\r
1113 #if defined(CONFIG_SERIAL_RK_CONSOLE) || defined(CONFIG_CONSOLE_POLL)
\r
1115 * Wait for transmitter & holding register to empty
\r
1117 static void wait_for_xmitr(struct uart_rk_port *up, int bits)
\r
1119 unsigned int status, tmout = 10000;
\r
1121 /* Wait up to 10ms for the character(s) to be sent. */
\r
1123 status = serial_in(up, UART_LSR);
\r
1125 up->lsr_saved_flags |= status & LSR_SAVE_FLAGS;
\r
1127 if ((status & bits) == bits)
\r
1136 #ifdef CONFIG_CONSOLE_POLL
\r
1138 * Console polling routines for writing and reading from the uart while
\r
1139 * in an interrupt or debug context.
\r
1142 static int serial_rk_get_poll_char(struct uart_port *port)
\r
1144 struct uart_rk_port *up =
\r
1145 container_of(port, struct uart_rk_port, port);
\r
1146 unsigned char lsr = serial_in(up, UART_LSR);
\r
1148 while (!(lsr & UART_LSR_DR))
\r
1149 lsr = serial_in(up, UART_LSR);
\r
1151 return serial_in(up, UART_RX);
\r
1154 static void serial_rk_put_poll_char(struct uart_port *port,
\r
1158 struct uart_rk_port *up =
\r
1159 container_of(port, struct uart_rk_port, port);
\r
1162 * First save the IER then disable the interrupts
\r
1164 ier = serial_in(up, UART_IER);
\r
1165 serial_out(up, UART_IER, 0);
\r
1167 wait_for_xmitr(up, BOTH_EMPTY);
\r
1169 * Send the character out.
\r
1170 * If a LF, also do CR...
\r
1172 serial_out(up, UART_TX, c);
\r
1174 wait_for_xmitr(up, BOTH_EMPTY);
\r
1175 serial_out(up, UART_TX, 13);
\r
1179 * Finally, wait for transmitter to become empty
\r
1180 * and restore the IER
\r
1182 wait_for_xmitr(up, BOTH_EMPTY);
\r
1183 serial_out(up, UART_IER, ier);
\r
1186 #endif /* CONFIG_CONSOLE_POLL */
\r
1188 static int serial_rk_startup(struct uart_port *port)
\r
1190 struct uart_rk_port *up =
\r
1191 container_of(port, struct uart_rk_port, port);
\r
1192 unsigned long flags;
\r
1196 dev_dbg(port->dev, "%s\n", __func__);
\r
1199 * Allocate the IRQ
\r
1201 retval = request_irq(up->port.irq, serial_rk_interrupt, up->port.irqflags,
\r
1208 clk_enable(up->pclk);
\r
1209 clk_enable(up->clk); // enable the config uart clock
\r
1212 * Clear the FIFO buffers and disable them.
\r
1213 * (they will be reenabled in set_termios())
\r
1215 serial_rk_clear_fifos(up);
\r
1218 * Clear the interrupt registers.
\r
1220 (void) serial_in(up, UART_LSR);
\r
1221 (void) serial_in(up, UART_RX);
\r
1222 (void) serial_in(up, UART_IIR);
\r
1223 (void) serial_in(up, UART_MSR);
\r
1224 (void) serial_in(up, UART_USR);
\r
1227 * Now, initialize the UART
\r
1229 serial_lcr_write(up, UART_LCR_WLEN8 | UART_LCR_EPAR);
\r
1231 spin_lock_irqsave(&up->port.lock, flags);
\r
1234 * Most PC uarts need OUT2 raised to enable interrupts.
\r
1236 // up->port.mctrl |= TIOCM_OUT2;
\r
1238 serial_rk_set_mctrl(&up->port, up->port.mctrl);
\r
1240 spin_unlock_irqrestore(&up->port.lock, flags);
\r
1243 * Clear the interrupt registers again for luck, and clear the
\r
1244 * saved flags to avoid getting false values from polling
\r
1245 * routines or the previous session.
\r
1247 (void) serial_in(up, UART_LSR);
\r
1248 (void) serial_in(up, UART_RX);
\r
1249 (void) serial_in(up, UART_IIR);
\r
1250 (void) serial_in(up, UART_MSR);
\r
1251 (void) serial_in(up, UART_USR);
\r
1252 up->lsr_saved_flags = 0;
\r
1254 up->msr_saved_flags = 0;
\r
1258 if (1 == up->prk29_uart_dma_t->use_dma) {
\r
1260 if(up->port.state->xmit.buf != up->prk29_uart_dma_t->tx_buffer){
\r
1261 free_page((unsigned long)up->port.state->xmit.buf);
\r
1262 up->port.state->xmit.buf = up->prk29_uart_dma_t->tx_buffer;
\r
1266 serial_rk_start_rx_dma(&up->port);
\r
1268 up->ier |= UART_IER_RDI;
\r
1269 up->ier |= UART_IER_RLSI;
\r
1270 serial_out(up, UART_IER, up->ier);
\r
1272 up->port_activity = jiffies;
\r
1275 #endif /* USE_DMA */
\r
1278 serial_out(up, UART_IER, up->ier);
\r
1282 * Finally, enable interrupts. Note: Modem status interrupts
\r
1283 * are set via set_termios(), which will be occurring imminently
\r
1284 * anyway, so we don't enable them here.
\r
1291 static void serial_rk_shutdown(struct uart_port *port)
\r
1293 struct uart_rk_port *up =
\r
1294 container_of(port, struct uart_rk_port, port);
\r
1295 unsigned long flags;
\r
1297 dev_dbg(port->dev, "%s\n", __func__);
\r
1299 * Disable interrupts from this port
\r
1302 serial_out(up, UART_IER, 0);
\r
1304 spin_lock_irqsave(&up->port.lock, flags);
\r
1305 // up->port.mctrl &= ~TIOCM_OUT2;
\r
1306 serial_rk_set_mctrl(&up->port, up->port.mctrl);
\r
1307 spin_unlock_irqrestore(&up->port.lock, flags);
\r
1310 * Disable break condition and FIFOs
\r
1312 serial_lcr_write(up, serial_in(up, UART_LCR) & ~UART_LCR_SBC);
\r
1313 serial_rk_clear_fifos(up);
\r
1316 * Read data port to reset things, and then free the irq
\r
1318 (void) serial_in(up, UART_RX);
\r
1320 free_irq(up->port.irq, up);
\r
1321 clk_disable(up->clk);
\r
1322 clk_disable(up->pclk);
\r
1326 serial_rk_set_termios(struct uart_port *port, struct ktermios *termios,
\r
1327 struct ktermios *old)
\r
1329 struct uart_rk_port *up =
\r
1330 container_of(port, struct uart_rk_port, port);
\r
1331 unsigned char cval, fcr = 0;
\r
1332 unsigned long flags;
\r
1333 unsigned int baud, quot;
\r
1334 int timeout = 1000000;
\r
1335 dev_dbg(port->dev, "+%s\n", __func__);
\r
1337 switch (termios->c_cflag & CSIZE) {
\r
1339 cval = UART_LCR_WLEN5;
\r
1342 cval = UART_LCR_WLEN6;
\r
1345 cval = UART_LCR_WLEN7;
\r
1349 cval = UART_LCR_WLEN8;
\r
1353 if (termios->c_cflag & CSTOPB){
\r
1354 cval |= UART_LCR_STOP;
\r
1356 if (termios->c_cflag & PARENB){
\r
1357 cval |= UART_LCR_PARITY;
\r
1359 if (!(termios->c_cflag & PARODD)){
\r
1360 cval |= UART_LCR_EPAR;
\r
1363 if (termios->c_cflag & CMSPAR)
\r
1364 cval |= UART_LCR_SPAR;
\r
1369 * Ask the core to calculate the divisor for us.
\r
1371 baud = uart_get_baud_rate(port, termios, old,
\r
1372 port->uartclk / 16 / 0xffff,
\r
1373 port->uartclk / 16);
\r
1375 quot = uart_get_divisor(port, baud);
\r
1377 dev_info(up->port.dev, "baud:%d\n", baud);
\r
1378 // dev_info(up->port.dev, "quot:%d\n", quot);
\r
1381 * To wait long enough to avoid writting lcr when the uart is busy
\r
1382 * because of data communication, so that we can set lcr and baud rate
\r
1383 * successfully. added by hhb@rock-chips.com
\r
1386 while(serial_in(up, UART_USR) & UART_USR_BUSY){
\r
1387 if(--timeout == 0){
\r
1388 if(port->line != DBG_PORT){
\r
1389 serial_out(up, UART_SRR, UART_RESET);
\r
1391 dbg("rk_serial_set_termios uart.%d timeout,irq=%d,ret=0x%x AND uart is reseted\n",
\r
1392 port->line, port->irq, serial_in(up, UART_USR));
\r
1399 printk("serial.%d timeout:%d\n", up->port.line,timeout);
\r
1403 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_1;
\r
1407 //added by hhb@rock-chips.com
\r
1408 if(up->prk29_uart_dma_t->use_timer == 1){
\r
1409 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_00 | UART_FCR_T_TRIG_01;
\r
1413 fcr = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10 | UART_FCR_T_TRIG_01;
\r
1418 * MCR-based auto flow control. When AFE is enabled, RTS will be
\r
1419 * deasserted when the receive FIFO contains more characters than
\r
1420 * the trigger, or the MCR RTS bit is cleared. In the case where
\r
1421 * the remote UART is not using CTS auto flow control, we must
\r
1422 * have sufficient FIFO entries for the latency of the remote
\r
1423 * UART to respond. IOW, at least 32 bytes of FIFO.
\r
1425 up->mcr &= ~UART_MCR_AFE;
\r
1426 if (termios->c_cflag & CRTSCTS){
\r
1427 up->mcr |= UART_MCR_AFE;
\r
1431 * Ok, we're now changing the port state. Do it with
\r
1432 * interrupts disabled.
\r
1434 spin_lock_irqsave(&up->port.lock, flags);
\r
1437 * Update the per-port timeout.
\r
1439 uart_update_timeout(port, termios->c_cflag, baud);
\r
1441 up->port.read_status_mask = UART_LSR_OE | UART_LSR_THRE | UART_LSR_DR;
\r
1442 if (termios->c_iflag & INPCK)
\r
1443 up->port.read_status_mask |= UART_LSR_FE | UART_LSR_PE;
\r
1444 if (termios->c_iflag & (BRKINT | PARMRK))
\r
1445 up->port.read_status_mask |= UART_LSR_BI;
\r
1448 * Characteres to ignore
\r
1450 up->port.ignore_status_mask = 0;
\r
1451 if (termios->c_iflag & IGNPAR)
\r
1452 up->port.ignore_status_mask |= UART_LSR_PE | UART_LSR_FE;
\r
1453 if (termios->c_iflag & IGNBRK) {
\r
1454 up->port.ignore_status_mask |= UART_LSR_BI;
\r
1456 * If we're ignoring parity and break indicators,
\r
1457 * ignore overruns too (for real raw support).
\r
1459 if (termios->c_iflag & IGNPAR)
\r
1460 up->port.ignore_status_mask |= UART_LSR_OE;
\r
1464 * ignore all characters if CREAD is not set
\r
1466 if ((termios->c_cflag & CREAD) == 0)
\r
1467 up->port.ignore_status_mask |= UART_LSR_DR;
\r
1470 * CTS flow control flag and modem status interrupts
\r
1472 up->ier &= ~UART_IER_MSI;
\r
1474 if (UART_ENABLE_MS(&up->port, termios->c_cflag))
\r
1475 up->ier |= UART_IER_MSI;
\r
1478 up->lcr = cval; /* Save LCR */
\r
1480 if(serial_lcr_write(up, cval | UART_LCR_DLAB)){
\r
1481 dbg("serial.%d set DLAB fail\n", up->port.line);
\r
1482 serial_out(up, UART_SRR, UART_RESET);
\r
1486 /* set uart baud rate */
\r
1487 if(serial_dl_write(up, quot)){
\r
1488 dbg("serial.%d set dll fail\n", up->port.line);
\r
1489 serial_out(up, UART_SRR, UART_RESET);
\r
1494 if(serial_lcr_write(up, cval)){
\r
1495 dbg("serial.%d reset DLAB fail\n", up->port.line);
\r
1496 serial_out(up, UART_SRR, UART_RESET);
\r
1500 serial_rk_set_mctrl(&up->port, up->port.mctrl);
\r
1501 serial_out(up, UART_FCR, fcr); /* set fcr */
\r
1503 /* enable the uart interrupt last */
\r
1504 up->ier |= UART_IER_RDI;
\r
1505 up->ier |= UART_IER_RLSI;
\r
1506 serial_out(up, UART_IER, up->ier);
\r
1509 spin_unlock_irqrestore(&up->port.lock, flags);
\r
1511 /* Don't rewrite B0 */
\r
1512 if (tty_termios_baud_rate(termios))
\r
1513 tty_termios_encode_baud_rate(termios, baud, baud);
\r
1514 dev_dbg(port->dev, "-%s baud %d\n", __func__, baud);
\r
1519 spin_unlock_irqrestore(&up->port.lock, flags);
\r
1525 serial_rk_set_ldisc(struct uart_port *port, int new)
\r
1527 if (new == N_PPS) {
\r
1528 port->flags |= UPF_HARDPPS_CD;
\r
1529 serial_rk_enable_ms(port);
\r
1531 port->flags &= ~UPF_HARDPPS_CD;
\r
1536 serial_rk_pm(struct uart_port *port, unsigned int state,
\r
1537 unsigned int oldstate)
\r
1539 struct uart_rk_port *up =
\r
1540 container_of(port, struct uart_rk_port, port);
\r
1542 dev_dbg(port->dev, "%s: %s\n", __func__, state ? "disable" : "enable");
\r
1544 clk_disable(up->clk);
\r
1545 clk_disable(up->pclk);
\r
1547 clk_enable(up->pclk);
\r
1548 clk_enable(up->clk);
\r
1552 static void serial_rk_release_port(struct uart_port *port)
\r
1554 dev_dbg(port->dev, "%s\n", __func__);
\r
1557 static int serial_rk_request_port(struct uart_port *port)
\r
1559 dev_dbg(port->dev, "%s\n", __func__);
\r
1563 static void serial_rk_config_port(struct uart_port *port, int flags)
\r
1565 dev_dbg(port->dev, "%s\n", __func__);
\r
1566 port->type = PORT_RK;
\r
1570 serial_rk_verify_port(struct uart_port *port, struct serial_struct *ser)
\r
1572 /* we don't want the core code to modify any port params */
\r
1573 dev_dbg(port->dev, "%s\n", __func__);
\r
1577 static const char *
\r
1578 serial_rk_type(struct uart_port *port)
\r
1580 struct uart_rk_port *up =
\r
1581 container_of(port, struct uart_rk_port, port);
\r
1583 dev_dbg(port->dev, "%s: %s\n", __func__, up->name);
\r
1587 static struct uart_ops serial_rk_pops = {
\r
1588 .tx_empty = serial_rk_tx_empty,
\r
1589 .set_mctrl = serial_rk_set_mctrl,
\r
1590 .get_mctrl = serial_rk_get_mctrl,
\r
1591 .stop_tx = serial_rk_stop_tx,
\r
1592 .start_tx = serial_rk_start_tx,
\r
1593 .stop_rx = serial_rk_stop_rx,
\r
1594 .enable_ms = serial_rk_enable_ms,
\r
1595 .break_ctl = serial_rk_break_ctl,
\r
1596 .startup = serial_rk_startup,
\r
1597 .shutdown = serial_rk_shutdown,
\r
1598 .set_termios = serial_rk_set_termios,
\r
1600 .set_ldisc = serial_rk_set_ldisc,
\r
1602 .pm = serial_rk_pm,
\r
1603 .type = serial_rk_type,
\r
1604 .release_port = serial_rk_release_port,
\r
1605 .request_port = serial_rk_request_port,
\r
1606 .config_port = serial_rk_config_port,
\r
1607 .verify_port = serial_rk_verify_port,
\r
1608 #ifdef CONFIG_CONSOLE_POLL
\r
1609 .poll_get_char = serial_rk_get_poll_char,
\r
1610 .poll_put_char = serial_rk_put_poll_char,
\r
1614 #ifdef CONFIG_SERIAL_RK_CONSOLE
\r
1616 static struct uart_rk_port *serial_rk_console_ports[UART_NR];
\r
1618 static void serial_rk_console_putchar(struct uart_port *port, int ch)
\r
1620 struct uart_rk_port *up =
\r
1621 container_of(port, struct uart_rk_port, port);
\r
1623 wait_for_xmitr(up, UART_LSR_THRE);
\r
1624 serial_out(up, UART_TX, ch);
\r
1628 * Print a string to the serial port trying not to disturb
\r
1629 * any possible real use of the port...
\r
1631 * The console_lock must be held when we get here.
\r
1634 serial_rk_console_write(struct console *co, const char *s, unsigned int count)
\r
1636 struct uart_rk_port *up = serial_rk_console_ports[co->index];
\r
1637 unsigned long flags;
\r
1641 touch_nmi_watchdog();
\r
1643 local_irq_save(flags);
\r
1644 if (up->port.sysrq) {
\r
1645 /* serial_rk_handle_port() already took the lock */
\r
1647 } else if (oops_in_progress) {
\r
1648 locked = spin_trylock(&up->port.lock);
\r
1650 spin_lock(&up->port.lock);
\r
1653 * First save the IER then disable the interrupts
\r
1655 ier = serial_in(up, UART_IER);
\r
1657 serial_out(up, UART_IER, 0);
\r
1659 uart_console_write(&up->port, s, count, serial_rk_console_putchar);
\r
1662 * Finally, wait for transmitter to become empty
\r
1663 * and restore the IER
\r
1665 wait_for_xmitr(up, BOTH_EMPTY);
\r
1666 serial_out(up, UART_IER, ier);
\r
1670 * The receive handling will happen properly because the
\r
1671 * receive ready bit will still be set; it is not cleared
\r
1672 * on read. However, modem control will not, we must
\r
1673 * call it if we have saved something in the saved flags
\r
1674 * while processing with interrupts off.
\r
1676 if (up->msr_saved_flags)
\r
1677 check_modem_status(up);
\r
1681 spin_unlock(&up->port.lock);
\r
1682 local_irq_restore(flags);
\r
1685 static int __init serial_rk_console_setup(struct console *co, char *options)
\r
1687 struct uart_rk_port *up;
\r
1688 int baud = 115200;
\r
1693 if (unlikely(co->index >= UART_NR || co->index < 0))
\r
1696 if (serial_rk_console_ports[co->index] == NULL)
\r
1698 up = serial_rk_console_ports[co->index];
\r
1701 uart_parse_options(options, &baud, &parity, &bits, &flow);
\r
1703 return uart_set_options(&up->port, co, baud, parity, bits, flow);
\r
1706 static struct console serial_rk_console = {
\r
1708 .write = serial_rk_console_write,
\r
1709 .device = uart_console_device,
\r
1710 .setup = serial_rk_console_setup,
\r
1711 .flags = CON_PRINTBUFFER | CON_ANYTIME,
\r
1713 .data = &serial_rk_reg,
\r
1716 static void serial_rk_add_console_port(struct uart_rk_port *up)
\r
1718 serial_rk_console_ports[up->pdev->id] = up;
\r
1721 #define SERIAL_CONSOLE &serial_rk_console
\r
1723 #define SERIAL_CONSOLE NULL
\r
1725 static inline void serial_rk_add_console_port(struct uart_rk_port *up)
\r
1730 static struct uart_driver serial_rk_reg = {
\r
1731 .owner = THIS_MODULE,
\r
1732 .driver_name = "rk29_serial",
\r
1733 .dev_name = "ttyS",
\r
1734 .major = TTY_MAJOR,
\r
1736 .cons = SERIAL_CONSOLE,
\r
1740 static int __devinit serial_rk_probe(struct platform_device *pdev)
\r
1742 struct uart_rk_port *up;
\r
1743 struct resource *mem;
\r
1745 int ret = -ENOSPC;
\r
1746 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
\r
1748 dev_err(&pdev->dev, "no mem resource?\n");
\r
1752 irq = platform_get_irq(pdev, 0);
\r
1754 dev_err(&pdev->dev, "no irq resource?\n");
\r
1758 if (!request_mem_region(mem->start, (mem->end - mem->start) + 1,
\r
1759 pdev->dev.driver->name)) {
\r
1760 dev_err(&pdev->dev, "memory region already claimed\n");
\r
1764 up = kzalloc(sizeof(*up), GFP_KERNEL);
\r
1767 goto do_release_region;
\r
1770 sprintf(up->name, "rk29_serial.%d", pdev->id);
\r
1772 up->pclk = clk_get(&pdev->dev, "pclk_uart");
\r
1773 up->clk = clk_get(&pdev->dev, "uart");
\r
1774 if (unlikely(IS_ERR(up->clk))) {
\r
1775 ret = PTR_ERR(up->clk);
\r
1778 up->tx_loadsz = 30;
\r
1780 up->prk29_uart_dma_t = &rk29_uart_ports_dma_t[pdev->id];
\r
1782 up->port.dev = &pdev->dev;
\r
1783 up->port.type = PORT_RK;
\r
1784 up->port.irq = irq;
\r
1785 up->port.iotype = UPIO_DWAPB;
\r
1787 up->port.regshift = 2;
\r
1788 up->port.fifosize = 32;
\r
1789 up->port.ops = &serial_rk_pops;
\r
1790 up->port.line = pdev->id;
\r
1791 up->port.iobase = mem->start;
\r
1792 up->port.membase = ioremap_nocache(mem->start, mem->end - mem->start + 1);
\r
1793 if (!up->port.membase) {
\r
1797 up->port.mapbase = mem->start;
\r
1798 up->port.irqflags = IRQF_DISABLED;
\r
1799 up->port.uartclk = clk_get_rate(up->clk);
\r
1802 /* set dma config */
\r
1803 if(1 == up->prk29_uart_dma_t->use_dma) {
\r
1804 pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
\r
1807 up->prk29_uart_dma_t->use_timer = USE_TIMER;
\r
1808 up->prk29_uart_dma_t->rx_timer.function = serial_rk_rx_timeout;
\r
1809 up->prk29_uart_dma_t->rx_timer.data = (unsigned long)up;
\r
1810 up->prk29_uart_dma_t->rx_timeout = 7;
\r
1811 up->prk29_uart_dma_t->rx_timer.expires = jiffies + msecs_to_jiffies(up->prk29_uart_dma_t->rx_timeout);
\r
1812 init_timer(&up->prk29_uart_dma_t->rx_timer);
\r
1814 up->prk29_uart_dma_t->tx_buffer_size = UART_XMIT_SIZE;
\r
1815 up->prk29_uart_dma_t->tx_buffer = dmam_alloc_coherent(up->port.dev, up->prk29_uart_dma_t->tx_buffer_size,
\r
1816 &up->prk29_uart_dma_t->tx_phy_addr, DMA_MEMORY_MAP);
\r
1817 if(!up->prk29_uart_dma_t->tx_buffer){
\r
1818 dev_info(up->port.dev, "dmam_alloc_coherent dma_tx_buffer fail\n");
\r
1821 dev_info(up->port.dev, "dma_tx_buffer 0x%08x\n", (unsigned) up->prk29_uart_dma_t->tx_buffer);
\r
1822 dev_info(up->port.dev, "dma_tx_phy 0x%08x\n", (unsigned) up->prk29_uart_dma_t->tx_phy_addr);
\r
1825 up->prk29_uart_dma_t->rx_buffer_size = UART_XMIT_SIZE*32;
\r
1826 up->prk29_uart_dma_t->rx_buffer = dmam_alloc_coherent(up->port.dev, up->prk29_uart_dma_t->rx_buffer_size,
\r
1827 &up->prk29_uart_dma_t->rx_phy_addr, DMA_MEMORY_MAP);
\r
1828 up->prk29_uart_dma_t->rb_pre_pos = 0;
\r
1829 if(!up->prk29_uart_dma_t->rx_buffer){
\r
1830 dev_info(up->port.dev, "dmam_alloc_coherent dma_rx_buffer fail\n");
\r
1833 dev_info(up->port.dev, "dma_rx_buffer 0x%08x\n", (unsigned) up->prk29_uart_dma_t->rx_buffer);
\r
1834 dev_info(up->port.dev, "up 0x%08x\n", (unsigned)up->prk29_uart_dma_t);
\r
1838 INIT_WORK(&up->uart_work, serial_rk_report_revdata_workfunc);
\r
1839 INIT_WORK(&up->uart_work_rx, serial_rk_start_dma_rx);
\r
1840 up->uart_wq = create_singlethread_workqueue("uart_workqueue");
\r
1841 up->prk29_uart_dma_t->rx_dma_start = 0;
\r
1842 spin_lock_init(&(up->prk29_uart_dma_t->tx_lock));
\r
1843 spin_lock_init(&(up->prk29_uart_dma_t->rx_lock));
\r
1844 serial_rk_init_dma_rx(&up->port);
\r
1845 serial_rk_init_dma_tx(&up->port);
\r
1846 up->ier |= THRE_MODE; // enable THRE interrupt mode
\r
1847 serial_out(up, UART_IER, up->ier);
\r
1851 serial_rk_add_console_port(up);
\r
1852 ret = uart_add_one_port(&serial_rk_reg, &up->port);
\r
1856 platform_set_drvdata(pdev, up);
\r
1857 dev_info(&pdev->dev, "membase 0x%08x\n", (unsigned) up->port.membase);
\r
1862 iounmap(up->port.membase);
\r
1863 up->port.membase = NULL;
\r
1866 clk_put(up->pclk);
\r
1869 do_release_region:
\r
1870 release_mem_region(mem->start, (mem->end - mem->start) + 1);
\r
1874 static int __devexit serial_rk_remove(struct platform_device *pdev)
\r
1876 struct uart_rk_port *up = platform_get_drvdata(pdev);
\r
1878 platform_set_drvdata(pdev, NULL);
\r
1880 struct resource *mem;
\r
1881 destroy_workqueue(up->uart_wq);
\r
1882 uart_remove_one_port(&serial_rk_reg, &up->port);
\r
1883 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
\r
1884 iounmap(up->port.membase);
\r
1885 up->port.membase = NULL;
\r
1887 clk_put(up->pclk);
\r
1889 release_mem_region(mem->start, (mem->end - mem->start) + 1);
\r
1895 static int serial_rk_suspend(struct platform_device *dev, pm_message_t state)
\r
1897 struct uart_rk_port *up = platform_get_drvdata(dev);
\r
1899 if (up && up->port.line != DBG_PORT && POWER_MANEGEMENT){
\r
1900 uart_suspend_port(&serial_rk_reg, &up->port);
\r
1902 if(up->port.line == DBG_PORT && POWER_MANEGEMENT){
\r
1903 serial_rk_pm(&up->port, 1, 0);
\r
1909 static int serial_rk_resume(struct platform_device *dev)
\r
1911 struct uart_rk_port *up = platform_get_drvdata(dev);
\r
1913 if (up && up->port.line != DBG_PORT && POWER_MANEGEMENT){
\r
1914 uart_resume_port(&serial_rk_reg, &up->port);
\r
1916 if(up->port.line == DBG_PORT && POWER_MANEGEMENT){
\r
1917 serial_rk_pm(&up->port, 0, 1);
\r
1922 static struct platform_driver serial_rk_driver = {
\r
1923 .probe = serial_rk_probe,
\r
1924 .remove = __devexit_p(serial_rk_remove),
\r
1925 .suspend = serial_rk_suspend,
\r
1926 .resume = serial_rk_resume,
\r
1928 #if defined(CONFIG_ARCH_RK29)
\r
1929 .name = "rk29_serial",
\r
1930 #elif defined(CONFIG_SERIAL_RK2818)
\r
1931 .name = "rk2818_serial",
\r
1933 .name = "rk_serial",
\r
1935 .owner = THIS_MODULE,
\r
1939 static int __init serial_rk_init(void)
\r
1943 ret = uart_register_driver(&serial_rk_reg);
\r
1947 ret = platform_driver_register(&serial_rk_driver);
\r
1949 uart_unregister_driver(&serial_rk_reg);
\r
1954 static void __exit serial_rk_exit(void)
\r
1956 platform_driver_unregister(&serial_rk_driver);
\r
1957 uart_unregister_driver(&serial_rk_reg);
\r
1960 module_init(serial_rk_init);
\r
1961 module_exit(serial_rk_exit);
\r
1963 MODULE_LICENSE("GPL");
\r
1964 MODULE_DESCRIPTION("RK UART driver");
\r