rk serial: migrate to kernel3.10,and fit device tree
authorhhb <hhb@rock-chips.com>
Fri, 29 Nov 2013 12:42:26 +0000 (20:42 +0800)
committerhhb <hhb@rock-chips.com>
Fri, 29 Nov 2013 12:42:26 +0000 (20:42 +0800)
arch/arm/boot/dts/rk3188-tb.dts
arch/arm/boot/dts/rk3188.dtsi
arch/arm/configs/rockchip_defconfig
drivers/tty/serial/Kconfig
drivers/tty/serial/Makefile
drivers/tty/serial/rk_serial.c

index 5960e1007c51e606d8b6ad41fde8d06c0b1aebf3..a9422f3aad0630c12afff1ce3b8457c2a04cd5f6 100644 (file)
@@ -9,7 +9,7 @@
        };
 
        chosen {
-               bootargs ="console=ttyS1,115200 androidboot.console=ttyS1";
+               bootargs ="console=ttyS2,115200 androidboot.console=ttyS2";
        };
 };
 
index 96a23224d76da6531ff9d42cbff81ee267d4d8ac..27607f16e6b0fc942a9918e86c04cd3aa9f239a6 100644 (file)
        };
 
        uart0: serial@10124000 {
-               compatible = "snps,dw-apb-uart";
+               compatible = "rockchip,serial";
                reg = <0x10124000 0x100>;
                interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <24000000>;
                reg-shift = <2>;
                reg-io-width = <4>;
+               id = <0>;
                status = "disabled";
        };
 
        uart1: serial@10126000 {
-               compatible = "snps,dw-apb-uart";
+               compatible = "rockchip,serial";
                reg = <0x10126000 0x100>;
                interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <24000000>;
                reg-shift = <2>;
                reg-io-width = <4>;
+               id = <1>;
                status = "disabled";
        };
 
        uart2: serial@20064000 {
-               compatible = "snps,dw-apb-uart";
+               compatible = "rockchip,serial";
                reg = <0x20064000 0x100>;
                interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <24000000>;
+               current-speed = <115200>;
                reg-shift = <2>;
                reg-io-width = <4>;
+               id = <2>;
                status = "disabled";
        };
 
        uart3: serial@20068000 {
-               compatible = "snps,dw-apb-uart";
+               compatible = "rockchip,serial";
                reg = <0x20068000 0x100>;
                interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
                clock-frequency = <24000000>;
                reg-shift = <2>;
                reg-io-width = <4>;
+               id = <3>;
                status = "disabled";
        };
 };
index 9b7a62119cac72eb6c71b5831d0c031483151d41..4930e8f7abc2aaa415d4a1f2fe1efbba7ac8c265 100644 (file)
@@ -257,12 +257,8 @@ CONFIG_INPUT_UINPUT=y
 # CONFIG_SERIO is not set
 # CONFIG_VT is not set
 # CONFIG_LEGACY_PTYS is not set
-CONFIG_SERIAL_8250=y
-# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_NR_UARTS=5
-CONFIG_SERIAL_8250_RUNTIME_UARTS=5
-CONFIG_SERIAL_8250_DW=y
+CONFIG_SERIAL_ROCKCHIP=y
+CONFIG_SERIAL_ROCKCHIP_CONSOLE=y
 # CONFIG_HW_RANDOM is not set
 CONFIG_I2C=y
 CONFIG_SPI=y
index 7e7006fd404e62000b19b728274c0abf8a51bf38..d5b92fda0b7e92b99bebd7b5636d3796efb2f576 100644 (file)
@@ -1268,6 +1268,16 @@ config SERIAL_BCM63XX_CONSOLE
          If you have enabled the serial port on the bcm63xx CPU
          you can make it the console by answering Y to this option.
 
+config SERIAL_ROCKCHIP
+       bool "RockChip SOCS serial port support"
+       select SERIAL_CORE
+
+config SERIAL_ROCKCHIP_CONSOLE
+       bool "Serial console support"
+       depends on SERIAL_ROCKCHIP=y
+       select SERIAL_CORE_CONSOLE
+
+
 config SERIAL_GRLIB_GAISLER_APBUART
        tristate "GRLIB APBUART serial support"
        depends on OF && SPARC
