From: hhb Date: Tue, 28 Aug 2012 08:34:02 +0000 (+0800) Subject: rk_serial:serial rx use new dma interface rk29_dma_enqueue_ring X-Git-Tag: firefly_0821_release~8819 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=259e917910129d2bab2033d39c3bc3abbe8ef076;p=firefly-linux-kernel-4.4.55.git rk_serial:serial rx use new dma interface rk29_dma_enqueue_ring --- diff --git a/drivers/tty/serial/rk_serial.c b/drivers/tty/serial/rk_serial.c index 558abd77faf5..c45c927b4899 100644 --- a/drivers/tty/serial/rk_serial.c +++ b/drivers/tty/serial/rk_serial.c @@ -57,10 +57,12 @@ * 1.modify dma dirver; * 2.enable Programmable THRE Interrupt Mode, so we can just judge ((up->iir & 0x0f) == 0x02) when transmit * 3.reset uart and set it to loopback state to ensure setting baud rate sucessfully -*v1.1 : 2012-08-23 -* 1. dma driver:make "when tx dma is only enable" work functionally +*v1.1 : 2012-08-23 +* 1. dma driver:make "when tx dma is only enable" work functionally +*v1.2 : 2012-08-28 +* 1. dma driver:serial rx use new dma interface rk29_dma_enqueue_ring */ -#define VERSION_AND_TIME "rk_serial.c v1.1 2012-08-23" +#define VERSION_AND_TIME "rk_serial.c v1.2 2012-08-28" #define PORT_RK 90 #define UART_USR 0x1F /* UART Status Register */ @@ -651,7 +653,7 @@ static int serial_rk_init_dma_rx(struct uart_port *port) { return -1; } - rk29_dma_setflags(uart_dma->rx_dmach, RK29_DMAF_CIRCULAR); + //rk29_dma_setflags(uart_dma->rx_dmach, RK29_DMAF_CIRCULAR); uart_dma->rx_dma_inited = 1; dev_info(up->port.dev, "serial_rk_init_dma_rx sucess\n"); @@ -674,19 +676,23 @@ static int serial_rk_start_rx_dma(struct uart_port *port) dev_info(up->port.dev, "*******serial_rk_init_dma_rx*******error*******\n"); return -1; } + +#if 0 + if (rk29_dma_enqueue(uart_dma->rx_dmach, (void *)up, uart_dma->rx_phy_addr, + uart_dma->rb_size/2)) { + dev_info(up->port.dev, "*******rk29_dma_enqueue fail*****\n"); + return -1; + } - if (rk29_dma_enqueue(uart_dma->rx_dmach, (void *)up, uart_dma->rx_phy_addr, - uart_dma->rb_size/2)) { - dev_info(up->port.dev, "*******rk29_dma_enqueue fail*****\n"); - return -1; - } - - if (rk29_dma_enqueue(uart_dma->rx_dmach, (void *)up, - uart_dma->rx_phy_addr+uart_dma->rb_size/2, uart_dma->rb_size/2)) { - dev_info(up->port.dev, "*******rk29_dma_enqueue fail*****\n"); - return -1; - } + if (rk29_dma_enqueue(uart_dma->rx_dmach, (void *)up, + uart_dma->rx_phy_addr+uart_dma->rb_size/2, uart_dma->rb_size/2)) { + dev_info(up->port.dev, "*******rk29_dma_enqueue fail*****\n"); + return -1; + } +#else + rk29_dma_enqueue_ring(uart_dma->rx_dmach, (void *)up, uart_dma->rx_phy_addr, uart_dma->rb_size/4, 4, false); +#endif rk29_dma_ctrl(uart_dma->rx_dmach, RK29_DMAOP_START); uart_dma->rx_dma_used = 1; if(uart_dma->use_timer == 1){ @@ -1838,7 +1844,6 @@ static int __devinit serial_rk_probe(struct platform_device *pdev) /* set dma config */ pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); if(up->dma->use_dma & RX_DMA) { - pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); //timer up->dma->use_timer = USE_TIMER; up->dma->rx_timer.function = serial_rk_report_dma_rx; @@ -1848,7 +1853,7 @@ static int __devinit serial_rk_probe(struct platform_device *pdev) init_timer(&up->dma->rx_timer); //rx buffer - up->dma->rb_size = UART_XMIT_SIZE*8; + up->dma->rb_size = UART_XMIT_SIZE*2; up->dma->rx_buffer = dmam_alloc_coherent(up->port.dev, up->dma->rb_size, &up->dma->rx_phy_addr, DMA_MEMORY_MAP); up->dma->rb_tail = 0; @@ -1857,8 +1862,8 @@ static int __devinit serial_rk_probe(struct platform_device *pdev) dev_info(up->port.dev, "dmam_alloc_coherent dma_rx_buffer fail\n"); } else { - dev_info(up->port.dev, "dma_rx_buffer 0x%08x, phy:0x%08x\n", (unsigned) up->dma->rx_buffer, (unsigned)up->dma->rx_phy_addr); - //dev_info(up->port.dev, "up 0x%08x\n", (unsigned)up->dma); + dev_info(up->port.dev, "dma_rx_buffer 0x%08x\n", (unsigned) up->dma->rx_buffer); + dev_info(up->port.dev, "dma_rx_phy 0x%08x\n", (unsigned)up->dma->rx_phy_addr); } // work queue