Merge branches 'acpi-resources', 'acpi-battery', 'acpi-doc' and 'acpi-pnp'
[linux-2.6-block.git] / drivers / tty / serial / atmel_serial.c
index 4e959c43f6804d12f8677d916e1f050bdc740457..27dade29646b7c8d962494cf37daee398c774514 100644 (file)
@@ -855,7 +855,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port)
        spin_lock_init(&atmel_port->lock_tx);
        sg_init_table(&atmel_port->sg_tx, 1);
        /* UART circular tx buffer is an aligned page. */
-       BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK);
+       BUG_ON(!PAGE_ALIGNED(port->state->xmit.buf));
        sg_set_page(&atmel_port->sg_tx,
                        virt_to_page(port->state->xmit.buf),
                        UART_XMIT_SIZE,
@@ -880,6 +880,7 @@ static int atmel_prepare_tx_dma(struct uart_port *port)
        config.direction = DMA_MEM_TO_DEV;
        config.dst_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
        config.dst_addr = port->mapbase + ATMEL_US_THR;
+       config.dst_maxburst = 1;
 
        ret = dmaengine_slave_config(atmel_port->chan_tx,
                                     &config);
@@ -1034,10 +1035,10 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
        spin_lock_init(&atmel_port->lock_rx);
        sg_init_table(&atmel_port->sg_rx, 1);
        /* UART circular rx buffer is an aligned page. */
-       BUG_ON((int)port->state->xmit.buf & ~PAGE_MASK);
+       BUG_ON(!PAGE_ALIGNED(ring->buf));
        sg_set_page(&atmel_port->sg_rx,
                    virt_to_page(ring->buf),
-                   ATMEL_SERIAL_RINGSIZE,
+                   sizeof(struct atmel_uart_char) * ATMEL_SERIAL_RINGSIZE,
                    (int)ring->buf & ~PAGE_MASK);
        nent = dma_map_sg(port->dev,
                          &atmel_port->sg_rx,
@@ -1059,6 +1060,7 @@ static int atmel_prepare_rx_dma(struct uart_port *port)
        config.direction = DMA_DEV_TO_MEM;
        config.src_addr_width = DMA_SLAVE_BUSWIDTH_1_BYTE;
        config.src_addr = port->mapbase + ATMEL_US_RHR;
+       config.src_maxburst = 1;
 
        ret = dmaengine_slave_config(atmel_port->chan_rx,
                                     &config);
@@ -1554,7 +1556,7 @@ static void atmel_tasklet_func(unsigned long data)
        spin_unlock(&port->lock);
 }
 
-static int atmel_init_property(struct atmel_uart_port *atmel_port,
+static void atmel_init_property(struct atmel_uart_port *atmel_port,
                                struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
@@ -1595,7 +1597,6 @@ static int atmel_init_property(struct atmel_uart_port *atmel_port,
                atmel_port->use_dma_tx  = false;
        }
 
-       return 0;
 }
 
 static void atmel_init_rs485(struct uart_port *port,
@@ -1777,10 +1778,13 @@ static int atmel_startup(struct uart_port *port)
        if (retval)
                goto free_irq;
 
+       tasklet_enable(&atmel_port->tasklet);
+
        /*
         * Initialize DMA (if necessary)
         */
        atmel_init_property(atmel_port, pdev);
+       atmel_set_ops(port);
 
        if (atmel_port->prepare_rx) {
                retval = atmel_port->prepare_rx(port);
@@ -1879,6 +1883,7 @@ static void atmel_shutdown(struct uart_port *port)
         * Clear out any scheduled tasklets before
         * we destroy the buffers
         */
+       tasklet_disable(&atmel_port->tasklet);
        tasklet_kill(&atmel_port->tasklet);
 
        /*
@@ -2256,8 +2261,8 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
        struct uart_port *port = &atmel_port->uart;
        struct atmel_uart_data *pdata = dev_get_platdata(&pdev->dev);
 
-       if (!atmel_init_property(atmel_port, pdev))
-               atmel_set_ops(port);
+       atmel_init_property(atmel_port, pdev);
+       atmel_set_ops(port);
 
        atmel_init_rs485(port, pdev);
 
@@ -2272,6 +2277,7 @@ static int atmel_init_port(struct atmel_uart_port *atmel_port,
 
        tasklet_init(&atmel_port->tasklet, atmel_tasklet_func,
                        (unsigned long)port);
+       tasklet_disable(&atmel_port->tasklet);
 
        memset(&atmel_port->rx_ring, 0, sizeof(atmel_port->rx_ring));
 
@@ -2581,8 +2587,8 @@ static int atmel_init_gpios(struct atmel_uart_port *p, struct device *dev)
        struct gpio_desc *gpiod;
 
        p->gpios = mctrl_gpio_init(dev, 0);
-       if (IS_ERR_OR_NULL(p->gpios))
-               return -1;
+       if (IS_ERR(p->gpios))
+               return PTR_ERR(p->gpios);
 
        for (i = 0; i < UART_GPIO_MAX; i++) {
                gpiod = mctrl_gpio_to_gpiod(p->gpios, i);
@@ -2635,9 +2641,10 @@ static int atmel_serial_probe(struct platform_device *pdev)
        spin_lock_init(&port->lock_suspended);
 
        ret = atmel_init_gpios(port, &pdev->dev);
-       if (ret < 0)
-               dev_err(&pdev->dev, "%s",
-                       "Failed to initialize GPIOs. The serial port may not work as expected");
+       if (ret < 0) {
+               dev_err(&pdev->dev, "Failed to initialize GPIOs.");
+               goto err;
+       }
 
        ret = atmel_init_port(port, pdev);
        if (ret)