index eedfec40e3dda242220cf1dc73b9ec1787c63cee..c10185a86e59170f95d8b5ff59aea4c13c462a33 100644 (file)
@@ -67,6 +67,7 @@ obj-$(CONFIG_SERIAL_OMAP) += omap-serial.o
 obj-$(CONFIG_SERIAL_ALTERA_UART) += altera_uart.o
 obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
 obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
+obj-$(CONFIG_SERIAL_ROCKCHIP) += rk_serial.o
 obj-$(CONFIG_SERIAL_TIMBERDALE)        += timbuart.o
 obj-$(CONFIG_SERIAL_GRLIB_GAISLER_APBUART) += apbuart.o
 obj-$(CONFIG_SERIAL_ALTERA_JTAGUART) += altera_jtaguart.o
index 319b9d0bf7d6f6c70908cf7455f6d6998f6cfd3d..561124349e38cb5dc8956001eb285e536f31f3de 100644 (file)
  * Date: 2011.06.18\r
  */\r
 \r
-#ifndef CONFIG_SERIAL_RK_CONSOLE\r
-#if defined(CONFIG_SERIAL_RK29_CONSOLE)\r
-#define CONFIG_SERIAL_RK_CONSOLE\r
-#endif\r
-#endif\r
-\r
-#if defined(CONFIG_SERIAL_RK_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)\r
+#if defined(CONFIG_SERIAL_ROCKCHIP_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)\r
 #define SUPPORT_SYSRQ\r
 #endif\r
 \r
 #include <linux/timer.h>\r
 #include <linux/workqueue.h>\r
 #include <linux/dma-mapping.h>\r
-\r
 #include <asm/io.h>\r
 #include <asm/irq.h>\r
 \r
+#ifdef CONFIG_OF\r
+#include <linux/of.h>\r
+#endif\r
+\r
+\r
 /*\r
 *                       Driver Version Note\r
 *\r
 *              1.fix bug dma buffer free error\r
 *v1.5 : 2013-10-17\r
 *              1.in some case, set uart rx as gpio interrupt to wake up arm, when arm suspends \r
+*v1.6 : 2013-11-29\r
+               migrate to kernel3.10,and fit device tree       \r
 */\r
-#define VERSION_AND_TIME  "rk_serial.c v1.5 2013-10-17"\r
+#define VERSION_AND_TIME  "rk_serial.c v1.5 2013-11-29"\r
 \r
 #define PORT_RK                90\r
 #define UART_USR       0x1F    /* UART Status Register */\r
@@ -82,7 +82,7 @@
 \r
 //#define BOTH_EMPTY   (UART_LSR_TEMT | UART_LSR_THRE)\r
 \r
-#define UART_NR        4   //uart port number\r
+#define UART_NR        5   //uart port number\r
 \r
 \r
 /* configurate whether the port transmit-receive by DMA in menuconfig*/\r
 #define UART3_USE_WAKEUP 0\r
 #endif\r
 \r
-\r
-\r
 #define USE_TIMER    1           // use timer for dma transport\r
 #define POWER_MANEGEMENT 1\r
 #define RX_TIMEOUT             (3000*3)  //uint ms\r
 #define DMA_TX_TRRIGE_LEVEL 128\r
 #define SERIAL_CIRC_CNT_TO_END(xmit)   CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE)\r
 \r
+#ifdef CONFIG_OF\r
+#define USE_DMA        0\r
+#else\r
+#define USE_DMA        (UART0_USE_DMA | UART1_USE_DMA | UART2_USE_DMA | UART3_USE_DMA)\r
+#endif\r
 \r
-#define USE_DMA (UART0_USE_DMA | UART1_USE_DMA | UART2_USE_DMA | UART3_USE_DMA)\r
 #define USE_WAKEUP (UART0_USE_WAKEUP | UART1_USE_WAKEUP | UART2_USE_WAKEUP | UART3_USE_WAKEUP)\r
 \r
 #if USE_DMA\r
@@ -211,6 +213,8 @@ module_param(log_port, int, S_IRUGO|S_IWUSR);
 #endif\r
 \r
 \r
