2 * drivers/serial/rk29_serial.c - driver for rk29 serial device and console
4 * Copyright (C) 2010 ROCKCHIP, Inc.
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
17 #if defined(CONFIG_SERIAL_RK29_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
21 #include <linux/hrtimer.h>
22 #include <linux/module.h>
24 #include <linux/ioport.h>
25 #include <linux/irq.h>
26 #include <linux/init.h>
27 #include <linux/console.h>
28 #include <linux/tty.h>
29 #include <linux/tty_flip.h>
30 #include <linux/serial_core.h>
31 #include <linux/serial.h>
32 #include <linux/clk.h>
33 #include <linux/platform_device.h>
34 #include <mach/iomux.h>
35 #include <mach/gpio.h>
36 #include <mach/board.h>
37 #include "rk2818_serial.h"
41 #define DBG(msg...) printk(msg);
46 * We wrap our port structure around the generic uart_port.
49 struct uart_port uart;
55 #define UART_TO_RK29(uart_port) ((struct rk29_port *) uart_port)
56 #define RK29_SERIAL_MAJOR TTY_MAJOR
57 #define RK29_SERIAL_MINOR 64
60 static inline void rk29_uart_write(struct uart_port *port, unsigned int val,
63 __raw_writel(val, port->membase + off);
66 static inline unsigned int rk29_uart_read(struct uart_port *port, unsigned int off)
68 return __raw_readl(port->membase + off);
71 static int rk29_set_baud_rate(struct uart_port *port, unsigned int baud)
73 unsigned int uartTemp;
75 rk29_uart_write(port,rk29_uart_read(port,UART_LCR) | LCR_DLA_EN,UART_LCR);
76 uartTemp = port->uartclk / (16 * baud);
77 rk29_uart_write(port,uartTemp & 0xff,UART_DLL);
78 rk29_uart_write(port,(uartTemp>>8) & 0xff,UART_DLH);
79 rk29_uart_write(port,rk29_uart_read(port,UART_LCR) & (~LCR_DLA_EN),UART_LCR);
84 * ÅжϷ¢ËÍ»º³åÇøÊÇ·ñΪ¿Õ
85 *ÏÈÒÔFIFO´ò¿ª×ö£¬ºóÃæ¿ÉÒÔ×ö³ÉFIFO¹Ø»òFIFO¿ª¡£
87 static u_int rk29_serial_tx_empty(struct uart_port *port)
89 int timeout = 10000000;
90 while(!(rk29_uart_read(port,UART_USR)&UART_TRANSMIT_FIFO_EMPTY))
94 if(rk29_uart_read(port,UART_USR)&UART_TRANSMIT_FIFO_EMPTY)
103 * Power / Clock management.
105 static void rk29_serial_pm(struct uart_port *port, unsigned int state,
106 unsigned int oldstate)
108 struct rk29_port *rk29_port = UART_TO_RK29(port);
113 * Enable the peripheral clock for this serial port.
114 * This is called on uart_open() or a resume event.
116 clk_enable(rk29_port->clk);
120 * Disable the peripheral clock for this serial port.
121 * This is called on uart_close() or a suspend event.
123 clk_disable(rk29_port->clk);
126 printk(KERN_ERR "rk29_serial: unknown pm %d\n", state);
131 * Return string describing the specified port
133 static const char *rk29_serial_type(struct uart_port *port)
135 return (port->type == PORT_RK29) ? "RK29_SERIAL" : NULL;
138 static void rk29_serial_enable_ms(struct uart_port *port)
141 printk("Enter::%s\n",__FUNCTION__);
145 /* no modem control lines */
146 static unsigned int rk29_serial_get_mctrl(struct uart_port *port)
148 unsigned int result = 0;
151 status = rk29_uart_read(port,UART_MSR);
152 if (status & UART_MSR_URCTS)
154 result = TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
155 printk("UART_GET_MSR:0x%x\n",result);
157 result = TIOCM_CAR | TIOCM_DSR;
158 printk("UART_GET_MSR:0x%x\n",result);
163 static void rk29_serial_set_mctrl(struct uart_port *port, unsigned int mctrl)
166 printk("Enter::%s\n",__FUNCTION__);
173 static void rk29_serial_stop_tx(struct uart_port *port)
176 printk("Enter::%s\n",__FUNCTION__);
181 * Start transmitting.
183 static void rk29_serial_start_tx(struct uart_port *port)
185 struct circ_buf *xmit = &port->state->xmit;
187 if(DBG_PORT == port->line) {
191 while(!(uart_circ_empty(xmit)))
193 while (!(rk29_uart_read(port,UART_USR) & UART_TRANSMIT_FIFO_NOT_FULL)){
194 rk29_uart_write(port,UART_IER_RECV_DATA_AVAIL_INT_ENABLE|UART_IER_SEND_EMPTY_INT_ENABLE,UART_IER);
197 rk29_uart_write(port,xmit->buf[xmit->tail],UART_THR);
199 if(DBG_PORT == port->line) {
200 DBG("0x%x, ", xmit->buf[xmit->tail]);
203 xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
206 if((uart_circ_empty(xmit)))
207 rk29_uart_write(port,UART_IER_RECV_DATA_AVAIL_INT_ENABLE,UART_IER);
208 if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
209 uart_write_wakeup(port);
211 if(DBG_PORT == port->line) {
217 * Stop receiving - port is in process of being closed.
219 static void rk29_serial_stop_rx(struct uart_port *port)
222 printk("Enter::%s\n",__FUNCTION__);
227 * Control the transmission of a break signal
229 static void rk29_serial_break_ctl(struct uart_port *port, int break_state)
232 temp = rk29_uart_read(port,UART_LCR);
233 if (break_state != 0)
234 temp = temp & (~BREAK_CONTROL_BIT);/* start break */
236 temp = temp | BREAK_CONTROL_BIT; /* stop break */
237 rk29_uart_write(port,temp,UART_LCR);
242 * Characters received (called from interrupt handler)
244 static void rk29_rx_chars(struct uart_port *port)
246 unsigned int ch, flag;
248 if(DBG_PORT == port->line) {
252 while((rk29_uart_read(port,UART_USR) & UART_RECEIVE_FIFO_NOT_EMPTY) == UART_RECEIVE_FIFO_NOT_EMPTY)
254 u32 lsr = rk29_uart_read(port, UART_LSR);
255 ch = rk29_uart_read(port,UART_RBR);
258 if (lsr & UART_BREAK_INT_BIT) {
260 if (uart_handle_break(port))
264 if (uart_handle_sysrq_char(port, ch))
269 uart_insert_char(port, 0, 0, ch, flag);
271 if(DBG_PORT == port->line) {
275 tty_flip_buffer_push(port->state->port.tty);
277 if(DBG_PORT == port->line) {
285 static irqreturn_t rk29_uart_interrupt(int irq, void *dev_id)
287 struct uart_port *port = dev_id;
288 unsigned int status, pending;
290 spin_lock(&port->lock);
291 status = rk29_uart_read(port,UART_IIR);
292 pending = status & 0x0f;
293 if((pending == UART_IIR_RECV_AVAILABLE) || (pending == UART_IIR_CHAR_TIMEOUT))
295 if(pending == UART_IIR_THR_EMPTY)
296 rk29_serial_start_tx(port);
297 spin_unlock(&port->lock);
304 static void rk29_serial_shutdown(struct uart_port *port)
306 struct rk29_port *rk29_port = UART_TO_RK29(port);
307 rk29_uart_write(port,0x00,UART_IER);
308 rk29_uart_write(port, UART_FCR_FIFO_ENABLE |
309 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, UART_FCR);
310 //rk29_uart_write(port, 0, UART_FCR);
311 clk_disable(rk29_port->clk);
312 free_irq(port->irq, port);
315 * Perform initialization and enable port for reception
317 static int rk29_serial_startup(struct uart_port *port)
319 struct rk29_port *rk29_port = UART_TO_RK29(port);
320 struct tty_struct *tty = port->state->port.tty;
322 DBG("%s\n",__FUNCTION__);
326 rk29_mux_api_set(GPIO2B1_UART2SOUT_NAME, GPIO2L_UART2_SOUT);
327 rk29_mux_api_set(GPIO2B0_UART2SIN_NAME, GPIO2L_UART2_SIN);
329 else if(0 == port->line)
331 rk29_mux_api_set(GPIO1B7_UART0SOUT_NAME, GPIO1L_UART0_SOUT);
332 rk29_mux_api_set(GPIO1B6_UART0SIN_NAME, GPIO1L_UART0_SIN);
334 else if(3 == port->line)
336 rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_UART3_SOUT);
337 rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_UART3_SIN);
340 retval = request_irq(port->irq,rk29_uart_interrupt,IRQF_SHARED,
341 tty ? tty->name : "rk29_serial",port);
344 printk("\nrk29_serial_startup err \n");
345 rk29_serial_shutdown(port);
348 clk_enable(rk29_port->clk);
350 if(port->irq == IRQ_NR_UART0)
351 rk29_uart_write(port,0xf7,UART_FCR); //enable and clear fifo if busy while starting
353 rk29_uart_write(port,0xf1,UART_FCR); //enable fifo
354 rk29_uart_write(port,0x01,UART_SFE);
355 rk29_uart_write(port,UART_IER_RECV_DATA_AVAIL_INT_ENABLE,UART_IER); //enable uart recevice IRQ
357 //lw modify on 110309
359 * Clear the FIFO buffers and disable them.
361 rk29_uart_write(port, UART_FCR_FIFO_ENABLE, UART_FCR);
362 rk29_uart_write(port, UART_FCR_FIFO_ENABLE |
363 UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT, UART_FCR);
364 rk29_uart_write(port, 0, UART_FCR);
367 * Clear the interrupt registers.
369 (void) rk29_uart_read(port, UART_LSR);
370 (void) rk29_uart_read(port, UART_RBR);
371 (void) rk29_uart_read(port, UART_IIR);
372 (void) rk29_uart_read(port, UART_MSR);
375 * And clear the user registers.
377 (void) rk29_uart_read(port, UART_USR);
384 * Change the port parameters
386 static void rk29_serial_set_termios(struct uart_port *port, struct ktermios *termios,
387 struct ktermios *old)
390 unsigned int mode, baud;
391 unsigned int umcon,fcr;
392 spin_lock_irqsave(&port->lock, flags);
393 /* Get current mode register */
394 mode = rk29_uart_read(port,UART_LCR) & (BREAK_CONTROL_BIT | EVEN_PARITY_SELECT | PARITY_ENABLED
395 | ONE_HALF_OR_TWO_BIT | UART_DATABIT_MASK);
397 baud = uart_get_baud_rate(port, termios, old, 0, port->uartclk / 16);
399 switch (termios->c_cflag & CSIZE) {
415 if (termios->c_cflag & CSTOPB)
416 mode |= ONE_STOP_BIT;
419 if (termios->c_cflag & PARENB)
421 mode |= PARITY_ENABLED;
422 if (termios->c_cflag & PARODD)
428 int timeout = 10000000;
429 while(rk29_uart_read(port,UART_USR)&UART_USR_BUSY){
431 printk("rk29_serial_set_termios uart timeout,irq=%d,ret=0x%x\n",port->irq,rk29_uart_read(port,UART_USR));
437 rk29_uart_write(port,mode,UART_LCR);
438 baud = rk29_set_baud_rate(port, baud);
439 uart_update_timeout(port, termios->c_cflag, baud);
442 * enable FIFO and interrupt
444 if(termios->c_cflag & CRTSCTS)
446 /*¿ªÆôuart0Ó²¼þÁ÷¿Ø*/
447 printk("start CRTSCTS control and baudrate is %d,irq=%d\n",baud,port->irq);
450 rk29_mux_api_set(GPIO2A7_UART2RTSN_NAME, GPIO2L_UART2_RTS_N);
451 rk29_mux_api_set(GPIO2A6_UART2CTSN_NAME, GPIO2L_UART2_CTS_N);
453 else if(0 == port->line)
455 rk29_mux_api_set(GPIO1C1_UART0RTSN_SDMMC1WRITEPRT_NAME, GPIO1H_UART0_RTS_N);
456 rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_UART0_CTS_N);
458 else if(3 == port->line)
460 rk29_mux_api_set(GPIO2B5_UART3RTSN_I2C3SCL_NAME, GPIO2L_UART3_RTS_N);
461 rk29_mux_api_set(GPIO2B4_UART3CTSN_I2C3SDA_NAME, GPIO2L_UART3_CTS_N);
464 umcon=rk29_uart_read(port,UART_MCR);
465 umcon |= UART_MCR_AFCEN;
466 umcon |= UART_MCR_URRTS;
467 umcon &=~UART_SIR_ENABLE;
468 rk29_uart_write(port,umcon,UART_MCR);
469 printk("UART_GET_MCR umcon=0x%x\n",umcon);
471 mode = mode | LCR_DLA_EN;
474 //lw modify on 110309
475 fcr = UART_FCR_FIFO_ENABLE | UART_FCR_R_TRIG_10 | UART_FCR_T_TRIG_10;
476 rk29_uart_write(port, fcr, UART_FCR);
477 rk29_uart_write(port,0x01,UART_SFE);
478 rk29_uart_write(port,UART_IER_RECV_DATA_AVAIL_INT_ENABLE,UART_IER); //enable uart recevice IRQ
479 printk("%s:fcr=0x%x,irq=%d\n",__FUNCTION__,fcr,port->irq);
482 spin_unlock_irqrestore(&port->lock, flags);
487 static void rk29_serial_release_port(struct uart_port *port)
489 struct platform_device *pdev = to_platform_device(port->dev);
490 struct resource *resource;
491 resource_size_t size;
493 resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
494 if (unlikely(!resource))
496 size = resource->end - resource->start + 1;
498 release_mem_region(port->mapbase, size);
499 iounmap(port->membase);
500 port->membase = NULL;
503 static int rk29_serial_request_port(struct uart_port *port)
505 struct platform_device *pdev = to_platform_device(port->dev);
506 struct resource *resource;
507 resource_size_t size;
509 resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
510 if (unlikely(!resource))
512 size = resource->end - resource->start + 1;
514 if (unlikely(!request_mem_region(port->mapbase, size, "rk29_serial")))
517 port->membase = ioremap(port->mapbase, size);
518 if (!port->membase) {
519 release_mem_region(port->mapbase, size);
527 * Configure/autoconfigure the port.
529 static void rk29_serial_config_port(struct uart_port *port, int flags)
531 if (flags & UART_CONFIG_TYPE) {
532 port->type = PORT_RK29;
533 rk29_serial_request_port(port);
538 * Verify the new serial_struct (for TIOCSSERIAL).
540 static int rk29_serial_verify_port(struct uart_port *port, struct serial_struct *ser)
543 if (ser->type != PORT_UNKNOWN && ser->type != PORT_RK29)
545 if (port->irq != ser->irq)
547 if (ser->io_type != SERIAL_IO_MEM)
549 if (port->uartclk / 16 != ser->baud_base)
551 if ((void *)port->mapbase != ser->iomem_base)
553 if (port->iobase != ser->port)
560 #ifdef CONFIG_CONSOLE_POLL
562 * Console polling routines for writing and reading from the uart while
563 * in an interrupt or debug context.
566 static int rk29_serial_poll_get_char(struct uart_port *port)
568 while (!((rk29_uart_read(port, UART_USR) & UART_RECEIVE_FIFO_NOT_EMPTY) == UART_RECEIVE_FIFO_NOT_EMPTY))
570 return rk29_uart_read(port, UART_RBR);
573 static void rk29_serial_poll_put_char(struct uart_port *port, unsigned char c)
575 while (!(rk29_uart_read(port, UART_USR) & UART_TRANSMIT_FIFO_NOT_FULL))
577 rk29_uart_write(port, c, UART_THR);
579 #endif /* CONFIG_CONSOLE_POLL */
581 static struct uart_ops rk29_uart_pops = {
582 .tx_empty = rk29_serial_tx_empty,
583 .set_mctrl = rk29_serial_set_mctrl,
584 .get_mctrl = rk29_serial_get_mctrl,
585 .stop_tx = rk29_serial_stop_tx,
586 .start_tx = rk29_serial_start_tx,
587 .stop_rx = rk29_serial_stop_rx,
588 .enable_ms = rk29_serial_enable_ms,
589 .break_ctl = rk29_serial_break_ctl,
590 .startup = rk29_serial_startup,
591 .shutdown = rk29_serial_shutdown,
592 .set_termios = rk29_serial_set_termios,
593 .type = rk29_serial_type,
594 .release_port = rk29_serial_release_port,
595 .request_port = rk29_serial_request_port,
596 .config_port = rk29_serial_config_port,
597 .verify_port = rk29_serial_verify_port,
598 .pm = rk29_serial_pm,
599 #ifdef CONFIG_CONSOLE_POLL
600 .poll_get_char = rk29_serial_poll_get_char,
601 .poll_put_char = rk29_serial_poll_put_char,
606 static struct rk29_port rk29_uart_ports[] = {
610 .ops = &rk29_uart_pops,
611 .flags = UPF_BOOT_AUTOCONF,
619 .ops = &rk29_uart_pops,
620 .flags = UPF_BOOT_AUTOCONF,
628 .ops = &rk29_uart_pops,
629 .flags = UPF_BOOT_AUTOCONF,
637 .ops = &rk29_uart_pops,
638 .flags = UPF_BOOT_AUTOCONF,
645 #define UART_NR ARRAY_SIZE(rk29_uart_ports)
647 static inline struct uart_port *get_port_from_line(unsigned int line)
649 return &rk29_uart_ports[line].uart;
652 #ifdef CONFIG_SERIAL_RK29_CONSOLE
653 static void rk29_console_putchar(struct uart_port *port, int ch)
655 while (!(rk29_uart_read(port,UART_USR) & UART_TRANSMIT_FIFO_NOT_FULL))
657 rk29_uart_write(port,ch,UART_THR);
661 * Interrupts are disabled on entering
663 static void rk29_console_write(struct console *co, const char *s, u_int count)
665 struct uart_port *port;
666 struct rk29_port *rk29_port;
668 BUG_ON(co->index < 0 || co->index >= UART_NR);
670 port = get_port_from_line(co->index);
671 rk29_port = UART_TO_RK29(port);
673 spin_lock(&port->lock);
674 uart_console_write(port, s, count, rk29_console_putchar);
675 spin_unlock(&port->lock);
678 static int __init rk29_console_setup(struct console *co, char *options)
680 struct uart_port *port;
681 int baud, flow, bits, parity;
683 if (unlikely(co->index >= UART_NR || co->index < 0))
686 port = get_port_from_line(co->index);
688 if (unlikely(!port->membase))
693 //rk29_init_clock(port);
696 uart_parse_options(options, &baud, &parity, &bits, &flow);
701 rk29_uart_write(port,rk29_uart_read(port,UART_LCR) | LCR_WLS_8 | PARITY_DISABLED | ONE_STOP_BIT,UART_LCR); /* 8N1 */
702 if (baud < 300 || baud > 115200)
704 rk29_set_baud_rate(port, baud);
706 printk(KERN_INFO "rk29_serial: console setup on port %d\n", port->line);
708 /* clear rx fifo, else will blocked on set_termios (always busy) */
709 while ((rk29_uart_read(port, UART_USR) & UART_RECEIVE_FIFO_NOT_EMPTY) == UART_RECEIVE_FIFO_NOT_EMPTY)
710 rk29_uart_read(port, UART_RBR);
712 return uart_set_options(port, co, baud, parity, bits, flow);
715 static struct uart_driver rk29_uart_driver;
717 static struct console rk29_console = {
719 .write = rk29_console_write,
720 .device = uart_console_device,
721 .setup = rk29_console_setup,
722 .flags = CON_PRINTBUFFER,
724 .data = &rk29_uart_driver,
727 #define RK29_CONSOLE (&rk29_console)
730 #define RK29_CONSOLE NULL
733 static struct uart_driver rk29_uart_driver = {
734 .owner = THIS_MODULE,
735 .driver_name = "rk29_serial",
738 .cons = RK29_CONSOLE,
739 .major = RK29_SERIAL_MAJOR,
740 .minor = RK29_SERIAL_MINOR,
743 static int __devinit rk29_serial_probe(struct platform_device *pdev)
745 struct rk29_port *rk29_port;
746 struct resource *resource;
747 struct uart_port *port;
748 //struct rk29_serial_platform_data *pdata = pdev->dev.platform_data;
750 if (unlikely(pdev->id < 0 || pdev->id >= UART_NR))
753 printk(KERN_INFO "rk29_serial: detected port %d\n", pdev->id);
755 //if (pdata && pdata->io_init)
758 port = get_port_from_line(pdev->id);
759 port->dev = &pdev->dev;
760 rk29_port = UART_TO_RK29(port);
762 rk29_port->clk = clk_get(&pdev->dev, "uart");
763 if (unlikely(IS_ERR(rk29_port->clk)))
764 return PTR_ERR(rk29_port->clk);
765 port->uartclk = 24000000; ///clk_get_rate(rk29_port->clk);
767 resource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
768 if (unlikely(!resource))
770 port->mapbase = resource->start;
772 port->irq = platform_get_irq(pdev, 0);
773 if (unlikely(port->irq < 0))
776 platform_set_drvdata(pdev, port);
778 return uart_add_one_port(&rk29_uart_driver, port);
781 static int __devexit rk29_serial_remove(struct platform_device *pdev)
783 struct rk29_port *rk29_port = platform_get_drvdata(pdev);
785 clk_put(rk29_port->clk);
790 static struct platform_driver rk29_platform_driver = {
791 .remove = rk29_serial_remove,
793 .name = "rk29_serial",
794 .owner = THIS_MODULE,
798 static int __init rk29_serial_init(void)
801 ret = uart_register_driver(&rk29_uart_driver);
805 ret = platform_driver_probe(&rk29_platform_driver, rk29_serial_probe);
807 uart_unregister_driver(&rk29_uart_driver);
809 printk(KERN_INFO "rk29_serial: driver initialized\n");
814 static void __exit rk29_serial_exit(void)
816 #ifdef CONFIG_SERIAL_RK29_CONSOLE
817 unregister_console(&rk29_console);
819 platform_driver_unregister(&rk29_platform_driver);
820 uart_unregister_driver(&rk29_uart_driver);
824 * While this can be a module, if builtin it's most likely the console
825 * So let's leave module_exit but move module_init to an earlier place
827 arch_initcall(rk29_serial_init);
828 module_exit(rk29_serial_exit);
830 MODULE_AUTHOR("lhh lhh@rock-chips.com");
831 MODULE_DESCRIPTION("Rockchip rk29 Serial port driver");
832 MODULE_LICENSE("GPL");