+//#define CONFIG_CLOCK_CTRL\r
+\r
 #if USE_DMA\r
 /* added by hhb@rock-chips.com for uart dma transfer */\r
 \r
@@ -262,6 +266,15 @@ struct uart_wake_up {
 };\r
 #endif\r
 \r
+#ifdef CONFIG_OF\r
+struct of_rk_serial {\r
+       unsigned int id;\r
+       unsigned int use_dma;   \r
+       unsigned int uartclk;\r
+};\r
+#endif\r
+\r
+\r
 struct uart_rk_port {\r
        struct uart_port        port;\r
        struct platform_device  *pdev;\r
@@ -808,7 +821,7 @@ static void serial_rk_report_dma_rx(unsigned long uart)
                up->port.icount.rx += count;\r
                flip = tty_insert_flip_string(up->port.state->port.tty, uart_dma->rx_buffer\r
                                + uart_dma->rb_tail, count);\r
-               tty_flip_buffer_push(up->port.state->port.tty);\r
+               tty_flip_buffer_push(&up->port.state->port);\r
                uart_dma->rb_tail = (uart_dma->rb_tail + count) & (uart_dma->rb_size - 1);\r
                up->port_activity = jiffies;\r
        }\r
@@ -842,7 +855,7 @@ static void serial_rk_report_revdata_workfunc(struct work_struct *work)
        if(up->port.state->port.tty && up->dma->use_timer != 1 && up->fifo_size > 0){\r
 \r
                tty_insert_flip_string(up->port.state->port.tty, up->fifo, up->fifo_size);\r
-               tty_flip_buffer_push(up->port.state->port.tty);\r
+               tty_flip_buffer_push(&up->port.state->port);\r
                up->port.icount.rx += up->fifo_size;\r
                up->ier |= UART_IER_RDI;\r
                serial_out(up, UART_IER, up->ier);\r
@@ -941,7 +954,7 @@ ignore_char:
                lsr = serial_in(up, UART_LSR);\r
        } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));\r
        spin_unlock(&up->port.lock);\r
-       tty_flip_buffer_push(tty);\r
+       tty_flip_buffer_push(tty->port);\r
        spin_lock(&up->port.lock);\r
        *status = lsr;\r
 }\r
@@ -1211,7 +1224,7 @@ static void serial_rk_break_ctl(struct uart_port *port, int break_state)
        dev_dbg(port->dev, "-%s lcr: 0x%02x\n", __func__, up->lcr);\r
 }\r
 \r
-#if defined(CONFIG_SERIAL_RK_CONSOLE) || defined(CONFIG_CONSOLE_POLL)\r
+#if defined(CONFIG_SERIAL_ROCKCHIP_CONSOLE) || defined(CONFIG_CONSOLE_POLL)\r
 /*\r
  *     Wait for transmitter & holding register to empty\r
  */\r
@@ -1305,10 +1318,10 @@ static int serial_rk_startup(struct uart_port *port)
                return retval;\r
 \r
        up->mcr = 0;\r
-\r
+#ifdef CONFIG_CLOCK_CTRL\r
        clk_enable(up->pclk);\r
        clk_enable(up->clk);  // enable the config uart clock\r
-\r
+#endif\r
        /*\r
         * Clear the FIFO buffers and disable them.\r
         * (they will be reenabled in set_termios())\r
@@ -1417,8 +1430,10 @@ static void serial_rk_shutdown(struct uart_port *port)
                up->port.state->xmit.buf = NULL;\r
 #endif\r
        free_irq(up->port.irq, up);\r
+#ifdef CONFIG_CLOCK_CTRL\r
        clk_disable(up->clk);\r
        clk_disable(up->pclk);\r
+#endif\r
 }\r
 \r
 static void\r
@@ -1655,11 +1670,15 @@ serial_rk_pm(struct uart_port *port, unsigned int state,
 \r
        dev_dbg(port->dev, "%s: %s\n", __func__, state ? "disable" : "enable");\r
        if (state) {\r
+#ifdef CONFIG_CLOCK_CTRL\r
                clk_disable(up->clk);\r
                clk_disable(up->pclk);\r
+#endif\r
        } else {\r
+#ifdef CONFIG_CLOCK_CTRL\r
                clk_enable(up->pclk);\r
                clk_enable(up->clk);\r
+#endif\r
        }\r
 }\r
 \r
@@ -1725,7 +1744,7 @@ static struct uart_ops serial_rk_pops = {
 #endif\r
 };\r
 \r
-#ifdef CONFIG_SERIAL_RK_CONSOLE\r
+#ifdef CONFIG_SERIAL_ROCKCHIP_CONSOLE\r
 \r
 static struct uart_rk_port *serial_rk_console_ports[UART_NR];\r
 \r
@@ -1843,7 +1862,7 @@ static inline void serial_rk_add_console_port(struct uart_rk_port *up)
 \r
 static struct uart_driver serial_rk_reg = {\r
        .owner                  = THIS_MODULE,\r
-       .driver_name            = "rk29_serial",\r
+       .driver_name            = "rk_serial",\r
        .dev_name               = "ttyS",\r
        .major                  = TTY_MAJOR,\r
        .minor                  = 64,\r
@@ -1924,15 +1943,33 @@ static int serial_rk_remove_wakeup_irq(struct uart_rk_port *up) {
 }\r
 #endif\r
 \r
+#ifdef CONFIG_OF\r
+static int of_rk_serial_parse_dt(const struct device_node *np, struct of_rk_serial *rks) {\r
+       unsigned int val = 0;\r
+       if(!of_property_read_u32(np, "id", &val))\r
+               rks->id = val;\r
+       if(!of_property_read_u32(np, "clock-frequency", &val))\r
+               rks->uartclk = val;\r
+#if USE_DMA\r
+       rks->use_dma = 0;       \r
+       if(of_find_property(np, "use-dma-rx", &val))\r
+               rks->use_dma |= RX_DMA;\r
+       if(of_find_property(np, "use-dma-tx", &val))\r
+               rks->use_dma |= TX_DMA;\r
+#endif\r
+       return 0;\r
+}\r
+#endif\r
 \r
 \r
-static int __devinit serial_rk_probe(struct platform_device *pdev)\r
+static int serial_rk_probe(struct platform_device *pdev)\r
 {\r
        struct uart_rk_port     *up;\r
        struct resource         *mem;\r
        int irq;\r
        int ret = -ENOSPC;\r
-       \r
+       struct of_rk_serial rks;        \r
+\r
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
        if (!mem) {\r
                dev_err(&pdev->dev, "no mem resource?\n");\r
@@ -1945,29 +1982,38 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
                return irq;\r
        }\r
 \r
+#ifdef CONFIG_OF\r
+       of_rk_serial_parse_dt(pdev->dev.of_node, &rks);\r
+       pdev->id = rks.id;\r
+#endif\r
        if (!request_mem_region(mem->start, (mem->end - mem->start) + 1,\r
                                pdev->dev.driver->name)) {\r
                dev_err(&pdev->dev, "memory region already claimed\n");\r
                return -EBUSY;\r
        }\r
-\r
+       \r
        up = kzalloc(sizeof(*up), GFP_KERNEL);\r
        if (up == NULL) {\r
                ret = -ENOMEM;\r
                goto do_release_region;\r
        }\r
-\r
+       \r
        sprintf(up->name, "rk29_serial.%d", pdev->id);\r
        up->pdev = pdev;\r
+#ifdef CONFIG_CLOCK_CTRL\r
        up->pclk = clk_get(&pdev->dev, "pclk_uart");\r
        up->clk = clk_get(&pdev->dev, "uart");\r
        if (unlikely(IS_ERR(up->clk))) {\r
                ret = PTR_ERR(up->clk);\r
+               printk("%s:%d\n", __func__, __LINE__);\r
                goto do_free;\r
+               \r
        }\r
+#endif\r
        up->tx_loadsz = 30;\r
 #if USE_DMA\r
        up->dma = &rk29_uart_ports_dma[pdev->id];\r
+       up->dma->use_dma = rks.use_dma;\r
 #endif\r
 #if USE_WAKEUP\r
        up->wakeup = &rk29_uart_ports_wakeup[pdev->id];\r
@@ -1975,8 +2021,8 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
        up->port.dev = &pdev->dev;\r
        up->port.type = PORT_RK;\r
        up->port.irq = irq;\r
-       up->port.iotype = UPIO_DWAPB;\r
-\r
+       up->port.iotype = UPIO_MEM;\r
+       \r
        up->port.regshift = 2;\r
        //fifo size default is 32, but it will be updated later when start_up\r
        up->port.fifosize = 32;\r
@@ -1990,8 +2036,13 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
        }\r
        up->port.mapbase = mem->start;\r
        up->port.irqflags = IRQF_DISABLED;\r
+#if defined(CONFIG_CLOCK_CTRL)\r
        up->port.uartclk = clk_get_rate(up->clk);\r
-\r
+#elif defined(CONFIG_OF)\r
+       up->port.uartclk = rks.uartclk;\r
+#else\r
+       up->port.uartclk = 24000000;\r
+#endif\r
 #if USE_DMA\r
        /* set dma config */\r
        pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);\r
@@ -2048,7 +2099,6 @@ static int __devinit serial_rk_probe(struct platform_device *pdev)
        ret = uart_add_one_port(&serial_rk_reg, &up->port);\r
        if (ret != 0)\r
                goto do_iounmap;\r
-\r
        platform_set_drvdata(pdev, up);\r
        dev_info(&pdev->dev, "membase 0x%08x\n", (unsigned) up->port.membase);\r
 #if USE_WAKEUP\r
@@ -2060,16 +2110,18 @@ do_iounmap:
        iounmap(up->port.membase);\r
        up->port.membase = NULL;\r
 do_put_clk:\r
+#ifdef CONFIG_CLOCK_CTRL\r
        clk_put(up->clk);\r
        clk_put(up->pclk);\r
 do_free:\r
+#endif\r
        kfree(up);\r
 do_release_region:\r
        release_mem_region(mem->start, (mem->end - mem->start) + 1);\r
        return ret;\r
 }\r
 \r
-static int __devexit serial_rk_remove(struct platform_device *pdev)\r
+static int serial_rk_remove(struct platform_device *pdev)\r
 {\r
        struct uart_rk_port *up = platform_get_drvdata(pdev);\r
 \r
@@ -2081,8 +2133,10 @@ static int __devexit serial_rk_remove(struct platform_device *pdev)
                mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
                iounmap(up->port.membase);\r
                up->port.membase = NULL;\r
+#ifdef CONFIG_CLOCK_CTRL\r
                clk_put(up->clk);\r
                clk_put(up->pclk);\r
+#endif\r
                kfree(up);\r
                release_mem_region(mem->start, (mem->end - mem->start) + 1);\r
        }\r
@@ -2122,19 +2176,21 @@ static int serial_rk_resume(struct platform_device *dev)
        }\r
        return 0;\r
 }\r
-\r
+#ifdef CONFIG_OF\r
+static const struct of_device_id of_rk_serial_match[] = {\r
+       { .compatible = "rockchip,serial" },\r
+       { /* Sentinel */ }\r
+};\r
+#endif\r
 static struct platform_driver serial_rk_driver = {\r
        .probe          = serial_rk_probe,\r
-       .remove         = __devexit_p(serial_rk_remove),\r
+       .remove         = serial_rk_remove,\r
        .suspend        = serial_rk_suspend,\r
        .resume         = serial_rk_resume,\r
        .driver         = {\r
-#if defined(CONFIG_ARCH_RK29)\r
-               .name   = "rk29_serial",\r
-#elif defined(CONFIG_SERIAL_RK2818)\r
-               .name   = "rk2818_serial",\r
-#else\r
-               .name   = "rk_serial",\r
+               .name   = "serial",\r
+#ifdef CONFIG_OF\r
+               .of_match_table = of_rk_serial_match,\r
 #endif\r
                .owner  = THIS_MODULE,\r
        },\r
@@ -2145,15 +2201,12 @@ static int __init serial_rk_init(void)
        int ret;\r
        //hhb@rock-chips.com\r
        printk("%s\n", VERSION_AND_TIME);\r
-\r
        ret = uart_register_driver(&serial_rk_reg);\r
        if (ret)\r
                return ret;\r
-\r
        ret = platform_driver_register(&serial_rk_driver);\r
        if (ret != 0)\r
                uart_unregister_driver(&serial_rk_reg);\r
-\r
        return ret;\r
 }\r
 \r